• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
OnDragDataGetThunk(GtkWidget * widget,GdkDragContext * context,GtkSelectionData * selection_data,guint target_type,guint time,CustomDrag * custom_drag)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