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#ifndef UI_BASE_MODELS_TABLE_MODEL_H_
6#define UI_BASE_MODELS_TABLE_MODEL_H_
7
8#include <vector>
9
10#include "base/strings/string16.h"
11#include "third_party/icu/source/i18n/unicode/coll.h"
12#include "ui/base/ui_base_export.h"
13
14namespace gfx {
15class ImageSkia;
16}
17
18namespace ui {
19
20class TableModelObserver;
21
22// The model driving the TableView.
23class UI_BASE_EXPORT TableModel {
24 public:
25  // See HasGroups, get GetGroupID for details as to how this is used.
26  struct Group {
27    // The title text for the group.
28    base::string16 title;
29
30    // Unique id for the group.
31    int id;
32  };
33  typedef std::vector<Group> Groups;
34
35  // Number of rows in the model.
36  virtual int RowCount() = 0;
37
38  // Returns the value at a particular location in text.
39  virtual base::string16 GetText(int row, int column_id) = 0;
40
41  // Returns the small icon (16x16) that should be displayed in the first
42  // column before the text. This is only used when the TableView was created
43  // with the ICON_AND_TEXT table type. Returns an isNull() image if there is
44  // no image.
45  virtual gfx::ImageSkia GetIcon(int row);
46
47  // Returns the tooltip, if any, to show for a particular row.  If there are
48  // multiple columns in the row, this will only be shown when hovering over
49  // column zero.
50  virtual base::string16 GetTooltip(int row);
51
52  // If true, this row should be indented.
53  virtual bool ShouldIndent(int row);
54
55  // Returns true if the TableView has groups. Groups provide a way to visually
56  // delineate the rows in a table view. When groups are enabled table view
57  // shows a visual separator for each group, followed by all the rows in
58  // the group.
59  //
60  // On win2k a visual separator is not rendered for the group headers.
61  virtual bool HasGroups();
62
63  // Returns the groups.
64  // This is only used if HasGroups returns true.
65  virtual Groups GetGroups();
66
67  // Returns the group id of the specified row.
68  // This is only used if HasGroups returns true.
69  virtual int GetGroupID(int row);
70
71  // Sets the observer for the model. The TableView should NOT take ownership
72  // of the observer.
73  virtual void SetObserver(TableModelObserver* observer) = 0;
74
75  // Compares the values in the column with id |column_id| for the two rows.
76  // Returns a value < 0, == 0 or > 0 as to whether the first value is
77  // <, == or > the second value.
78  //
79  // This implementation does a case insensitive locale specific string
80  // comparison.
81  virtual int CompareValues(int row1, int row2, int column_id);
82
83  // Reset the collator.
84  void ClearCollator();
85
86 protected:
87  virtual ~TableModel() {}
88
89  // Returns the collator used by CompareValues.
90  icu::Collator* GetCollator();
91};
92
93// TableColumn specifies the title, alignment and size of a particular column.
94struct UI_BASE_EXPORT TableColumn {
95  enum Alignment {
96    LEFT, RIGHT, CENTER
97  };
98
99  TableColumn();
100  TableColumn(int id, Alignment alignment, int width, float percent);
101
102  // A unique identifier for the column.
103  int id;
104
105  // The title for the column.
106  base::string16 title;
107
108  // Alignment for the content.
109  Alignment alignment;
110
111  // The size of a column may be specified in two ways:
112  // 1. A fixed width. Set the width field to a positive number and the
113  //    column will be given that width, in pixels.
114  // 2. As a percentage of the available width. If width is -1, and percent is
115  //    > 0, the column is given a width of
116  //    available_width * percent / total_percent.
117  // 3. If the width == -1 and percent == 0, the column is autosized based on
118  //    the width of the column header text.
119  //
120  // Sizing is done in four passes. Fixed width columns are given
121  // their width, percentages are applied, autosized columns are autosized,
122  // and finally percentages are applied again taking into account the widths
123  // of autosized columns.
124  int width;
125  float percent;
126
127  // The minimum width required for all items in this column
128  // (including the header)
129  // to be visible.
130  int min_visible_width;
131
132  // Is this column sortable? Default is false
133  bool sortable;
134};
135
136}  // namespace ui
137
138#endif  // UI_BASE_MODELS_TABLE_MODEL_H_
139