xref: /haiku/src/apps/mediaplayer/playlist/ListViews.h (revision 2222d0559df303a9846a2fad53741f8b20b14d7c)
1 /*
2  * Copyright 2006-2007, Haiku. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 #ifndef LIST_VIEWS_H
9 #define LIST_VIEWS_H
10 
11 #include <ListItem.h>
12 #include <ListView.h>
13 #include <Message.h>
14 
15 enum {
16 	FLAGS_NONE			= 0x00,
17 	FLAGS_TINTED_LINE	= 0x01,
18 	FLAGS_FOCUSED		= 0x02,
19 };
20 
21 // portion of the listviews height that triggers autoscrolling
22 // when the mouse is over it with a dragmessage
23 #define SCROLL_AREA			0.1
24 
25 class BMessageRunner;
26 class BMessageFilter;
27 class InterfaceWindow;
28 class BScrollView;
29 
30 // SimpleItem
31 class SimpleItem : public BStringItem {
32  public:
33 							SimpleItem(const char* name);
34 		virtual				~SimpleItem();
35 
36 		virtual	void		Draw(BView* owner, BRect frame,
37 								 uint32 flags);
38 		virtual	void		DrawBackground(BView* owner, BRect frame,
39 								  uint32 flags);
40 };
41 
42 // DragSortableListView
43 class DragSortableListView : public BListView {
44  public:
45 							DragSortableListView(BRect frame, const char* name,
46 								list_view_type type = B_SINGLE_SELECTION_LIST,
47 								uint32 resizingMode = B_FOLLOW_LEFT
48 									| B_FOLLOW_TOP,
49 								uint32 flags = B_WILL_DRAW | B_NAVIGABLE
50 									| B_FRAME_EVENTS);
51 	virtual					~DragSortableListView();
52 
53 	// BListView interface
54 	virtual	void			AttachedToWindow();
55 	virtual	void			DetachedFromWindow();
56 	virtual	void			FrameResized(float width, float height);
57 	virtual	void			Draw(BRect updateRect);
58 	virtual	void			ScrollTo(BPoint where);
59 	virtual	void			TargetedByScrollView(BScrollView* scrollView);
60 	virtual	bool			InitiateDrag(BPoint point, int32 index,
61 										 bool wasSelected);
62 	virtual void			MessageReceived(BMessage* message);
63 	virtual	void			KeyDown(const char* bytes, int32 numBytes);
64 	virtual	void			MouseDown(BPoint where);
65 	virtual void			MouseMoved(BPoint where, uint32 transit,
66 									   const BMessage* dragMessage);
67 	virtual void			MouseUp(BPoint where);
68 	virtual	void			WindowActivated(bool active);
69 	virtual void			DrawItem(BListItem *item, BRect itemFrame,
70 									 bool complete = false);
71 
72 	// DragSortableListView
73 	virtual	void			SetDragCommand(uint32 command);
74 	virtual	void			ModifiersChanged();	// called by window
75 	virtual	void			DoubleClicked(int32 index) {}
76 
77 	virtual	void			SetItemFocused(int32 index);
78 
79 	virtual	bool			AcceptDragMessage(const BMessage* message) const;
80 	virtual	void			SetDropTargetRect(const BMessage* message,
81 											  BPoint where);
82 
83 	// autoscrolling
84 			void			SetAutoScrolling(bool enable);
85 			bool			DoesAutoScrolling() const;
86 			BScrollView*	ScrollView() const
87 								{ return fScrollView; }
88 			void			ScrollTo(int32 index);
89 
90 			bool			MouseWheelChanged(float x, float y);
91 
92 	virtual	void			MoveItems(const BList& indices, int32 toIndex);
93 	virtual	void			CopyItems(const BList& indices, int32 toIndex);
94 	virtual	void			RemoveItemList(const BList& indices);
95 
96 			void			GetSelectedItems(BList& indices);
97 			void			RemoveSelected(); // uses RemoveItemList()
98 			void			RemoveAll(); // uses RemoveItemList()
99 			int32			CountSelectedItems() const;
100 			void			SelectAll();
101 	virtual	bool			DeleteItem(int32 index);
102 
103 	virtual	BListItem*		CloneItem(int32 atIndex) const = 0;
104 	virtual	void			DrawListItem(BView* owner, int32 index,
105 										 BRect itemFrame) const = 0;
106 	virtual	void			MakeDragMessage(BMessage* message) const = 0;
107 
108  private:
109 			void			_RemoveDropAnticipationRect();
110 			void			_SetDragMessage(const BMessage* message);
111 
112 	BRect					fDropRect;
113 	BMessage				fDragMessageCopy;
114 	BMessageRunner*			fScrollPulse;
115 	BPoint					fLastMousePos;
116 
117  protected:
118 			void			_SetDropAnticipationRect(BRect r);
119 			void			_SetDropIndex(int32 index);
120 
121 	int32					fDropIndex;
122 	BListItem*				fLastClickedItem;
123 	BScrollView*			fScrollView;
124 	uint32					fDragCommand;
125 	int32					fFocusedIndex;
126 };
127 
128 // SimpleListView
129 class SimpleListView : public DragSortableListView {
130  public:
131 							SimpleListView(BRect frame,
132 								BMessage* selectionChangeMessage = NULL);
133 							SimpleListView(BRect frame, const char* name,
134 								BMessage* selectionChangeMessage = NULL,
135 								list_view_type type = B_MULTIPLE_SELECTION_LIST,
136 								uint32 resizingMode = B_FOLLOW_ALL_SIDES,
137 								uint32 flags = B_WILL_DRAW | B_NAVIGABLE
138 									| B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE);
139 							~SimpleListView();
140 
141 	// DragSortableListView interface
142 	virtual void			MessageReceived(BMessage* message);
143 	virtual	void			SelectionChanged();
144 
145 	virtual	BListItem*		CloneItem(int32 atIndex) const;
146 	virtual	void			DrawListItem(BView* owner, int32 index,
147 										 BRect itemFrame) const;
148 	virtual	void			MakeDragMessage(BMessage* message) const;
149 
150  private:
151 
152 	BMessage*				fSelectionChangeMessage;
153 };
154 
155 #endif // LIST_VIEWS_H
156