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

Unified Diff: views/controls/table/group_table_view.cc

Issue 8655001: views: Move table and tree directories to ui/views/controls/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: exclude native_widget_win_unittest too Created 9 years, 1 month 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 | « views/controls/table/group_table_view.h ('k') | views/controls/table/native_table_gtk.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/controls/table/group_table_view.cc
diff --git a/views/controls/table/group_table_view.cc b/views/controls/table/group_table_view.cc
deleted file mode 100644
index 3f8a1be08c93a5545134ca2e99cddb71b94d6f31..0000000000000000000000000000000000000000
--- a/views/controls/table/group_table_view.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "views/controls/table/group_table_view.h"
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/message_loop.h"
-#include "ui/gfx/canvas.h"
-
-namespace views {
-
-const COLORREF kSeparatorLineColor = RGB(208, 208, 208);
-const int kSeparatorLineThickness = 1;
-
-const char GroupTableView::kViewClassName[] = "views/GroupTableView";
-
-GroupTableView::GroupTableView(GroupTableModel* model,
- const std::vector<ui::TableColumn>& columns,
- TableTypes table_type,
- bool single_selection,
- bool resizable_columns,
- bool autosize_columns,
- bool draw_group_separators)
- : TableView(model, columns, table_type, false, resizable_columns,
- autosize_columns),
- model_(model),
- draw_group_separators_(draw_group_separators),
- ALLOW_THIS_IN_INITIALIZER_LIST(sync_selection_factory_(this)) {
-}
-
-GroupTableView::~GroupTableView() {
-}
-
-void GroupTableView::SyncSelection() {
- int index = 0;
- int row_count = model_->RowCount();
- GroupRange group_range;
- while (index < row_count) {
- model_->GetGroupRangeForItem(index, &group_range);
- if (group_range.length == 1) {
- // No synching required for single items.
- index++;
- } else {
- // We need to select the group if at least one item is selected.
- bool should_select = false;
- for (int i = group_range.start;
- i < group_range.start + group_range.length; ++i) {
- if (IsItemSelected(i)) {
- should_select = true;
- break;
- }
- }
- if (should_select) {
- for (int i = group_range.start;
- i < group_range.start + group_range.length; ++i) {
- SetSelectedState(i, true);
- }
- }
- index += group_range.length;
- }
- }
-}
-
-bool GroupTableView::OnKeyDown(ui::KeyboardCode virtual_keycode) {
- // In a list view, multiple items can be selected but only one item has the
- // focus. This creates a problem when the arrow keys are used for navigating
- // between items in the list view. An example will make this more clear:
- //
- // Suppose we have 5 items in the list view, and three of these items are
- // part of one group:
- //
- // Index0: ItemA (No Group)
- // Index1: ItemB (GroupX)
- // Index2: ItemC (GroupX)
- // Index3: ItemD (GroupX)
- // Index4: ItemE (No Group)
- //
- // When GroupX is selected (say, by clicking on ItemD with the mouse),
- // GroupTableView::SyncSelection() will make sure ItemB, ItemC and ItemD are
- // selected. Also, the item with the focus will be ItemD (simply because
- // this is the item the user happened to click on). If then the UP arrow is
- // pressed once, the focus will be switched to ItemC and not to ItemA and the
- // end result is that we are stuck in GroupX even though the intention was to
- // switch to ItemA.
- //
- // For that exact reason, we need to set the focus appropriately when we
- // detect that one of the arrow keys is pressed. Thus, when it comes time
- // for the list view control to actually switch the focus, the right item
- // will be selected.
- if ((virtual_keycode != ui::VKEY_UP) &&
- (virtual_keycode != ui::VKEY_DOWN)) {
- return TableView::OnKeyDown(virtual_keycode);
- }
-
- // We start by finding the index of the item with the focus. If no item
- // currently has the focus, then this routine doesn't do anything.
- int focused_index;
- int row_count = model_->RowCount();
- for (focused_index = 0; focused_index < row_count; focused_index++) {
- if (ItemHasTheFocus(focused_index)) {
- break;
- }
- }
-
- if (focused_index == row_count)
- return false;
-
- DCHECK_LT(focused_index, row_count);
-
- // Nothing to do if the item which has the focus is not part of a group.
- GroupRange group_range;
- model_->GetGroupRangeForItem(focused_index, &group_range);
- if (group_range.length == 1)
- return false;
-
- // If the user pressed the UP key, then the focus should be set to the
- // topmost element in the group. If the user pressed the DOWN key, the focus
- // should be set to the bottommost element.
- if (virtual_keycode == ui::VKEY_UP) {
- SetFocusOnItem(group_range.start);
- } else {
- DCHECK_EQ(virtual_keycode, ui::VKEY_DOWN);
- SetFocusOnItem(group_range.start + group_range.length - 1);
- }
-
- return false;
-}
-
-void GroupTableView::PrepareForSort() {
- GroupRange range;
- int row_count = RowCount();
- model_index_to_range_start_map_.clear();
- for (int model_row = 0; model_row < row_count;) {
- model_->GetGroupRangeForItem(model_row, &range);
- for (int range_counter = 0; range_counter < range.length; range_counter++)
- model_index_to_range_start_map_[range_counter + model_row] = model_row;
- model_row += range.length;
- }
-}
-
-int GroupTableView::CompareRows(int model_row1, int model_row2) {
- int range1 = model_index_to_range_start_map_[model_row1];
- int range2 = model_index_to_range_start_map_[model_row2];
- if (range1 == range2) {
- // The two rows are in the same group, sort so that items in the same group
- // always appear in the same order.
- return model_row1 - model_row2;
- }
- // Sort by the first entry of each of the groups.
- return TableView::CompareRows(range1, range2);
-}
-
-void GroupTableView::OnSelectedStateChanged() {
- // The goal is to make sure all items for a same group are in a consistent
- // state in term of selection. When a user clicks an item, several selection
- // messages are sent, possibly including unselecting all currently selected
- // items. For that reason, we post a task to be performed later, after all
- // selection messages have been processed. In the meantime we just ignore all
- // selection notifications.
- if (!sync_selection_factory_.HasWeakPtrs()) {
- MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&GroupTableView::SyncSelection,
- sync_selection_factory_.GetWeakPtr()));
- }
- TableView::OnSelectedStateChanged();
-}
-
-// Draws the line separator betweens the groups.
-void GroupTableView::PostPaint(int model_row, int column, bool selected,
- const gfx::Rect& bounds, HDC hdc) {
- if (!draw_group_separators_)
- return;
-
- GroupRange group_range;
- model_->GetGroupRangeForItem(model_row, &group_range);
-
- // We always paint a vertical line at the end of the last cell.
- HPEN hPen = CreatePen(PS_SOLID, kSeparatorLineThickness, kSeparatorLineColor);
- HPEN hPenOld = (HPEN) SelectObject(hdc, hPen);
- int x = bounds.right() - kSeparatorLineThickness;
- MoveToEx(hdc, x, bounds.y(), NULL);
- LineTo(hdc, x, bounds.bottom());
-
- // We paint a separator line after the last item of a group.
- if (model_row == (group_range.start + group_range.length - 1)) {
- int y = bounds.bottom() - kSeparatorLineThickness;
- MoveToEx(hdc, 0, y, NULL);
- LineTo(hdc, bounds.width(), y);
- }
- SelectObject(hdc, hPenOld);
- DeleteObject(hPen);
-}
-
-std::string GroupTableView::GetClassName() const {
- return kViewClassName;
-}
-
-} // namespace views
« no previous file with comments | « views/controls/table/group_table_view.h ('k') | views/controls/table/native_table_gtk.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698