diff options
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r-- | chrome/browser/gtk/download_item_drag.cc | 80 | ||||
-rw-r--r-- | chrome/browser/gtk/download_item_drag.h | 43 | ||||
-rw-r--r-- | chrome/browser/gtk/download_item_gtk.cc | 24 | ||||
-rw-r--r-- | chrome/browser/gtk/download_item_gtk.h | 5 |
4 files changed, 126 insertions, 26 deletions
diff --git a/chrome/browser/gtk/download_item_drag.cc b/chrome/browser/gtk/download_item_drag.cc new file mode 100644 index 0000000..4106a91 --- /dev/null +++ b/chrome/browser/gtk/download_item_drag.cc @@ -0,0 +1,80 @@ +// 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/download_item_drag.h" + +#include "app/gfx/gtk_util.h" +#include "app/gtk_dnd_util.h" +#include "base/string_util.h" +#include "chrome/browser/download/download_manager.h" +#include "googleurl/src/gurl.h" +#include "net/base/net_util.h" +#include "third_party/skia/include/core/SkBitmap.h" + +namespace { + +const int kCodeMask = GtkDndUtil::TEXT_URI_LIST | + GtkDndUtil::CHROME_NAMED_URL; +const GdkDragAction kDragAction = GDK_ACTION_COPY; + +void OnDragDataGet(GtkWidget* widget, GdkDragContext* context, + GtkSelectionData* selection_data, + guint target_type, guint time, + DownloadItem* download_item) { + GURL url = net::FilePathToFileURL(download_item->full_path()); + GtkDndUtil::WriteURLWithName(selection_data, url, + UTF8ToUTF16(download_item->GetFileName().value()), target_type); +} + +} // namespace + +// static +void DownloadItemDrag::SetSource(GtkWidget* widget, DownloadItem* item) { + gtk_drag_source_set(widget, GDK_BUTTON1_MASK, NULL, 0, + kDragAction); + GtkDndUtil::SetSourceTargetListFromCodeMask(widget, kCodeMask); + g_signal_connect(widget, "drag-data-get", + G_CALLBACK(OnDragDataGet), item); +} + +// static +void DownloadItemDrag::BeginDrag(const DownloadItem* item, SkBitmap* icon) { + new DownloadItemDrag(item, icon); +} + +DownloadItemDrag::DownloadItemDrag(const DownloadItem* item, + SkBitmap* icon) + : drag_widget_(gtk_invisible_new()), + pixbuf_(gfx::GdkPixbufFromSkBitmap(icon)) { + g_object_ref_sink(drag_widget_); + g_signal_connect(drag_widget_, "drag-data-get", + G_CALLBACK(OnDragDataGet), const_cast<DownloadItem*>(item)); + g_signal_connect(drag_widget_, "drag-begin", + G_CALLBACK(OnDragBegin), this); + g_signal_connect(drag_widget_, "drag-end", + G_CALLBACK(OnDragEnd), this); + + GtkTargetList* list = GtkDndUtil::GetTargetListFromCodeMask(kCodeMask); + gtk_drag_begin(drag_widget_, list, kDragAction, 1, gtk_get_current_event()); + gtk_target_list_unref(list); +} + +DownloadItemDrag::~DownloadItemDrag() { + g_object_unref(pixbuf_); + g_object_unref(drag_widget_); +} + +// static +void DownloadItemDrag::OnDragBegin(GtkWidget* widget, + GdkDragContext* drag_context, + DownloadItemDrag* drag) { + gtk_drag_set_icon_pixbuf(drag_context, drag->pixbuf_, 0, 0); +} + +// static +void DownloadItemDrag::OnDragEnd(GtkWidget* widget, + GdkDragContext* drag_context, + DownloadItemDrag* drag) { + delete drag; +} diff --git a/chrome/browser/gtk/download_item_drag.h b/chrome/browser/gtk/download_item_drag.h new file mode 100644 index 0000000..1f8df44 --- /dev/null +++ b/chrome/browser/gtk/download_item_drag.h @@ -0,0 +1,43 @@ +// 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. + +#ifndef CHROME_BROWSER_GTK_DOWNLOAD_ITEM_DRAG_H_ +#define CHROME_BROWSER_GTK_DOWNLOAD_ITEM_DRAG_H_ + +#include <gtk/gtk.h> + +#include "base/basictypes.h" + +class DownloadItem; +class SkBitmap; + +class DownloadItemDrag { + public: + // Sets |widget| as a source for drags pertaining to |item|. No + // DownloadItemDrag object is created. + static void SetSource(GtkWidget* widget, DownloadItem* item); + + // Creates a new DownloadItemDrag, the lifetime of which is tied to the + // system drag. + static void BeginDrag(const DownloadItem* item, SkBitmap* icon); + + private: + explicit DownloadItemDrag(const DownloadItem* item, SkBitmap* icon); + ~DownloadItemDrag(); + + static void OnDragBegin(GtkWidget* widget, + GdkDragContext* drag_context, + DownloadItemDrag* drag); + + static void OnDragEnd(GtkWidget* widget, + GdkDragContext* drag_context, + DownloadItemDrag* drag); + + GtkWidget* drag_widget_; + GdkPixbuf* pixbuf_; + + DISALLOW_COPY_AND_ASSIGN(DownloadItemDrag); +}; + +#endif // CHROME_BROWSER_GTK_DOWNLOAD_ITEM_DRAG_H_ diff --git a/chrome/browser/gtk/download_item_gtk.cc b/chrome/browser/gtk/download_item_gtk.cc index 9ea494c..47c8f86 100644 --- a/chrome/browser/gtk/download_item_gtk.cc +++ b/chrome/browser/gtk/download_item_gtk.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. @@ -9,7 +9,6 @@ #include "app/gfx/color_utils.h" #include "app/gfx/font.h" #include "app/gfx/text_elider.h" -#include "app/gtk_dnd_util.h" #include "app/menus/simple_menu_model.h" #include "app/resource_bundle.h" #include "app/slide_animation.h" @@ -23,6 +22,7 @@ #include "chrome/browser/download/download_manager.h" #include "chrome/browser/download/download_shelf.h" #include "chrome/browser/download/download_util.h" +#include "chrome/browser/gtk/download_item_drag.h" #include "chrome/browser/gtk/download_shelf_gtk.h" #include "chrome/browser/gtk/gtk_theme_provider.h" #include "chrome/browser/gtk/menu_gtk.h" @@ -32,7 +32,6 @@ #include "chrome/common/notification_service.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" -#include "net/base/net_util.h" #include "skia/ext/skia_utils_gtk.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -370,13 +369,7 @@ void DownloadItemGtk::OnDownloadUpdated(DownloadItem* download) { StopDownloadProgress(); // Set up the widget as a drag source. - gtk_drag_source_set(body_.get(), GDK_BUTTON1_MASK, NULL, 0, - GDK_ACTION_COPY); - GtkDndUtil::SetSourceTargetListFromCodeMask(body_.get(), - GtkDndUtil::TEXT_URI_LIST | - GtkDndUtil::CHROME_NAMED_URL); - g_signal_connect(body_.get(), "drag-data-get", - G_CALLBACK(OnDragDataGet), this); + DownloadItemDrag::SetSource(body_.get(), get_download()); complete_animation_.reset(new SlideAnimation(this)); complete_animation_->SetSlideDuration(kCompleteAnimationDurationMs); @@ -871,17 +864,6 @@ void DownloadItemGtk::OnShelfResized(GtkWidget *widget, } // static -void DownloadItemGtk::OnDragDataGet(GtkWidget* widget, GdkDragContext* context, - GtkSelectionData* selection_data, - guint target_type, guint time, - DownloadItemGtk* item) { - GURL url = net::FilePathToFileURL(item->get_download()->full_path()); - - GtkDndUtil::WriteURLWithName(selection_data, url, - UTF8ToUTF16(item->get_download()->GetFileName().value()), target_type); -} - -// static gboolean DownloadItemGtk::OnDangerousPromptExpose(GtkWidget* widget, GdkEventExpose* event, DownloadItemGtk* item) { if (!item->theme_provider_->UseGtkTheme()) { diff --git a/chrome/browser/gtk/download_item_gtk.h b/chrome/browser/gtk/download_item_gtk.h index 1976be8..e19688f 100644 --- a/chrome/browser/gtk/download_item_gtk.h +++ b/chrome/browser/gtk/download_item_gtk.h @@ -112,11 +112,6 @@ class DownloadItemGtk : public DownloadItem::Observer, GtkAllocation *allocation, DownloadItemGtk* item); - static void OnDragDataGet(GtkWidget* widget, GdkDragContext* context, - GtkSelectionData* selection_data, - guint target_type, guint time, - DownloadItemGtk* item); - // Dangerous download related. ----------------------------------------------- static gboolean OnDangerousPromptExpose(GtkWidget* widget, GdkEventExpose* event, |