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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef UI_VIEWS_CONTROLS_TABLE_TABLE_VIEW_VIEWS_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_VIEWS_CONTROLS_TABLE_TABLE_VIEW_VIEWS_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/models/list_selection_model.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/models/table_model.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/models/table_model_observer.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/view.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/views_export.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A TableView is a view that displays multiple rows with any number of columns. 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TableView is driven by a TableModel. The model returns the contents 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to display. TableModel also has an Observer which is used to notify 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TableView of changes to the model so that the display may be updated 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// appropriately. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TableView itself has an observer that is notified when the selection 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// changes. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When a table is sorted the model coordinates do not necessarily match the 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// view coordinates. All table methods are in terms of the model. If you need to 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// convert to view coordinates use ModelToView(). 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sorting is done by a locale sensitive string sort. You can customize the 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sort by way of overriding TableModel::CompareValues(). 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct GroupRange; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TableGrouper; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TableHeader; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TableViewObserver; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TableViewRowBackgroundPainter; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TableViewTestHelper; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The cells in the first column of a table can contain: 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - only text 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - a small icon (16x16) and some text 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - a check box and some text 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum TableTypes { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TEXT_ONLY = 0, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ICON_AND_TEXT, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VIEWS_EXPORT TableView 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public views::View, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ui::TableModelObserver { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to track a visible column. Useful only for the header. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct VIEWS_EXPORT VisibleColumn { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VisibleColumn(); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~VisibleColumn(); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The column. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TableColumn column; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starting x-coordinate of the column. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int x; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Width of the column. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int width; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Describes a sorted column. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct VIEWS_EXPORT SortDescriptor { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SortDescriptor() : column_id(-1), ascending(true) {} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SortDescriptor(int column_id, bool ascending) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : column_id(column_id), 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ascending(ascending) {} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ID of the sorted column. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int column_id; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Is the sort ascending? 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ascending; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<SortDescriptor> SortDescriptors; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a new table using the model and columns specified. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The table type applies to the content of the first column (text, icon and 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // text, checkbox and text). 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TableView(ui::TableModel* model, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<ui::TableColumn>& columns, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TableTypes table_type, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool single_selection); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TableView(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Assigns a new model to the table view, detaching the old one if present. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |model| is NULL, the table view cannot be used after this call. This 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be called in the containing view's destructor to avoid destruction 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // issues when the model needs to be deleted before the table. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetModel(ui::TableModel* model); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TableModel* model() const { return model_; } 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns a new ScrollView that contains the receiver. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* CreateParentIfNecessary(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetRowBackgroundPainter( 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TableViewRowBackgroundPainter> painter); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the TableGrouper. TableView does not own |grouper| (common use case is 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to have TableModel implement TableGrouper). 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetGrouper(TableGrouper* grouper); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the number of rows in the TableView. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int RowCount() const; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the number of selected rows. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sky): remove this and force callers to use selection_model(). 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int SelectedRowCount(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Selects the specified item, making sure it's visible. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Select(int model_row); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the first selected row in terms of the model. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int FirstSelectedRow(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::ListSelectionModel& selection_model() const { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return selection_model_; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Changes the visibility of the specified column (by id). 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetColumnVisibility(int id, bool is_visible); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsColumnVisible(int id) const; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Adds the specified column. |col| is not made visible. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddColumn(const ui::TableColumn& col); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the column with the specified id is known (either visible 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or not). 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasColumn(int id) const; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sky): rename to set_observer(). 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetObserver(TableViewObserver* observer) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) table_view_observer_ = observer; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TableViewObserver* observer() const { return table_view_observer_; } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<VisibleColumn>& visible_columns() const { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return visible_columns_; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the width of the column. |index| is in terms of |visible_columns_|. 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetVisibleColumnWidth(int index, int width); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Toggles the sort order of the specified visible column index. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ToggleSortOrder(int visible_column_index); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SortDescriptors& sort_descriptors() const { return sort_descriptors_; } 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_sorted() const { return !sort_descriptors_.empty(); } 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maps from the index in terms of the model to that of the view. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ModelToView(int model_index) const; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maps from the index in terms of the view to that of the model. 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ViewToModel(int view_index) const; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int row_height() const { return row_height_; } 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // View overrides: 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetTooltipText(const gfx::Point& p, 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* tooltip) const OVERRIDE; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetTooltipTextOrigin(const gfx::Point& p, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point* loc) const OVERRIDE; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ui::TableModelObserver overrides: 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnModelChanged() OVERRIDE; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnItemsChanged(int start, int length) OVERRIDE; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnItemsAdded(int start, int length) OVERRIDE; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnItemsRemoved(int start, int length) OVERRIDE; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // View overrides: 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Point GetKeyboardContextMenuLocation() OVERRIDE; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnFocus() OVERRIDE; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnBlur() OVERRIDE; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class TableViewTestHelper; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct GroupSortHelper; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct SortHelper; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used during painting to determine the range of cells that need to be 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // painted. 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NOTE: the row indices returned by this are in terms of the view and column 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // indices in terms of |visible_columns_|. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct VIEWS_EXPORT PaintRegion { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PaintRegion(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~PaintRegion(); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_row; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_row; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_column; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_column; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used by AdvanceSelection() to determine the direction to change the 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // selection. 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum AdvanceDirection { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ADVANCE_DECREMENT, 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ADVANCE_INCREMENT, 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invoked when the number of rows changes in some way. 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void NumRowsChanged(); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resets the sort descriptions. 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetSortDescriptors(const SortDescriptors& sort_descriptors); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Does the actual sort and updates the mappings (|view_to_model_| and 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |model_to_view_|) appropriately. 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SortItemsAndUpdateMapping(); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to sort the two rows. Returns a value < 0, == 0 or > 0 indicating 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // whether the row2 comes before row1, row2 is the same as row1 or row1 comes 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // after row2. This invokes CompareValues on the model with the sorted column. 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int CompareRows(int model_row1, int model_row2); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the bounds of the specified row. 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect GetRowBounds(int row) const; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the bounds of the specified cell. |visible_column_index| indexes 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // into |visible_columns_|. 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect GetCellBounds(int row, int visible_column_index) const; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Adjusts |bounds| based on where the text should be painted. |bounds| comes 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // from GetCellBounds() and |visible_column_index| is the corresponding column 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (in terms of |visible_columns_|). 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AdjustCellBoundsForText(int visible_column_index, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect* bounds) const; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates |header_| if necessary. 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateHeaderIfNecessary(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates the |x| and |width| of each of the columns in |visible_columns_|. 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateVisibleColumnSizes(); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the cells that need to be painted for the specified region. 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |bounds| is in terms of |this|. 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PaintRegion GetPaintRegion(const gfx::Rect& bounds) const; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the bounds that need to be painted based on the clip set on 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |canvas|. 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect GetPaintBounds(gfx::Canvas* canvas) const; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invokes SchedulePaint() for the selected rows. 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SchedulePaintForSelection(); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the TableColumn matching the specified id. 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TableColumn FindColumnByID(int id) const; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the selection to the specified index (in terms of the view). 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SelectByViewIndex(int view_index); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the selection model to |new_selection|. 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetSelectionModel(const ui::ListSelectionModel& new_selection); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Advances the selection (from the active index) in the specified direction. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AdvanceSelection(AdvanceDirection direction); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Sets |model| appropriately based on a event. 2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void ConfigureSelectionModelForEvent(const ui::LocatedEvent& event, 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ListSelectionModel* model) const; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the selection state of row at |view_index| to |select|, additionally 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // any other rows in the GroupRange containing |view_index| are updated as 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // well. This does not change the anchor or active index of |model|. 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SelectRowsInRangeFrom(int view_index, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool select, 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ListSelectionModel* model) const; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the range of the specified model index. If a TableGrouper has not 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // been set this returns a group with a start of |model_index| and length of 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1. 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GroupRange GetGroupRange(int model_index) const; 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used by both GetTooltipText methods. Returns true if there is a tooltip and 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // sets |tooltip| and/or |tooltip_origin| as appropriate, each of which may be 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NULL. 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool GetTooltipImpl(const gfx::Point& location, 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* tooltip, 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point* tooltip_origin) const; 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TableModel* model_; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ui::TableColumn> columns_; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The set of visible columns. The values of these point to |columns_|. This 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // may contain a subset of |columns_|. 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<VisibleColumn> visible_columns_; 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The header. This is only created if more than one column is specified or 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the first column has a non-empty title. 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TableHeader* header_; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TableTypes table_type_; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool single_selection_; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sky): rename to observer_. 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TableViewObserver* table_view_observer_; 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The selection, in terms of the model. 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ListSelectionModel selection_model_; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::FontList font_list_; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int row_height_; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Width of the ScrollView last time Layout() was invoked. Used to determine 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when we should invoke UpdateVisibleColumnSizes(). 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int last_parent_width_; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The width we layout to. This may differ from |last_parent_width_|. 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int layout_width_; 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Current sort. 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SortDescriptors sort_descriptors_; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Mappings used when sorted. 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<int> view_to_model_; 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<int> model_to_view_; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TableViewRowBackgroundPainter> row_background_painter_; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TableGrouper* grouper_; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // True if in SetVisibleColumnWidth(). 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool in_set_visible_column_width_; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TableView); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace views 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // UI_VIEWS_CONTROLS_TABLE_TABLE_VIEW_VIEWS_H_ 350