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