17f721ea1SAxel Dörfler/*
27f9368caSlooncraz * Copyright 2002-2015 Haiku, Inc. All rights reserved.
389208c77SStephan Aßmus * Distributed under the terms of the MIT License.
47f721ea1SAxel Dörfler */
552a38012Sejakowatz#ifndef _LIST_VIEW_H
652a38012Sejakowatz#define _LIST_VIEW_H
87f721ea1SAxel Dörfler
952a38012Sejakowatz#include <Invoker.h>
10b2d5d0deSAxel Dörfler#include <List.h>
11b2d5d0deSAxel Dörfler#include <ListItem.h>
1297970c5cSAxel Dörfler#include <View.h>
147f721ea1SAxel Dörfler
15b2d5d0deSAxel Dörflerstruct track_data;
17429ae1b1SJohn Scipione
1852a38012Sejakowatzenum list_view_type {
1952a38012Sejakowatz	B_SINGLE_SELECTION_LIST,
2052a38012Sejakowatz	B_MULTIPLE_SELECTION_LIST
247f721ea1SAxel Dörflerclass BListView : public BView, public BInvoker {
2597970c5cSAxel Dörflerpublic:
260a5897b7SStephan Aßmus								BListView(BRect frame, const char* name,
270a5897b7SStephan Aßmus									list_view_type type
280a5897b7SStephan Aßmus										= B_SINGLE_SELECTION_LIST,
297f9368caSlooncraz									uint32 resizeMask = B_FOLLOW_LEFT_TOP,
300a5897b7SStephan Aßmus									uint32 flags = B_WILL_DRAW
310a5897b7SStephan Aßmus										| B_FRAME_EVENTS | B_NAVIGABLE);
320a5897b7SStephan Aßmus								BListView(const char* name,
330a5897b7SStephan Aßmus									list_view_type type
340a5897b7SStephan Aßmus										= B_SINGLE_SELECTION_LIST,
350a5897b7SStephan Aßmus									uint32 flags = B_WILL_DRAW
360a5897b7SStephan Aßmus										| B_FRAME_EVENTS | B_NAVIGABLE);
370a5897b7SStephan Aßmus								BListView(list_view_type type
380a5897b7SStephan Aßmus									= B_SINGLE_SELECTION_LIST);
390a5897b7SStephan Aßmus								BListView(BMessage* data);
400a5897b7SStephan Aßmus
410a5897b7SStephan Aßmus	virtual						~BListView();
420a5897b7SStephan Aßmus
430a5897b7SStephan Aßmus	static	BArchivable*		Instantiate(BMessage* data);
440a5897b7SStephan Aßmus	virtual status_t			Archive(BMessage* data,
450a5897b7SStephan Aßmus									bool deep = true) const;
460a5897b7SStephan Aßmus
470a5897b7SStephan Aßmus	virtual void				Draw(BRect updateRect);
480a5897b7SStephan Aßmus
490a5897b7SStephan Aßmus	virtual void				AttachedToWindow();
500a5897b7SStephan Aßmus	virtual void				DetachedFromWindow();
510a5897b7SStephan Aßmus	virtual void				AllAttached();
520a5897b7SStephan Aßmus	virtual void				AllDetached();
530a5897b7SStephan Aßmus	virtual void				FrameResized(float newWidth, float newHeight);
540a5897b7SStephan Aßmus	virtual void				FrameMoved(BPoint newPosition);
551f424632SJohn Scipione	virtual void				TargetedByScrollView(BScrollView* view);
561f424632SJohn Scipione	virtual void				WindowActivated(bool active);
570a5897b7SStephan Aßmus
580a5897b7SStephan Aßmus	virtual void				MessageReceived(BMessage* message);
590a5897b7SStephan Aßmus	virtual void				KeyDown(const char* bytes, int32 numBytes);
600a5897b7SStephan Aßmus	virtual void				MouseDown(BPoint where);
6163f3755cSJohn Scipione	virtual void				MouseUp(BPoint where);
6263f3755cSJohn Scipione	virtual void				MouseMoved(BPoint where, uint32 code,
630a5897b7SStephan Aßmus									const BMessage* dragMessage);
640a5897b7SStephan Aßmus
650a5897b7SStephan Aßmus	virtual void				ResizeToPreferred();
6663f3755cSJohn Scipione	virtual void				GetPreferredSize(float *_width,
6763f3755cSJohn Scipione									float *_height);
680a5897b7SStephan Aßmus
690a5897b7SStephan Aßmus	virtual	BSize				MinSize();
700a5897b7SStephan Aßmus	virtual	BSize				MaxSize();
710a5897b7SStephan Aßmus	virtual	BSize				PreferredSize();
720a5897b7SStephan Aßmus
730a5897b7SStephan Aßmus	virtual void				MakeFocus(bool state = true);
740a5897b7SStephan Aßmus
750a5897b7SStephan Aßmus	virtual	void				SetFont(const BFont* font, uint32 mask
760a5897b7SStephan Aßmus									= B_FONT_ALL);
770a5897b7SStephan Aßmus	virtual void				ScrollTo(BPoint where);
780a5897b7SStephan Aßmus	inline	void				ScrollTo(float x, float y);
790a5897b7SStephan Aßmus
800a5897b7SStephan Aßmus	virtual bool				AddItem(BListItem* item);
810a5897b7SStephan Aßmus	virtual bool				AddItem(BListItem* item, int32 atIndex);
820a5897b7SStephan Aßmus	virtual bool				AddList(BList* newItems);
830a5897b7SStephan Aßmus	virtual bool				AddList(BList* newItems, int32 atIndex);
840a5897b7SStephan Aßmus	virtual bool				RemoveItem(BListItem* item);
850a5897b7SStephan Aßmus	virtual BListItem*			RemoveItem(int32 index);
860a5897b7SStephan Aßmus	virtual bool				RemoveItems(int32 index, int32 count);
870a5897b7SStephan Aßmus
880a5897b7SStephan Aßmus	virtual void				SetSelectionMessage(BMessage* message);
890a5897b7SStephan Aßmus	virtual void				SetInvocationMessage(BMessage* message);
900a5897b7SStephan Aßmus
910a5897b7SStephan Aßmus			BMessage*			SelectionMessage() const;
920a5897b7SStephan Aßmus			uint32				SelectionCommand() const;
930a5897b7SStephan Aßmus			BMessage*			InvocationMessage() const;
940a5897b7SStephan Aßmus			uint32				InvocationCommand() const;
950a5897b7SStephan Aßmus
960a5897b7SStephan Aßmus	virtual void				SetListType(list_view_type type);
970a5897b7SStephan Aßmus			list_view_type		ListType() const;
980a5897b7SStephan Aßmus
990a5897b7SStephan Aßmus			BListItem*			ItemAt(int32 index) const;
1000a5897b7SStephan Aßmus			int32				IndexOf(BPoint point) const;
1010a5897b7SStephan Aßmus			int32				IndexOf(BListItem* item) const;
1020a5897b7SStephan Aßmus			BListItem*			FirstItem() const;
1030a5897b7SStephan Aßmus			BListItem*			LastItem() const;
1040a5897b7SStephan Aßmus			bool				HasItem(BListItem* item) const;
1050a5897b7SStephan Aßmus			int32				CountItems() const;
1060a5897b7SStephan Aßmus	virtual void				MakeEmpty();
1070a5897b7SStephan Aßmus			bool				IsEmpty() const;
1080a5897b7SStephan Aßmus			void				DoForEach(bool (*func)(BListItem* item));
1090a5897b7SStephan Aßmus			void				DoForEach(bool (*func)(BListItem* item,
1100a5897b7SStephan Aßmus									void* arg), void* arg);
1110a5897b7SStephan Aßmus			const BListItem**	Items() const;
1120a5897b7SStephan Aßmus			void				InvalidateItem(int32 index);
1130a5897b7SStephan Aßmus			void				ScrollToSelection();
1140a5897b7SStephan Aßmus
1150a5897b7SStephan Aßmus			void				Select(int32 index, bool extend = false);
1160a5897b7SStephan Aßmus			void				Select(int32 from, int32 to,
1170a5897b7SStephan Aßmus									bool extend = false);
1180a5897b7SStephan Aßmus			bool				IsItemSelected(int32 index) const;
1190a5897b7SStephan Aßmus			int32				CurrentSelection(int32 index = 0) const;
1200a5897b7SStephan Aßmus	virtual status_t			Invoke(BMessage* message = NULL);
1210a5897b7SStephan Aßmus
1220a5897b7SStephan Aßmus			void				DeselectAll();
1230a5897b7SStephan Aßmus			void				DeselectExcept(int32 exceptFrom,
1240a5897b7SStephan Aßmus									int32 exceptTo);
1250a5897b7SStephan Aßmus			void				Deselect(int32 index);
1260a5897b7SStephan Aßmus
1270a5897b7SStephan Aßmus	virtual void				SelectionChanged();
1280a5897b7SStephan Aßmus
1299dfd244eSJohn Scipione	virtual bool				InitiateDrag(BPoint where, int32 index,
1309dfd244eSJohn Scipione									bool wasSelected);
13142a5968aSStephan Aßmus
1320a5897b7SStephan Aßmus			void				SortItems(int (*cmp)(const void*,
1330a5897b7SStephan Aßmus									const void*));
1340a5897b7SStephan Aßmus
1350a5897b7SStephan Aßmus	// These functions bottleneck through DoMiscellaneous()
1360a5897b7SStephan Aßmus			bool				SwapItems(int32 a, int32 b);
1370a5897b7SStephan Aßmus			bool				MoveItem(int32 from, int32 to);
1380a5897b7SStephan Aßmus			bool				ReplaceItem(int32 index, BListItem* item);
1390a5897b7SStephan Aßmus
1400a5897b7SStephan Aßmus			BRect				ItemFrame(int32 index);
1410a5897b7SStephan Aßmus
1420a5897b7SStephan Aßmus	virtual BHandler*			ResolveSpecifier(BMessage* message,
1430a5897b7SStephan Aßmus									int32 index, BMessage* specifier,
1441f424632SJohn Scipione									int32 what, const char* property);
1450a5897b7SStephan Aßmus	virtual status_t			GetSupportedSuites(BMessage* data);
1460a5897b7SStephan Aßmus
1470a5897b7SStephan Aßmus	virtual status_t			Perform(perform_code code, void* arg);
1480a5897b7SStephan Aßmus
1490a5897b7SStephan Aßmusprivate:
1500a5897b7SStephan Aßmus	virtual	void				_ReservedListView2();
1510a5897b7SStephan Aßmus	virtual	void				_ReservedListView3();
1520a5897b7SStephan Aßmus	virtual	void				_ReservedListView4();
1530a5897b7SStephan Aßmus
1540a5897b7SStephan Aßmus			BListView&			operator=(const BListView& other);
15597970c5cSAxel Dörfler
15697970c5cSAxel Dörflerprotected:
15797970c5cSAxel Dörfler	enum MiscCode { B_NO_OP, B_REPLACE_OP, B_MOVE_OP, B_SWAP_OP };
15897970c5cSAxel Dörfler	union MiscData {
15997970c5cSAxel Dörfler		struct Spare { int32 data[5]; };
16097970c5cSAxel Dörfler		struct Replace { int32 index; BListItem *item; } replace;
16197970c5cSAxel Dörfler		struct Move { int32 from; int32 to; } move;
16297970c5cSAxel Dörfler		struct Swap { int32 a; int32 b; } swap;
16397970c5cSAxel Dörfler	};
16497970c5cSAxel Dörfler
1650a5897b7SStephan Aßmus	virtual bool				DoMiscellaneous(MiscCode code, MiscData* data);
16697970c5cSAxel Dörfler
16797970c5cSAxel Dörflerprivate:
16897970c5cSAxel Dörfler	friend class BOutlineListView;
16997970c5cSAxel Dörfler
1700a5897b7SStephan Aßmus			void				_InitObject(list_view_type type);
1710a5897b7SStephan Aßmus			void				_FixupScrollBar();
1720a5897b7SStephan Aßmus			void				_InvalidateFrom(int32 index);
1730a5897b7SStephan Aßmus			status_t			_PostMessage(BMessage* message);
1744ee47fe9SRene Gollent			void				_UpdateItems();
1750a5897b7SStephan Aßmus			int32				_RangeCheck(int32 index);
1760a5897b7SStephan Aßmus			bool				_Select(int32 index, bool extend);
1770a5897b7SStephan Aßmus			bool				_Select(int32 from, int32 to, bool extend);
1780a5897b7SStephan Aßmus			bool				_Deselect(int32 index);
1790a5897b7SStephan Aßmus			bool				_DeselectAll(int32 exceptFrom, int32 exceptTo);
1800a5897b7SStephan Aßmus			int32				_CalcFirstSelected(int32 after);
1810a5897b7SStephan Aßmus			int32				_CalcLastSelected(int32 before);
1820a5897b7SStephan Aßmus			void				_RecalcItemTops(int32 start, int32 end = -1);
1830a5897b7SStephan Aßmus
1840a5897b7SStephan Aßmus	virtual void				DrawItem(BListItem* item, BRect itemRect,
1850a5897b7SStephan Aßmus									bool complete = false);
1860a5897b7SStephan Aßmus
1870a5897b7SStephan Aßmus			bool				_SwapItems(int32 a, int32 b);
1880a5897b7SStephan Aßmus			bool				_MoveItem(int32 from, int32 to);
1890a5897b7SStephan Aßmus			bool				_ReplaceItem(int32 index, BListItem* item);
1900a5897b7SStephan Aßmus			void				_RescanSelection(int32 from, int32 to);
1910a5897b7SStephan Aßmus
1922446f53bSJohn Scipione			void				_DoneTracking(BPoint where);
1932446f53bSJohn Scipione			void				_Track(BPoint where, uint32);
1942446f53bSJohn Scipione
1950a5897b7SStephan Aßmusprivate:
1960a5897b7SStephan Aßmus			BList				fList;
1970a5897b7SStephan Aßmus			list_view_type		fListType;
1980a5897b7SStephan Aßmus			int32				fFirstSelected;
1990a5897b7SStephan Aßmus			int32				fLastSelected;
2000a5897b7SStephan Aßmus			int32				fAnchorIndex;
2010a5897b7SStephan Aßmus			BMessage*			fSelectMessage;
2020a5897b7SStephan Aßmus			BScrollView*		fScrollView;
2030a5897b7SStephan Aßmus			track_data*			fTrack;
2040a5897b7SStephan Aßmus
2050a5897b7SStephan Aßmus			uint32				_reserved[4];
206b2d5d0deSAxel Dörfler};
207b2d5d0deSAxel Dörfler
20897970c5cSAxel Dörfler
209b2d5d0deSAxel Dörflerinline void
210b2d5d0deSAxel DörflerBListView::ScrollTo(float x, float y)
211b2d5d0deSAxel Dörfler{
212b2d5d0deSAxel Dörfler	ScrollTo(BPoint(x, y));
213b2d5d0deSAxel Dörfler}
2150a5897b7SStephan Aßmus#endif // _LIST_VIEW_H