xref: /haiku/src/apps/debuganalyzer/gui/ListSelectionModel.h (revision 63481b10d3fbbc39c40a71af242f21ae42eb2cd4)
1446ac6d7SIngo Weinhold /*
2446ac6d7SIngo Weinhold  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3446ac6d7SIngo Weinhold  * Distributed under the terms of the MIT License.
4446ac6d7SIngo Weinhold  */
5446ac6d7SIngo Weinhold #ifndef LIST_SELECTION_MODEL_H
6446ac6d7SIngo Weinhold #define LIST_SELECTION_MODEL_H
7446ac6d7SIngo Weinhold 
8446ac6d7SIngo Weinhold 
9446ac6d7SIngo Weinhold #include <SupportDefs.h>
10446ac6d7SIngo Weinhold 
11446ac6d7SIngo Weinhold #include <ObjectList.h>
12446ac6d7SIngo Weinhold 
13446ac6d7SIngo Weinhold #include "../debugger/util/Array.h"
14446ac6d7SIngo Weinhold 
15446ac6d7SIngo Weinhold 
16446ac6d7SIngo Weinhold class ListSelectionModel {
17446ac6d7SIngo Weinhold public:
18446ac6d7SIngo Weinhold 			class Listener;
19446ac6d7SIngo Weinhold 
20446ac6d7SIngo Weinhold public:
21446ac6d7SIngo Weinhold 								ListSelectionModel();
22*63481b10SIngo Weinhold 								ListSelectionModel(
23*63481b10SIngo Weinhold 									const ListSelectionModel& other);
24446ac6d7SIngo Weinhold 								~ListSelectionModel();
25446ac6d7SIngo Weinhold 
26446ac6d7SIngo Weinhold 			int32				CountSelectedItems() const
27446ac6d7SIngo Weinhold 									{ return fSelectedItems.Count(); }
28446ac6d7SIngo Weinhold 			int32				SelectedItemAt(int32 index) const;
29446ac6d7SIngo Weinhold 			bool				IsItemSelected(int32 itemIndex) const;
30446ac6d7SIngo Weinhold 
31446ac6d7SIngo Weinhold 			void				Clear();
32446ac6d7SIngo Weinhold 			bool				SelectItem(int32 itemIndex,
33446ac6d7SIngo Weinhold 									bool extendSelection);
34446ac6d7SIngo Weinhold 			bool				SelectItems(int32 itemIndex, int32 count,
35446ac6d7SIngo Weinhold 									bool extendSelection);
36446ac6d7SIngo Weinhold 			void				DeselectItem(int32 itemIndex);
37446ac6d7SIngo Weinhold 			void				DeselectItems(int32 itemIndex, int32 count);
38446ac6d7SIngo Weinhold 
39446ac6d7SIngo Weinhold 			void				ItemsAdded(int32 itemIndex, int32 count);
40446ac6d7SIngo Weinhold 			void				ItemsRemoved(int32 itemIndex, int32 count);
41446ac6d7SIngo Weinhold 
42446ac6d7SIngo Weinhold 			bool				AddListener(Listener* listener);
43446ac6d7SIngo Weinhold 			void				RemoveListener(Listener* listener);
44446ac6d7SIngo Weinhold 
45*63481b10SIngo Weinhold 			ListSelectionModel&	operator=(const ListSelectionModel& other);
46*63481b10SIngo Weinhold 
47446ac6d7SIngo Weinhold private:
48446ac6d7SIngo Weinhold 			typedef BObjectList<Listener> ListenerList;
49446ac6d7SIngo Weinhold 
50446ac6d7SIngo Weinhold private:
51446ac6d7SIngo Weinhold 			int32				_FindItem(int32 itemIndex) const;
52446ac6d7SIngo Weinhold 			int32				_CountSelectedItemsInRange(int32 index,
53446ac6d7SIngo Weinhold 									int32 endItemIndex) const;
54446ac6d7SIngo Weinhold 
55446ac6d7SIngo Weinhold 			void				_NotifyItemsSelected(int32 index, int32 count);
56446ac6d7SIngo Weinhold 			void				_NotifyItemsDeselected(int32 index,
57446ac6d7SIngo Weinhold 									int32 count);
58446ac6d7SIngo Weinhold 
59446ac6d7SIngo Weinhold private:
60446ac6d7SIngo Weinhold 			Array<int32>		fSelectedItems;
61446ac6d7SIngo Weinhold 			ListenerList		fListeners;
62446ac6d7SIngo Weinhold };
63446ac6d7SIngo Weinhold 
64446ac6d7SIngo Weinhold 
65446ac6d7SIngo Weinhold class ListSelectionModel::Listener {
66446ac6d7SIngo Weinhold public:
67446ac6d7SIngo Weinhold 	virtual						~Listener();
68446ac6d7SIngo Weinhold 
69446ac6d7SIngo Weinhold 	virtual	void				ItemsSelected(ListSelectionModel* model,
70446ac6d7SIngo Weinhold 									int32 index, int32 count);
71446ac6d7SIngo Weinhold 	virtual	void				ItemsDeselected(ListSelectionModel* model,
72446ac6d7SIngo Weinhold 									int32 index, int32 count);
73446ac6d7SIngo Weinhold };
74446ac6d7SIngo Weinhold 
75446ac6d7SIngo Weinhold 
76446ac6d7SIngo Weinhold inline bool
77446ac6d7SIngo Weinhold ListSelectionModel::IsItemSelected(int32 itemIndex) const
78446ac6d7SIngo Weinhold {
79446ac6d7SIngo Weinhold 	int32 index = _FindItem(itemIndex);
80446ac6d7SIngo Weinhold 	return index < fSelectedItems.Count() && fSelectedItems[index] == itemIndex;
81446ac6d7SIngo Weinhold }
82446ac6d7SIngo Weinhold 
83446ac6d7SIngo Weinhold 
84446ac6d7SIngo Weinhold inline int32
85446ac6d7SIngo Weinhold ListSelectionModel::SelectedItemAt(int32 index) const
86446ac6d7SIngo Weinhold {
87446ac6d7SIngo Weinhold 	return index >= 0 && index < fSelectedItems.Count()
88446ac6d7SIngo Weinhold 		? fSelectedItems[index] : -1;
89446ac6d7SIngo Weinhold }
90446ac6d7SIngo Weinhold 
91446ac6d7SIngo Weinhold 
92446ac6d7SIngo Weinhold inline bool
93446ac6d7SIngo Weinhold ListSelectionModel::SelectItem(int32 itemIndex, bool extendSelection)
94446ac6d7SIngo Weinhold {
95446ac6d7SIngo Weinhold 	return SelectItems(itemIndex, 1, extendSelection);
96446ac6d7SIngo Weinhold }
97446ac6d7SIngo Weinhold 
98446ac6d7SIngo Weinhold 
99446ac6d7SIngo Weinhold inline void
100446ac6d7SIngo Weinhold ListSelectionModel::DeselectItem(int32 itemIndex)
101446ac6d7SIngo Weinhold {
102446ac6d7SIngo Weinhold 	DeselectItems(itemIndex, 1);
103446ac6d7SIngo Weinhold }
104446ac6d7SIngo Weinhold 
105446ac6d7SIngo Weinhold 
106446ac6d7SIngo Weinhold #endif	// LIST_SELECTION_MODEL_H
107