xref: /haiku/src/apps/icon-o-matic/generic/gui/ListViews.h (revision f99596f4e35e2a977680980c64249f56153ea0a2)
1128277c9SStephan Aßmus /*
24b0dffe5SZardshard  * 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>
74b0dffe5SZardshard  *		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 
17128277c9SStephan Aßmus #include "MouseWheelFilter.h"
180e1ba39fSStephan Aßmus #include "Observer.h"
19128277c9SStephan Aßmus 
20128277c9SStephan Aßmus // portion of the listviews height that triggers autoscrolling
21128277c9SStephan Aßmus // when the mouse is over it with a dragmessage
22128277c9SStephan Aßmus #define SCROLL_AREA			0.1
23128277c9SStephan Aßmus 
24128277c9SStephan Aßmus class BMessageFilter;
250e1ba39fSStephan Aßmus class BMessageRunner;
26128277c9SStephan Aßmus class BScrollView;
270e1ba39fSStephan Aßmus class Selectable;
280e1ba39fSStephan Aßmus class Selection;
29128277c9SStephan Aßmus 
30128277c9SStephan Aßmus // SimpleItem
31128277c9SStephan Aßmus class SimpleItem : public BStringItem
32128277c9SStephan Aßmus {
33128277c9SStephan Aßmus  public:
34128277c9SStephan Aßmus 							SimpleItem(const char* name);
35128277c9SStephan Aßmus 		virtual				~SimpleItem();
36128277c9SStephan Aßmus 
37*f99596f4SJohn Scipione 		virtual	void		DrawItem(BView*, BRect, bool even = false);
38*f99596f4SJohn Scipione 		virtual	void		DrawBackground(BView*, BRect, bool even);
39128277c9SStephan Aßmus };
40128277c9SStephan Aßmus 
41be84a3d6SJohn Scipione 
42be84a3d6SJohn Scipione class DragSortableListView : public BListView,
43be84a3d6SJohn Scipione 	public MouseWheelTarget, public Observer {
44128277c9SStephan Aßmus  public:
45128277c9SStephan Aßmus 							DragSortableListView(BRect frame,
46128277c9SStephan Aßmus 								const char* name,
47be84a3d6SJohn Scipione 								list_view_type type = B_SINGLE_SELECTION_LIST,
48128277c9SStephan Aßmus 								uint32 resizingMode
49be84a3d6SJohn Scipione 									= B_FOLLOW_LEFT | B_FOLLOW_TOP,
50be84a3d6SJohn Scipione 								uint32 flags = B_WILL_DRAW | B_NAVIGABLE
51128277c9SStephan Aßmus 									| B_FRAME_EVENTS);
52128277c9SStephan Aßmus 	virtual					~DragSortableListView();
53128277c9SStephan Aßmus 
540e1ba39fSStephan Aßmus 	// BListView interface
55128277c9SStephan Aßmus 	virtual	void			AttachedToWindow();
56128277c9SStephan Aßmus 	virtual	void			DetachedFromWindow();
57128277c9SStephan Aßmus 	virtual	void			FrameResized(float width, float height);
58128277c9SStephan Aßmus //	virtual	void			MakeFocus(bool focused);
59*f99596f4SJohn Scipione 	virtual	void			TargetedByScrollView(BScrollView*);
60128277c9SStephan Aßmus 	virtual void			MessageReceived(BMessage* message);
61128277c9SStephan Aßmus 	virtual	void			KeyDown(const char* bytes, int32 numBytes);
62128277c9SStephan Aßmus 	virtual	void			MouseDown(BPoint where);
63*f99596f4SJohn Scipione 	virtual void			MouseMoved(BPoint where, uint32, const BMessage*);
64128277c9SStephan Aßmus 	virtual void			MouseUp(BPoint where);
65128277c9SStephan Aßmus 	virtual	void			WindowActivated(bool active);
66128277c9SStephan Aßmus 
670e1ba39fSStephan Aßmus 	// MouseWheelTarget interface
68128277c9SStephan Aßmus 	virtual	bool			MouseWheelChanged(float x, float y);
69128277c9SStephan Aßmus 
700e1ba39fSStephan Aßmus 	// Observer interface (watching Selection)
710e1ba39fSStephan Aßmus 	virtual	void			ObjectChanged(const Observable* object);
720e1ba39fSStephan Aßmus 
73128277c9SStephan Aßmus 	// DragSortableListView
74128277c9SStephan Aßmus 	virtual	void			SetDragCommand(uint32 command);
75128277c9SStephan Aßmus 	virtual	void			ModifiersChanged();	// called by window
DoubleClicked(int32 index)76128277c9SStephan Aßmus 	virtual	void			DoubleClicked(int32 index) {}
77128277c9SStephan Aßmus 
78128277c9SStephan Aßmus 	virtual	void			SetItemFocused(int32 index);
79128277c9SStephan Aßmus 
80128277c9SStephan Aßmus 	virtual	bool			AcceptDragMessage(const BMessage* message) const;
81f0eab45bSStephan Aßmus 	virtual	bool			HandleDropMessage(const BMessage* message,
82f0eab45bSStephan Aßmus 								int32 dropIndex);
83128277c9SStephan Aßmus 	virtual	void			SetDropTargetRect(const BMessage* message,
84128277c9SStephan Aßmus 								BPoint where);
85128277c9SStephan Aßmus 
86128277c9SStephan Aßmus 			bool			DoesAutoScrolling() const;
ScrollView()87128277c9SStephan Aßmus 			BScrollView*	ScrollView() const
88128277c9SStephan Aßmus 								{ return fScrollView; }
89128277c9SStephan Aßmus 
90128277c9SStephan Aßmus 	virtual	void			MoveItems(BList& items, int32 toIndex);
91128277c9SStephan Aßmus 	virtual	void			CopyItems(BList& items, int32 toIndex);
92128277c9SStephan Aßmus 	virtual	void			RemoveItemList(BList& indices);
93128277c9SStephan Aßmus 			void			RemoveSelected(); // uses RemoveItemList()
94128277c9SStephan Aßmus 	virtual	bool			DeleteItem(int32 index);
95128277c9SStephan Aßmus 
960e1ba39fSStephan Aßmus 							// selection
970e1ba39fSStephan Aßmus 			void			SetSelection(Selection* selection);
980e1ba39fSStephan Aßmus 
990e1ba39fSStephan Aßmus 	virtual	int32			IndexOfSelectable(Selectable* selectable) const;
1000e1ba39fSStephan Aßmus 	virtual	Selectable*		SelectableFor(BListItem* item) const;
1010e1ba39fSStephan Aßmus 
1020e1ba39fSStephan Aßmus 			void			SetDeselectAllInGlobalSelection(bool deselect);
1030e1ba39fSStephan Aßmus 
1040e1ba39fSStephan Aßmus 			void			SelectAll();
1050e1ba39fSStephan Aßmus 			int32			CountSelectedItems() const;
1060e1ba39fSStephan Aßmus 	virtual	void			SelectionChanged();
1070e1ba39fSStephan Aßmus 
108128277c9SStephan Aßmus 	virtual	BListItem*		CloneItem(int32 atIndex) const = 0;
109128277c9SStephan Aßmus 	virtual	void			MakeDragMessage(BMessage* message) const = 0;
110128277c9SStephan Aßmus 
111be84a3d6SJohn Scipione  protected:
112be84a3d6SJohn Scipione 			void			InvalidateDropRect();
113be84a3d6SJohn Scipione 			void			SetDragMessage(const BMessage* message);
114128277c9SStephan Aßmus 
115128277c9SStephan Aßmus 	BRect					fDropRect;
116128277c9SStephan Aßmus 	BMessage				fDragMessageCopy;
117128277c9SStephan Aßmus 	BMessageFilter*			fMouseWheelFilter;
118128277c9SStephan Aßmus 	BMessageRunner*			fScrollPulse;
119128277c9SStephan Aßmus 	BPoint					fLastMousePos;
120128277c9SStephan Aßmus 
121128277c9SStephan Aßmus  protected:
122be84a3d6SJohn Scipione 			void			SetDropRect(BRect rect);
123be84a3d6SJohn Scipione 			void			SetDropIndex(int32 index);
124128277c9SStephan Aßmus 
125128277c9SStephan Aßmus 	int32					fDropIndex;
126128277c9SStephan Aßmus 	BListItem*				fLastClickedItem;
127128277c9SStephan Aßmus 	BScrollView*			fScrollView;
128128277c9SStephan Aßmus 	uint32					fDragCommand;
129128277c9SStephan Aßmus 	int32					fFocusedIndex;
1300e1ba39fSStephan Aßmus 
1310e1ba39fSStephan Aßmus 	Selection*				fSelection;
1320e1ba39fSStephan Aßmus 	bool					fSyncingToSelection;
1330e1ba39fSStephan Aßmus 	bool					fModifyingSelection;
134128277c9SStephan Aßmus };
135128277c9SStephan Aßmus 
136128277c9SStephan Aßmus // SimpleListView
137be84a3d6SJohn Scipione class SimpleListView : public DragSortableListView {
138128277c9SStephan Aßmus  public:
139128277c9SStephan Aßmus 							SimpleListView(BRect frame,
140be84a3d6SJohn Scipione 								BMessage* selectionChanged = NULL);
141be84a3d6SJohn Scipione 							SimpleListView(BRect frame, const char* name,
142be84a3d6SJohn Scipione 								BMessage* selectionChanged = NULL,
143128277c9SStephan Aßmus 								list_view_type type
144128277c9SStephan Aßmus 									= B_MULTIPLE_SELECTION_LIST,
145be84a3d6SJohn Scipione 								uint32 resizingMode = B_FOLLOW_ALL_SIDES,
146be84a3d6SJohn Scipione 								uint32 flags = B_WILL_DRAW | B_NAVIGABLE
147128277c9SStephan Aßmus 									| B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE);
148128277c9SStephan Aßmus 							~SimpleListView();
149128277c9SStephan Aßmus 
150128277c9SStephan Aßmus 							// BListView
1510e1ba39fSStephan Aßmus 	virtual	void			DetachedFromWindow();
152*f99596f4SJohn Scipione 	virtual	void			Draw(BRect updateRect);
153*f99596f4SJohn Scipione 	virtual	bool			InitiateDrag(BPoint, int32, bool);
154128277c9SStephan Aßmus 	virtual void			MessageReceived(BMessage* message);
155128277c9SStephan Aßmus 
156128277c9SStephan Aßmus 	virtual	BListItem*		CloneItem(int32 atIndex) const;
1574b0dffe5SZardshard 
1584b0dffe5SZardshard 	/*! Archive the selected items.
1594b0dffe5SZardshard 		The information should be sufficient for \c InstantiateSelection to
1604b0dffe5SZardshard 		create a new copy of the objects without relying on the original object.
1614b0dffe5SZardshard 	*/
162be84a3d6SJohn Scipione 	virtual	status_t		ArchiveSelection(BMessage*, bool = true) const = 0;
1634b0dffe5SZardshard 	/*! Put a copy of the items archived by \c ArchiveSelection into the list.
1644b0dffe5SZardshard 		This method should ensure whether the item is truly meant for the list
1654b0dffe5SZardshard 		view.
1664b0dffe5SZardshard 	*/
167be84a3d6SJohn Scipione 	virtual	bool			InstantiateSelection(const BMessage*, int32) = 0;
1684b0dffe5SZardshard 
169128277c9SStephan Aßmus 	virtual	void			MakeDragMessage(BMessage* message) const;
1704b0dffe5SZardshard 	virtual	bool			HandleDropMessage(const BMessage* message,
1714b0dffe5SZardshard 								int32 dropIndex);
1724b0dffe5SZardshard 			bool			HandlePaste(const BMessage* archive);
173128277c9SStephan Aßmus 
174bab183a2SStephan Aßmus  protected:
175bab183a2SStephan Aßmus 			void			_MakeEmpty();
176bab183a2SStephan Aßmus 
177128277c9SStephan Aßmus  private:
178128277c9SStephan Aßmus 
179128277c9SStephan Aßmus 	BMessage*				fSelectionChangeMessage;
180128277c9SStephan Aßmus };
181128277c9SStephan Aßmus 
182128277c9SStephan Aßmus #endif // LIST_VIEWS_H
183