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