summaryrefslogtreecommitdiffstats
path: root/ui/base/models/list_model.h
diff options
context:
space:
mode:
Diffstat (limited to 'ui/base/models/list_model.h')
-rw-r--r--ui/base/models/list_model.h116
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_