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/table_example.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace examples {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::TableColumn TestTableColumn(int id, const std::string& title) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::TableColumn column;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  column.id = id;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  column.title = ASCIIToUTF16(title.c_str());
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  column.sortable = true;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return column;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TableExample::TableExample() : ExampleBase("Table") , table_(NULL) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TableExample::~TableExample() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the view before the model.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete table_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  table_ = NULL;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::CreateExampleView(View* container) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column1_visible_checkbox_ = new Checkbox(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Fruit column visible"));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column1_visible_checkbox_->SetChecked(true);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column1_visible_checkbox_->set_listener(this);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column2_visible_checkbox_ = new Checkbox(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Color column visible"));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column2_visible_checkbox_->SetChecked(true);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column2_visible_checkbox_->set_listener(this);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column3_visible_checkbox_ = new Checkbox(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Origin column visible"));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column3_visible_checkbox_->SetChecked(true);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column3_visible_checkbox_->set_listener(this);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column4_visible_checkbox_ = new Checkbox(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Price column visible"));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column4_visible_checkbox_->SetChecked(true);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column4_visible_checkbox_->set_listener(this);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = new GridLayout(container);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container->SetLayoutManager(layout);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<ui::TableColumn> columns;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  columns.push_back(TestTableColumn(0, "Fruit"));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  columns[0].percent = 1;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  columns.push_back(TestTableColumn(1, "Color"));
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  columns.push_back(TestTableColumn(2, "Origin"));
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  columns.push_back(TestTableColumn(3, "Price"));
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  columns.back().alignment = ui::TableColumn::RIGHT;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  table_ = new TableView(this, columns, ICON_AND_TEXT, true);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->SetGrouper(this);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  table_->SetObserver(this);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon1_.setConfig(SkBitmap::kARGB_8888_Config, 16, 16);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon1_.allocPixels();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkCanvas canvas1(icon1_);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas1.drawColor(SK_ColorRED);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon2_.setConfig(SkBitmap::kARGB_8888_Config, 16, 16);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon2_.allocPixels();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkCanvas canvas2(icon2_);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas2.drawColor(SK_ColorBLUE);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* column_set = layout->AddColumnSet(0);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(1 /* expand */, 0);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(table_->CreateParentIfNecessary());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set = layout->AddColumnSet(1);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        0.5f, GridLayout::USE_PREF, 0, 0);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        0.5f, GridLayout::USE_PREF, 0, 0);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        0.5f, GridLayout::USE_PREF, 0, 0);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        0.5f, GridLayout::USE_PREF, 0, 0);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0 /* no expand */, 1);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(column1_visible_checkbox_);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(column2_visible_checkbox_);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(column3_visible_checkbox_);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(column4_visible_checkbox_);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TableExample::RowCount() {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 10;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 TableExample::GetText(int row, int column_id) {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (row == -1)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::string16();
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* const cells[5][4] = {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Orange", "Orange", "South america", "$5" },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Apple", "Green", "Canada", "$3" },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Blue berries", "Blue", "Mexico", "$10.3" },
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Strawberries", "Red", "California", "$7" },
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Cantaloupe", "Orange", "South america", "$5" },
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ASCIIToUTF16(cells[row % 5][column_id]);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia TableExample::GetIcon(int row) {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap row_icon = row % 2 ? icon1_ : icon2_;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::ImageSkia::CreateFrom1xBitmap(row_icon);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::SetObserver(ui::TableModelObserver* observer) {}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TableExample::GetGroupRange(int model_index, GroupRange* range) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (model_index < 2) {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    range->start = 0;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    range->length = 2;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (model_index > 6) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    range->start = 7;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    range->length = 3;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    range->start = model_index;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    range->length = 1;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnSelectionChanged() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintStatus("Selected: %s",
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              base::UTF16ToASCII(GetText(table_->selection_model().active(),
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                         0)).c_str());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnDoubleClick() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintStatus("Double Click: %s",
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              base::UTF16ToASCII(GetText(table_->selection_model().active(),
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                         0)).c_str());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnMiddleClick() {}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnKeyDown(ui::KeyboardCode virtual_keycode) {}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::ButtonPressed(Button* sender, const ui::Event& event) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool show = true;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == column1_visible_checkbox_) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index = 0;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show = column1_visible_checkbox_->checked();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == column2_visible_checkbox_) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index = 1;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show = column2_visible_checkbox_->checked();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == column3_visible_checkbox_) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index = 2;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show = column3_visible_checkbox_->checked();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == column4_visible_checkbox_) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index = 3;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show = column4_visible_checkbox_->checked();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  table_->SetColumnVisibility(index, show);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace examples
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
183