summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/bookmark_bar_gtk.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-28 00:45:35 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-28 00:45:35 +0000
commit903e7a8a5f8948b96c46f16c4920648c29a5af12 (patch)
treed34d420a39ce4e3e8048ec5503d9c255617ca357 /chrome/browser/gtk/bookmark_bar_gtk.cc
parentf05798163ceb52a2694e59c1a7f40ace72fb2024 (diff)
downloadchromium_src-903e7a8a5f8948b96c46f16c4920648c29a5af12.zip
chromium_src-903e7a8a5f8948b96c46f16c4920648c29a5af12.tar.gz
chromium_src-903e7a8a5f8948b96c46f16c4920648c29a5af12.tar.bz2
Gtk: DnD extravaganza
- Correctly update drag status for drags over renderer. This makes things look quite a bit better. - Rework the dnd utils so that we specify the drag targets in the order we prefer them (for destinations) - Refactor code in bookmark bar so folder and toolbar drags share more code - Allow bookmark bar to accept URI lists and plain text drags (for plain text we require the text to be a valid url) BUG=17431 Review URL: http://codereview.chromium.org/159419 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21767 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/bookmark_bar_gtk.cc')
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.cc132
1 files changed, 66 insertions, 66 deletions
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc
index 877d2af..5e2c736 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.cc
+++ b/chrome/browser/gtk/bookmark_bar_gtk.cc
@@ -48,6 +48,12 @@ const int kInstructionsPadding = 6;
// Color of the instructional text.
const GdkColor kInstructionsColor = GDK_COLOR_RGB(128, 128, 142);
+// The targets accepted by the toolbar and folder buttons for DnD.
+const int kDestTargetList[] = { GtkDndUtil::CHROME_BOOKMARK_ITEM,
+ GtkDndUtil::CHROME_NAMED_URL,
+ GtkDndUtil::TEXT_URI_LIST,
+ GtkDndUtil::TEXT_PLAIN, -1 };
+
void SetToolBarStyle() {
static bool style_was_set = false;
@@ -159,15 +165,13 @@ void BookmarkBarGtk::Init(Profile* profile) {
gtk_drag_dest_set(bookmark_toolbar_.get(), GTK_DEST_DEFAULT_DROP,
NULL, 0, GDK_ACTION_MOVE);
- GtkDndUtil::SetDestTargetListFromCodeMask(bookmark_toolbar_.get(),
- GtkDndUtil::CHROME_BOOKMARK_ITEM |
- GtkDndUtil::CHROME_NAMED_URL);
+ GtkDndUtil::SetDestTargetList(bookmark_toolbar_.get(), kDestTargetList);
g_signal_connect(bookmark_toolbar_.get(), "drag-motion",
G_CALLBACK(&OnToolbarDragMotion), this);
g_signal_connect(bookmark_toolbar_.get(), "drag-leave",
G_CALLBACK(&OnToolbarDragLeave), this);
g_signal_connect(bookmark_toolbar_.get(), "drag-data-received",
- G_CALLBACK(&OnToolbarDragReceived), this);
+ G_CALLBACK(&OnDragReceived), this);
g_signal_connect(bookmark_toolbar_.get(), "button-press-event",
G_CALLBACK(&OnButtonPressed), this);
@@ -449,11 +453,9 @@ GtkToolItem* BookmarkBarGtk::CreateBookmarkToolItem(const BookmarkNode* node) {
void BookmarkBarGtk::ConnectFolderButtonEvents(GtkWidget* widget) {
gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_MOVE);
- GtkDndUtil::SetDestTargetListFromCodeMask(widget,
- GtkDndUtil::CHROME_BOOKMARK_ITEM |
- GtkDndUtil::CHROME_NAMED_URL);
+ GtkDndUtil::SetDestTargetList(widget, kDestTargetList);
g_signal_connect(widget, "drag-data-received",
- G_CALLBACK(&OnFolderDragReceived), this);
+ G_CALLBACK(&OnDragReceived), this);
// Connect to 'button-release-event' instead of 'clicked' because we need
// access to the modifier keys and we do different things on each
@@ -666,40 +668,6 @@ gboolean BookmarkBarGtk::OnFolderButtonReleased(GtkWidget* sender,
}
// static
-void BookmarkBarGtk::OnFolderDragReceived(GtkWidget* widget,
- GdkDragContext* context, gint x, gint y, GtkSelectionData* selection_data,
- guint target_type, guint time, BookmarkBarGtk* bar) {
- gboolean dnd_success = FALSE;
- gboolean delete_selection_data = FALSE;
-
- const BookmarkNode* dest_node = bar->GetNodeForToolButton(widget);
- DCHECK(dest_node->is_folder());
-
- if (target_type == GtkDndUtil::CHROME_BOOKMARK_ITEM) {
- std::vector<const BookmarkNode*> nodes =
- bookmark_utils::GetNodesFromSelection(context, selection_data,
- target_type,
- bar->profile_,
- &delete_selection_data,
- &dnd_success);
- DCHECK(!nodes.empty());
- DCHECK(dnd_success);
-
- for (std::vector<const BookmarkNode*>::iterator it = nodes.begin();
- it != nodes.end(); ++it) {
- bar->model_->Move(*it, dest_node, dest_node->GetChildCount());
- }
- } else if (target_type == GtkDndUtil::CHROME_NAMED_URL) {
- dnd_success = bookmark_utils::CreateNewBookmarkFromNamedUrl(
- selection_data, bar->model_, dest_node, dest_node->GetChildCount());
- } else {
- NOTREACHED();
- }
-
- gtk_drag_finish(context, dnd_success, delete_selection_data, time);
-}
-
-// static
gboolean BookmarkBarGtk::OnToolbarExpose(GtkWidget* widget,
GdkEventExpose* event,
BookmarkBarGtk* bar) {
@@ -771,36 +739,68 @@ void BookmarkBarGtk::OnToolbarDragLeave(GtkToolbar* toolbar,
}
// static
-void BookmarkBarGtk::OnToolbarDragReceived(GtkWidget* widget,
- GdkDragContext* context,
- gint x, gint y,
- GtkSelectionData* selection_data,
- guint target_type, guint time,
- BookmarkBarGtk* bar) {
+void BookmarkBarGtk::OnDragReceived(GtkWidget* widget,
+ GdkDragContext* context,
+ gint x, gint y,
+ GtkSelectionData* selection_data,
+ guint target_type, guint time,
+ BookmarkBarGtk* bar) {
gboolean dnd_success = FALSE;
gboolean delete_selection_data = FALSE;
- gint index = gtk_toolbar_get_drop_index(
+ const BookmarkNode* dest_node;
+ gint index;
+ if (widget == bar->bookmark_toolbar_.get()) {
+ dest_node = bar->model_->GetBookmarkBarNode();
+ index = gtk_toolbar_get_drop_index(
GTK_TOOLBAR(bar->bookmark_toolbar_.get()), x, y);
+ } else {
+ dest_node = bar->GetNodeForToolButton(widget);
+ index = dest_node->GetChildCount();
+ }
- if (target_type == GtkDndUtil::CHROME_BOOKMARK_ITEM) {
- std::vector<const BookmarkNode*> nodes =
- bookmark_utils::GetNodesFromSelection(context, selection_data,
- target_type,
- bar->profile_,
- &delete_selection_data,
- &dnd_success);
- DCHECK(!nodes.empty());
- for (std::vector<const BookmarkNode*>::iterator it = nodes.begin();
- it != nodes.end(); ++it) {
- bar->model_->Move(*it, bar->model_->GetBookmarkBarNode(), index);
- index = bar->model_->GetBookmarkBarNode()->IndexOfChild(*it) + 1;
+ switch (target_type) {
+ case GtkDndUtil::CHROME_BOOKMARK_ITEM: {
+ std::vector<const BookmarkNode*> nodes =
+ bookmark_utils::GetNodesFromSelection(context, selection_data,
+ target_type,
+ bar->profile_,
+ &delete_selection_data,
+ &dnd_success);
+ DCHECK(!nodes.empty());
+ for (std::vector<const BookmarkNode*>::iterator it = nodes.begin();
+ it != nodes.end(); ++it) {
+ bar->model_->Move(*it, dest_node, index);
+ index = dest_node->IndexOfChild(*it) + 1;
+ }
+ break;
+ }
+
+ case GtkDndUtil::CHROME_NAMED_URL: {
+ dnd_success = bookmark_utils::CreateNewBookmarkFromNamedUrl(
+ selection_data, bar->model_, dest_node, index);
+ break;
+ }
+
+ case GtkDndUtil::TEXT_URI_LIST: {
+ dnd_success = bookmark_utils::CreateNewBookmarksFromURIList(
+ selection_data, bar->model_, dest_node, index);
+ break;
+ }
+
+ case GtkDndUtil::TEXT_PLAIN: {
+ guchar* text = gtk_selection_data_get_text(selection_data);
+ GURL url(reinterpret_cast<char*>(text));
+ g_free(text);
+ // TODO(estade): It would be nice to head this case off at drag motion,
+ // so that it doesn't look like we can drag onto the bookmark bar.
+ if (!url.is_valid())
+ break;
+ std::string title = bookmark_utils::GetNameForURL(url);
+ bar->model_->AddURL(dest_node, index, UTF8ToWide(title), url);
+ dnd_success = TRUE;
+ break;
}
- } else if (target_type == GtkDndUtil::CHROME_NAMED_URL) {
- dnd_success = bookmark_utils::CreateNewBookmarkFromNamedUrl(
- selection_data, bar->model_, bar->model_->GetBookmarkBarNode(), index);
- } else {
- NOTREACHED();
}
gtk_drag_finish(context, dnd_success, delete_selection_data, time);