summaryrefslogtreecommitdiffstats
path: root/views/controls/tree/tree_node_model.h
diff options
context:
space:
mode:
Diffstat (limited to 'views/controls/tree/tree_node_model.h')
-rw-r--r--views/controls/tree/tree_node_model.h283
1 files changed, 0 insertions, 283 deletions
diff --git a/views/controls/tree/tree_node_model.h b/views/controls/tree/tree_node_model.h
deleted file mode 100644
index f1e1c16..0000000
--- a/views/controls/tree/tree_node_model.h
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright (c) 2006-2008 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 VIEWS_CONTROLS_TREE_TREE_NODE_MODEL_H_
-#define VIEWS_CONTROLS_TREE_TREE_NODE_MODEL_H_
-
-#include <algorithm>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/scoped_ptr.h"
-#include "base/scoped_vector.h"
-#include "base/stl_util-inl.h"
-#include "views/controls/tree/tree_model.h"
-
-namespace views {
-
-// TreeNodeModel and TreeNodes provide an implementation of TreeModel around
-// TreeNodes. TreeNodes form a directed acyclic graph.
-//
-// TreeNodes own their children, so that deleting a node deletes all
-// descendants.
-//
-// TreeNodes do NOT maintain a pointer back to the model. As such, if you
-// are using TreeNodes with a TreeNodeModel you will need to notify the observer
-// yourself any time you make any change directly to the TreeNodes. For example,
-// if you directly invoke SetTitle on a node it does not notify the
-// observer, you will need to do it yourself. This includes the following
-// methods: SetTitle, Remove and Add. TreeNodeModel provides cover
-// methods that mutate the TreeNodes and notify the observer. If you are using
-// TreeNodes with a TreeNodeModel use the cover methods to save yourself the
-// headache.
-//
-// The following example creates a TreeNode with two children and then
-// creates a TreeNodeModel from it:
-//
-// TreeNodeWithValue<int> root = new TreeNodeWithValue<int>(0, L"root");
-// root.add(new TreeNodeWithValue<int>(1, L"child 1"));
-// root.add(new TreeNodeWithValue<int>(1, L"child 2"));
-// TreeNodeModel<TreeNodeWithValue<int>>* model =
-// new TreeNodeModel<TreeNodeWithValue<int>>(root);
-//
-// Two variants of TreeNode are provided here:
-//
-// . TreeNode itself is intended for subclassing. It has one type parameter
-// that corresponds to the type of the node. When subclassing use your class
-// name as the type parameter, eg:
-// class MyTreeNode : public TreeNode<MyTreeNode> .
-// . TreeNodeWithValue is a trivial subclass of TreeNode that has one type
-// type parameter: a value type that is associated with the node.
-//
-// Which you use depends upon the situation. If you want to subclass and add
-// methods, then use TreeNode. If you don't need any extra methods and just
-// want to associate a value with each node, then use TreeNodeWithValue.
-//
-// Regardless of which TreeNode you use, if you are using the nodes with a
-// TreeView take care to notify the observer when mutating the nodes.
-
-template <class NodeType>
-class TreeNodeModel;
-
-// TreeNode -------------------------------------------------------------------
-
-template <class NodeType>
-class TreeNode : public TreeModelNode {
- public:
- TreeNode() : parent_(NULL) { }
-
- explicit TreeNode(const std::wstring& title)
- : title_(title), parent_(NULL) {}
-
- virtual ~TreeNode() {
- }
-
- // Adds the specified child node.
- virtual void Add(int index, NodeType* child) {
- DCHECK(child && index >= 0 && index <= GetChildCount());
- // If the node has a parent, remove it from its parent.
- NodeType* node_parent = child->GetParent();
- if (node_parent)
- node_parent->Remove(node_parent->IndexOfChild(child));
- child->parent_ = static_cast<NodeType*>(this);
- children_->insert(children_->begin() + index, child);
- }
-
- // Removes the node by index. This does NOT delete the specified node, it is
- // up to the caller to delete it when done.
- virtual NodeType* Remove(int index) {
- DCHECK(index >= 0 && index < GetChildCount());
- NodeType* node = GetChild(index);
- node->parent_ = NULL;
- children_->erase(index + children_->begin());
- return node;
- }
-
- // Removes all the children from this node. This does NOT delete the nodes.
- void RemoveAll() {
- for (size_t i = 0; i < children_->size(); ++i)
- children_[i]->parent_ = NULL;
- children_->clear();
- }
-
- // Returns the number of children.
- int GetChildCount() {
- return static_cast<int>(children_->size());
- }
-
- // Returns a child by index.
- NodeType* GetChild(int index) {
- DCHECK(index >= 0 && index < GetChildCount());
- return children_[index];
- }
-
- // Returns the parent.
- NodeType* GetParent() {
- return parent_;
- }
-
- // Returns the index of the specified child, or -1 if node is a not a child.
- int IndexOfChild(const NodeType* node) {
- DCHECK(node);
- typename std::vector<NodeType*>::iterator i =
- std::find(children_->begin(), children_->end(), node);
- if (i != children_->end())
- return static_cast<int>(i - children_->begin());
- return -1;
- }
-
- // Sets the title of the node.
- void SetTitle(const std::wstring& string) {
- title_ = string;
- }
-
- // Returns the title of the node.
- std::wstring GetTitle() {
- return title_;
- }
-
- // Returns true if this is the root.
- bool IsRoot() { return (parent_ == NULL); }
-
- // Returns true if this == ancestor, or one of this nodes parents is
- // ancestor.
- bool HasAncestor(NodeType* ancestor) const {
- if (ancestor == this)
- return true;
- if (!ancestor)
- return false;
- return parent_ ? parent_->HasAncestor(ancestor) : false;
- }
-
- protected:
- std::vector<NodeType*>& children() { return children_.get(); }
-
- private:
- // Title displayed in the tree.
- std::wstring title_;
-
- NodeType* parent_;
-
- // Children.
- ScopedVector<NodeType> children_;
-
- DISALLOW_COPY_AND_ASSIGN(TreeNode);
-};
-
-// TreeNodeWithValue ----------------------------------------------------------
-
-template <class ValueType>
-class TreeNodeWithValue : public TreeNode< TreeNodeWithValue<ValueType> > {
- private:
- typedef TreeNode< TreeNodeWithValue<ValueType> > ParentType;
-
- public:
- TreeNodeWithValue() { }
-
- TreeNodeWithValue(const ValueType& value)
- : ParentType(std::wstring()), value(value) { }
-
- TreeNodeWithValue(const std::wstring& title, const ValueType& value)
- : ParentType(title), value(value) { }
-
- ValueType value;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(TreeNodeWithValue);
-};
-
-// TreeNodeModel --------------------------------------------------------------
-
-// TreeModel implementation intended to be used with TreeNodes.
-template <class NodeType>
-class TreeNodeModel : public TreeModel {
- public:
- // Creates a TreeNodeModel with the specified root node. The root is owned
- // by the TreeNodeModel.
- explicit TreeNodeModel(NodeType* root)
- : root_(root),
- observer_(NULL) {
- }
-
- virtual ~TreeNodeModel() {}
-
- virtual void SetObserver(TreeModelObserver* observer) {
- observer_ = observer;
- }
-
- TreeModelObserver* GetObserver() {
- return observer_;
- }
-
- // TreeModel methods, all forward to the nodes.
- virtual NodeType* GetRoot() { return root_.get(); }
-
- virtual int GetChildCount(TreeModelNode* parent) {
- DCHECK(parent);
- return AsNode(parent)->GetChildCount();
- }
-
- virtual NodeType* GetChild(TreeModelNode* parent, int index) {
- DCHECK(parent);
- return AsNode(parent)->GetChild(index);
- }
-
- virtual TreeModelNode* GetParent(TreeModelNode* node) {
- DCHECK(node);
- return AsNode(node)->GetParent();
- }
-
- NodeType* AsNode(TreeModelNode* model_node) {
- return reinterpret_cast<NodeType*>(model_node);
- }
-
- // Sets the title of the specified node.
- virtual void SetTitle(TreeModelNode* node,
- const std::wstring& title) {
- DCHECK(node);
- AsNode(node)->SetTitle(title);
- NotifyObserverTreeNodeChanged(node);
- }
-
- void Add(NodeType* parent, int index, NodeType* child) {
- DCHECK(parent && child);
- parent->Add(index, child);
- NotifyObserverTreeNodesAdded(parent, index, 1);
- }
-
- NodeType* Remove(NodeType* parent, int index) {
- DCHECK(parent);
- NodeType* child = parent->Remove(index);
- NotifyObserverTreeNodesRemoved(parent, index, 1);
- return child;
- }
-
- void NotifyObserverTreeNodesAdded(NodeType* parent, int start, int count) {
- if (observer_)
- observer_->TreeNodesAdded(this, parent, start, count);
- }
-
- void NotifyObserverTreeNodesRemoved(NodeType* parent, int start, int count) {
- if (observer_)
- observer_->TreeNodesRemoved(this, parent, start, count);
- }
-
- virtual void NotifyObserverTreeNodeChanged(TreeModelNode* node) {
- if (observer_)
- observer_->TreeNodeChanged(this, node);
- }
-
- private:
- // The root.
- scoped_ptr<NodeType> root_;
-
- // The observer.
- TreeModelObserver* observer_;
-
- DISALLOW_COPY_AND_ASSIGN(TreeNodeModel);
-};
-
-} // namespace views
-
-#endif // VIEWS_CONTROLS_TREE_TREE_NODE_MODEL_H_