xref: /haiku/src/apps/icon-o-matic/generic/gui/ListViews.h (revision 4b0dffe500671f2cbf8dd203fb610ef6323cb123)
1128277c9SStephan Aßmus /*
2*4b0dffe5SZardshard  * Copyright 2006, 2023, Haiku.
3128277c9SStephan Aßmus  * Distributed under the terms of the MIT License.
4128277c9SStephan Aßmus  *
5128277c9SStephan Aßmus  * Authors:
6128277c9SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7*4b0dffe5SZardshard  *		Zardshard
8128277c9SStephan Aßmus  */
9128277c9SStephan Aßmus 
10128277c9SStephan Aßmus #ifndef LIST_VIEWS_H
11128277c9SStephan Aßmus #define LIST_VIEWS_H
12128277c9SStephan Aßmus 
13128277c9SStephan Aßmus #include <ListItem.h>
14128277c9SStephan Aßmus #include <ListView.h>
15128277c9SStephan Aßmus #include <Message.h>
16128277c9SStephan Aßmus 
17cfda5dd7SStephan Aßmus #ifdef LIB_LAYOUT
18128277c9SStephan Aßmus #  include <layout.h>
19cfda5dd7SStephan Aßmus #endif
20128277c9SStephan Aßmus 
21128277c9SStephan Aßmus #include "MouseWheelFilter.h"
220e1ba39fSStephan Aßmus #include "Observer.h"
23128277c9SStephan Aßmus 
24128277c9SStephan Aßmus enum
25128277c9SStephan Aßmus {
26128277c9SStephan Aßmus 	FLAGS_NONE			= 0x00,
27128277c9SStephan Aßmus 	FLAGS_TINTED_LINE	= 0x01,
28128277c9SStephan Aßmus 	FLAGS_FOCUSED		= 0x02,
29128277c9SStephan Aßmus };
30128277c9SStephan Aßmus 
31128277c9SStephan Aßmus // portion of the listviews height that triggers autoscrolling
32128277c9SStephan Aßmus // when the mouse is over it with a dragmessage
33128277c9SStephan Aßmus #define SCROLL_AREA			0.1
34128277c9SStephan Aßmus 
35128277c9SStephan Aßmus class BMessageFilter;
360e1ba39fSStephan Aßmus class BMessageRunner;
37128277c9SStephan Aßmus class BScrollView;
380e1ba39fSStephan Aßmus class Selectable;
390e1ba39fSStephan Aßmus class Selection;
40128277c9SStephan Aßmus 
41128277c9SStephan Aßmus // SimpleItem
42128277c9SStephan Aßmus class SimpleItem : public BStringItem
43128277c9SStephan Aßmus {
44128277c9SStephan Aßmus  public:
45128277c9SStephan Aßmus 							SimpleItem(const char* name);
46128277c9SStephan Aßmus 		virtual				~SimpleItem();
47128277c9SStephan Aßmus 
48128277c9SStephan Aßmus 		virtual	void		Draw(BView* owner, BRect frame,
49128277c9SStephan Aßmus 								 uint32 flags);
50128277c9SStephan Aßmus 		virtual	void		DrawBackground(BView* owner, BRect frame,
51128277c9SStephan Aßmus 								  uint32 flags);
52128277c9SStephan Aßmus 
53128277c9SStephan Aßmus 							// let the item know what's going on
54128277c9SStephan Aßmus /*		virtual	void		AttachedToListView(SimpleListView* owner);
55128277c9SStephan Aßmus 		virtual	void		DetachedFromListView(SimpleListView* owner);
56128277c9SStephan Aßmus 
57128277c9SStephan Aßmus 		virtual	void		SetItemFrame(BRect frame);*/
58128277c9SStephan Aßmus 
59128277c9SStephan Aßmus  private:
60128277c9SStephan Aßmus 
61128277c9SStephan Aßmus };
62128277c9SStephan Aßmus 
63128277c9SStephan Aßmus // DragSortableListView
64128277c9SStephan Aßmus class DragSortableListView : public MouseWheelTarget,
650e1ba39fSStephan Aßmus 							 public BListView,
660e1ba39fSStephan Aßmus 							 public Observer {
67128277c9SStephan Aßmus  public:
68128277c9SStephan Aßmus 							DragSortableListView(BRect frame,
69128277c9SStephan Aßmus 												 const char* name,
70128277c9SStephan Aßmus 												 list_view_type type
71128277c9SStephan Aßmus 														= B_SINGLE_SELECTION_LIST,
72128277c9SStephan Aßmus 												 uint32 resizingMode
73128277c9SStephan Aßmus 														= B_FOLLOW_LEFT
74128277c9SStephan Aßmus 														  | B_FOLLOW_TOP,
75128277c9SStephan Aßmus 												 uint32 flags
76128277c9SStephan Aßmus 														= B_WILL_DRAW
77128277c9SStephan Aßmus 														  | B_NAVIGABLE
78128277c9SStephan Aßmus 														  | B_FRAME_EVENTS);
79128277c9SStephan Aßmus 	virtual					~DragSortableListView();
80128277c9SStephan Aßmus 
810e1ba39fSStephan Aßmus 	// BListView interface
82128277c9SStephan Aßmus 	virtual	void			AttachedToWindow();
83128277c9SStephan Aßmus 	virtual	void			DetachedFromWindow();
84128277c9SStephan Aßmus 	virtual	void			FrameResized(float width, float height);
85128277c9SStephan Aßmus //	virtual	void			MakeFocus(bool focused);
86128277c9SStephan Aßmus 	virtual	void			Draw(BRect updateRect);
87128277c9SStephan Aßmus 	virtual	void			ScrollTo(BPoint where);
88128277c9SStephan Aßmus 	virtual	void			TargetedByScrollView(BScrollView* scrollView);
89128277c9SStephan Aßmus 	virtual	bool			InitiateDrag(BPoint point, int32 index,
90128277c9SStephan Aßmus 										 bool wasSelected);
91128277c9SStephan Aßmus 	virtual void			MessageReceived(BMessage* message);
92128277c9SStephan Aßmus 	virtual	void			KeyDown(const char* bytes, int32 numBytes);
93128277c9SStephan Aßmus 	virtual	void			MouseDown(BPoint where);
94128277c9SStephan Aßmus 	virtual void			MouseMoved(BPoint where, uint32 transit,
95128277c9SStephan Aßmus 									   const BMessage* dragMessage);
96128277c9SStephan Aßmus 	virtual void			MouseUp(BPoint where);
97128277c9SStephan Aßmus 	virtual	void			WindowActivated(bool active);
98128277c9SStephan Aßmus 	virtual void			DrawItem(BListItem *item, BRect itemFrame,
99128277c9SStephan Aßmus 									 bool complete = false);
100128277c9SStephan Aßmus 
1010e1ba39fSStephan Aßmus 	// MouseWheelTarget interface
102128277c9SStephan Aßmus 	virtual	bool			MouseWheelChanged(float x, float y);
103128277c9SStephan Aßmus 
1040e1ba39fSStephan Aßmus 	// Observer interface (watching Selection)
1050e1ba39fSStephan Aßmus 	virtual	void			ObjectChanged(const Observable* object);
1060e1ba39fSStephan Aßmus 
107128277c9SStephan Aßmus 	// DragSortableListView
108128277c9SStephan Aßmus 	virtual	void			SetDragCommand(uint32 command);
109128277c9SStephan Aßmus 	virtual	void			ModifiersChanged();	// called by window
110128277c9SStephan Aßmus 	virtual	void			DoubleClicked(int32 index) {}
111128277c9SStephan Aßmus 
112128277c9SStephan Aßmus 	virtual	void			SetItemFocused(int32 index);
113128277c9SStephan Aßmus 
114128277c9SStephan Aßmus 	virtual	bool			AcceptDragMessage(const BMessage* message) const;
115f0eab45bSStephan Aßmus 	virtual	bool			HandleDropMessage(const BMessage* message,
116f0eab45bSStephan Aßmus 								int32 dropIndex);
117128277c9SStephan Aßmus 	virtual	void			SetDropTargetRect(const BMessage* message,
118128277c9SStephan Aßmus 								BPoint where);
119128277c9SStephan Aßmus 
120128277c9SStephan Aßmus 							// autoscrolling
121128277c9SStephan Aßmus 			void			SetAutoScrolling(bool enable);
122128277c9SStephan Aßmus 			bool			DoesAutoScrolling() const;
123128277c9SStephan Aßmus 			BScrollView*	ScrollView() const
124128277c9SStephan Aßmus 								{ return fScrollView; }
125128277c9SStephan Aßmus 			void			ScrollTo(int32 index);
126128277c9SStephan Aßmus 
127128277c9SStephan Aßmus 	virtual	void			MoveItems(BList& items, int32 toIndex);
128128277c9SStephan Aßmus 	virtual	void			CopyItems(BList& items, int32 toIndex);
129128277c9SStephan Aßmus 	virtual	void			RemoveItemList(BList& indices);
130128277c9SStephan Aßmus 			void			RemoveSelected(); // uses RemoveItemList()
131128277c9SStephan Aßmus 	virtual	bool			DeleteItem(int32 index);
132128277c9SStephan Aßmus 
1330e1ba39fSStephan Aßmus 							// selection
1340e1ba39fSStephan Aßmus 			void			SetSelection(Selection* selection);
1350e1ba39fSStephan Aßmus 
1360e1ba39fSStephan Aßmus 	virtual	int32			IndexOfSelectable(Selectable* selectable) const;
1370e1ba39fSStephan Aßmus 	virtual	Selectable*		SelectableFor(BListItem* item) const;
1380e1ba39fSStephan Aßmus 
1390e1ba39fSStephan Aßmus 			void			SetDeselectAllInGlobalSelection(bool deselect);
1400e1ba39fSStephan Aßmus 
1410e1ba39fSStephan Aßmus 			void			SelectAll();
1420e1ba39fSStephan Aßmus 			int32			CountSelectedItems() const;
1430e1ba39fSStephan Aßmus 	virtual	void			SelectionChanged();
1440e1ba39fSStephan Aßmus 
145128277c9SStephan Aßmus 	virtual	BListItem*		CloneItem(int32 atIndex) const = 0;
146128277c9SStephan Aßmus 	virtual	void			DrawListItem(BView* owner, int32 index,
147128277c9SStephan Aßmus 										 BRect itemFrame) const = 0;
148128277c9SStephan Aßmus 	virtual	void			MakeDragMessage(BMessage* message) const = 0;
149128277c9SStephan Aßmus 
150128277c9SStephan Aßmus  private:
151128277c9SStephan Aßmus 			void			_RemoveDropAnticipationRect();
152128277c9SStephan Aßmus 			void			_SetDragMessage(const BMessage* message);
153128277c9SStephan Aßmus 
154128277c9SStephan Aßmus 	BRect					fDropRect;
155128277c9SStephan Aßmus 	BMessage				fDragMessageCopy;
156128277c9SStephan Aßmus 	BMessageFilter*			fMouseWheelFilter;
157128277c9SStephan Aßmus 	BMessageRunner*			fScrollPulse;
158128277c9SStephan Aßmus 	BPoint					fLastMousePos;
159128277c9SStephan Aßmus 
160128277c9SStephan Aßmus  protected:
161128277c9SStephan Aßmus 			void			_SetDropAnticipationRect(BRect r);
162128277c9SStephan Aßmus 			void			_SetDropIndex(int32 index);
163128277c9SStephan Aßmus 
164128277c9SStephan Aßmus 	int32					fDropIndex;
165128277c9SStephan Aßmus 	BListItem*				fLastClickedItem;
166128277c9SStephan Aßmus 	BScrollView*			fScrollView;
167128277c9SStephan Aßmus 	uint32					fDragCommand;
168128277c9SStephan Aßmus 	int32					fFocusedIndex;
1690e1ba39fSStephan Aßmus 
1700e1ba39fSStephan Aßmus 	Selection*				fSelection;
1710e1ba39fSStephan Aßmus 	bool					fSyncingToSelection;
1720e1ba39fSStephan Aßmus 	bool					fModifyingSelection;
173128277c9SStephan Aßmus };
174128277c9SStephan Aßmus 
175128277c9SStephan Aßmus // SimpleListView
176cfda5dd7SStephan Aßmus class SimpleListView :
177cfda5dd7SStephan Aßmus 					   #ifdef LIB_LAYOUT
178cfda5dd7SStephan Aßmus 					   public MView,
179cfda5dd7SStephan Aßmus 					   #endif
180cfda5dd7SStephan Aßmus 					   public DragSortableListView {
181128277c9SStephan Aßmus  public:
182128277c9SStephan Aßmus 							SimpleListView(BRect frame,
183128277c9SStephan Aßmus 										   BMessage* selectionChangeMessage = NULL);
184128277c9SStephan Aßmus 							SimpleListView(BRect frame,
185128277c9SStephan Aßmus 										   const char* name,
186128277c9SStephan Aßmus 										   BMessage* selectionChangeMessage = NULL,
187128277c9SStephan Aßmus 										   list_view_type type
188128277c9SStephan Aßmus 												= B_MULTIPLE_SELECTION_LIST,
189128277c9SStephan Aßmus 										   uint32 resizingMode
190128277c9SStephan Aßmus 												= B_FOLLOW_ALL_SIDES,
191128277c9SStephan Aßmus 										   uint32 flags
192128277c9SStephan Aßmus 												= B_WILL_DRAW | B_NAVIGABLE
193128277c9SStephan Aßmus 												  | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE);
194128277c9SStephan Aßmus 							~SimpleListView();
195128277c9SStephan Aßmus 
196cfda5dd7SStephan Aßmus 	#ifdef LIB_LAYOUT
197128277c9SStephan Aßmus 							// MView
198128277c9SStephan Aßmus 	virtual	minimax			layoutprefs();
199128277c9SStephan Aßmus 	virtual	BRect			layout(BRect frame);
200cfda5dd7SStephan Aßmus 	#endif
201128277c9SStephan Aßmus 							// BListView
2020e1ba39fSStephan Aßmus 	virtual	void			DetachedFromWindow();
203128277c9SStephan Aßmus 	virtual void			MessageReceived(BMessage* message);
204128277c9SStephan Aßmus 
205128277c9SStephan Aßmus 	virtual	BListItem*		CloneItem(int32 atIndex) const;
206128277c9SStephan Aßmus 	virtual	void			DrawListItem(BView* owner, int32 index,
207128277c9SStephan Aßmus 										 BRect itemFrame) const;
208*4b0dffe5SZardshard 
209*4b0dffe5SZardshard 	/*! Archive the selected items.
210*4b0dffe5SZardshard 		The information should be sufficient for \c InstantiateSelection to
211*4b0dffe5SZardshard 		create a new copy of the objects without relying on the original object.
212*4b0dffe5SZardshard 	*/
213*4b0dffe5SZardshard 	virtual	status_t		ArchiveSelection(BMessage* into, bool deep = true) const = 0;
214*4b0dffe5SZardshard 	/*! Put a copy of the items archived by \c ArchiveSelection into the list.
215*4b0dffe5SZardshard 		This method should ensure whether the item is truly meant for the list
216*4b0dffe5SZardshard 		view.
217*4b0dffe5SZardshard 	*/
218*4b0dffe5SZardshard 	virtual	bool			InstantiateSelection(const BMessage* archive, int32 dropIndex) = 0;
219*4b0dffe5SZardshard 
220128277c9SStephan Aßmus 	virtual	void			MakeDragMessage(BMessage* message) const;
221*4b0dffe5SZardshard 	virtual	bool			HandleDropMessage(const BMessage* message,
222*4b0dffe5SZardshard 								int32 dropIndex);
223*4b0dffe5SZardshard 			bool			HandlePaste(const BMessage* archive);
224128277c9SStephan Aßmus 
225bab183a2SStephan Aßmus  protected:
226bab183a2SStephan Aßmus 			void			_MakeEmpty();
227bab183a2SStephan Aßmus 
228128277c9SStephan Aßmus  private:
229128277c9SStephan Aßmus 
230128277c9SStephan Aßmus 	BMessage*				fSelectionChangeMessage;
231128277c9SStephan Aßmus };
232128277c9SStephan Aßmus 
233128277c9SStephan Aßmus #endif // LIST_VIEWS_H
234