diff options
Diffstat (limited to 'chrome/browser/views/bookmark_folder_tree_view.cc')
-rw-r--r-- | chrome/browser/views/bookmark_folder_tree_view.cc | 179 |
1 files changed, 81 insertions, 98 deletions
diff --git a/chrome/browser/views/bookmark_folder_tree_view.cc b/chrome/browser/views/bookmark_folder_tree_view.cc index c068103..29dbceb 100644 --- a/chrome/browser/views/bookmark_folder_tree_view.cc +++ b/chrome/browser/views/bookmark_folder_tree_view.cc @@ -11,10 +11,14 @@ #include "chrome/browser/profile.h" #include "chrome/common/drag_drop_types.h" #include "chrome/common/os_exchange_data.h" -#include "chrome/views/chrome_menu.h" +#include "chrome/views/view_constants.h" #include "generated_resources.h" +void BookmarkFolderTreeView::DropInfo::Scrolled() { + view_->UpdateDropInfo(); +} + BookmarkFolderTreeView::BookmarkFolderTreeView(Profile* profile, BookmarkFolderTreeModel* model) : views::TreeView(), @@ -30,14 +34,18 @@ bool BookmarkFolderTreeView::CanDrop(const OSExchangeData& data) { if (!profile_->GetBookmarkModel()->IsLoaded()) return false; - drop_info_.reset(new DropInfo()); - if (!drop_info_->drag_data.Read(data)) + BookmarkDragData drag_data; + + if (!drag_data.Read(data)) return false; + drop_info_.reset(new DropInfo(this)); + drop_info_->SetData(drag_data); + // See if there are any urls being dropped. - for (size_t i = 0; i < drop_info_->drag_data.size(); ++i) { - if (drop_info_->drag_data.elements[0].is_url) { - drop_info_->only_folders = false; + for (size_t i = 0; i < drop_info_->data().size(); ++i) { + if (drop_info_->data().elements[0].is_url) { + drop_info_->set_only_folders(false); break; } } @@ -50,27 +58,12 @@ void BookmarkFolderTreeView::OnDragEntered( } int BookmarkFolderTreeView::OnDragUpdated(const views::DropTargetEvent& event) { - int drop_index; - bool drop_on; - FolderNode* drop_parent = - CalculateDropParent(event.y(), drop_info_->only_folders, &drop_index, - &drop_on); - drop_info_->drop_operation = - CalculateDropOperation(event, drop_parent, drop_index, drop_on); - - if (drop_info_->drop_operation == DragDropTypes::DRAG_NONE) { - drop_parent = NULL; - drop_index = -1; - drop_on = false; - } - - SetDropParent(drop_parent, drop_index, drop_on); - - return drop_info_->drop_operation; + drop_info_->Update(event); + return UpdateDropInfo(); } void BookmarkFolderTreeView::OnDragExited() { - SetDropParent(NULL, -1, false); + SetDropPosition(DropPosition()); drop_info_.reset(); } @@ -78,8 +71,8 @@ void BookmarkFolderTreeView::OnDragExited() { int BookmarkFolderTreeView::OnPerformDrop(const views::DropTargetEvent& event) { OnPerformDropImpl(); - int drop_operation = drop_info_->drop_operation; - SetDropParent(NULL, -1, false); + int drop_operation = drop_info_->drop_operation(); + SetDropPosition(DropPosition()); drop_info_.reset(); return drop_operation; } @@ -106,6 +99,19 @@ LRESULT BookmarkFolderTreeView::OnNotify(int w_param, LPNMHDR l_param) { return TreeView::OnNotify(w_param, l_param); } +int BookmarkFolderTreeView::UpdateDropInfo() { + DropPosition position = + CalculateDropPosition(drop_info_->last_y(), drop_info_->only_folders()); + 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 BookmarkFolderTreeView::BeginDrag(BookmarkNode* node) { BookmarkModel* model = profile_->GetBookmarkModel(); // Only allow the drag if the user has selected a node of type bookmark and it @@ -128,12 +134,8 @@ void BookmarkFolderTreeView::BeginDrag(BookmarkNode* node) { is_dragging_ = false; } -FolderNode* BookmarkFolderTreeView::CalculateDropParent(int y, - bool only_folders, - int* drop_index, - bool* drop_on) { - *drop_on = false; - *drop_index = -1; +BookmarkFolderTreeView::DropPosition BookmarkFolderTreeView:: + CalculateDropPosition(int y, bool only_folders) { HWND hwnd = GetNativeControlHWND(); HTREEITEM item = TreeView_GetFirstVisible(hwnd); while (item) { @@ -144,7 +146,7 @@ FolderNode* BookmarkFolderTreeView::CalculateDropParent(int y, if (folder_model()->GetNodeType(model_node) != BookmarkFolderTreeModel::BOOKMARK) { // Only allow drops on bookmark nodes. - return NULL; + return DropPosition(); } FolderNode* node = folder_model()->AsNode(model_node); @@ -153,59 +155,50 @@ FolderNode* BookmarkFolderTreeView::CalculateDropParent(int y, // If some of the elements being dropped are urls, then we only allow // dropping on a folder. Similarly you can't drop between the // bookmark bar and other folder nodes. - *drop_on = true; - *drop_index = node->GetChildCount(); - return node; + return DropPosition(node, node->GetChildCount(), true); } // Drop contains all folders, allow them to be dropped between // folders. - if (y < bounds.top + views::MenuItemView::kDropBetweenPixels) { - *drop_index = node->GetParent()->IndexOfChild(node); - return node->GetParent(); + if (y < bounds.top + views::kDropBetweenPixels) { + return DropPosition(node->GetParent(), + node->GetParent()->IndexOfChild(node), false); } - if (y >= bounds.bottom - views::MenuItemView::kDropBetweenPixels) { + if (y >= bounds.bottom - views::kDropBetweenPixels) { if (IsExpanded(node) && folder_model()->GetChildCount(node) > 0) { // The node is expanded and has children, treat the drop as occurring // as the first child. This is done to avoid the selection highlight // dancing around when dragging over expanded folders. Without this // the highlight jumps past the last expanded child of node. - *drop_index = 0; - return node; + return DropPosition(node, 0, false); } - *drop_index = node->GetParent()->IndexOfChild(node) + 1; - return node->GetParent(); + return DropPosition(node->GetParent(), + node->GetParent()->IndexOfChild(node) + 1, false); } - *drop_on = true; - *drop_index = node->GetChildCount(); - return node; + return DropPosition(node, node->GetChildCount(), true); } item = TreeView_GetNextVisible(hwnd, item); } - return NULL; + return DropPosition(); } int BookmarkFolderTreeView::CalculateDropOperation( - const views::DropTargetEvent& event, - FolderNode* drop_parent, - int drop_index, - bool drop_on) { - if (!drop_parent) + const DropPosition& position) { + if (!position.parent) return DragDropTypes::DRAG_NONE; - if (drop_info_->drag_data.IsFromProfile(profile_)) { - int bookmark_model_drop_index = - FolderIndexToBookmarkIndex(drop_parent, drop_index, drop_on); + if (drop_info_->data().IsFromProfile(profile_)) { + int bookmark_model_drop_index = FolderIndexToBookmarkIndex(position); if (!bookmark_utils::IsValidDropLocation( - profile_, drop_info_->drag_data, - TreeNodeAsBookmarkNode(drop_parent), + profile_, drop_info_->data(), + TreeNodeAsBookmarkNode(position.parent), bookmark_model_drop_index)) { return DragDropTypes::DRAG_NONE; } // Data from the same profile. Prefer move, but do copy if the user wants // that. - if (event.IsControlDown()) + if (drop_info_->is_control_down()) return DragDropTypes::DRAG_COPY; return DragDropTypes::DRAG_MOVE; @@ -213,25 +206,26 @@ int BookmarkFolderTreeView::CalculateDropOperation( // We're going to copy, but return an operation compatible with the source // operations so that the user can drop. return bookmark_utils::PreferredDropOperation( - event, DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK); + drop_info_->source_operations(), + DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK); } void BookmarkFolderTreeView::OnPerformDropImpl() { - BookmarkNode* parent_node = TreeNodeAsBookmarkNode(drop_info_->drop_parent); - int drop_index = FolderIndexToBookmarkIndex( - drop_info_->drop_parent, drop_info_->drop_index, drop_info_->drop_on); + BookmarkNode* parent_node = + TreeNodeAsBookmarkNode(drop_info_->position().parent); + int drop_index = FolderIndexToBookmarkIndex(drop_info_->position()); BookmarkModel* model = profile_->GetBookmarkModel(); // 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_->drag_data.IsFromProfile(profile_) || - drop_info_->drop_operation == DragDropTypes::DRAG_COPY) { - bookmark_utils::CloneDragData(model, drop_info_->drag_data.elements, + if (!drop_info_->data().IsFromProfile(profile_) || + drop_info_->drop_operation() == DragDropTypes::DRAG_COPY) { + bookmark_utils::CloneDragData(model, drop_info_->data().elements, parent_node, drop_index); return; } // else, move. - std::vector<BookmarkNode*> nodes = drop_info_->drag_data.GetNodes(profile_); + std::vector<BookmarkNode*> nodes = drop_info_->data().GetNodes(profile_); if (nodes.empty()) return; @@ -250,46 +244,36 @@ void BookmarkFolderTreeView::OnPerformDropImpl() { } } -void BookmarkFolderTreeView::SetDropParent(FolderNode* node, - int drop_index, - bool drop_on) { - if (drop_info_->drop_parent == node && - drop_info_->drop_index == drop_index && - drop_info_->drop_on == drop_on) { +void BookmarkFolderTreeView::SetDropPosition(const DropPosition& position) { + if (drop_info_->position().equals(position)) return; - } + // Remove the indicator over the previous location. - if (drop_info_->drop_on) { - HTREEITEM item = GetTreeItemForNode(drop_info_->drop_parent); + if (drop_info_->position().on) { + HTREEITEM item = GetTreeItemForNode(drop_info_->position().parent); if (item) TreeView_SetItemState(GetNativeControlHWND(), item, 0, TVIS_DROPHILITED); - } else if (drop_info_->drop_index != -1) { + } else if (drop_info_->position().index != -1) { TreeView_SetInsertMark(GetNativeControlHWND(), NULL, FALSE); } - drop_info_->drop_parent = node; - drop_info_->drop_index = drop_index; - drop_info_->drop_on = drop_on; + drop_info_->set_position(position); // And show the new indicator. - if (drop_info_->drop_on) { - HTREEITEM item = GetTreeItemForNode(drop_info_->drop_parent); + if (position.on) { + HTREEITEM item = GetTreeItemForNode(position.parent); if (item) { TreeView_SetItemState(GetNativeControlHWND(), item, TVIS_DROPHILITED, TVIS_DROPHILITED); } - } else if (drop_info_->drop_index != -1) { + } else if (position.index != -1) { BOOL after = FALSE; - if (folder_model()->GetChildCount(drop_info_->drop_parent) == - drop_info_->drop_index) { + FolderNode* node = position.parent; + if (folder_model()->GetChildCount(position.parent) == position.index) { after = TRUE; - node = - folder_model()->GetChild(drop_info_->drop_parent, - drop_info_->drop_index - 1); + node = folder_model()->GetChild(position.parent, position.index - 1); } else { - node = - folder_model()->GetChild(drop_info_->drop_parent, - drop_info_->drop_index); + node = folder_model()->GetChild(position.parent, position.index); } HTREEITEM item = GetTreeItemForNode(node); if (item) @@ -305,16 +289,15 @@ BookmarkNode* BookmarkFolderTreeView::TreeNodeAsBookmarkNode(FolderNode* node) { return folder_model()->TreeNodeAsBookmarkNode(node); } -int BookmarkFolderTreeView::FolderIndexToBookmarkIndex(FolderNode* node, - int index, - bool drop_on) { - BookmarkNode* parent_node = TreeNodeAsBookmarkNode(node); - if (drop_on || index == node->GetChildCount()) +int BookmarkFolderTreeView::FolderIndexToBookmarkIndex( + const DropPosition& position) { + BookmarkNode* parent_node = TreeNodeAsBookmarkNode(position.parent); + if (position.on || position.index == position.parent->GetChildCount()) return parent_node->GetChildCount(); - if (index != 0) { + if (position.index != 0) { return parent_node->IndexOfChild( - TreeNodeAsBookmarkNode(node->GetChild(index))); + TreeNodeAsBookmarkNode(position.parent->GetChild(position.index))); } return 0; |