172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_TAB_CONTENTS_DRAG_SOURCE_H_ 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_TAB_CONTENTS_DRAG_SOURCE_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal_registrar.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/native_widget_types.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/point.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SkBitmap; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents; 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContentsView; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct WebDropData; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TabContentsDragSource takes care of managing the drag from a TabContents 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with Gtk. 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContentsDragSource : public MessageLoopForUI::Observer { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit TabContentsDragSource(TabContentsView* tab_contents_view); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~TabContentsDragSource(); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents() const; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Starts a drag for the tab contents this TabContentsDragSource was 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // created for. 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartDragging(const WebDropData& drop_data, 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebKit::WebDragOperationsMask allowed_ops, 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventButton* last_mouse_down, 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SkBitmap& image, 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Point& image_offset); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // MessageLoop::Observer implementation: 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void WillProcessEvent(GdkEvent* event); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void DidProcessEvent(GdkEvent* event); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_2(TabContentsDragSource, gboolean, OnDragFailed, 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkDragContext*, GtkDragResult); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabContentsDragSource, void, OnDragBegin, 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkDragContext*); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabContentsDragSource, void, OnDragEnd, 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkDragContext*); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_4(TabContentsDragSource, void, OnDragDataGet, 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkDragContext*, GtkSelectionData*, guint, guint); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabContentsDragSource, gboolean, OnDragIconExpose, 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventExpose*); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeView GetContentNativeView() const; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The view we're manging the drag for. 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContentsView* tab_contents_view_; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The drop data for the current drag (for drags that originate in the render 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // view). Non-NULL iff there is a current drag. 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<WebDropData> drop_data_; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The image used for depicting the drag, and the offset between the cursor 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // and the top left pixel. 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkPixbuf* drag_pixbuf_; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Point image_offset_; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The mime type for the file contents of the current drag (if any). 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkAtom drag_file_mime_type_; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether the current drag has failed. Meaningless if we are not the source 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for a current drag. 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool drag_failed_; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is the widget we use to initiate drags. Since we don't use the 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // renderer widget, we can persist drags even when our contents is switched 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // out. We can't use an OwnedWidgetGtk because the GtkInvisible widget 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // initialization code sinks the reference. 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* drag_widget_; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Context created once drag starts. A NULL value indicates that there is 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // no drag currently in progress. 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GdkDragContext* drag_context_; 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The file mime type for a drag-out download. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 wide_download_mime_type_; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The file name to be saved to for a drag-out download. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath download_file_name_; 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The URL to download from for a drag-out download. 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL download_url_; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The widget that provides visual feedback for the drag. We can't use 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // an OwnedWidgetGtk because the GtkWindow initialization code sinks 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the reference. 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* drag_icon_; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::GtkSignalRegistrar signals_; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(TabContentsDragSource); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif // CHROME_BROWSER_UI_GTK_TAB_CONTENTS_DRAG_SOURCE_H_ 111