tree_view_example.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/examples/tree_view_example.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/button/label_button.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_model_adapter.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_runner.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/tree/tree_view.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace examples { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TreeViewExample::TreeViewExample() 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ExampleBase("Tree View"), 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_(NULL), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_(new NodeType(ASCIIToUTF16("root"), 1)) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TreeViewExample::~TreeViewExample() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the view before the model. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete tree_view_; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_ = NULL; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TreeViewExample::CreateExampleView(View* container) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add some sample data. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NodeType* colors_node = new NodeType(ASCIIToUTF16("colors"), 1); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.GetRoot()->Add(colors_node, 0); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_node->Add(new NodeType(ASCIIToUTF16("red"), 1), 0); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_node->Add(new NodeType(ASCIIToUTF16("green"), 1), 1); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_node->Add(new NodeType(ASCIIToUTF16("blue"), 1), 2); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NodeType* sheep_node = new NodeType(ASCIIToUTF16("sheep"), 1); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.GetRoot()->Add(sheep_node, 0); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sheep_node->Add(new NodeType(ASCIIToUTF16("Sheep 1"), 1), 0); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sheep_node->Add(new NodeType(ASCIIToUTF16("Sheep 2"), 1), 1); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_ = new TreeView(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_->set_context_menu_controller(this); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_->SetRootShown(false); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_->SetModel(&model_); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_->SetController(this); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) add_ = new LabelButton(this, ASCIIToUTF16("Add")); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_->SetFocusable(true); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remove_ = new LabelButton(this, ASCIIToUTF16("Remove")); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) remove_->SetFocusable(true); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) change_title_ = new LabelButton(this, ASCIIToUTF16("Change Title")); 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) change_title_->SetFocusable(true); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout* layout = new GridLayout(container); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->SetLayoutManager(layout); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int tree_view_column = 0; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColumnSet* column_set = layout->AddColumnSet(tree_view_column); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0f, GridLayout::USE_PREF, 0, 0); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(1 /* expand */, tree_view_column); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(tree_view_->CreateParentIfNecessary()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add control buttons horizontally. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int button_column = 1; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set = layout->AddColumnSet(button_column); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; i++) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0f, GridLayout::USE_PREF, 0, 0); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0 /* no expand */, button_column); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(add_); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(remove_); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(change_title_); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TreeViewExample::AddNewNode() { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NodeType* selected_node = 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<NodeType*>(tree_view_->GetSelectedNode()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!selected_node) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_node = model_.GetRoot(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NodeType* new_node = new NodeType(selected_node->GetTitle(), 1); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.Add(selected_node, new_node, selected_node->child_count()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_->SetSelectedNode(new_node); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TreeViewExample::IsCommandIdEnabled(int command_id) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return command_id != ID_REMOVE || 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_->GetSelectedNode() != model_.GetRoot(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TreeViewExample::ButtonPressed(Button* sender, const ui::Event& event) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NodeType* selected_node = 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<NodeType*>(tree_view_->GetSelectedNode()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == add_) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddNewNode(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (sender == remove_) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(selected_node); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(model_.GetRoot(), selected_node); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.Remove(selected_node->parent(), selected_node); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (sender == change_title_) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(selected_node); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.SetTitle(selected_node, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_node->GetTitle() + ASCIIToUTF16("new")); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TreeViewExample::OnTreeViewSelectionChanged(TreeView* tree_view) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TreeModelNode* node = tree_view_->GetSelectedNode(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) change_title_->SetEnabled(true); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_->SetEnabled(node != model_.GetRoot()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) change_title_->SetEnabled(false); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_->SetEnabled(false); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TreeViewExample::CanEdit(TreeView* tree_view, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TreeModelNode* node) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TreeViewExample::ShowContextMenuForView(View* source, 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Point& point, 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SimpleMenuModel context_menu_model(this); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_model.AddItem(ID_EDIT, ASCIIToUTF16("Edit")); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_model.AddItem(ID_REMOVE, ASCIIToUTF16("Remove")); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_model.AddItem(ID_ADD, ASCIIToUTF16("Add")); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context_menu_runner_.reset(new MenuRunner(&context_menu_model)); 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (context_menu_runner_->RunMenuAt(source->GetWidget(), 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NULL, 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Rect(point, gfx::Size()), 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MENU_ANCHOR_TOPLEFT, 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source_type, 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 0) == MenuRunner::MENU_DELETED) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TreeViewExample::IsCommandIdChecked(int command_id) const { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TreeViewExample::IsCommandIdEnabled(int command_id) const { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_cast<TreeViewExample*>(this)->IsCommandIdEnabled(command_id); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TreeViewExample::GetAcceleratorForCommandId( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command_id, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator* accelerator) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TreeViewExample::ExecuteCommand(int command_id, int event_flags) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NodeType* selected_node = 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<NodeType*>(tree_view_->GetSelectedNode()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (command_id) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_EDIT: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_view_->StartEditing(selected_node); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_REMOVE: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.Remove(selected_node->parent(), selected_node); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_ADD: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddNewNode(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace examples 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 179