// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/views/examples/tree_view_example.h"

#include "base/strings/utf_string_conversions.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/menu/menu_model_adapter.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/controls/tree/tree_view.h"
#include "ui/views/layout/grid_layout.h"

using base::ASCIIToUTF16;

namespace views {
namespace examples {

TreeViewExample::TreeViewExample()
    : ExampleBase("Tree View"),
      tree_view_(NULL),
      model_(new NodeType(ASCIIToUTF16("root"), 1)) {
}

TreeViewExample::~TreeViewExample() {
  // Delete the view before the model.
  delete tree_view_;
  tree_view_ = NULL;
}

void TreeViewExample::CreateExampleView(View* container) {
  // Add some sample data.
  NodeType* colors_node = new NodeType(ASCIIToUTF16("colors"), 1);
  model_.GetRoot()->Add(colors_node, 0);
  colors_node->Add(new NodeType(ASCIIToUTF16("red"), 1), 0);
  colors_node->Add(new NodeType(ASCIIToUTF16("green"), 1), 1);
  colors_node->Add(new NodeType(ASCIIToUTF16("blue"), 1), 2);

  NodeType* sheep_node = new NodeType(ASCIIToUTF16("sheep"), 1);
  model_.GetRoot()->Add(sheep_node, 0);
  sheep_node->Add(new NodeType(ASCIIToUTF16("Sheep 1"), 1), 0);
  sheep_node->Add(new NodeType(ASCIIToUTF16("Sheep 2"), 1), 1);

  tree_view_ = new TreeView();
  tree_view_->set_context_menu_controller(this);
  tree_view_->SetRootShown(false);
  tree_view_->SetModel(&model_);
  tree_view_->SetController(this);
  add_ = new LabelButton(this, ASCIIToUTF16("Add"));
  add_->SetFocusable(true);
  remove_ = new LabelButton(this, ASCIIToUTF16("Remove"));
  remove_->SetFocusable(true);
  change_title_ = new LabelButton(this, ASCIIToUTF16("Change Title"));
  change_title_->SetFocusable(true);

  GridLayout* layout = new GridLayout(container);
  container->SetLayoutManager(layout);

  const int tree_view_column = 0;
  ColumnSet* column_set = layout->AddColumnSet(tree_view_column);
  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
                        1.0f, GridLayout::USE_PREF, 0, 0);
  layout->StartRow(1 /* expand */, tree_view_column);
  layout->AddView(tree_view_->CreateParentIfNecessary());

  // Add control buttons horizontally.
  const int button_column = 1;
  column_set = layout->AddColumnSet(button_column);
  for (int i = 0; i < 3; i++) {
    column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
                          1.0f, GridLayout::USE_PREF, 0, 0);
  }

  layout->StartRow(0 /* no expand */, button_column);
  layout->AddView(add_);
  layout->AddView(remove_);
  layout->AddView(change_title_);
}

void TreeViewExample::AddNewNode() {
  NodeType* selected_node =
      static_cast<NodeType*>(tree_view_->GetSelectedNode());
  if (!selected_node)
    selected_node = model_.GetRoot();
  NodeType* new_node = new NodeType(selected_node->GetTitle(), 1);
  model_.Add(selected_node, new_node, selected_node->child_count());
  tree_view_->SetSelectedNode(new_node);
}

bool TreeViewExample::IsCommandIdEnabled(int command_id) {
  return command_id != ID_REMOVE ||
      tree_view_->GetSelectedNode() != model_.GetRoot();
}

void TreeViewExample::ButtonPressed(Button* sender, const ui::Event& event) {
  NodeType* selected_node =
      static_cast<NodeType*>(tree_view_->GetSelectedNode());
  if (sender == add_) {
    AddNewNode();
  } else if (sender == remove_) {
    DCHECK(selected_node);
    DCHECK_NE(model_.GetRoot(), selected_node);
    model_.Remove(selected_node->parent(), selected_node);
  } else if (sender == change_title_) {
    DCHECK(selected_node);
    model_.SetTitle(selected_node,
                    selected_node->GetTitle() + ASCIIToUTF16("new"));
  }
}

void TreeViewExample::OnTreeViewSelectionChanged(TreeView* tree_view) {
  ui::TreeModelNode* node = tree_view_->GetSelectedNode();
  if (node) {
    change_title_->SetEnabled(true);
    remove_->SetEnabled(node != model_.GetRoot());
  } else {
    change_title_->SetEnabled(false);
    remove_->SetEnabled(false);
  }
}

bool TreeViewExample::CanEdit(TreeView* tree_view,
                              ui::TreeModelNode* node) {
  return true;
}

void TreeViewExample::ShowContextMenuForView(View* source,
                                             const gfx::Point& point,
                                             ui::MenuSourceType source_type) {
  ui::SimpleMenuModel context_menu_model(this);
  context_menu_model.AddItem(ID_EDIT, ASCIIToUTF16("Edit"));
  context_menu_model.AddItem(ID_REMOVE, ASCIIToUTF16("Remove"));
  context_menu_model.AddItem(ID_ADD, ASCIIToUTF16("Add"));
  context_menu_runner_.reset(new MenuRunner(&context_menu_model, 0));
  if (context_menu_runner_->RunMenuAt(source->GetWidget(),
                                      NULL,
                                      gfx::Rect(point, gfx::Size()),
                                      MENU_ANCHOR_TOPLEFT,
                                      source_type) ==
      MenuRunner::MENU_DELETED) {
    return;
  }
}

bool TreeViewExample::IsCommandIdChecked(int command_id) const {
  return false;
}

bool TreeViewExample::IsCommandIdEnabled(int command_id) const {
  return const_cast<TreeViewExample*>(this)->IsCommandIdEnabled(command_id);
}

bool TreeViewExample::GetAcceleratorForCommandId(
    int command_id,
    ui::Accelerator* accelerator) {
  return false;
}

void TreeViewExample::ExecuteCommand(int command_id, int event_flags) {
  NodeType* selected_node =
      static_cast<NodeType*>(tree_view_->GetSelectedNode());
  switch (command_id) {
    case ID_EDIT:
      tree_view_->StartEditing(selected_node);
      break;
    case ID_REMOVE:
      model_.Remove(selected_node->parent(), selected_node);
      break;
    case ID_ADD:
      AddNewNode();
      break;
    default:
      NOTREACHED();
  }
}

}  // namespace examples
}  // namespace views
