Home | History | Annotate | Download | only in gtk
      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_UI_GTK_CUSTOM_DRAG_H_
      6 #define CHROME_BROWSER_UI_GTK_CUSTOM_DRAG_H_
      7 #pragma once
      8 
      9 #include <gtk/gtk.h>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "ui/base/gtk/gtk_signal.h"
     14 
     15 class BookmarkNode;
     16 class DownloadItem;
     17 class Profile;
     18 
     19 namespace gfx {
     20 class Image;
     21 }
     22 
     23 // Base class for programatically generated drags.
     24 class CustomDrag {
     25  protected:
     26   explicit CustomDrag(gfx::Image* icon, int code_mask, GdkDragAction action);
     27   virtual ~CustomDrag();
     28 
     29   virtual void OnDragDataGet(GtkWidget* widget, GdkDragContext* context,
     30                              GtkSelectionData* selection_data,
     31                              guint target_type, guint time) = 0;
     32 
     33  private:
     34   CHROMEGTK_CALLBACK_1(CustomDrag, void, OnDragBegin, GdkDragContext*);
     35   CHROMEGTK_CALLBACK_1(CustomDrag, void, OnDragEnd, GdkDragContext*);
     36 
     37   // Since this uses a virtual function, we can't use a macro.
     38   static void OnDragDataGetThunk(GtkWidget* widget, GdkDragContext* context,
     39                                  GtkSelectionData* selection_data,
     40                                  guint target_type, guint time,
     41                                  CustomDrag* custom_drag) {
     42     return custom_drag->OnDragDataGet(widget, context, selection_data,
     43                                       target_type, time);
     44   }
     45 
     46   // Can't use a OwnedWidgetGtk because the initialization of GtkInvisible
     47   // sinks the reference.
     48   GtkWidget* drag_widget_;
     49 
     50   // The image for the drag. The lifetime of the image should be managed outside
     51   // this object. Most icons are owned by the IconManager.
     52   gfx::Image* image_;
     53 
     54   DISALLOW_COPY_AND_ASSIGN(CustomDrag);
     55 };
     56 
     57 // Encapsulates functionality for drags of download items.
     58 class DownloadItemDrag : public CustomDrag {
     59  public:
     60   // Sets |widget| as a source for drags pertaining to |item|. No
     61   // DownloadItemDrag object is created.
     62   // It is safe to call this multiple times with different values of |icon|.
     63   static void SetSource(GtkWidget* widget,
     64                         DownloadItem* item,
     65                         gfx::Image* icon);
     66 
     67   // Creates a new DownloadItemDrag, the lifetime of which is tied to the
     68   // system drag.
     69   static void BeginDrag(const DownloadItem* item, gfx::Image* icon);
     70 
     71  private:
     72   DownloadItemDrag(const DownloadItem* item, gfx::Image* icon);
     73   virtual ~DownloadItemDrag();
     74 
     75   virtual void OnDragDataGet(GtkWidget* widget, GdkDragContext* context,
     76                              GtkSelectionData* selection_data,
     77                              guint target_type, guint time);
     78 
     79   const DownloadItem* download_item_;
     80 
     81   DISALLOW_COPY_AND_ASSIGN(DownloadItemDrag);
     82 };
     83 
     84 // Encapsulates functionality for drags of one or more bookmarks.
     85 class BookmarkDrag : public CustomDrag {
     86  public:
     87   // Creates a new BookmarkDrag, the lifetime of which is tied to the
     88   // system drag.
     89   static void BeginDrag(Profile* profile,
     90                         const std::vector<const BookmarkNode*>& nodes);
     91 
     92  private:
     93   BookmarkDrag(Profile* profile,
     94                const std::vector<const BookmarkNode*>& nodes);
     95   virtual ~BookmarkDrag();
     96 
     97   virtual void OnDragDataGet(GtkWidget* widget, GdkDragContext* context,
     98                              GtkSelectionData* selection_data,
     99                              guint target_type, guint time);
    100 
    101   Profile* profile_;
    102   std::vector<const BookmarkNode*> nodes_;
    103 
    104   DISALLOW_COPY_AND_ASSIGN(BookmarkDrag);
    105 };
    106 
    107 #endif  // CHROME_BROWSER_UI_GTK_CUSTOM_DRAG_H_
    108