15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef UI_VIEWS_CONTROLS_TREE_TREE_VIEW_VIEWS_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_VIEWS_CONTROLS_TREE_TREE_VIEW_VIEWS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/models/tree_node_model.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
16fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "ui/views/controls/prefix_delegate.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/textfield/textfield_controller.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/focus/focus_manager.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/view.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Textfield;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TreeViewController;
25fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochclass PrefixSelector;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TreeView displays hierarchical data as returned from a TreeModel. The user
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// can expand, collapse and edit the items. A Controller may be attached to
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// receive notification of selection changes and restrict editing.
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note on implementation. This implementation doesn't scale well. In particular
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it does not store any row information, but instead calculates it as
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// necessary. But it's more than adequate for current uses.
34fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochclass VIEWS_EXPORT TreeView : public ui::TreeModelObserver,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              public TextfieldController,
36fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                              public FocusChangeListener,
37fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                              public PrefixDelegate {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // The tree view's class name.
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static const char kViewClassName[];
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TreeView();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TreeView();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns new ScrollPane that contains the receiver.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* CreateParentIfNecessary();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the model. TreeView does not take ownership of the model.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetModel(ui::TreeModel* model);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::TreeModel* model() const { return model_; }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets whether to automatically expand children when a parent node is
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // expanded. The default is false. If true, when a node in the tree is
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // expanded for the first time, its children are also automatically expanded.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If a node is subsequently collapsed and expanded again, the children
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will not be automatically expanded.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_auto_expand_children(bool auto_expand_children) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    auto_expand_children_ = auto_expand_children;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets whether the user can edit the nodes. The default is true. If true,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the Controller is queried to determine if a particular node can be edited.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetEditable(bool editable);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Edits the specified node. This cancels the current edit and expands all
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // parents of node.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartEditing(ui::TreeModelNode* node);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cancels the current edit. Does nothing if not editing.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CancelEdit();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Commits the current edit. Does nothing if not editing.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CommitEdit();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the user is editing a node, it is returned. If the user is not
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // editing a node, NULL is returned.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::TreeModelNode* GetEditingNode();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Selects the specified node. This expands all the parents of node.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetSelectedNode(ui::TreeModelNode* model_node);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the selected node, or NULL if nothing is selected.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::TreeModelNode* GetSelectedNode();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Marks |model_node| as collapsed. This only effects the UI if node and all
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // its parents are expanded (IsExpanded(model_node) returns true).
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Collapse(ui::TreeModelNode* model_node);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure node and all its parents are expanded.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Expand(ui::TreeModelNode* node);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invoked from ExpandAll(). Expands the supplied node and recursively
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // invokes itself with all children.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpandAll(ui::TreeModelNode* node);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the specified node is expanded.
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsExpanded(ui::TreeModelNode* model_node);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets whether the root is shown. If true, the root node of the tree is
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // shown, if false only the children of the root are shown. The default is
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // true.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetRootShown(bool root_visible);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the controller, which may be null. TreeView does not take ownership
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of the controller.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetController(TreeViewController* controller) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    controller_ = controller;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns the node for the specified row, or NULL for an invalid row index.
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui::TreeModelNode* GetNodeForRow(int row);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Maps a node to a row, returns -1 if node is not valid.
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int GetRowForNode(ui::TreeModelNode* node);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::Textfield* editor() { return editor_; }
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // View overrides:
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ui::TextInputClient* GetTextInputClient() OVERRIDE;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShowContextMenu(const gfx::Point& p,
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               ui::MenuSourceType source_type) OVERRIDE;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual const char* GetClassName() const OVERRIDE;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TreeModelObserver overrides:
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TreeNodesAdded(ui::TreeModel* model,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              ui::TreeModelNode* parent,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              int start,
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              int count) OVERRIDE;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TreeNodesRemoved(ui::TreeModel* model,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                ui::TreeModelNode* parent,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int start,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int count) OVERRIDE;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TreeNodeChanged(ui::TreeModel* model,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               ui::TreeModelNode* model_node) OVERRIDE;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TextfieldController overrides:
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ContentsChanged(Textfield* sender,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const string16& new_contents) OVERRIDE;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool HandleKeyEvent(Textfield* sender,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const ui::KeyEvent& key_event) OVERRIDE;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FocusChangeListener overrides:
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWillChangeFocus(View* focused_before,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 View* focused_now) OVERRIDE;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDidChangeFocus(View* focused_before,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                View* focused_now) OVERRIDE;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
154fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // PrefixDelegate overrides:
155fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  virtual int GetRowCount() OVERRIDE;
156fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  virtual int GetSelectedRow() OVERRIDE;
157fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  virtual void SetSelectedRow(int row) OVERRIDE;
158fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  virtual string16 GetTextForRow(int row) OVERRIDE;
159fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // View overrides:
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Point GetKeyboardContextMenuLocation() OVERRIDE;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnFocus() OVERRIDE;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnBlur() OVERRIDE;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class TreeViewTest;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Selects, expands or collapses nodes in the tree.  Consistent behavior for
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tap gesture and click events.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool OnClickOrTap(const ui::LocatedEvent& event);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // InternalNode is used to track information about the set of nodes displayed
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // by TreeViewViews.
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class InternalNode : public ui::TreeNode<InternalNode> {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InternalNode();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~InternalNode();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Resets the state from |node|.
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void Reset(ui::TreeModelNode* node);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The model node this InternalNode represents.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::TreeModelNode* model_node() { return model_node_; }
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Whether the node is expanded.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void set_is_expanded(bool expanded) { is_expanded_ = expanded; }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_expanded() const { return is_expanded_; }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Whether children have been loaded.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void set_loaded_children(bool value) { loaded_children_ = value; }
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool loaded_children() const { return loaded_children_; }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Width needed to display the string.
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void set_text_width(int width) { text_width_ = width; }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int text_width() const { return text_width_; }
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Returns the total number of descendants (including this node).
201fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    int NumExpandedNodes() const;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Returns the max width of all descendants (including this node). |indent|
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // is how many pixels each child is indented and |depth| is the depth of
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // this node from its parent.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int GetMaxWidth(int indent, int depth);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The node from the model.
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::TreeModelNode* model_node_;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Whether the children have been loaded.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool loaded_children_;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_expanded_;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int text_width_;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(InternalNode);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used by GetInternalNodeForModelNode.
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum GetInternalNodeCreateType {
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If an InternalNode hasn't been created yet, create it.
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CREATE_IF_NOT_LOADED,
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Don't create an InternalNode if one hasn't been created yet.
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DONT_CREATE_IF_NOT_LOADED,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used by IncrementSelection.
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum IncrementType {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Selects the next node.
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INCREMENT_NEXT,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Selects the previous node.
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INCREMENT_PREVIOUS
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Row of the root node. This varies depending upon whether the root is
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // visible.
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int root_row() const { return root_shown_ ? 0 : -1; }
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Depth of the root node.
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int root_depth() const { return root_shown_ ? 0 : -1; }
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads the children of the specified node.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadChildren(InternalNode* node);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Configures an InternalNode from a node from the model. This is used
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when a node changes as well as when loading.
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ConfigureInternalNode(ui::TreeModelNode* model_node, InternalNode* node);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets |node|s text_width.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateNodeTextWidth(InternalNode* node);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invoked when the set of drawn nodes changes.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DrawnNodesChanged();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates |preferred_size_| from the state of the UI.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdatePreferredSize();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Positions |editor_|.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LayoutEditor();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Schedules a paint for |node|.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SchedulePaintForNode(InternalNode* node);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Recursively paints rows from |min_row| to |max_row|. |node| is the node for
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the row |*row|. |row| is updated as this walks the tree. Depth is the depth
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of |*row|.
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PaintRows(gfx::Canvas* canvas,
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 int min_row,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 int max_row,
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 InternalNode* node,
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 int depth,
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 int* row);
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invoked to paint a single node.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PaintRow(gfx::Canvas* canvas,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                InternalNode* node,
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                int row,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                int depth);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Paints the expand control given the specified nodes bounds.
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PaintExpandControl(gfx::Canvas* canvas,
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const gfx::Rect& node_bounds,
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          bool expanded);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the InternalNode for a model node. |create_type| indicates wheter
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this should load InternalNode or not.
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InternalNode* GetInternalNodeForModelNode(
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::TreeModelNode* model_node,
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetInternalNodeCreateType create_type);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the bounds for a node.
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect GetBoundsForNode(InternalNode* node);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Implementation of GetBoundsForNode. Separated out as some callers already
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // know the row/depth.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect GetBoundsForNodeImpl(InternalNode* node, int row, int depth);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the row and depth of a node.
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int GetRowForInternalNode(InternalNode* node, int* depth);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the row and depth of the specified node.
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InternalNode* GetNodeByRow(int row, int* depth);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Implementation of GetNodeByRow. |curent_row| is updated as we iterate.
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InternalNode* GetNodeByRowImpl(InternalNode* node,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int target_row,
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int current_depth,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int* current_row,
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int* node_depth);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Increments the selection. Invoked in response to up/down arrow.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void IncrementSelection(IncrementType type);
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the current node is expanded, it's collapsed, otherwise selection is
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // moved to the parent.
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CollapseOrSelectParent();
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the selected node is collapsed, it's expanded. Otherwise the first child
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is seleected.
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpandOrSelectChild();
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Implementation of Expand(). Returns true if at least one node was expanded
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that previously wasn't.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ExpandImpl(ui::TreeModelNode* model_node);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The model, may be null.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::TreeModel* model_;
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Default icons for closed/open.
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkia closed_icon_;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkia open_icon_;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Icons from the model.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<gfx::ImageSkia> icons_;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The root node.
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InternalNode root_;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The selected node, may be NULL.
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InternalNode* selected_node_;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool editing_;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The editor; lazily created and never destroyed (well, until TreeView is
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destroyed). Hidden when no longer editing. We do this avoid destruction
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // problems.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Textfield* editor_;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Preferred size of |editor_| with no content.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size empty_editor_size_;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If non-NULL we've attached a listener to this focus manager. Used to know
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when focus is changing to another view so that we can cancel the edit.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusManager* focus_manager_;
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether to automatically expand children when a parent node is expanded.
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool auto_expand_children_;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the user can edit the items.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool editable_;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The controller.
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TreeViewController* controller_;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not the root is shown in the tree.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool root_shown_;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Did the model return a non-empty set of icons from GetIcons?
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_custom_icons_;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cached preferred size.
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size preferred_size_;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Font used to display text.
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Font font_;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Height of each row. Based on font and some padding.
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int row_height_;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Offset the text is drawn at. This accounts for the size of the expand
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // control, icon and offsets.
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int text_offset_;
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
389fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<PrefixSelector> selector_;
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TreeView);
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // UI_VIEWS_CONTROLS_TREE_TREE_VIEW_VIEWS_H_
397