Index: chrome/browser/views/bookmark_table_view.cc |
diff --git a/chrome/browser/views/bookmark_table_view.cc b/chrome/browser/views/bookmark_table_view.cc |
deleted file mode 100644 |
index 7a48cefe870b6a9270173953fc7ea5c14680d681..0000000000000000000000000000000000000000 |
--- a/chrome/browser/views/bookmark_table_view.cc |
+++ /dev/null |
@@ -1,404 +0,0 @@ |
-// Copyright (c) 2010 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 "chrome/browser/views/bookmark_table_view.h" |
- |
-#include <commctrl.h> |
- |
-#include "app/drag_drop_types.h" |
-#include "app/l10n_util.h" |
-#include "app/os_exchange_data.h" |
-#include "app/os_exchange_data_provider_win.h" |
-#include "app/resource_bundle.h" |
-#include "base/base_drag_source.h" |
-#include "chrome/browser/bookmarks/bookmark_utils.h" |
-#include "chrome/browser/bookmarks/bookmark_model.h" |
-#include "chrome/browser/bookmarks/bookmark_table_model.h" |
-#include "chrome/browser/pref_service.h" |
-#include "chrome/browser/profile.h" |
-#include "chrome/common/pref_names.h" |
-#include "gfx/canvas.h" |
-#include "grit/generated_resources.h" |
-#include "views/controls/table/table_view_observer.h" |
-#include "views/view_constants.h" |
- |
-namespace { |
- |
-// Height of the drop indicator used when dropping between rows. |
-const int kDropHighlightHeight = 2; |
- |
-int GetWidthOfColumn(const std::vector<TableColumn>& columns, |
- const std::vector<int> widths, |
- int column_id) { |
- for (size_t i = 0; i < columns.size(); ++i) { |
- if (columns[i].id == column_id) |
- return widths[i]; |
- } |
- NOTREACHED(); |
- return -1; |
-} |
- |
-} // namespace |
- |
-void BookmarkTableView::DropInfo::Scrolled() { |
- view_->UpdateDropInfo(); |
-} |
- |
-BookmarkTableView::BookmarkTableView(Profile* profile, |
- BookmarkTableModel* model) |
- : views::TableView(model, std::vector<TableColumn>(), |
- views::ICON_AND_TEXT, false, true, true), |
- profile_(profile), |
- show_path_column_(false) { |
- UpdateColumns(); |
-} |
- |
-bool BookmarkTableView::CanDrop(const OSExchangeData& data) { |
- if (!parent_node_ || !profile_->GetBookmarkModel()->IsLoaded()) |
- return false; |
- |
- BookmarkDragData drag_data; |
- if (!drag_data.Read(data)) |
- return false; |
- |
- // Don't allow the user to drop an ancestor of the parent node onto the |
- // parent node. This would create a cycle, which is definitely a no-no. |
- std::vector<const BookmarkNode*> nodes = drag_data.GetNodes(profile_); |
- for (size_t i = 0; i < nodes.size(); ++i) { |
- if (parent_node_->HasAncestor(nodes[i])) |
- return false; |
- } |
- |
- drop_info_.reset(new DropInfo(this)); |
- drop_info_->SetData(drag_data); |
- return true; |
-} |
- |
-void BookmarkTableView::OnDragEntered(const views::DropTargetEvent& event) { |
-} |
- |
-int BookmarkTableView::OnDragUpdated(const views::DropTargetEvent& event) { |
- if (!parent_node_ || !drop_info_.get()) { |
- drop_info_.reset(NULL); |
- return false; |
- } |
- |
- drop_info_->Update(event); |
- return UpdateDropInfo(); |
-} |
- |
-void BookmarkTableView::OnDragExited() { |
- SetDropPosition(DropPosition()); |
- drop_info_.reset(); |
-} |
- |
-int BookmarkTableView::OnPerformDrop(const views::DropTargetEvent& event) { |
- OnPerformDropImpl(); |
- int drop_operation = drop_info_->drop_operation(); |
- SetDropPosition(DropPosition()); |
- drop_info_.reset(); |
- return drop_operation; |
-} |
- |
-BookmarkTableModel* BookmarkTableView::bookmark_table_model() const { |
- return static_cast<BookmarkTableModel*>(model()); |
-} |
- |
-void BookmarkTableView::SaveColumnConfiguration() { |
- PrefService* prefs = profile_->GetPrefs(); |
- if (!prefs) |
- return; |
- |
- if (show_path_column_) { |
- prefs->SetInteger(prefs::kBookmarkTableNameWidth2, |
- GetColumnWidth(IDS_BOOKMARK_TABLE_TITLE)); |
- prefs->SetInteger(prefs::kBookmarkTableURLWidth2, |
- GetColumnWidth(IDS_BOOKMARK_TABLE_URL)); |
- prefs->SetInteger(prefs::kBookmarkTablePathWidth, |
- GetColumnWidth(IDS_BOOKMARK_TABLE_PATH)); |
- } else { |
- prefs->SetInteger(prefs::kBookmarkTableNameWidth1, |
- GetColumnWidth(IDS_BOOKMARK_TABLE_TITLE)); |
- prefs->SetInteger(prefs::kBookmarkTableURLWidth1, |
- GetColumnWidth(IDS_BOOKMARK_TABLE_URL)); |
- } |
-} |
- |
-void BookmarkTableView::SetShowPathColumn(bool show_path_column) { |
- if (show_path_column == show_path_column_) |
- return; |
- |
- SaveColumnConfiguration(); |
- |
- show_path_column_ = show_path_column; |
- UpdateColumns(); |
-} |
- |
-void BookmarkTableView::PostPaint() { |
- PaintAltText(); |
- |
- if (!drop_info_.get() || drop_info_->position().index == -1 || |
- drop_info_->position().on) { |
- return; |
- } |
- |
- RECT bounds = GetDropBetweenHighlightRect(drop_info_->position().index); |
- HDC dc = GetDC(GetNativeControlHWND()); |
- HBRUSH brush = CreateSolidBrush(GetSysColor(COLOR_WINDOWTEXT)); |
- FillRect(dc, &bounds, brush); |
- DeleteObject(brush); |
- ReleaseDC(GetNativeControlHWND(), dc); |
-} |
- |
-LRESULT BookmarkTableView::OnNotify(int w_param, LPNMHDR l_param) { |
- switch (l_param->code) { |
- case LVN_BEGINDRAG: |
- BeginDrag(); |
- return 0; // Return value doesn't matter for this message. |
- } |
- |
- return TableView::OnNotify(w_param, l_param); |
-} |
- |
-int BookmarkTableView::UpdateDropInfo() { |
- DropPosition position = CalculateDropPosition(drop_info_->last_y()); |
- |
- drop_info_->set_drop_operation(CalculateDropOperation(position)); |
- |
- if (drop_info_->drop_operation() == DragDropTypes::DRAG_NONE) |
- position = DropPosition(); |
- |
- SetDropPosition(position); |
- |
- return drop_info_->drop_operation(); |
-} |
- |
-void BookmarkTableView::BeginDrag() { |
- std::vector<const BookmarkNode*> nodes_to_drag; |
- for (TableView::iterator i = SelectionBegin(); i != SelectionEnd(); ++i) |
- nodes_to_drag.push_back(bookmark_table_model()->GetNodeForRow(*i)); |
- if (nodes_to_drag.empty()) |
- return; // Nothing to drag. |
- |
- // Reverse the nodes so that they are put on the clipboard in visual order. |
- // We do this as SelectionBegin starts at the end of the visual order. |
- std::reverse(nodes_to_drag.begin(), nodes_to_drag.end()); |
- |
- OSExchangeData data; |
- BookmarkDragData(nodes_to_drag).Write(profile_, &data); |
- scoped_refptr<BaseDragSource> drag_source(new BaseDragSource); |
- DWORD effects; |
- DoDragDrop(OSExchangeDataProviderWin::GetIDataObject(data), drag_source, |
- DROPEFFECT_LINK | DROPEFFECT_COPY | DROPEFFECT_MOVE, &effects); |
-} |
- |
-int BookmarkTableView::CalculateDropOperation(const DropPosition& position) { |
- if (drop_info_->data().IsFromProfile(profile_)) { |
- // Data from the same profile. Prefer move, but do copy if the user wants |
- // that. |
- if (drop_info_->is_control_down()) |
- return DragDropTypes::DRAG_COPY; |
- |
- int real_drop_index; |
- const BookmarkNode* drop_parent = GetDropParentAndIndex(position, |
- &real_drop_index); |
- if (!bookmark_utils::IsValidDropLocation( |
- profile_, drop_info_->data(), drop_parent, real_drop_index)) { |
- return DragDropTypes::DRAG_NONE; |
- } |
- return DragDropTypes::DRAG_MOVE; |
- } |
- // We're going to copy, but return an operation compatible with the source |
- // operations so that the user can drop. |
- return bookmark_utils::PreferredDropOperation( |
- drop_info_->source_operations(), |
- DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK); |
-} |
- |
-void BookmarkTableView::OnPerformDropImpl() { |
- int drop_index; |
- const BookmarkNode* drop_parent = GetDropParentAndIndex( |
- drop_info_->position(), &drop_index); |
- BookmarkModel* model = profile_->GetBookmarkModel(); |
- int min_selection; |
- int max_selection; |
- // If the data is not from this profile we return an operation compatible |
- // with the source. As such, we need to need to check the data here too. |
- if (!drop_info_->data().IsFromProfile(profile_) || |
- drop_info_->drop_operation() == DragDropTypes::DRAG_COPY) { |
- bookmark_utils::CloneDragData(model, drop_info_->data().elements, |
- drop_parent, drop_index); |
- min_selection = drop_index; |
- max_selection = drop_index + |
- static_cast<int>(drop_info_->data().elements.size()); |
- } else { |
- // else, move. |
- std::vector<const BookmarkNode*> nodes = |
- drop_info_->data().GetNodes(profile_); |
- if (nodes.empty()) |
- return; |
- |
- for (size_t i = 0; i < nodes.size(); ++i) { |
- model->Move(nodes[i], drop_parent, drop_index); |
- // Reset the drop_index, just in case the index didn't really change. |
- drop_index = drop_parent->IndexOfChild(nodes[i]) + 1; |
- } |
- min_selection = drop_parent->IndexOfChild(nodes[0]); |
- max_selection = min_selection + static_cast<int>(nodes.size()); |
- } |
- if (drop_info_->position().on) { |
- // The user dropped on a folder, select it. |
- int index = parent_node_->IndexOfChild(drop_parent); |
- if (index != -1) |
- Select(index); |
- } else if (min_selection < RowCount() && max_selection <= RowCount()) { |
- // Select the moved/copied rows. |
- Select(min_selection); |
- if (min_selection + 1 < max_selection) { |
- // SetSelectedState doesn't send notification, so we manually do it. |
- for (int i = min_selection + 1; i < max_selection; ++i) |
- SetSelectedState(i, true); |
- if (observer()) |
- observer()->OnSelectionChanged(); |
- } |
- } |
-} |
- |
-void BookmarkTableView::SetDropPosition(const DropPosition& position) { |
- if (drop_info_->position().equals(position)) |
- return; |
- |
- UpdateDropIndicator(drop_info_->position(), false); |
- |
- drop_info_->set_position(position); |
- |
- UpdateDropIndicator(drop_info_->position(), true); |
-} |
- |
-void BookmarkTableView::UpdateDropIndicator(const DropPosition& position, |
- bool turn_on) { |
- if (position.index == -1) |
- return; |
- |
- if (position.on) { |
- ListView_SetItemState(GetNativeControlHWND(), position.index, |
- turn_on ? LVIS_DROPHILITED : 0, LVIS_DROPHILITED); |
- } else { |
- RECT bounds = GetDropBetweenHighlightRect(position.index); |
- InvalidateRect(GetNativeControlHWND(), &bounds, FALSE); |
- } |
-} |
- |
-BookmarkTableView::DropPosition |
- BookmarkTableView::CalculateDropPosition(int y) { |
- HWND hwnd = GetNativeControlHWND(); |
- int row_count = RowCount(); |
- int top_index = ListView_GetTopIndex(hwnd); |
- if (row_count == 0 || top_index < 0) |
- return DropPosition(0, false); |
- |
- for (int i = top_index; i < row_count; ++i) { |
- RECT bounds; |
- ListView_GetItemRect(hwnd, i, &bounds, LVIR_BOUNDS); |
- if (y < bounds.top) |
- return DropPosition(i, false); |
- if (y < bounds.bottom) { |
- if (bookmark_table_model()->GetNodeForRow(i)->is_folder()) { |
- if (y < bounds.top + views::kDropBetweenPixels) |
- return DropPosition(i, false); |
- if (y >= bounds.bottom - views::kDropBetweenPixels) |
- return DropPosition(i + 1, false); |
- return DropPosition(i, true); |
- } |
- if (y < (bounds.bottom - bounds.top) / 2 + bounds.top) |
- return DropPosition(i, false); |
- return DropPosition(i + 1, false); |
- } |
- } |
- return DropPosition(row_count, false); |
-} |
- |
-const BookmarkNode* BookmarkTableView::GetDropParentAndIndex( |
- const DropPosition& position, |
- int* index) { |
- if (position.on) { |
- const BookmarkNode* parent = parent_node_->GetChild(position.index); |
- *index = parent->GetChildCount(); |
- return parent; |
- } |
- *index = position.index; |
- return parent_node_; |
-} |
- |
-RECT BookmarkTableView::GetDropBetweenHighlightRect(int index) { |
- RECT bounds = { 0 }; |
- if (RowCount() == 0) { |
- bounds.top = content_offset(); |
- bounds.left = 0; |
- bounds.right = width(); |
- } else if (index >= RowCount()) { |
- ListView_GetItemRect(GetNativeControlHWND(), index - 1, &bounds, |
- LVIR_BOUNDS); |
- bounds.top = bounds.bottom - kDropHighlightHeight / 2; |
- } else { |
- ListView_GetItemRect(GetNativeControlHWND(), index, &bounds, LVIR_BOUNDS); |
- bounds.top -= kDropHighlightHeight / 2; |
- } |
- bounds.bottom = bounds.top + kDropHighlightHeight; |
- return bounds; |
-} |
- |
-void BookmarkTableView::UpdateColumns() { |
- PrefService* prefs = profile_->GetPrefs(); |
- TableColumn name_column = |
- TableColumn(IDS_BOOKMARK_TABLE_TITLE, TableColumn::LEFT, -1); |
- TableColumn url_column = |
- TableColumn(IDS_BOOKMARK_TABLE_URL, TableColumn::LEFT, -1); |
- TableColumn path_column = |
- TableColumn(IDS_BOOKMARK_TABLE_PATH, TableColumn::LEFT, -1); |
- |
- std::vector<TableColumn> columns; |
- if (show_path_column_) { |
- int name_width = -1; |
- int url_width = -1; |
- int path_width = -1; |
- if (prefs) { |
- name_width = prefs->GetInteger(prefs::kBookmarkTableNameWidth2); |
- url_width = prefs->GetInteger(prefs::kBookmarkTableURLWidth2); |
- path_width = prefs->GetInteger(prefs::kBookmarkTablePathWidth); |
- } |
- if (name_width != -1 && url_width != -1 && path_width != -1) { |
- name_column.width = name_width; |
- url_column.width = url_width; |
- path_column.width = path_width; |
- } else { |
- name_column.percent = .5; |
- url_column.percent = .25; |
- path_column.percent= .25; |
- } |
- columns.push_back(name_column); |
- columns.push_back(url_column); |
- columns.push_back(path_column); |
- } else { |
- int name_width = -1; |
- int url_width = -1; |
- if (prefs) { |
- name_width = prefs->GetInteger(prefs::kBookmarkTableNameWidth1); |
- url_width = prefs->GetInteger(prefs::kBookmarkTableURLWidth1); |
- } |
- if (name_width != -1 && url_width != -1) { |
- name_column.width = name_width; |
- url_column.width = url_width; |
- } else { |
- name_column.percent = .5; |
- url_column.percent = .5; |
- } |
- columns.push_back(name_column); |
- columns.push_back(url_column); |
- } |
- SetColumns(columns); |
- for (size_t i = 0; i < columns.size(); ++i) |
- SetColumnVisibility(columns[i].id, true); |
- OnModelChanged(); |
-} |