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