table_example.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace examples { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::TableColumn TestTableColumn(int id, const std::string& title) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TableColumn column; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) column.id = id; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) column.title = ASCIIToUTF16(title.c_str()); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) column.sortable = true; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return column; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TableExample::TableExample() : ExampleBase("Table") , table_(NULL) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TableExample::~TableExample() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the view before the model. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete table_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table_ = NULL; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::CreateExampleView(View* container) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column1_visible_checkbox_ = new Checkbox( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Fruit column visible")); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column1_visible_checkbox_->SetChecked(true); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column1_visible_checkbox_->set_listener(this); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column2_visible_checkbox_ = new Checkbox( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Color column visible")); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column2_visible_checkbox_->SetChecked(true); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column2_visible_checkbox_->set_listener(this); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column3_visible_checkbox_ = new Checkbox( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Origin column visible")); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column3_visible_checkbox_->SetChecked(true); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column3_visible_checkbox_->set_listener(this); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column4_visible_checkbox_ = new Checkbox( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("Price column visible")); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column4_visible_checkbox_->SetChecked(true); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column4_visible_checkbox_->set_listener(this); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout* layout = new GridLayout(container); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->SetLayoutManager(layout); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::TableColumn> columns; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) columns.push_back(TestTableColumn(0, "Fruit")); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) columns[0].percent = 1; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) columns.push_back(TestTableColumn(1, "Color")); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) columns.push_back(TestTableColumn(2, "Origin")); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) columns.push_back(TestTableColumn(3, "Price")); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) columns.back().alignment = ui::TableColumn::RIGHT; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table_ = new TableView(this, columns, ICON_AND_TEXT, true, true, true); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sky): remove ifdef once we get rid of win32 table. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) table_->SetGrouper(this); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table_->SetObserver(this); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon1_.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon1_.allocPixels(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas canvas1(icon1_); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas1.drawColor(SK_ColorRED); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon2_.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon2_.allocPixels(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas canvas2(icon2_); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas2.drawColor(SK_ColorBLUE); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColumnSet* column_set = layout->AddColumnSet(0); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout::USE_PREF, 0, 0); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(1 /* expand */, 0); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(table_->CreateParentIfNecessary()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set = layout->AddColumnSet(1); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.5f, GridLayout::USE_PREF, 0, 0); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.5f, GridLayout::USE_PREF, 0, 0); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.5f, GridLayout::USE_PREF, 0, 0); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.5f, GridLayout::USE_PREF, 0, 0); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0 /* no expand */, 1); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(column1_visible_checkbox_); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(column2_visible_checkbox_); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(column3_visible_checkbox_); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(column4_visible_checkbox_); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TableExample::RowCount() { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 10; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 TableExample::GetText(int row, int column_id) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const cells[5][4] = { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Orange", "Orange", "South america", "$5" }, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Apple", "Green", "Canada", "$3" }, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Blue berries", "Blue", "Mexico", "$10.3" }, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Strawberries", "Red", "California", "$7" }, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Cantaloupe", "Orange", "South america", "$5" }, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ASCIIToUTF16(cells[row % 5][column_id]); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia TableExample::GetIcon(int row) { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap row_icon = row % 2 ? icon1_ : icon2_; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::ImageSkia::CreateFrom1xBitmap(row_icon); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::SetObserver(ui::TableModelObserver* observer) {} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TableExample::GetGroupRange(int model_index, GroupRange* range) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (model_index < 2) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range->start = 0; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range->length = 2; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (model_index > 6) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range->start = 7; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range->length = 3; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range->start = model_index; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range->length = 1; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnSelectionChanged() { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintStatus("Selected: %s", 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToASCII(GetText(table_->FirstSelectedRow(), 0)).c_str()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnDoubleClick() { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintStatus("Double Click: %s", 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToASCII(GetText(table_->FirstSelectedRow(), 0)).c_str()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnMiddleClick() {} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::OnKeyDown(ui::KeyboardCode virtual_keycode) {} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TableExample::ButtonPressed(Button* sender, const ui::Event& event) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show = true; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == column1_visible_checkbox_) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = 0; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show = column1_visible_checkbox_->checked(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (sender == column2_visible_checkbox_) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = 1; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show = column2_visible_checkbox_->checked(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (sender == column3_visible_checkbox_) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = 2; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show = column3_visible_checkbox_->checked(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (sender == column4_visible_checkbox_) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = 3; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show = column4_visible_checkbox_->checked(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table_->SetColumnVisibility(index, show); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace examples 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 179