Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(516)

Unified Diff: ui/views/controls/table/table_view_views.h

Issue 9187027: Attempt 2 at: Adds a trivial views based table implementation (only supports single (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/table/table_view_unittest.cc ('k') | ui/views/controls/table/table_view_views.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ui/views/controls/table/table_view_unittest.cc ('k') | ui/views/controls/table/table_view_views.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698