* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#ifndef LIST_SELECTION_MODEL_H
#define LIST_SELECTION_MODEL_H
#include <SupportDefs.h>
#include <Array.h>
#include <ObjectList.h>
class ListSelectionModel {
public:
class Listener;
public:
ListSelectionModel();
ListSelectionModel(
const ListSelectionModel& other);
~ListSelectionModel();
int32 CountSelectedItems() const
{ return fSelectedItems.Count(); }
int32 SelectedItemAt(int32 index) const;
bool IsItemSelected(int32 itemIndex) const;
void Clear();
bool SelectItem(int32 itemIndex,
bool extendSelection);
bool SelectItems(int32 itemIndex, int32 count,
bool extendSelection);
void DeselectItem(int32 itemIndex);
void DeselectItems(int32 itemIndex, int32 count);
void ItemsAdded(int32 itemIndex, int32 count);
void ItemsRemoved(int32 itemIndex, int32 count);
bool AddListener(Listener* listener);
void RemoveListener(Listener* listener);
ListSelectionModel& operator=(const ListSelectionModel& other);
private:
typedef BObjectList<Listener> ListenerList;
private:
int32 _FindItem(int32 itemIndex) const;
int32 _CountSelectedItemsInRange(int32 index,
int32 endItemIndex) const;
void _NotifyItemsSelected(int32 index, int32 count);
void _NotifyItemsDeselected(int32 index,
int32 count);
private:
Array<int32> fSelectedItems;
ListenerList fListeners;
};
class ListSelectionModel::Listener {
public:
virtual ~Listener();
virtual void ItemsSelected(ListSelectionModel* model,
int32 index, int32 count);
virtual void ItemsDeselected(ListSelectionModel* model,
int32 index, int32 count);
};
inline bool
ListSelectionModel::IsItemSelected(int32 itemIndex) const
{
int32 index = _FindItem(itemIndex);
return index < fSelectedItems.Count() && fSelectedItems[index] == itemIndex;
}
inline int32
ListSelectionModel::SelectedItemAt(int32 index) const
{
return index >= 0 && index < fSelectedItems.Count()
? fSelectedItems[index] : -1;
}
inline bool
ListSelectionModel::SelectItem(int32 itemIndex, bool extendSelection)
{
return SelectItems(itemIndex, 1, extendSelection);
}
inline void
ListSelectionModel::DeselectItem(int32 itemIndex)
{
DeselectItems(itemIndex, 1);
}
#endif