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