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