1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef LIST_SELECTION_MODEL_H
6#define LIST_SELECTION_MODEL_H
7
8
9#include <SupportDefs.h>
10
11#include <Array.h>
12#include <ObjectList.h>
13
14
15class ListSelectionModel {
16public:
17			class Listener;
18
19public:
20								ListSelectionModel();
21								ListSelectionModel(
22									const ListSelectionModel& other);
23								~ListSelectionModel();
24
25			int32				CountSelectedItems() const
26									{ return fSelectedItems.Count(); }
27			int32				SelectedItemAt(int32 index) const;
28			bool				IsItemSelected(int32 itemIndex) const;
29
30			void				Clear();
31			bool				SelectItem(int32 itemIndex,
32									bool extendSelection);
33			bool				SelectItems(int32 itemIndex, int32 count,
34									bool extendSelection);
35			void				DeselectItem(int32 itemIndex);
36			void				DeselectItems(int32 itemIndex, int32 count);
37
38			void				ItemsAdded(int32 itemIndex, int32 count);
39			void				ItemsRemoved(int32 itemIndex, int32 count);
40
41			bool				AddListener(Listener* listener);
42			void				RemoveListener(Listener* listener);
43
44			ListSelectionModel&	operator=(const ListSelectionModel& other);
45
46private:
47			typedef BObjectList<Listener> ListenerList;
48
49private:
50			int32				_FindItem(int32 itemIndex) const;
51			int32				_CountSelectedItemsInRange(int32 index,
52									int32 endItemIndex) const;
53
54			void				_NotifyItemsSelected(int32 index, int32 count);
55			void				_NotifyItemsDeselected(int32 index,
56									int32 count);
57
58private:
59			Array<int32>		fSelectedItems;
60			ListenerList		fListeners;
61};
62
63
64class ListSelectionModel::Listener {
65public:
66	virtual						~Listener();
67
68	virtual	void				ItemsSelected(ListSelectionModel* model,
69									int32 index, int32 count);
70	virtual	void				ItemsDeselected(ListSelectionModel* model,
71									int32 index, int32 count);
72};
73
74
75inline bool
76ListSelectionModel::IsItemSelected(int32 itemIndex) const
77{
78	int32 index = _FindItem(itemIndex);
79	return index < fSelectedItems.Count() && fSelectedItems[index] == itemIndex;
80}
81
82
83inline int32
84ListSelectionModel::SelectedItemAt(int32 index) const
85{
86	return index >= 0 && index < fSelectedItems.Count()
87		? fSelectedItems[index] : -1;
88}
89
90
91inline bool
92ListSelectionModel::SelectItem(int32 itemIndex, bool extendSelection)
93{
94	return SelectItems(itemIndex, 1, extendSelection);
95}
96
97
98inline void
99ListSelectionModel::DeselectItem(int32 itemIndex)
100{
101	DeselectItems(itemIndex, 1);
102}
103
104
105#endif	// LIST_SELECTION_MODEL_H
106