1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef UI_VIEWS_CONTROLS_TREE_TREE_VIEW_VIEWS_H_ 6 #define UI_VIEWS_CONTROLS_TREE_TREE_VIEW_VIEWS_H_ 7 8 #include <vector> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "ui/base/models/tree_node_model.h" 14 #include "ui/gfx/font_list.h" 15 #include "ui/gfx/image/image_skia.h" 16 #include "ui/views/controls/prefix_delegate.h" 17 #include "ui/views/controls/textfield/textfield_controller.h" 18 #include "ui/views/focus/focus_manager.h" 19 #include "ui/views/view.h" 20 21 namespace gfx { 22 class Rect; 23 } // namespace gfx 24 25 namespace views { 26 27 class Textfield; 28 class TreeViewController; 29 class PrefixSelector; 30 31 // TreeView displays hierarchical data as returned from a TreeModel. The user 32 // can expand, collapse and edit the items. A Controller may be attached to 33 // receive notification of selection changes and restrict editing. 34 // 35 // Note on implementation. This implementation doesn't scale well. In particular 36 // it does not store any row information, but instead calculates it as 37 // necessary. But it's more than adequate for current uses. 38 class VIEWS_EXPORT TreeView : public ui::TreeModelObserver, 39 public TextfieldController, 40 public FocusChangeListener, 41 public PrefixDelegate { 42 public: 43 // The tree view's class name. 44 static const char kViewClassName[]; 45 46 TreeView(); 47 virtual ~TreeView(); 48 49 // Returns new ScrollPane that contains the receiver. 50 View* CreateParentIfNecessary(); 51 52 // Sets the model. TreeView does not take ownership of the model. 53 void SetModel(ui::TreeModel* model); model()54 ui::TreeModel* model() const { return model_; } 55 56 // Sets whether to automatically expand children when a parent node is 57 // expanded. The default is false. If true, when a node in the tree is 58 // expanded for the first time, its children are also automatically expanded. 59 // If a node is subsequently collapsed and expanded again, the children 60 // will not be automatically expanded. set_auto_expand_children(bool auto_expand_children)61 void set_auto_expand_children(bool auto_expand_children) { 62 auto_expand_children_ = auto_expand_children; 63 } 64 65 // Sets whether the user can edit the nodes. The default is true. If true, 66 // the Controller is queried to determine if a particular node can be edited. 67 void SetEditable(bool editable); 68 69 // Edits the specified node. This cancels the current edit and expands all 70 // parents of node. 71 void StartEditing(ui::TreeModelNode* node); 72 73 // Cancels the current edit. Does nothing if not editing. 74 void CancelEdit(); 75 76 // Commits the current edit. Does nothing if not editing. 77 void CommitEdit(); 78 79 // If the user is editing a node, it is returned. If the user is not 80 // editing a node, NULL is returned. 81 ui::TreeModelNode* GetEditingNode(); 82 83 // Selects the specified node. This expands all the parents of node. 84 void SetSelectedNode(ui::TreeModelNode* model_node); 85 86 // Returns the selected node, or NULL if nothing is selected. 87 ui::TreeModelNode* GetSelectedNode(); 88 89 // Marks |model_node| as collapsed. This only effects the UI if node and all 90 // its parents are expanded (IsExpanded(model_node) returns true). 91 void Collapse(ui::TreeModelNode* model_node); 92 93 // Make sure node and all its parents are expanded. 94 void Expand(ui::TreeModelNode* node); 95 96 // Invoked from ExpandAll(). Expands the supplied node and recursively 97 // invokes itself with all children. 98 void ExpandAll(ui::TreeModelNode* node); 99 100 // Returns true if the specified node is expanded. 101 bool IsExpanded(ui::TreeModelNode* model_node); 102 103 // Sets whether the root is shown. If true, the root node of the tree is 104 // shown, if false only the children of the root are shown. The default is 105 // true. 106 void SetRootShown(bool root_visible); 107 108 // Sets the controller, which may be null. TreeView does not take ownership 109 // of the controller. SetController(TreeViewController * controller)110 void SetController(TreeViewController* controller) { 111 controller_ = controller; 112 } 113 114 // Returns the node for the specified row, or NULL for an invalid row index. 115 ui::TreeModelNode* GetNodeForRow(int row); 116 117 // Maps a node to a row, returns -1 if node is not valid. 118 int GetRowForNode(ui::TreeModelNode* node); 119 editor()120 views::Textfield* editor() { return editor_; } 121 122 // View overrides: 123 virtual void Layout() OVERRIDE; 124 virtual gfx::Size GetPreferredSize() const OVERRIDE; 125 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; 126 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 127 virtual ui::TextInputClient* GetTextInputClient() OVERRIDE; 128 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 129 virtual void ShowContextMenu(const gfx::Point& p, 130 ui::MenuSourceType source_type) OVERRIDE; 131 virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE; 132 virtual const char* GetClassName() const OVERRIDE; 133 134 // TreeModelObserver overrides: 135 virtual void TreeNodesAdded(ui::TreeModel* model, 136 ui::TreeModelNode* parent, 137 int start, 138 int count) OVERRIDE; 139 virtual void TreeNodesRemoved(ui::TreeModel* model, 140 ui::TreeModelNode* parent, 141 int start, 142 int count) OVERRIDE; 143 virtual void TreeNodeChanged(ui::TreeModel* model, 144 ui::TreeModelNode* model_node) OVERRIDE; 145 146 // TextfieldController overrides: 147 virtual void ContentsChanged(Textfield* sender, 148 const base::string16& new_contents) OVERRIDE; 149 virtual bool HandleKeyEvent(Textfield* sender, 150 const ui::KeyEvent& key_event) OVERRIDE; 151 152 // FocusChangeListener overrides: 153 virtual void OnWillChangeFocus(View* focused_before, 154 View* focused_now) OVERRIDE; 155 virtual void OnDidChangeFocus(View* focused_before, 156 View* focused_now) OVERRIDE; 157 158 // PrefixDelegate overrides: 159 virtual int GetRowCount() OVERRIDE; 160 virtual int GetSelectedRow() OVERRIDE; 161 virtual void SetSelectedRow(int row) OVERRIDE; 162 virtual base::string16 GetTextForRow(int row) OVERRIDE; 163 164 protected: 165 // View overrides: 166 virtual gfx::Point GetKeyboardContextMenuLocation() OVERRIDE; 167 virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE; 168 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 169 virtual void OnFocus() OVERRIDE; 170 virtual void OnBlur() OVERRIDE; 171 172 private: 173 friend class TreeViewTest; 174 175 // Selects, expands or collapses nodes in the tree. Consistent behavior for 176 // tap gesture and click events. 177 bool OnClickOrTap(const ui::LocatedEvent& event); 178 179 // InternalNode is used to track information about the set of nodes displayed 180 // by TreeViewViews. 181 class InternalNode : public ui::TreeNode<InternalNode> { 182 public: 183 InternalNode(); 184 virtual ~InternalNode(); 185 186 // Resets the state from |node|. 187 void Reset(ui::TreeModelNode* node); 188 189 // The model node this InternalNode represents. model_node()190 ui::TreeModelNode* model_node() { return model_node_; } 191 192 // Whether the node is expanded. set_is_expanded(bool expanded)193 void set_is_expanded(bool expanded) { is_expanded_ = expanded; } is_expanded()194 bool is_expanded() const { return is_expanded_; } 195 196 // Whether children have been loaded. set_loaded_children(bool value)197 void set_loaded_children(bool value) { loaded_children_ = value; } loaded_children()198 bool loaded_children() const { return loaded_children_; } 199 200 // Width needed to display the string. set_text_width(int width)201 void set_text_width(int width) { text_width_ = width; } text_width()202 int text_width() const { return text_width_; } 203 204 // Returns the total number of descendants (including this node). 205 int NumExpandedNodes() const; 206 207 // Returns the max width of all descendants (including this node). |indent| 208 // is how many pixels each child is indented and |depth| is the depth of 209 // this node from its parent. 210 int GetMaxWidth(int indent, int depth); 211 212 private: 213 // The node from the model. 214 ui::TreeModelNode* model_node_; 215 216 // Whether the children have been loaded. 217 bool loaded_children_; 218 219 bool is_expanded_; 220 221 int text_width_; 222 223 DISALLOW_COPY_AND_ASSIGN(InternalNode); 224 }; 225 226 // Used by GetInternalNodeForModelNode. 227 enum GetInternalNodeCreateType { 228 // If an InternalNode hasn't been created yet, create it. 229 CREATE_IF_NOT_LOADED, 230 231 // Don't create an InternalNode if one hasn't been created yet. 232 DONT_CREATE_IF_NOT_LOADED, 233 }; 234 235 // Used by IncrementSelection. 236 enum IncrementType { 237 // Selects the next node. 238 INCREMENT_NEXT, 239 240 // Selects the previous node. 241 INCREMENT_PREVIOUS 242 }; 243 244 // Row of the root node. This varies depending upon whether the root is 245 // visible. root_row()246 int root_row() const { return root_shown_ ? 0 : -1; } 247 248 // Depth of the root node. root_depth()249 int root_depth() const { return root_shown_ ? 0 : -1; } 250 251 // Loads the children of the specified node. 252 void LoadChildren(InternalNode* node); 253 254 // Configures an InternalNode from a node from the model. This is used 255 // when a node changes as well as when loading. 256 void ConfigureInternalNode(ui::TreeModelNode* model_node, InternalNode* node); 257 258 // Sets |node|s text_width. 259 void UpdateNodeTextWidth(InternalNode* node); 260 261 // Invoked when the set of drawn nodes changes. 262 void DrawnNodesChanged(); 263 264 // Updates |preferred_size_| from the state of the UI. 265 void UpdatePreferredSize(); 266 267 // Positions |editor_|. 268 void LayoutEditor(); 269 270 // Schedules a paint for |node|. 271 void SchedulePaintForNode(InternalNode* node); 272 273 // Recursively paints rows from |min_row| to |max_row|. |node| is the node for 274 // the row |*row|. |row| is updated as this walks the tree. Depth is the depth 275 // of |*row|. 276 void PaintRows(gfx::Canvas* canvas, 277 int min_row, 278 int max_row, 279 InternalNode* node, 280 int depth, 281 int* row); 282 283 // Invoked to paint a single node. 284 void PaintRow(gfx::Canvas* canvas, 285 InternalNode* node, 286 int row, 287 int depth); 288 289 // Paints the expand control given the specified nodes bounds. 290 void PaintExpandControl(gfx::Canvas* canvas, 291 const gfx::Rect& node_bounds, 292 bool expanded); 293 294 // Returns the InternalNode for a model node. |create_type| indicates wheter 295 // this should load InternalNode or not. 296 InternalNode* GetInternalNodeForModelNode( 297 ui::TreeModelNode* model_node, 298 GetInternalNodeCreateType create_type); 299 300 // Returns the bounds for a node. 301 gfx::Rect GetBoundsForNode(InternalNode* node); 302 303 // Implementation of GetBoundsForNode. Separated out as some callers already 304 // know the row/depth. 305 gfx::Rect GetBoundsForNodeImpl(InternalNode* node, int row, int depth); 306 307 // Returns the row and depth of a node. 308 int GetRowForInternalNode(InternalNode* node, int* depth); 309 310 // Returns the row and depth of the specified node. 311 InternalNode* GetNodeByRow(int row, int* depth); 312 313 // Implementation of GetNodeByRow. |curent_row| is updated as we iterate. 314 InternalNode* GetNodeByRowImpl(InternalNode* node, 315 int target_row, 316 int current_depth, 317 int* current_row, 318 int* node_depth); 319 320 // Increments the selection. Invoked in response to up/down arrow. 321 void IncrementSelection(IncrementType type); 322 323 // If the current node is expanded, it's collapsed, otherwise selection is 324 // moved to the parent. 325 void CollapseOrSelectParent(); 326 327 // If the selected node is collapsed, it's expanded. Otherwise the first child 328 // is seleected. 329 void ExpandOrSelectChild(); 330 331 // Implementation of Expand(). Returns true if at least one node was expanded 332 // that previously wasn't. 333 bool ExpandImpl(ui::TreeModelNode* model_node); 334 335 // The model, may be null. 336 ui::TreeModel* model_; 337 338 // Default icons for closed/open. 339 gfx::ImageSkia closed_icon_; 340 gfx::ImageSkia open_icon_; 341 342 // Icons from the model. 343 std::vector<gfx::ImageSkia> icons_; 344 345 // The root node. 346 InternalNode root_; 347 348 // The selected node, may be NULL. 349 InternalNode* selected_node_; 350 351 bool editing_; 352 353 // The editor; lazily created and never destroyed (well, until TreeView is 354 // destroyed). Hidden when no longer editing. We do this avoid destruction 355 // problems. 356 Textfield* editor_; 357 358 // Preferred size of |editor_| with no content. 359 gfx::Size empty_editor_size_; 360 361 // If non-NULL we've attached a listener to this focus manager. Used to know 362 // when focus is changing to another view so that we can cancel the edit. 363 FocusManager* focus_manager_; 364 365 // Whether to automatically expand children when a parent node is expanded. 366 bool auto_expand_children_; 367 368 // Whether the user can edit the items. 369 bool editable_; 370 371 // The controller. 372 TreeViewController* controller_; 373 374 // Whether or not the root is shown in the tree. 375 bool root_shown_; 376 377 // Cached preferred size. 378 gfx::Size preferred_size_; 379 380 // Font list used to display text. 381 gfx::FontList font_list_; 382 383 // Height of each row. Based on font and some padding. 384 int row_height_; 385 386 // Offset the text is drawn at. This accounts for the size of the expand 387 // control, icon and offsets. 388 int text_offset_; 389 390 scoped_ptr<PrefixSelector> selector_; 391 392 DISALLOW_COPY_AND_ASSIGN(TreeView); 393 }; 394 395 } // namespace views 396 397 #endif // UI_VIEWS_CONTROLS_TREE_TREE_VIEW_VIEWS_H_ 398