Initial implementation of Drag and Drop for the extension BMM.
Review URL: http://codereview.chromium.org/660139
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40858 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/bookmarks/bookmark_utils.cc b/chrome/browser/bookmarks/bookmark_utils.cc
index 4aa14eb..e43c89dc 100644
--- a/chrome/browser/bookmarks/bookmark_utils.cc
+++ b/chrome/browser/bookmarks/bookmark_utils.cc
@@ -15,6 +15,9 @@
#include "base/time.h"
#include "chrome/browser/bookmarks/bookmark_drag_data.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
+#if defined(OS_MACOSX)
+#include "chrome/browser/bookmarks/bookmark_pasteboard_helper_mac.h"
+#endif
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_process.h"
@@ -252,31 +255,23 @@
const BookmarkDragData& data,
const BookmarkNode* parent_node,
int index) {
- const std::vector<const BookmarkNode*> dragged_nodes = data.GetNodes(profile);
BookmarkModel* model = profile->GetBookmarkModel();
- if (!dragged_nodes.empty()) {
- // Drag from same profile. Move nodes.
- for (size_t i = 0; i < dragged_nodes.size(); ++i) {
- model->Move(dragged_nodes[i], parent_node, index);
- index = parent_node->IndexOfChild(dragged_nodes[i]) + 1;
+ if (data.IsFromProfile(profile)) {
+ const std::vector<const BookmarkNode*> dragged_nodes =
+ data.GetNodes(profile);
+ if (!dragged_nodes.empty()) {
+ // Drag from same profile. Move nodes.
+ for (size_t i = 0; i < dragged_nodes.size(); ++i) {
+ model->Move(dragged_nodes[i], parent_node, index);
+ index = parent_node->IndexOfChild(dragged_nodes[i]) + 1;
+ }
+ return DragDropTypes::DRAG_MOVE;
}
- return DragDropTypes::DRAG_MOVE;
- } else if (data.has_single_url()) {
- // New URL, add it at the specified location.
- string16 title = data.elements[0].title;
- if (title.empty()) {
- // No title, use the host.
- title = UTF8ToUTF16(data.elements[0].url.host());
- if (title.empty())
- title = TabContents::GetDefaultTitle();
- }
- model->AddURL(parent_node, index, title, data.elements[0].url);
- return DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK;
- } else {
- // Dropping a group from different profile. Always accept.
- bookmark_utils::CloneDragData(model, data.elements, parent_node, index);
- return DragDropTypes::DRAG_COPY;
+ return DragDropTypes::DRAG_NONE;
}
+ // Dropping a group from different profile. Always accept.
+ bookmark_utils::CloneDragData(model, data.elements, parent_node, index);
+ return DragDropTypes::DRAG_COPY;
}
bool IsValidDropLocation(Profile* profile,
@@ -348,8 +343,14 @@
DragDropTypes::DRAG_LINK);
MessageLoop::current()->SetNestableTasksAllowed(was_nested);
+#elif defined(OS_MACOSX)
+ // Allow nested message loop so we get DnD events as we drag this around.
+ bool was_nested = MessageLoop::current()->IsNested();
+ MessageLoop::current()->SetNestableTasksAllowed(true);
+ bookmark_pasteboard_helper_mac::StartDrag(profile, nodes, view);
+ MessageLoop::current()->SetNestableTasksAllowed(was_nested);
#else
- // TODO(arv): Implement for GTK and Cocoa.
+ // TODO(arv): Implement for GTK.
NOTIMPLEMENTED();
#endif
}