Index: ui/base/models/list_model.h |
diff --git a/ui/base/models/list_model.h b/ui/base/models/list_model.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3634ed1f895cf901364f3290834893c6107ae60e |
--- /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_ |