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