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 #include "ui/views/examples/table_example.h" 6 7 #include <vector> 8 9 #include "base/strings/string_util.h" 10 #include "base/strings/utf_string_conversions.h" 11 #include "third_party/skia/include/core/SkBitmap.h" 12 #include "third_party/skia/include/core/SkCanvas.h" 13 #include "ui/gfx/image/image_skia.h" 14 #include "ui/views/controls/button/checkbox.h" 15 #include "ui/views/layout/grid_layout.h" 16 17 using base::ASCIIToUTF16; 18 19 namespace views { 20 namespace examples { 21 22 namespace { 23 24 ui::TableColumn TestTableColumn(int id, const std::string& title) { 25 ui::TableColumn column; 26 column.id = id; 27 column.title = ASCIIToUTF16(title.c_str()); 28 column.sortable = true; 29 return column; 30 } 31 32 } // namespace 33 34 TableExample::TableExample() : ExampleBase("Table") , table_(NULL) { 35 } 36 37 TableExample::~TableExample() { 38 // Delete the view before the model. 39 delete table_; 40 table_ = NULL; 41 } 42 43 void TableExample::CreateExampleView(View* container) { 44 column1_visible_checkbox_ = new Checkbox( 45 ASCIIToUTF16("Fruit column visible")); 46 column1_visible_checkbox_->SetChecked(true); 47 column1_visible_checkbox_->set_listener(this); 48 column2_visible_checkbox_ = new Checkbox( 49 ASCIIToUTF16("Color column visible")); 50 column2_visible_checkbox_->SetChecked(true); 51 column2_visible_checkbox_->set_listener(this); 52 column3_visible_checkbox_ = new Checkbox( 53 ASCIIToUTF16("Origin column visible")); 54 column3_visible_checkbox_->SetChecked(true); 55 column3_visible_checkbox_->set_listener(this); 56 column4_visible_checkbox_ = new Checkbox( 57 ASCIIToUTF16("Price column visible")); 58 column4_visible_checkbox_->SetChecked(true); 59 column4_visible_checkbox_->set_listener(this); 60 61 GridLayout* layout = new GridLayout(container); 62 container->SetLayoutManager(layout); 63 64 std::vector<ui::TableColumn> columns; 65 columns.push_back(TestTableColumn(0, "Fruit")); 66 columns[0].percent = 1; 67 columns.push_back(TestTableColumn(1, "Color")); 68 columns.push_back(TestTableColumn(2, "Origin")); 69 columns.push_back(TestTableColumn(3, "Price")); 70 columns.back().alignment = ui::TableColumn::RIGHT; 71 table_ = new TableView(this, columns, ICON_AND_TEXT, true); 72 table_->SetGrouper(this); 73 table_->SetObserver(this); 74 icon1_.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 75 icon1_.allocPixels(); 76 SkCanvas canvas1(icon1_); 77 canvas1.drawColor(SK_ColorRED); 78 79 icon2_.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 80 icon2_.allocPixels(); 81 SkCanvas canvas2(icon2_); 82 canvas2.drawColor(SK_ColorBLUE); 83 84 ColumnSet* column_set = layout->AddColumnSet(0); 85 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, 86 GridLayout::USE_PREF, 0, 0); 87 layout->StartRow(1 /* expand */, 0); 88 layout->AddView(table_->CreateParentIfNecessary()); 89 90 column_set = layout->AddColumnSet(1); 91 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 92 0.5f, GridLayout::USE_PREF, 0, 0); 93 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 94 0.5f, GridLayout::USE_PREF, 0, 0); 95 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 96 0.5f, GridLayout::USE_PREF, 0, 0); 97 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 98 0.5f, GridLayout::USE_PREF, 0, 0); 99 100 layout->StartRow(0 /* no expand */, 1); 101 102 layout->AddView(column1_visible_checkbox_); 103 layout->AddView(column2_visible_checkbox_); 104 layout->AddView(column3_visible_checkbox_); 105 layout->AddView(column4_visible_checkbox_); 106 } 107 108 int TableExample::RowCount() { 109 return 10; 110 } 111 112 base::string16 TableExample::GetText(int row, int column_id) { 113 if (row == -1) 114 return base::string16(); 115 116 const char* const cells[5][4] = { 117 { "Orange", "Orange", "South america", "$5" }, 118 { "Apple", "Green", "Canada", "$3" }, 119 { "Blue berries", "Blue", "Mexico", "$10.3" }, 120 { "Strawberries", "Red", "California", "$7" }, 121 { "Cantaloupe", "Orange", "South america", "$5" }, 122 }; 123 return ASCIIToUTF16(cells[row % 5][column_id]); 124 } 125 126 gfx::ImageSkia TableExample::GetIcon(int row) { 127 SkBitmap row_icon = row % 2 ? icon1_ : icon2_; 128 return gfx::ImageSkia::CreateFrom1xBitmap(row_icon); 129 } 130 131 void TableExample::SetObserver(ui::TableModelObserver* observer) {} 132 133 void TableExample::GetGroupRange(int model_index, GroupRange* range) { 134 if (model_index < 2) { 135 range->start = 0; 136 range->length = 2; 137 } else if (model_index > 6) { 138 range->start = 7; 139 range->length = 3; 140 } else { 141 range->start = model_index; 142 range->length = 1; 143 } 144 } 145 146 void TableExample::OnSelectionChanged() { 147 PrintStatus("Selected: %s", 148 base::UTF16ToASCII(GetText(table_->selection_model().active(), 149 0)).c_str()); 150 } 151 152 void TableExample::OnDoubleClick() { 153 PrintStatus("Double Click: %s", 154 base::UTF16ToASCII(GetText(table_->selection_model().active(), 155 0)).c_str()); 156 } 157 158 void TableExample::OnMiddleClick() {} 159 160 void TableExample::OnKeyDown(ui::KeyboardCode virtual_keycode) {} 161 162 void TableExample::ButtonPressed(Button* sender, const ui::Event& event) { 163 int index = 0; 164 bool show = true; 165 if (sender == column1_visible_checkbox_) { 166 index = 0; 167 show = column1_visible_checkbox_->checked(); 168 } else if (sender == column2_visible_checkbox_) { 169 index = 1; 170 show = column2_visible_checkbox_->checked(); 171 } else if (sender == column3_visible_checkbox_) { 172 index = 2; 173 show = column3_visible_checkbox_->checked(); 174 } else if (sender == column4_visible_checkbox_) { 175 index = 3; 176 show = column4_visible_checkbox_->checked(); 177 } 178 table_->SetColumnVisibility(index, show); 179 } 180 181 } // namespace examples 182 } // namespace views 183