summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/custom_drag.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/gtk/custom_drag.cc')
-rw-r--r--chrome/browser/gtk/custom_drag.cc134
1 files changed, 134 insertions, 0 deletions
diff --git a/chrome/browser/gtk/custom_drag.cc b/chrome/browser/gtk/custom_drag.cc
new file mode 100644
index 0000000..7cff653
--- /dev/null
+++ b/chrome/browser/gtk/custom_drag.cc
@@ -0,0 +1,134 @@
+// 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/gtk/custom_drag.h"
+
+#include "app/gtk_dnd_util.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/download/download_manager.h"
+#include "chrome/browser/gtk/bookmark_utils_gtk.h"
+#include "gfx/gtk_util.h"
+#include "googleurl/src/gurl.h"
+#include "net/base/net_util.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+
+namespace {
+
+const int kDownloadItemCodeMask = gtk_dnd_util::TEXT_URI_LIST |
+ gtk_dnd_util::CHROME_NAMED_URL;
+const GdkDragAction kDownloadItemDragAction = GDK_ACTION_COPY;
+const GdkDragAction kBookmarkDragAction = GDK_ACTION_COPY;
+
+void OnDragDataGetForDownloadItem(GtkSelectionData* selection_data,
+ guint target_type,
+ const DownloadItem* download_item) {
+ GURL url = net::FilePathToFileURL(download_item->full_path());
+ gtk_dnd_util::WriteURLWithName(selection_data, url,
+ UTF8ToUTF16(download_item->GetFileName().value()), target_type);
+}
+
+void OnDragDataGetStandalone(GtkWidget* widget, GdkDragContext* context,
+ GtkSelectionData* selection_data,
+ guint target_type, guint time,
+ const DownloadItem* item) {
+ OnDragDataGetForDownloadItem(selection_data, target_type, item);
+}
+
+} // namespace
+
+// CustomDrag ------------------------------------------------------------------
+
+CustomDrag::CustomDrag(SkBitmap* icon, int code_mask, GdkDragAction action)
+ : drag_widget_(gtk_invisible_new()),
+ pixbuf_(icon ? gfx::GdkPixbufFromSkBitmap(icon) : NULL) {
+ g_object_ref_sink(drag_widget_);
+ g_signal_connect(drag_widget_, "drag-data-get",
+ G_CALLBACK(OnDragDataGetThunk), this);
+ g_signal_connect(drag_widget_, "drag-begin",
+ G_CALLBACK(OnDragBeginThunk), this);
+ g_signal_connect(drag_widget_, "drag-end",
+ G_CALLBACK(OnDragEndThunk), this);
+
+ GtkTargetList* list = gtk_dnd_util::GetTargetListFromCodeMask(code_mask);
+ GdkEvent* event = gtk_get_current_event();
+ gtk_drag_begin(drag_widget_, list, action, 1, event);
+ if (event)
+ gdk_event_free(event);
+ gtk_target_list_unref(list);
+}
+
+CustomDrag::~CustomDrag() {
+ if (pixbuf_)
+ g_object_unref(pixbuf_);
+ g_object_unref(drag_widget_);
+}
+
+void CustomDrag::OnDragBegin(GtkWidget* widget, GdkDragContext* drag_context) {
+ if (pixbuf_)
+ gtk_drag_set_icon_pixbuf(drag_context, pixbuf_, 0, 0);
+}
+
+void CustomDrag::OnDragEnd(GtkWidget* widget, GdkDragContext* drag_context) {
+ delete this;
+}
+
+// DownloadItemDrag ------------------------------------------------------------
+
+DownloadItemDrag::DownloadItemDrag(const DownloadItem* item,
+ SkBitmap* icon)
+ : CustomDrag(icon, kDownloadItemCodeMask, kDownloadItemDragAction),
+ download_item_(item) {
+}
+
+DownloadItemDrag::~DownloadItemDrag() {
+}
+
+void DownloadItemDrag::OnDragDataGet(
+ GtkWidget* widget, GdkDragContext* context,
+ GtkSelectionData* selection_data,
+ guint target_type, guint time) {
+ OnDragDataGetForDownloadItem(selection_data, target_type, download_item_);
+}
+
+// static
+void DownloadItemDrag::SetSource(GtkWidget* widget, DownloadItem* item) {
+ gtk_drag_source_set(widget, GDK_BUTTON1_MASK, NULL, 0,
+ kDownloadItemDragAction);
+ gtk_dnd_util::SetSourceTargetListFromCodeMask(widget, kDownloadItemCodeMask);
+ g_signal_connect(widget, "drag-data-get",
+ G_CALLBACK(OnDragDataGetStandalone), item);
+}
+
+// static
+void DownloadItemDrag::BeginDrag(const DownloadItem* item, SkBitmap* icon) {
+ new DownloadItemDrag(item, icon);
+}
+
+// BookmarkDrag ----------------------------------------------------------------
+
+BookmarkDrag::BookmarkDrag(Profile* profile,
+ const std::vector<const BookmarkNode*>& nodes)
+ : CustomDrag(NULL,
+ bookmark_utils::GetCodeMask(false),
+ kBookmarkDragAction),
+ profile_(profile),
+ nodes_(nodes) {
+}
+
+BookmarkDrag::~BookmarkDrag() {
+}
+
+void BookmarkDrag::OnDragDataGet(GtkWidget* widget, GdkDragContext* context,
+ GtkSelectionData* selection_data,
+ guint target_type, guint time) {
+ bookmark_utils::WriteBookmarksToSelection(nodes_, selection_data,
+ target_type, profile_);
+}
+
+// static
+void BookmarkDrag::BeginDrag(Profile* profile,
+ const std::vector<const BookmarkNode*>& nodes) {
+ new BookmarkDrag(profile, nodes);
+}
+