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