Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/views/bookmark_folder_tree_view.h" | 5 #include "chrome/browser/views/bookmark_folder_tree_view.h" |
| 6 | 6 |
| 7 #include "base/base_drag_source.h" | 7 #include "base/base_drag_source.h" |
| 8 #include "chrome/browser/bookmarks/bookmark_utils.h" | 8 #include "chrome/browser/bookmarks/bookmark_utils.h" |
| 9 #include "chrome/browser/bookmarks/bookmark_model.h" | 9 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 10 #include "chrome/browser/bookmarks/bookmark_folder_tree_model.h" | 10 #include "chrome/browser/bookmarks/bookmark_folder_tree_model.h" |
| 11 #include "chrome/browser/profile.h" | 11 #include "chrome/browser/profile.h" |
| 12 #include "chrome/common/drag_drop_types.h" | 12 #include "chrome/common/drag_drop_types.h" |
| 13 #include "chrome/common/os_exchange_data.h" | 13 #include "chrome/common/os_exchange_data.h" |
| 14 #include "chrome/views/chrome_menu.h" | 14 #include "chrome/views/view_constants.h" |
| 15 | 15 |
| 16 #include "generated_resources.h" | 16 #include "generated_resources.h" |
| 17 | 17 |
| 18 void BookmarkFolderTreeView::DropInfo::Scrolled() { | |
| 19 view_->UpdateDropInfo(); | |
| 20 } | |
| 21 | |
| 18 BookmarkFolderTreeView::BookmarkFolderTreeView(Profile* profile, | 22 BookmarkFolderTreeView::BookmarkFolderTreeView(Profile* profile, |
| 19 BookmarkFolderTreeModel* model) | 23 BookmarkFolderTreeModel* model) |
| 20 : views::TreeView(), | 24 : views::TreeView(), |
| 21 profile_(profile), | 25 profile_(profile), |
| 22 is_dragging_(false) { | 26 is_dragging_(false) { |
| 23 SetModel(model); | 27 SetModel(model); |
| 24 SetEditable(false); | 28 SetEditable(false); |
| 25 SetRootShown(false); | 29 SetRootShown(false); |
| 26 set_drag_enabled(true); | 30 set_drag_enabled(true); |
| 27 } | 31 } |
| 28 | 32 |
| 29 bool BookmarkFolderTreeView::CanDrop(const OSExchangeData& data) { | 33 bool BookmarkFolderTreeView::CanDrop(const OSExchangeData& data) { |
| 30 if (!profile_->GetBookmarkModel()->IsLoaded()) | 34 if (!profile_->GetBookmarkModel()->IsLoaded()) |
| 31 return false; | 35 return false; |
| 32 | 36 |
| 33 drop_info_.reset(new DropInfo()); | 37 BookmarkDragData drag_data; |
| 34 if (!drop_info_->drag_data.Read(data)) | 38 |
| 39 if (!drag_data.Read(data)) | |
| 35 return false; | 40 return false; |
| 36 | 41 |
| 42 drop_info_.reset(new DropInfo(this)); | |
| 43 drop_info_->SetData(drag_data); | |
| 44 | |
| 37 // See if there are any urls being dropped. | 45 // See if there are any urls being dropped. |
| 38 for (size_t i = 0; i < drop_info_->drag_data.size(); ++i) { | 46 for (size_t i = 0; i < drop_info_->data().size(); ++i) { |
| 39 if (drop_info_->drag_data.elements[0].is_url) { | 47 if (drop_info_->data().elements[0].is_url) { |
| 40 drop_info_->only_folders = false; | 48 drop_info_->set_only_folders(false); |
| 41 break; | 49 break; |
| 42 } | 50 } |
| 43 } | 51 } |
| 44 | 52 |
| 45 return true; | 53 return true; |
| 46 } | 54 } |
| 47 | 55 |
| 48 void BookmarkFolderTreeView::OnDragEntered( | 56 void BookmarkFolderTreeView::OnDragEntered( |
| 49 const views::DropTargetEvent& event) { | 57 const views::DropTargetEvent& event) { |
| 50 } | 58 } |
| 51 | 59 |
| 52 int BookmarkFolderTreeView::OnDragUpdated(const views::DropTargetEvent& event) { | 60 int BookmarkFolderTreeView::OnDragUpdated(const views::DropTargetEvent& event) { |
| 53 int drop_index; | 61 drop_info_->Update(event); |
| 54 bool drop_on; | 62 return UpdateDropInfo(); |
| 55 FolderNode* drop_parent = | |
| 56 CalculateDropParent(event.y(), drop_info_->only_folders, &drop_index, | |
| 57 &drop_on); | |
| 58 drop_info_->drop_operation = | |
| 59 CalculateDropOperation(event, drop_parent, drop_index, drop_on); | |
| 60 | |
| 61 if (drop_info_->drop_operation == DragDropTypes::DRAG_NONE) { | |
| 62 drop_parent = NULL; | |
| 63 drop_index = -1; | |
| 64 drop_on = false; | |
| 65 } | |
| 66 | |
| 67 SetDropParent(drop_parent, drop_index, drop_on); | |
| 68 | |
| 69 return drop_info_->drop_operation; | |
| 70 } | 63 } |
| 71 | 64 |
| 72 void BookmarkFolderTreeView::OnDragExited() { | 65 void BookmarkFolderTreeView::OnDragExited() { |
| 73 SetDropParent(NULL, -1, false); | 66 SetDropPosition(DropPosition()); |
| 74 | 67 |
| 75 drop_info_.reset(); | 68 drop_info_.reset(); |
| 76 } | 69 } |
| 77 | 70 |
| 78 int BookmarkFolderTreeView::OnPerformDrop(const views::DropTargetEvent& event) { | 71 int BookmarkFolderTreeView::OnPerformDrop(const views::DropTargetEvent& event) { |
| 79 OnPerformDropImpl(); | 72 OnPerformDropImpl(); |
| 80 | 73 |
| 81 int drop_operation = drop_info_->drop_operation; | 74 int drop_operation = drop_info_->drop_operation(); |
| 82 SetDropParent(NULL, -1, false); | 75 SetDropPosition(DropPosition()); |
| 83 drop_info_.reset(); | 76 drop_info_.reset(); |
| 84 return drop_operation; | 77 return drop_operation; |
| 85 } | 78 } |
| 86 | 79 |
| 87 BookmarkNode* BookmarkFolderTreeView::GetSelectedBookmarkNode() { | 80 BookmarkNode* BookmarkFolderTreeView::GetSelectedBookmarkNode() { |
| 88 views::TreeModelNode* selected_node = GetSelectedNode(); | 81 views::TreeModelNode* selected_node = GetSelectedNode(); |
| 89 if (!selected_node) | 82 if (!selected_node) |
| 90 return NULL; | 83 return NULL; |
| 91 return TreeNodeAsBookmarkNode(folder_model()->AsNode(selected_node)); | 84 return TreeNodeAsBookmarkNode(folder_model()->AsNode(selected_node)); |
| 92 } | 85 } |
| 93 | 86 |
| 94 LRESULT BookmarkFolderTreeView::OnNotify(int w_param, LPNMHDR l_param) { | 87 LRESULT BookmarkFolderTreeView::OnNotify(int w_param, LPNMHDR l_param) { |
| 95 switch (l_param->code) { | 88 switch (l_param->code) { |
| 96 case TVN_BEGINDRAG: { | 89 case TVN_BEGINDRAG: { |
| 97 HTREEITEM tree_item = | 90 HTREEITEM tree_item = |
| 98 reinterpret_cast<LPNMTREEVIEW>(l_param)->itemNew.hItem; | 91 reinterpret_cast<LPNMTREEVIEW>(l_param)->itemNew.hItem; |
| 99 FolderNode* folder_node = | 92 FolderNode* folder_node = |
| 100 folder_model()->AsNode(GetNodeForTreeItem(tree_item)); | 93 folder_model()->AsNode(GetNodeForTreeItem(tree_item)); |
| 101 BeginDrag(TreeNodeAsBookmarkNode(folder_node)); | 94 BeginDrag(TreeNodeAsBookmarkNode(folder_node)); |
| 102 return 0; // Return value ignored. | 95 return 0; // Return value ignored. |
| 103 } | 96 } |
| 104 } | 97 } |
| 105 | 98 |
| 106 return TreeView::OnNotify(w_param, l_param); | 99 return TreeView::OnNotify(w_param, l_param); |
| 107 } | 100 } |
| 108 | 101 |
| 102 int BookmarkFolderTreeView::UpdateDropInfo() { | |
| 103 DropPosition position = | |
| 104 CalculateDropPosition(drop_info_->last_y(), drop_info_->only_folders()); | |
| 105 drop_info_->set_drop_operation(CalculateDropOperation(position)); | |
| 106 | |
| 107 if (drop_info_->drop_operation() == DragDropTypes::DRAG_NONE) | |
| 108 position = DropPosition(); | |
| 109 | |
| 110 SetDropPosition(position); | |
| 111 | |
| 112 return drop_info_->drop_operation(); | |
| 113 } | |
| 114 | |
| 109 void BookmarkFolderTreeView::BeginDrag(BookmarkNode* node) { | 115 void BookmarkFolderTreeView::BeginDrag(BookmarkNode* node) { |
| 110 BookmarkModel* model = profile_->GetBookmarkModel(); | 116 BookmarkModel* model = profile_->GetBookmarkModel(); |
| 111 // Only allow the drag if the user has selected a node of type bookmark and it | 117 // Only allow the drag if the user has selected a node of type bookmark and it |
| 112 // isn't the bookmark bar or other bookmarks folders. | 118 // isn't the bookmark bar or other bookmarks folders. |
| 113 if (!node || node == model->other_node() || | 119 if (!node || node == model->other_node() || |
| 114 node == model->GetBookmarkBarNode()) { | 120 node == model->GetBookmarkBarNode()) { |
| 115 return; | 121 return; |
| 116 } | 122 } |
| 117 | 123 |
| 118 std::vector<BookmarkNode*> nodes_to_drag; | 124 std::vector<BookmarkNode*> nodes_to_drag; |
| 119 nodes_to_drag.push_back(node); | 125 nodes_to_drag.push_back(node); |
| 120 | 126 |
| 121 scoped_refptr<OSExchangeData> data = new OSExchangeData; | 127 scoped_refptr<OSExchangeData> data = new OSExchangeData; |
| 122 BookmarkDragData(nodes_to_drag).Write(profile_, data); | 128 BookmarkDragData(nodes_to_drag).Write(profile_, data); |
| 123 scoped_refptr<BaseDragSource> drag_source(new BaseDragSource); | 129 scoped_refptr<BaseDragSource> drag_source(new BaseDragSource); |
| 124 DWORD effects; | 130 DWORD effects; |
| 125 is_dragging_ = true; | 131 is_dragging_ = true; |
| 126 DoDragDrop(data, drag_source, | 132 DoDragDrop(data, drag_source, |
| 127 DROPEFFECT_LINK | DROPEFFECT_COPY | DROPEFFECT_MOVE, &effects); | 133 DROPEFFECT_LINK | DROPEFFECT_COPY | DROPEFFECT_MOVE, &effects); |
| 128 is_dragging_ = false; | 134 is_dragging_ = false; |
| 129 } | 135 } |
| 130 | 136 |
| 131 FolderNode* BookmarkFolderTreeView::CalculateDropParent(int y, | 137 BookmarkFolderTreeView::DropPosition BookmarkFolderTreeView:: |
|
ncarter (slow)
2008/11/04 18:39:47
Is the first scope resolution necessary?
| |
| 132 bool only_folders, | 138 CalculateDropPosition(int y, bool only_folders) { |
| 133 int* drop_index, | |
| 134 bool* drop_on) { | |
| 135 *drop_on = false; | |
| 136 *drop_index = -1; | |
| 137 HWND hwnd = GetNativeControlHWND(); | 139 HWND hwnd = GetNativeControlHWND(); |
| 138 HTREEITEM item = TreeView_GetFirstVisible(hwnd); | 140 HTREEITEM item = TreeView_GetFirstVisible(hwnd); |
| 139 while (item) { | 141 while (item) { |
| 140 RECT bounds; | 142 RECT bounds; |
| 141 TreeView_GetItemRect(hwnd, item, &bounds, TRUE); | 143 TreeView_GetItemRect(hwnd, item, &bounds, TRUE); |
| 142 if (y < bounds.bottom) { | 144 if (y < bounds.bottom) { |
| 143 views::TreeModelNode* model_node = GetNodeForTreeItem(item); | 145 views::TreeModelNode* model_node = GetNodeForTreeItem(item); |
| 144 if (folder_model()->GetNodeType(model_node) != | 146 if (folder_model()->GetNodeType(model_node) != |
| 145 BookmarkFolderTreeModel::BOOKMARK) { | 147 BookmarkFolderTreeModel::BOOKMARK) { |
| 146 // Only allow drops on bookmark nodes. | 148 // Only allow drops on bookmark nodes. |
| 147 return NULL; | 149 return DropPosition(); |
| 148 } | 150 } |
| 149 | 151 |
| 150 FolderNode* node = folder_model()->AsNode(model_node); | 152 FolderNode* node = folder_model()->AsNode(model_node); |
| 151 if (!only_folders || !node->GetParent() || | 153 if (!only_folders || !node->GetParent() || |
| 152 !node->GetParent()->GetParent()) { | 154 !node->GetParent()->GetParent()) { |
| 153 // If some of the elements being dropped are urls, then we only allow | 155 // If some of the elements being dropped are urls, then we only allow |
| 154 // dropping on a folder. Similarly you can't drop between the | 156 // dropping on a folder. Similarly you can't drop between the |
| 155 // bookmark bar and other folder nodes. | 157 // bookmark bar and other folder nodes. |
| 156 *drop_on = true; | 158 return DropPosition(node, node->GetChildCount(), true); |
| 157 *drop_index = node->GetChildCount(); | |
| 158 return node; | |
| 159 } | 159 } |
| 160 | 160 |
| 161 // Drop contains all folders, allow them to be dropped between | 161 // Drop contains all folders, allow them to be dropped between |
| 162 // folders. | 162 // folders. |
| 163 if (y < bounds.top + views::MenuItemView::kDropBetweenPixels) { | 163 if (y < bounds.top + views::kDropBetweenPixels) { |
| 164 *drop_index = node->GetParent()->IndexOfChild(node); | 164 return DropPosition(node->GetParent(), |
| 165 return node->GetParent(); | 165 node->GetParent()->IndexOfChild(node), false); |
| 166 } | 166 } |
| 167 if (y >= bounds.bottom - views::MenuItemView::kDropBetweenPixels) { | 167 if (y >= bounds.bottom - views::kDropBetweenPixels) { |
| 168 if (IsExpanded(node) && folder_model()->GetChildCount(node) > 0) { | 168 if (IsExpanded(node) && folder_model()->GetChildCount(node) > 0) { |
| 169 // The node is expanded and has children, treat the drop as occurring | 169 // The node is expanded and has children, treat the drop as occurring |
| 170 // as the first child. This is done to avoid the selection highlight | 170 // as the first child. This is done to avoid the selection highlight |
| 171 // dancing around when dragging over expanded folders. Without this | 171 // dancing around when dragging over expanded folders. Without this |
| 172 // the highlight jumps past the last expanded child of node. | 172 // the highlight jumps past the last expanded child of node. |
| 173 *drop_index = 0; | 173 return DropPosition(node, 0, false); |
| 174 return node; | |
| 175 } | 174 } |
| 176 *drop_index = node->GetParent()->IndexOfChild(node) + 1; | 175 return DropPosition(node->GetParent(), |
| 177 return node->GetParent(); | 176 node->GetParent()->IndexOfChild(node) + 1, false); |
| 178 } | 177 } |
| 179 *drop_on = true; | 178 return DropPosition(node, node->GetChildCount(), true); |
| 180 *drop_index = node->GetChildCount(); | |
| 181 return node; | |
| 182 } | 179 } |
| 183 item = TreeView_GetNextVisible(hwnd, item); | 180 item = TreeView_GetNextVisible(hwnd, item); |
| 184 } | 181 } |
| 185 return NULL; | 182 return DropPosition(); |
| 186 } | 183 } |
| 187 | 184 |
| 188 int BookmarkFolderTreeView::CalculateDropOperation( | 185 int BookmarkFolderTreeView::CalculateDropOperation( |
| 189 const views::DropTargetEvent& event, | 186 const DropPosition& position) { |
| 190 FolderNode* drop_parent, | 187 if (!position.parent) |
| 191 int drop_index, | |
| 192 bool drop_on) { | |
| 193 if (!drop_parent) | |
| 194 return DragDropTypes::DRAG_NONE; | 188 return DragDropTypes::DRAG_NONE; |
| 195 | 189 |
| 196 if (drop_info_->drag_data.IsFromProfile(profile_)) { | 190 if (drop_info_->data().IsFromProfile(profile_)) { |
| 197 int bookmark_model_drop_index = | 191 int bookmark_model_drop_index = |
| 198 FolderIndexToBookmarkIndex(drop_parent, drop_index, drop_on); | 192 FolderIndexToBookmarkIndex(position.parent, position.index, |
| 193 position.on); | |
| 199 if (!bookmark_utils::IsValidDropLocation( | 194 if (!bookmark_utils::IsValidDropLocation( |
| 200 profile_, drop_info_->drag_data, | 195 profile_, drop_info_->data(), |
| 201 TreeNodeAsBookmarkNode(drop_parent), | 196 TreeNodeAsBookmarkNode(position.parent), |
| 202 bookmark_model_drop_index)) { | 197 bookmark_model_drop_index)) { |
| 203 return DragDropTypes::DRAG_NONE; | 198 return DragDropTypes::DRAG_NONE; |
| 204 } | 199 } |
| 205 | 200 |
| 206 // Data from the same profile. Prefer move, but do copy if the user wants | 201 // Data from the same profile. Prefer move, but do copy if the user wants |
| 207 // that. | 202 // that. |
| 208 if (event.IsControlDown()) | 203 if (drop_info_->is_control_down()) |
| 209 return DragDropTypes::DRAG_COPY; | 204 return DragDropTypes::DRAG_COPY; |
| 210 | 205 |
| 211 return DragDropTypes::DRAG_MOVE; | 206 return DragDropTypes::DRAG_MOVE; |
| 212 } | 207 } |
| 213 // We're going to copy, but return an operation compatible with the source | 208 // We're going to copy, but return an operation compatible with the source |
| 214 // operations so that the user can drop. | 209 // operations so that the user can drop. |
| 215 return bookmark_utils::PreferredDropOperation( | 210 return bookmark_utils::PreferredDropOperation( |
| 216 event, DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK); | 211 drop_info_->source_operations(), |
| 212 DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK); | |
| 217 } | 213 } |
| 218 | 214 |
| 219 void BookmarkFolderTreeView::OnPerformDropImpl() { | 215 void BookmarkFolderTreeView::OnPerformDropImpl() { |
| 220 BookmarkNode* parent_node = TreeNodeAsBookmarkNode(drop_info_->drop_parent); | 216 BookmarkNode* parent_node = |
| 217 TreeNodeAsBookmarkNode(drop_info_->position().parent); | |
| 221 int drop_index = FolderIndexToBookmarkIndex( | 218 int drop_index = FolderIndexToBookmarkIndex( |
| 222 drop_info_->drop_parent, drop_info_->drop_index, drop_info_->drop_on); | 219 drop_info_->position().parent, drop_info_->position().index, |
| 220 drop_info_->position().on); | |
| 223 BookmarkModel* model = profile_->GetBookmarkModel(); | 221 BookmarkModel* model = profile_->GetBookmarkModel(); |
| 224 // If the data is not from this profile we return an operation compatible | 222 // If the data is not from this profile we return an operation compatible |
| 225 // with the source. As such, we need to need to check the data here too. | 223 // with the source. As such, we need to need to check the data here too. |
| 226 if (!drop_info_->drag_data.IsFromProfile(profile_) || | 224 if (!drop_info_->data().IsFromProfile(profile_) || |
| 227 drop_info_->drop_operation == DragDropTypes::DRAG_COPY) { | 225 drop_info_->drop_operation() == DragDropTypes::DRAG_COPY) { |
| 228 bookmark_utils::CloneDragData(model, drop_info_->drag_data.elements, | 226 bookmark_utils::CloneDragData(model, drop_info_->data().elements, |
| 229 parent_node, drop_index); | 227 parent_node, drop_index); |
| 230 return; | 228 return; |
| 231 } | 229 } |
| 232 | 230 |
| 233 // else, move. | 231 // else, move. |
| 234 std::vector<BookmarkNode*> nodes = drop_info_->drag_data.GetNodes(profile_); | 232 std::vector<BookmarkNode*> nodes = drop_info_->data().GetNodes(profile_); |
| 235 if (nodes.empty()) | 233 if (nodes.empty()) |
| 236 return; | 234 return; |
| 237 | 235 |
| 238 for (size_t i = 0; i < nodes.size(); ++i) { | 236 for (size_t i = 0; i < nodes.size(); ++i) { |
| 239 model->Move(nodes[i], parent_node, drop_index); | 237 model->Move(nodes[i], parent_node, drop_index); |
| 240 // Reset the drop_index, just in case the index didn't really change. | 238 // Reset the drop_index, just in case the index didn't really change. |
| 241 drop_index = parent_node->IndexOfChild(nodes[i]) + 1; | 239 drop_index = parent_node->IndexOfChild(nodes[i]) + 1; |
| 242 if (nodes[i]->is_folder()) { | 240 if (nodes[i]->is_folder()) { |
| 243 Expand(folder_model()->GetFolderNodeForBookmarkNode(nodes[i])); | 241 Expand(folder_model()->GetFolderNodeForBookmarkNode(nodes[i])); |
| 244 } | 242 } |
| 245 } | 243 } |
| 246 | 244 |
| 247 if (is_dragging_ && nodes[0]->is_folder()) { | 245 if (is_dragging_ && nodes[0]->is_folder()) { |
| 248 // We're the drag source. Select the node that was moved. | 246 // We're the drag source. Select the node that was moved. |
| 249 SetSelectedNode(folder_model()->GetFolderNodeForBookmarkNode(nodes[0])); | 247 SetSelectedNode(folder_model()->GetFolderNodeForBookmarkNode(nodes[0])); |
| 250 } | 248 } |
| 251 } | 249 } |
| 252 | 250 |
| 253 void BookmarkFolderTreeView::SetDropParent(FolderNode* node, | 251 void BookmarkFolderTreeView::SetDropPosition(const DropPosition& position) { |
| 254 int drop_index, | 252 if (drop_info_->position().equals(position)) |
| 255 bool drop_on) { | |
| 256 if (drop_info_->drop_parent == node && | |
| 257 drop_info_->drop_index == drop_index && | |
| 258 drop_info_->drop_on == drop_on) { | |
| 259 return; | 253 return; |
| 260 } | 254 |
| 261 // Remove the indicator over the previous location. | 255 // Remove the indicator over the previous location. |
| 262 if (drop_info_->drop_on) { | 256 if (drop_info_->position().on) { |
| 263 HTREEITEM item = GetTreeItemForNode(drop_info_->drop_parent); | 257 HTREEITEM item = GetTreeItemForNode(drop_info_->position().parent); |
| 264 if (item) | 258 if (item) |
| 265 TreeView_SetItemState(GetNativeControlHWND(), item, 0, TVIS_DROPHILITED); | 259 TreeView_SetItemState(GetNativeControlHWND(), item, 0, TVIS_DROPHILITED); |
| 266 } else if (drop_info_->drop_index != -1) { | 260 } else if (drop_info_->position().index != -1) { |
| 267 TreeView_SetInsertMark(GetNativeControlHWND(), NULL, FALSE); | 261 TreeView_SetInsertMark(GetNativeControlHWND(), NULL, FALSE); |
| 268 } | 262 } |
| 269 | 263 |
| 270 drop_info_->drop_parent = node; | 264 drop_info_->set_position(position); |
| 271 drop_info_->drop_index = drop_index; | |
| 272 drop_info_->drop_on = drop_on; | |
| 273 | 265 |
| 274 // And show the new indicator. | 266 // And show the new indicator. |
| 275 if (drop_info_->drop_on) { | 267 if (position.on) { |
| 276 HTREEITEM item = GetTreeItemForNode(drop_info_->drop_parent); | 268 HTREEITEM item = GetTreeItemForNode(position.parent); |
| 277 if (item) { | 269 if (item) { |
| 278 TreeView_SetItemState(GetNativeControlHWND(), item, TVIS_DROPHILITED, | 270 TreeView_SetItemState(GetNativeControlHWND(), item, TVIS_DROPHILITED, |
| 279 TVIS_DROPHILITED); | 271 TVIS_DROPHILITED); |
| 280 } | 272 } |
| 281 } else if (drop_info_->drop_index != -1) { | 273 } else if (position.index != -1) { |
| 282 BOOL after = FALSE; | 274 BOOL after = FALSE; |
| 283 if (folder_model()->GetChildCount(drop_info_->drop_parent) == | 275 FolderNode* node = position.parent; |
| 284 drop_info_->drop_index) { | 276 if (folder_model()->GetChildCount(position.parent) == position.index) { |
| 285 after = TRUE; | 277 after = TRUE; |
| 286 node = | 278 node = folder_model()->GetChild(position.parent, position.index - 1); |
| 287 folder_model()->GetChild(drop_info_->drop_parent, | |
| 288 drop_info_->drop_index - 1); | |
| 289 } else { | 279 } else { |
| 290 node = | 280 node = folder_model()->GetChild(position.parent, position.index); |
| 291 folder_model()->GetChild(drop_info_->drop_parent, | |
| 292 drop_info_->drop_index); | |
| 293 } | 281 } |
| 294 HTREEITEM item = GetTreeItemForNode(node); | 282 HTREEITEM item = GetTreeItemForNode(node); |
| 295 if (item) | 283 if (item) |
| 296 TreeView_SetInsertMark(GetNativeControlHWND(), item, after); | 284 TreeView_SetInsertMark(GetNativeControlHWND(), item, after); |
| 297 } | 285 } |
| 298 } | 286 } |
| 299 | 287 |
| 300 BookmarkFolderTreeModel* BookmarkFolderTreeView::folder_model() const { | 288 BookmarkFolderTreeModel* BookmarkFolderTreeView::folder_model() const { |
| 301 return static_cast<BookmarkFolderTreeModel*>(model()); | 289 return static_cast<BookmarkFolderTreeModel*>(model()); |
| 302 } | 290 } |
| 303 | 291 |
| 304 BookmarkNode* BookmarkFolderTreeView::TreeNodeAsBookmarkNode(FolderNode* node) { | 292 BookmarkNode* BookmarkFolderTreeView::TreeNodeAsBookmarkNode(FolderNode* node) { |
| 305 return folder_model()->TreeNodeAsBookmarkNode(node); | 293 return folder_model()->TreeNodeAsBookmarkNode(node); |
| 306 } | 294 } |
| 307 | 295 |
| 308 int BookmarkFolderTreeView::FolderIndexToBookmarkIndex(FolderNode* node, | 296 int BookmarkFolderTreeView::FolderIndexToBookmarkIndex(FolderNode* node, |
| 309 int index, | 297 int index, |
| 310 bool drop_on) { | 298 bool drop_on) { |
| 311 BookmarkNode* parent_node = TreeNodeAsBookmarkNode(node); | 299 BookmarkNode* parent_node = TreeNodeAsBookmarkNode(node); |
| 312 if (drop_on || index == node->GetChildCount()) | 300 if (drop_on || index == node->GetChildCount()) |
| 313 return parent_node->GetChildCount(); | 301 return parent_node->GetChildCount(); |
| 314 | 302 |
| 315 if (index != 0) { | 303 if (index != 0) { |
| 316 return parent_node->IndexOfChild( | 304 return parent_node->IndexOfChild( |
| 317 TreeNodeAsBookmarkNode(node->GetChild(index))); | 305 TreeNodeAsBookmarkNode(node->GetChild(index))); |
| 318 } | 306 } |
| 319 | 307 |
| 320 return 0; | 308 return 0; |
| 321 } | 309 } |
| OLD | NEW |