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