diff options
Diffstat (limited to 'ui/base/models/list_model.h')
-rw-r--r-- | ui/base/models/list_model.h | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/ui/base/models/list_model.h b/ui/base/models/list_model.h new file mode 100644 index 0000000..3634ed1 --- /dev/null +++ b/ui/base/models/list_model.h @@ -0,0 +1,116 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_BASE_MODELS_LIST_MODEL_H_ +#define UI_BASE_MODELS_LIST_MODEL_H_ +#pragma once + +#include "base/basictypes.h" +#include "base/logging.h" +#include "base/observer_list.h" +#include "base/memory/scoped_vector.h" +#include "ui/base/models/list_model_observer.h" + +namespace ui { + +// A list model that manages a list of ItemType pointers. Items added to the +// model are owned by the model. An item can be taken out of the model by +// RemoveAt. +template <class ItemType> +class ListModel { + public: + typedef std::vector<ItemType*> Items; + + ListModel() {} + virtual ~ListModel() {} + + // Adds |item| to the model at given |index|. + virtual void AddAt(int index, ItemType* item) { + DCHECK(index >= 0 && index <= item_count()); + items_->insert(items_.begin() + index, item); + NotifyItemsAdded(index, 1); + } + + // Removes an item at given |index| from the model. Note the removed item + // is NOT deleted and it's up to the caller to delete it. + virtual ItemType* RemoveAt(int index) { + DCHECK(index >= 0 && index < item_count()); + ItemType* item = items_[index]; + items_->erase(items_.begin() + index); + NotifyItemsRemoved(index, 1); + return item; + } + + // Removes all items from the model. This does NOT delete the items. + virtual void RemoveAll() { + int count = item_count(); + items_->clear(); + NotifyItemsRemoved(0, count); + } + + // Removes an item at given |index| from the model and deletes it. + virtual void DeleteAt(int index) { + delete RemoveAt(index); + } + + // Removes and deletes all items from the model. + virtual void DeleteAll() { + int count = item_count(); + items_.reset(); + NotifyItemsRemoved(0, count); + } + + // Convenience function to append an item to the model. + void Add(ItemType* item) { + AddAt(item_count(), item); + } + + void AddObserver(ListModelObserver* observer) { + observers_.AddObserver(observer); + } + + void RemoveObserver(ListModelObserver* observer) { + observers_.RemoveObserver(observer); + } + + void NotifyItemsAdded(int start, int count) { + FOR_EACH_OBSERVER(ListModelObserver, + observers_, + ListItemsAdded(start, count)); + } + + void NotifyItemsRemoved(int start, int count) { + FOR_EACH_OBSERVER(ListModelObserver, + observers_, + ListItemsRemoved(start, count)); + } + + void NotifyItemsChanged(int start, int count) { + FOR_EACH_OBSERVER(ListModelObserver, + observers_, + ListItemsChanged(start, count)); + } + + int item_count() const { return static_cast<int>(items_.size()); } + const Items& items() const { return items_.get(); } + + const ItemType* item_at(int index) const { + DCHECK(index >= 0 && index < item_count()); + return items_[index]; + } + ItemType* item_at(int index) { + return const_cast<ItemType*>( + const_cast<const ListModel<ItemType>*>(this)->item_at(index)); + } + + private: + ScopedVector<ItemType> items_; + ObserverList<ListModelObserver> observers_; + + DISALLOW_COPY_AND_ASSIGN(ListModel<ItemType>); +}; + +} // namespace ui + +#endif // UI_BASE_MODELS_LIST_MODEL_H_ |