Index: ui/views/controls/table/table_view_views.h |
diff --git a/ui/views/controls/table/table_view_views.h b/ui/views/controls/table/table_view_views.h |
index 4a3ae5f0c2269ee92343091d5df16113aba7e080..3b7c4f62744d9549ad9862bb3864809cc910c342 100644 |
--- a/ui/views/controls/table/table_view_views.h |
+++ b/ui/views/controls/table/table_view_views.h |
@@ -6,30 +6,14 @@ |
#define UI_VIEWS_CONTROLS_TABLE_TABLE_VIEW_VIEWS_H_ |
#pragma once |
-#include <map> |
#include <vector> |
-#include "base/gtest_prod_util.h" |
-#include "base/string16.h" |
-#include "build/build_config.h" |
-#include "third_party/skia/include/core/SkColor.h" |
#include "ui/base/keycodes/keyboard_codes.h" |
#include "ui/base/models/table_model_observer.h" |
+#include "ui/gfx/font.h" |
+#include "ui/views/view.h" |
#include "ui/views/views_export.h" |
-#if defined(OS_WIN) |
-#include <windows.h> |
- |
-// TODO(port): remove the ifdef when native_control.h is ported. |
-#include "ui/views/controls/native_control.h" |
- |
-typedef struct tagNMLVCUSTOMDRAW NMLVCUSTOMDRAW; |
-#endif // defined(OS_WIN) |
- |
-namespace gfx { |
-class Font; |
-} |
- |
namespace ui { |
struct TableColumn; |
class TableModel; |
@@ -59,9 +43,6 @@ class TableModel; |
// TableView is a wrapper around the window type ListView in report mode. |
namespace views { |
-class ListView; |
-class ListViewParent; |
-class TableView; |
class TableViewObserver; |
// The cells in the first column of a table can contain: |
@@ -74,57 +55,9 @@ enum TableTypes { |
CHECK_BOX_AND_TEXT |
}; |
-// Returned from SelectionBegin/SelectionEnd |
-class VIEWS_EXPORT TableSelectionIterator { |
- public: |
- TableSelectionIterator(TableView* view, int view_index); |
- TableSelectionIterator& operator=(const TableSelectionIterator& other); |
- bool operator==(const TableSelectionIterator& other); |
- bool operator!=(const TableSelectionIterator& other); |
- TableSelectionIterator& operator++(); |
- int operator*(); |
- |
- private: |
- void UpdateModelIndexFromViewIndex(); |
- |
- TableView* table_view_; |
- int view_index_; |
- |
- // The index in terms of the model. This is returned from the * operator. This |
- // is cached to avoid dependencies on the view_to_model mapping. |
- int model_index_; |
-}; |
- |
-#if defined(OS_WIN) |
-// TODO(port): Port TableView. |
-class VIEWS_EXPORT TableView : public NativeControl, |
+class VIEWS_EXPORT TableView : public views::View, |
public ui::TableModelObserver { |
public: |
- typedef TableSelectionIterator iterator; |
- |
- // A helper struct for GetCellColors. Set |color_is_set| to true if color is |
- // set. See OnCustomDraw for more details on why we need this. |
- struct ItemColor { |
- bool color_is_set; |
- SkColor color; |
- }; |
- |
- // Describes a sorted column. |
- struct SortDescriptor { |
- SortDescriptor() : column_id(-1), ascending(true) {} |
- SortDescriptor(int column_id, bool ascending) |
- : column_id(column_id), |
- ascending(ascending) { } |
- |
- // ID of the sorted column. |
- int column_id; |
- |
- // Is the sort ascending? |
- bool ascending; |
- }; |
- |
- typedef std::vector<SortDescriptor> SortDescriptors; |
- |
// Creates a new table using the model and columns specified. |
// The table type applies to the content of the first column (text, icon and |
// text, checkbox and text). |
@@ -139,9 +72,12 @@ class VIEWS_EXPORT TableView : public NativeControl, |
// Note that setting both resizable_columns and autosize_columns to false is |
// probably not a good idea, as there is no way for the user to increase a |
// column's size in that case. |
- TableView(ui::TableModel* model, const std::vector<ui::TableColumn>& columns, |
- TableTypes table_type, bool single_selection, |
- bool resizable_columns, bool autosize_columns); |
+ TableView(ui::TableModel* model, |
+ const std::vector<ui::TableColumn>& columns, |
+ TableTypes table_type, |
+ bool single_selection, |
+ bool resizable_columns, |
+ bool autosize_columns); |
virtual ~TableView(); |
// Assigns a new model to the table view, detaching the old one if present. |
@@ -151,11 +87,8 @@ class VIEWS_EXPORT TableView : public NativeControl, |
void SetModel(ui::TableModel* model); |
ui::TableModel* model() const { return model_; } |
- // Resorts the contents. |
- void SetSortDescriptors(const SortDescriptors& sort_descriptors); |
- |
- // Current sort. |
- const SortDescriptors& sort_descriptors() const { return sort_descriptors_; } |
+ // Returns a new ScrollPane that contains the receiver. |
+ View* CreateParentIfNecessary(); |
// Returns the number of rows in the TableView. |
int RowCount() const; |
@@ -166,337 +99,54 @@ class VIEWS_EXPORT TableView : public NativeControl, |
// Selects the specified item, making sure it's visible. |
void Select(int model_row); |
- // Sets the selected state of an item (without sending any selection |
- // notifications). Note that this routine does NOT set the focus to the |
- // item at the given index. |
- void SetSelectedState(int model_row, bool state); |
- |
- // Sets the focus to the item at the given index. |
- void SetFocusOnItem(int model_row); |
- |
// Returns the first selected row in terms of the model. |
int FirstSelectedRow(); |
- // Returns true if the item at the specified index is selected. |
- bool IsItemSelected(int model_row); |
- |
- // Returns true if the item at the specified index has the focus. |
- bool ItemHasTheFocus(int model_row); |
- |
- // Returns an iterator over the selection. The iterator proceeds from the |
- // last index to the first. |
- // |
- // NOTE: the iterator iterates over the visual order (but returns coordinates |
- // in terms of the model). |
- iterator SelectionBegin(); |
- iterator SelectionEnd(); |
- |
- // ui::TableModelObserver methods. |
- virtual void OnModelChanged(); |
- virtual void OnItemsChanged(int start, int length); |
- virtual void OnItemsAdded(int start, int length); |
- virtual void OnItemsRemoved(int start, int length); |
- |
void SetObserver(TableViewObserver* observer) { |
table_view_observer_ = observer; |
} |
TableViewObserver* observer() const { return table_view_observer_; } |
- // Replaces the set of known columns without changing the current visible |
- // columns. |
- void SetColumns(const std::vector<ui::TableColumn>& columns); |
- void AddColumn(const ui::TableColumn& col); |
- bool HasColumn(int id); |
- |
- // Sets which columns (by id) are displayed. All transient size and position |
- // information is lost. |
- void SetVisibleColumns(const std::vector<int>& columns); |
- void SetColumnVisibility(int id, bool is_visible); |
- bool IsColumnVisible(int id) const; |
- |
- // Resets the size of the columns based on the sizes passed to the |
- // constructor. Your normally needn't invoked this, it's done for you the |
- // first time the TableView is given a valid size. |
- void ResetColumnSizes(); |
+ // View overrides: |
+ virtual void Layout() OVERRIDE; |
+ virtual gfx::Size GetPreferredSize() OVERRIDE; |
+ virtual bool OnKeyPressed(const KeyEvent& event) OVERRIDE; |
+ virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE; |
- // Sometimes we may want to size the TableView to a specific width and |
- // height. |
- virtual gfx::Size GetPreferredSize(); |
- void SetPreferredSize(const gfx::Size& size); |
- |
- // Is the table sorted? |
- bool is_sorted() const { return !sort_descriptors_.empty(); } |
- |
- // Maps from the index in terms of the model to that of the view. |
- int ModelToView(int model_index) const; |
- |
- // Maps from the index in terms of the view to that of the model. |
- int ViewToModel(int view_index) const; |
- |
- // Sets the text to display on top of the table. This is useful if the table |
- // is empty and you want to inform the user why. |
- void SetAltText(const string16& alt_text); |
+ // ui::TableModelObserver methods. |
+ virtual void OnModelChanged() OVERRIDE; |
+ virtual void OnItemsChanged(int start, int length) OVERRIDE; |
+ virtual void OnItemsAdded(int start, int length) OVERRIDE; |
+ virtual void OnItemsRemoved(int start, int length) OVERRIDE; |
protected: |
- // Overriden to return the position of the first selected row. |
+ // View overrides: |
virtual gfx::Point GetKeyboardContextMenuLocation() OVERRIDE; |
- |
- // Subclasses that want to customize the colors of a particular row/column, |
- // must invoke this passing in true. The default value is false, such that |
- // GetCellColors is never invoked. |
- void SetCustomColorsEnabled(bool custom_colors_enabled); |
- |
- // Notification from the ListView that the selected state of an item has |
- // changed. |
- virtual void OnSelectedStateChanged(); |
- |
- // Notification from the ListView that the used double clicked the table. |
- virtual void OnDoubleClick(); |
- |
- // Notification from the ListView that the user middle clicked the table. |
- virtual void OnMiddleClick(); |
- |
- // Overridden from NativeControl. Notifies the observer. |
- virtual bool OnKeyDown(ui::KeyboardCode virtual_keycode) OVERRIDE; |
- |
- // View override. |
- virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; |
- |
- // Invoked to customize the colors or font at a particular cell. If you |
- // change the colors or font, return true. This is only invoked if |
- // SetCustomColorsEnabled(true) has been invoked. |
- virtual bool GetCellColors(int model_row, |
- int column, |
- ItemColor* foreground, |
- ItemColor* background, |
- LOGFONT* logfont); |
- |
- // Subclasses that want to perform some custom painting (on top of the regular |
- // list view painting) should return true here and implement the PostPaint |
- // method. |
- virtual bool ImplementPostPaint() { return false; } |
- // Subclasses can implement in this method extra-painting for cells. |
- virtual void PostPaint(int model_row, int column, bool selected, |
- const gfx::Rect& bounds, HDC device_context) { } |
- virtual void PostPaint() {} |
- |
- virtual HWND CreateNativeControl(HWND parent_container); |
- |
- virtual LRESULT OnNotify(int w_param, LPNMHDR l_param); |
- |
- // Used to sort the two rows. Returns a value < 0, == 0 or > 0 indicating |
- // whether the row2 comes before row1, row2 is the same as row1 or row1 comes |
- // after row2. This invokes CompareValues on the model with the sorted column. |
- virtual int CompareRows(int model_row1, int model_row2); |
- |
- // Called before sorting. This does nothing and is intended for subclasses |
- // that need to cache state used during sorting. |
- virtual void PrepareForSort() {} |
- |
- // Returns the width of the specified column by id, or -1 if the column isn't |
- // visible. |
- int GetColumnWidth(int column_id); |
- |
- // Returns the offset from the top of the client area to the start of the |
- // content. |
- int content_offset() const { return content_offset_; } |
- |
- // Draws the alt_text_. Does nothing if there is no alt_text_. |
- void PaintAltText(); |
- |
- // Size (width and height) of images. |
- static const int kImageSize; |
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
+ virtual void OnFocus() OVERRIDE; |
+ virtual void OnBlur() OVERRIDE; |
private: |
- // Direction of a sort. |
- enum SortDirection { |
- ASCENDING_SORT, |
- DESCENDING_SORT, |
- NO_SORT |
- }; |
- |
- // We need this wrapper to pass the table view to the windows proc handler |
- // when subclassing the list view and list view header, as the reinterpret |
- // cast from GetWindowLongPtr would break the pointer if it is pointing to a |
- // subclass (in the OO sense of TableView). |
- struct TableViewWrapper { |
- explicit TableViewWrapper(TableView* view) : table_view(view) { } |
- TableView* table_view; |
- }; |
- |
- friend class ListViewParent; |
- friend class TableSelectionIterator; |
- friend class GroupModelTableViewTest; |
- FRIEND_TEST_ALL_PREFIXES(GroupModelTableViewTest, ShiftSelectAcrossGroups); |
- FRIEND_TEST_ALL_PREFIXES(GroupModelTableViewTest, ShiftSelectSameGroup); |
- |
- LRESULT OnCustomDraw(NMLVCUSTOMDRAW* draw_info); |
- |
- // Invoked when the user clicks on a column to toggle the sort order. If |
- // column_id is the primary sorted column the direction of the sort is |
- // toggled, otherwise column_id is made the primary sorted column. |
- void ToggleSortOrder(int column_id); |
- |
- // Updates the lparam of each of the list view items to be the model index. |
- // If length is > 0, all items with an index >= start get offset by length. |
- // This is used during sorting to determine how the items were sorted. |
- void UpdateItemsLParams(int start, int length); |
- |
- // Does the actual sort and updates the mappings (view_to_model and |
- // model_to_view) appropriately. |
- void SortItemsAndUpdateMapping(); |
- |
- // Selects multiple items from the current view row to the marked view row |
- // (implements shift-click behavior). |view_index| is the most recent row |
- // that the user clicked on, and so there is no guarantee that |
- // |view_index| > |mark_view_index| or vice-versa. Returns false if the |
- // selection attempt was rejected because it crossed group boundaries. |
- bool SelectMultiple(int view_index, int mark_view_index); |
- |
- // Method invoked by ListView to compare the two values. Invokes CompareRows. |
- static int CALLBACK SortFunc(LPARAM model_index_1_p, |
- LPARAM model_index_2_p, |
- LPARAM table_view_param); |
- |
- // Method invoked by ListView when sorting back to natural state. Returns |
- // model_index_1_p - model_index_2_p. |
- static int CALLBACK NaturalSortFunc(LPARAM model_index_1_p, |
- LPARAM model_index_2_p, |
- LPARAM table_view_param); |
- |
- // Resets the sort image displayed for the specified column. |
- void ResetColumnSortImage(int column_id, SortDirection direction); |
- |
- // Adds a new column. |
- void InsertColumn(const ui::TableColumn& tc, int index); |
- |
- // Update headers and internal state after columns have changed |
- void OnColumnsChanged(); |
- |
- // Updates the ListView with values from the model. See UpdateListViewCache0 |
- // for a complete description. |
- // This turns off redrawing, and invokes UpdateListViewCache0 to do the |
- // actual updating. |
- void UpdateListViewCache(int start, int length, bool add); |
- |
- // Updates ListView with values from the model. |
- // If add is true, this adds length items starting at index start. |
- // If add is not true, the items are not added, the but the values in the |
- // range start - [start + length] are updated from the model. |
- void UpdateListViewCache0(int start, int length, bool add); |
- |
- // Returns the index of the selected item before |view_index|, or -1 if |
- // |view_index| is the first selected item. |
- // |
- // WARNING: this returns coordinates in terms of the view, NOT the model. |
- int PreviousSelectedViewIndex(int view_index); |
- |
- // Returns the last selected view index in the table view, or -1 if the table |
- // is empty, or nothing is selected. |
- // |
- // WARNING: this returns coordinates in terms of the view, NOT the model. |
- int LastSelectedViewIndex(); |
- |
- // The TableColumn visible at position pos. |
- const ui::TableColumn& GetColumnAtPosition(int pos); |
+ // Invoked when the number of rows changes in some way. |
+ void NumRowsChanged(); |
- // Window procedure of the list view class. We subclass the list view to |
- // ignore WM_ERASEBKGND, which gives smoother painting during resizing. |
- static LRESULT CALLBACK TableWndProc(HWND window, |
- UINT message, |
- WPARAM w_param, |
- LPARAM l_param); |
- |
- // Window procedure of the header class. We subclass the header of the table |
- // to disable resizing of columns. |
- static LRESULT CALLBACK TableHeaderWndProc(HWND window, UINT message, |
- WPARAM w_param, LPARAM l_param); |
- |
- // Updates content_offset_ from the position of the header. |
- void UpdateContentOffset(); |
- |
- // Reloads the groups from the model if there is one and it has groups. |
- void UpdateGroups(); |
- |
- // Returns the bounds of the alt text. |
- gfx::Rect GetAltTextBounds(); |
- |
- // Returns the font used for alt text. |
- gfx::Font GetAltTextFont(); |
- |
- // Overriden in order to update the column sizes, which can only be sized |
- // accurately when the native control is available. |
- virtual void VisibilityChanged(View* starting_from, bool is_visible); |
+ // Returns the bounds of the specified row. |
+ gfx::Rect GetRowBounds(int row); |
ui::TableModel* model_; |
- TableTypes table_type_; |
- TableViewObserver* table_view_observer_; |
- |
- // An ordered list of id's into |all_columns_| representing current visible |
- // columns. |
- std::vector<int> visible_columns_; |
- |
- // Mapping of an int id to a TableColumn representing all possible columns. |
- std::map<int, ui::TableColumn> all_columns_; |
- |
- // Cached value of columns_.size() |
- int column_count_; |
- |
- // Selection mode. |
- bool single_selection_; |
- // If true, any events that would normally be propagated to the observer |
- // are ignored. For example, if this is true and the selection changes in |
- // the listview, the observer is not notified. |
- bool ignore_listview_change_; |
+ const TableTypes table_type_; |
- // Reflects the value passed to SetCustomColorsEnabled. |
- bool custom_colors_enabled_; |
- |
- // Whether or not columns should automatically be resized to fill the |
- // the available width when the list view is resized. |
- bool autosize_columns_; |
- |
- // Whether or not the user can resize columns. |
- bool resizable_columns_; |
- |
- // Whether the column sizes have been determined. |
- bool column_sizes_valid_; |
- |
- // NOTE: While this has the name View in it, it's not a view. Rather it's |
- // a wrapper around the List-View window. |
- HWND list_view_; |
- |
- // The list view's header original proc handler. It is required when |
- // subclassing. |
- WNDPROC header_original_handler_; |
- |
- // Window procedure of the listview before we subclassed it. |
- WNDPROC original_handler_; |
- |
- // A wrapper around 'this' used when "subclassing" the list view and header. |
- TableViewWrapper table_view_wrapper_; |
- |
- // A custom font we use when overriding the font type for a specific cell. |
- HFONT custom_cell_font_; |
- |
- // The preferred size of the table view. |
- gfx::Size preferred_size_; |
- |
- int content_offset_; |
+ TableViewObserver* table_view_observer_; |
- // Current sort. |
- SortDescriptors sort_descriptors_; |
+ int selected_row_; |
- // Mappings used when sorted. |
- scoped_array<int> view_to_model_; |
- scoped_array<int> model_to_view_; |
+ gfx::Font font_; |
- string16 alt_text_; |
+ int row_height_; |
DISALLOW_COPY_AND_ASSIGN(TableView); |
}; |
-#endif // defined(OS_WIN) |
} // namespace views |