// Copyright (c) 2012 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 CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_ #define CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_ #include #include "base/basictypes.h" #include "base/files/file_path.h" #include "base/message_loop/message_loop.h" #include "base/strings/string16.h" #include "content/common/content_export.h" #include "content/public/browser/web_contents.h" #include "third_party/WebKit/public/web/WebDragOperation.h" #include "ui/base/gtk/gtk_signal.h" #include "ui/base/gtk/gtk_signal_registrar.h" #include "ui/gfx/native_widget_types.h" #include "ui/gfx/vector2d.h" #include "url/gurl.h" class SkBitmap; namespace content { class RenderViewHostImpl; class WebContentsImpl; struct DropData; // WebDragSourceGtk takes care of managing the drag from a WebContents // with Gtk. class CONTENT_EXPORT WebDragSourceGtk : public base::MessageLoopForUI::Observer { public: explicit WebDragSourceGtk(WebContents* web_contents); virtual ~WebDragSourceGtk(); // Starts a drag for the WebContents this WebDragSourceGtk was created for. // Returns false if the drag could not be started. bool StartDragging(const DropData& drop_data, WebKit::WebDragOperationsMask allowed_ops, GdkEventButton* last_mouse_down, const SkBitmap& image, const gfx::Vector2d& image_offset); // MessageLoop::Observer implementation: virtual void WillProcessEvent(GdkEvent* event) OVERRIDE; virtual void DidProcessEvent(GdkEvent* event) OVERRIDE; private: CHROMEGTK_CALLBACK_2(WebDragSourceGtk, gboolean, OnDragFailed, GdkDragContext*, GtkDragResult); CHROMEGTK_CALLBACK_1(WebDragSourceGtk, void, OnDragBegin, GdkDragContext*); CHROMEGTK_CALLBACK_1(WebDragSourceGtk, void, OnDragEnd, GdkDragContext*); CHROMEGTK_CALLBACK_4(WebDragSourceGtk, void, OnDragDataGet, GdkDragContext*, GtkSelectionData*, guint, guint); CHROMEGTK_CALLBACK_1(WebDragSourceGtk, gboolean, OnDragIconExpose, GdkEventExpose*); gfx::NativeView GetContentNativeView() const; // The tab we're manging the drag for. WebContentsImpl* web_contents_; // The drop data for the current drag (for drags that originate in the render // view). Non-NULL iff there is a current drag. scoped_ptr drop_data_; // The image used for depicting the drag, and the offset between the cursor // and the top left pixel. GdkPixbuf* drag_pixbuf_; gfx::Vector2d image_offset_; // The mime type for the file contents of the current drag (if any). GdkAtom drag_file_mime_type_; // Whether the current drag has failed. Meaningless if we are not the source // for a current drag. bool drag_failed_; // This is the widget we use to initiate drags. Since we don't use the // renderer widget, we can persist drags even when our contents is switched // out. We can't use an OwnedWidgetGtk because the GtkInvisible widget // initialization code sinks the reference. GtkWidget* drag_widget_; // Context created once drag starts. A NULL value indicates that there is // no drag currently in progress. GdkDragContext* drag_context_; // The file mime type for a drag-out download. string16 wide_download_mime_type_; // The file name to be saved to for a drag-out download. base::FilePath download_file_name_; // The URL to download from for a drag-out download. GURL download_url_; // The widget that provides visual feedback for the drag. We can't use // an OwnedWidgetGtk because the GtkWindow initialization code sinks // the reference. GtkWidget* drag_icon_; ui::GtkSignalRegistrar signals_; DISALLOW_COPY_AND_ASSIGN(WebDragSourceGtk); }; } // namespace content #endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_