1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_TAB_CONTENTS_WEB_DRAG_DEST_GTK_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_TAB_CONTENTS_WEB_DRAG_DEST_GTK_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h"
13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/bookmarks/bookmark_node_data.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webdropdata.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A helper class that handles DnD for drops in the renderer. In GTK parlance,
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this handles destination-side DnD, but not source-side DnD.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebDragDestGtk {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebDragDestGtk(TabContents* tab_contents, GtkWidget* widget);
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~WebDragDestGtk();
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is called when the renderer responds to a drag motion event. We must
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // update the system drag cursor.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateDragStatus(WebKit::WebDragOperation operation);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Informs the renderer when a system drag has left the render view.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See OnDragLeave().
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DragLeave();
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when a system drag crosses over the render view. As there is no drag
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // enter event, we treat it as an enter event (and not a regular motion event)
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when |context_| is NULL.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_4(WebDragDestGtk, gboolean, OnDragMotion, GdkDragContext*,
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       gint, gint, guint);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We make a series of requests for the drag data when the drag first enters
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the render view. This is the callback that is used to give us the data
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for each individual target. When |data_requests_| reaches 0, we know we
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // have attained all the data, and we can finally tell the renderer about the
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // drag.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_6(WebDragDestGtk, void, OnDragDataReceived,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkDragContext*, gint, gint, GtkSelectionData*,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       guint, guint);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The drag has left our widget; forward this information to the renderer.
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_2(WebDragDestGtk, void, OnDragLeave, GdkDragContext*,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       guint);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by GTK when the user releases the mouse, executing a drop.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_4(WebDragDestGtk, gboolean, OnDragDrop, GdkDragContext*,
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       gint, gint, guint);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents_;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The render view.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* widget_;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The current drag context for system drags over our render view, or NULL if
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // there is no system drag or the system drag is not over our render view.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkDragContext* context_;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The data for the current drag, or NULL if |context_| is NULL.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<WebDropData> drop_data_;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The number of outstanding drag data requests we have sent to the drag
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // source.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int data_requests_;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The last time we sent a message to the renderer related to a drag motion.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gint drag_over_time_;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the cursor is over a drop target, according to the last message we
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // got from the renderer.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_drop_target_;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler ID for the destroy signal handler. We connect to the destroy
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // signal handler so that we won't call dest_unset on it after it is
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // destroyed, but we have to cancel the handler if we are destroyed before
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |widget_| is.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int destroy_handler_;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The bookmark data for the current tab. This will be empty if there is not
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a native bookmark drag (or we haven't gotten the data from the source yet).
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData bookmark_drag_data_;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedRunnableMethodFactory<WebDragDestGtk> method_factory_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WebDragDestGtk);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_TAB_CONTENTS_WEB_DRAG_DEST_GTK_H_
95