Commit 99762f21 authored by tfarina@chromium.org's avatar tfarina@chromium.org

gtk: Split CustomDrag into multiple pieces.

This will make it easier the next patch in this series.

BUG=None
TEST=None, no functional change, just refactoring.
R=asanka@chromium.org, erg@chromium.org

Review URL: https://codereview.chromium.org/23646006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@220705 0039d316-1c4b-4281-b951-d872f2087c98
parent cf822d39
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "chrome/browser/download/drag_download_item.h" #include "chrome/browser/download/drag_download_item.h"
#include "chrome/browser/ui/gtk/custom_drag.h" #include "chrome/browser/ui/gtk/download/download_item_drag.h"
void DragDownloadItem(const content::DownloadItem* download, void DragDownloadItem(const content::DownloadItem* download,
gfx::Image* icon, gfx::Image* icon,
......
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/gtk/bookmarks/bookmark_drag.h"
#include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h"
namespace {
const GdkDragAction kBookmarkDragAction =
static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE);
} // namespace
// static
void BookmarkDrag::BeginDrag(Profile* profile,
const std::vector<const BookmarkNode*>& nodes) {
new BookmarkDrag(profile, nodes);
}
BookmarkDrag::BookmarkDrag(Profile* profile,
const std::vector<const BookmarkNode*>& nodes)
: CustomDrag(NULL, GetCodeMask(false), kBookmarkDragAction),
profile_(profile),
nodes_(nodes) {}
BookmarkDrag::~BookmarkDrag() {}
void BookmarkDrag::OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type,
guint time) {
WriteBookmarksToSelection(nodes_, selection_data, target_type, profile_);
}
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_DRAG_H_
#define CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_DRAG_H_
#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "chrome/browser/ui/gtk/custom_drag.h"
class BookmarkNode;
class Profile;
// Encapsulates functionality for drags of one or more bookmarks.
class BookmarkDrag : public CustomDrag {
public:
// Creates a new BookmarkDrag, the lifetime of which is tied to the system
// drag.
static void BeginDrag(Profile* profile,
const std::vector<const BookmarkNode*>& nodes);
private:
BookmarkDrag(Profile* profile, const std::vector<const BookmarkNode*>& nodes);
virtual ~BookmarkDrag();
virtual void OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type,
guint time) OVERRIDE;
Profile* profile_;
std::vector<const BookmarkNode*> nodes_;
DISALLOW_COPY_AND_ASSIGN(BookmarkDrag);
};
#endif // CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_DRAG_H_
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "chrome/browser/ui/bookmarks/bookmark_drag_drop.h" #include "chrome/browser/ui/bookmarks/bookmark_drag_drop.h"
#include "chrome/browser/ui/gtk/custom_drag.h" #include "chrome/browser/ui/gtk/bookmarks/bookmark_drag.h"
namespace chrome { namespace chrome {
......
...@@ -4,29 +4,8 @@ ...@@ -4,29 +4,8 @@
#include "chrome/browser/ui/gtk/custom_drag.h" #include "chrome/browser/ui/gtk/custom_drag.h"
#include "base/files/file_path.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h"
#include "content/public/browser/download_item.h"
#include "net/base/net_util.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/dragdrop/gtk_dnd_util.h" #include "ui/base/dragdrop/gtk_dnd_util.h"
#include "ui/gfx/gtk_util.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
#include "url/gurl.h"
using content::DownloadItem;
namespace {
const int kDownloadItemCodeMask = ui::TEXT_URI_LIST | ui::CHROME_NAMED_URL;
const GdkDragAction kDownloadItemDragAction = GDK_ACTION_COPY;
const GdkDragAction kBookmarkDragAction =
static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE);
} // namespace
// CustomDrag ------------------------------------------------------------------
CustomDrag::CustomDrag(gfx::Image* icon, int code_mask, GdkDragAction action) CustomDrag::CustomDrag(gfx::Image* icon, int code_mask, GdkDragAction action)
: drag_widget_(gtk_invisible_new()), : drag_widget_(gtk_invisible_new()),
...@@ -58,132 +37,3 @@ void CustomDrag::OnDragBegin(GtkWidget* widget, GdkDragContext* drag_context) { ...@@ -58,132 +37,3 @@ void CustomDrag::OnDragBegin(GtkWidget* widget, GdkDragContext* drag_context) {
void CustomDrag::OnDragEnd(GtkWidget* widget, GdkDragContext* drag_context) { void CustomDrag::OnDragEnd(GtkWidget* widget, GdkDragContext* drag_context) {
delete this; delete this;
} }
// DownloadItemDrag ------------------------------------------------------------
// Stores metadata for a drag & drop operation.
class DownloadItemDrag::DragData {
public:
// Constructs a DragData object based on the current state of |item|.
explicit DragData(const DownloadItem* item);
// 'drag-data-get' signal handler.
CHROMEGTK_CALLBACK_4(DragData, void, OnDragDataGet, GdkDragContext*,
GtkSelectionData*, guint, guint);
// Sets up a drag source and connects |drag_data| to 'drag-data-get' on
// |widget|. If |icon| is non-NULL it will be used as the drag icon. The
// object pointed to by |drag_data| will be deleted when the signal is
// disconnected.
static void AttachToWidget(scoped_ptr<DragData> drag_data,
GtkWidget* widget,
gfx::Image* icon);
private:
// GClosureNotify handler for destroying a DragData object. |data| is assumed
// to be a DragData*.
static void OnDestroy(gpointer data, GClosure* closure);
GURL url_;
string16 display_name_;
};
DownloadItemDrag::DragData::DragData(const DownloadItem* item)
: url_(net::FilePathToFileURL(item->GetTargetFilePath())),
display_name_(item->GetFileNameToReportUser().LossyDisplayName()) {
DCHECK_EQ(DownloadItem::COMPLETE, item->GetState());
}
void DownloadItemDrag::DragData::OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type,
guint time) {
ui::WriteURLWithName(selection_data, url_, display_name_, target_type);
}
// static
void DownloadItemDrag::DragData::AttachToWidget(scoped_ptr<DragData> drag_data,
GtkWidget* widget,
gfx::Image* icon) {
gtk_drag_source_set(widget, GDK_BUTTON1_MASK, NULL, 0,
kDownloadItemDragAction);
ui::SetSourceTargetListFromCodeMask(widget, kDownloadItemCodeMask);
// Disconnect previous signal handlers, if any.
g_signal_handlers_disconnect_matched(
widget, G_SIGNAL_MATCH_FUNC, 0, 0, NULL,
reinterpret_cast<gpointer>(&OnDragDataGetThunk),
NULL);
// Connect new signal handlers.
g_signal_connect_data(
widget, "drag-data-get",
G_CALLBACK(&OnDragDataGetThunk),
reinterpret_cast<gpointer>(drag_data.release()),
&OnDestroy,
static_cast<GConnectFlags>(0));
if (icon)
gtk_drag_source_set_icon_pixbuf(widget, icon->ToGdkPixbuf());
}
// static
void DownloadItemDrag::DragData::OnDestroy(gpointer data, GClosure* closure) {
DragData* drag_data = reinterpret_cast<DragData*>(data);
delete drag_data;
}
DownloadItemDrag::DownloadItemDrag(const DownloadItem* item,
gfx::Image* icon)
: CustomDrag(icon, kDownloadItemCodeMask, kDownloadItemDragAction),
drag_data_(new DragData(item)) {
}
DownloadItemDrag::~DownloadItemDrag() {
}
void DownloadItemDrag::OnDragDataGet(
GtkWidget* widget, GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type, guint time) {
drag_data_->OnDragDataGet(widget, context, selection_data, target_type, time);
}
// static
void DownloadItemDrag::SetSource(GtkWidget* widget,
const DownloadItem* item,
gfx::Image* icon) {
scoped_ptr<DragData> drag_data(new DragData(item));
DragData::AttachToWidget(drag_data.Pass(), widget, icon);
}
// static
void DownloadItemDrag::BeginDrag(const DownloadItem* item, gfx::Image* icon) {
new DownloadItemDrag(item, icon);
}
// BookmarkDrag ----------------------------------------------------------------
BookmarkDrag::BookmarkDrag(Profile* profile,
const std::vector<const BookmarkNode*>& nodes)
: CustomDrag(NULL, GetCodeMask(false), kBookmarkDragAction),
profile_(profile),
nodes_(nodes) {}
BookmarkDrag::~BookmarkDrag() {
}
void BookmarkDrag::OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type,
guint time) {
WriteBookmarksToSelection(nodes_, selection_data, target_type, profile_);
}
// static
void BookmarkDrag::BeginDrag(Profile* profile,
const std::vector<const BookmarkNode*>& nodes) {
new BookmarkDrag(profile, nodes);
}
...@@ -6,20 +6,10 @@ ...@@ -6,20 +6,10 @@
#define CHROME_BROWSER_UI_GTK_CUSTOM_DRAG_H_ #define CHROME_BROWSER_UI_GTK_CUSTOM_DRAG_H_
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <vector>
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "ui/base/gtk/gtk_signal.h" #include "ui/base/gtk/gtk_signal.h"
class BookmarkNode;
class Profile;
namespace content {
class DownloadItem;
}
namespace gfx { namespace gfx {
class Image; class Image;
} }
...@@ -30,9 +20,11 @@ class CustomDrag { ...@@ -30,9 +20,11 @@ class CustomDrag {
CustomDrag(gfx::Image* icon, int code_mask, GdkDragAction action); CustomDrag(gfx::Image* icon, int code_mask, GdkDragAction action);
virtual ~CustomDrag(); virtual ~CustomDrag();
virtual void OnDragDataGet(GtkWidget* widget, GdkDragContext* context, virtual void OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data, GtkSelectionData* selection_data,
guint target_type, guint time) = 0; guint target_type,
guint time) = 0;
private: private:
CHROMEGTK_CALLBACK_1(CustomDrag, void, OnDragBegin, GdkDragContext*); CHROMEGTK_CALLBACK_1(CustomDrag, void, OnDragBegin, GdkDragContext*);
...@@ -58,56 +50,4 @@ class CustomDrag { ...@@ -58,56 +50,4 @@ class CustomDrag {
DISALLOW_COPY_AND_ASSIGN(CustomDrag); DISALLOW_COPY_AND_ASSIGN(CustomDrag);
}; };
// Encapsulates functionality for drags of download items.
class DownloadItemDrag : public CustomDrag {
public:
// Sets |widget| as a source for drags pertaining to |item|. No
// DownloadItemDrag object is created.
// It is safe to call this multiple times with different values of |icon|.
static void SetSource(GtkWidget* widget,
const content::DownloadItem* item,
gfx::Image* icon);
// Creates a new DownloadItemDrag, the lifetime of which is tied to the
// system drag.
static void BeginDrag(const content::DownloadItem* item, gfx::Image* icon);
private:
class DragData;
DownloadItemDrag(const content::DownloadItem* item, gfx::Image* icon);
virtual ~DownloadItemDrag();
virtual void OnDragDataGet(GtkWidget* widget, GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type, guint time) OVERRIDE;
scoped_ptr<DragData> drag_data_;
DISALLOW_COPY_AND_ASSIGN(DownloadItemDrag);
};
// Encapsulates functionality for drags of one or more bookmarks.
class BookmarkDrag : public CustomDrag {
public:
// Creates a new BookmarkDrag, the lifetime of which is tied to the
// system drag.
static void BeginDrag(Profile* profile,
const std::vector<const BookmarkNode*>& nodes);
private:
BookmarkDrag(Profile* profile,
const std::vector<const BookmarkNode*>& nodes);
virtual ~BookmarkDrag();
virtual void OnDragDataGet(GtkWidget* widget, GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type, guint time) OVERRIDE;
Profile* profile_;
std::vector<const BookmarkNode*> nodes_;
DISALLOW_COPY_AND_ASSIGN(BookmarkDrag);
};
#endif // CHROME_BROWSER_UI_GTK_CUSTOM_DRAG_H_ #endif // CHROME_BROWSER_UI_GTK_CUSTOM_DRAG_H_
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/gtk/download/download_item_drag.h"
#include "base/files/file_path.h"
#include "base/strings/utf_string_conversions.h"
#include "content/public/browser/download_item.h"
#include "net/base/net_util.h"
#include "ui/base/dragdrop/gtk_dnd_util.h"
#include "ui/gfx/image/image.h"
#include "url/gurl.h"
using content::DownloadItem;
namespace {
const int kDownloadItemCodeMask = ui::TEXT_URI_LIST | ui::CHROME_NAMED_URL;
const GdkDragAction kDownloadItemDragAction = GDK_ACTION_COPY;
} // namespace
// Stores metadata for a drag & drop operation.
class DownloadItemDrag::DragData {
public:
// Constructs a DragData object based on the current state of |item|.
explicit DragData(const DownloadItem* item);
// Sets up a drag source and connects |drag_data| to 'drag-data-get' on
// |widget|. If |icon| is non-NULL it will be used as the drag icon. The
// object pointed to by |drag_data| will be deleted when the signal is
// disconnected.
static void AttachToWidget(scoped_ptr<DragData> drag_data,
GtkWidget* widget,
gfx::Image* icon);
// 'drag-data-get' signal handler.
CHROMEGTK_CALLBACK_4(DragData, void, OnDragDataGet, GdkDragContext*,
GtkSelectionData*, guint, guint);
private:
// GClosureNotify handler for destroying a DragData object. |data| is assumed
// to be a DragData*.
static void OnDestroy(gpointer data, GClosure* closure);
GURL url_;
base::string16 display_name_;
};
DownloadItemDrag::DragData::DragData(const DownloadItem* item)
: url_(net::FilePathToFileURL(item->GetTargetFilePath())),
display_name_(item->GetFileNameToReportUser().LossyDisplayName()) {
DCHECK_EQ(DownloadItem::COMPLETE, item->GetState());
}
// static
void DownloadItemDrag::DragData::AttachToWidget(scoped_ptr<DragData> drag_data,
GtkWidget* widget,
gfx::Image* icon) {
gtk_drag_source_set(
widget, GDK_BUTTON1_MASK, NULL, 0, kDownloadItemDragAction);
ui::SetSourceTargetListFromCodeMask(widget, kDownloadItemCodeMask);
// Disconnect previous signal handlers, if any.
g_signal_handlers_disconnect_matched(
widget,
G_SIGNAL_MATCH_FUNC,
0,
0,
NULL,
reinterpret_cast<gpointer>(&OnDragDataGetThunk),
NULL);
// Connect new signal handlers.
g_signal_connect_data(widget,
"drag-data-get",
G_CALLBACK(&OnDragDataGetThunk),
reinterpret_cast<gpointer>(drag_data.release()),
&OnDestroy,
static_cast<GConnectFlags>(0));
if (icon)
gtk_drag_source_set_icon_pixbuf(widget, icon->ToGdkPixbuf());
}
void DownloadItemDrag::DragData::OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type,
guint time) {
ui::WriteURLWithName(selection_data, url_, display_name_, target_type);
}
// static
void DownloadItemDrag::DragData::OnDestroy(gpointer data, GClosure* closure) {
DragData* drag_data = reinterpret_cast<DragData*>(data);
delete drag_data;
}
// DownloadItemDrag ------------------------------------------------------------
// static
void DownloadItemDrag::SetSource(GtkWidget* widget,
const DownloadItem* item,
gfx::Image* icon) {
scoped_ptr<DragData> drag_data(new DragData(item));
DragData::AttachToWidget(drag_data.Pass(), widget, icon);
}
// static
void DownloadItemDrag::BeginDrag(const DownloadItem* item, gfx::Image* icon) {
new DownloadItemDrag(item, icon);
}
DownloadItemDrag::DownloadItemDrag(const DownloadItem* item, gfx::Image* icon)
: CustomDrag(icon, kDownloadItemCodeMask, kDownloadItemDragAction),
drag_data_(new DragData(item)) {}
DownloadItemDrag::~DownloadItemDrag() {}
void DownloadItemDrag::OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type,
guint time) {
drag_data_->OnDragDataGet(widget, context, selection_data, target_type, time);
}
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_DRAG_H_
#define CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_DRAG_H_
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/ui/gtk/custom_drag.h"
namespace content {
class DownloadItem;
}
// Encapsulates functionality for drags of download items.
class DownloadItemDrag : public CustomDrag {
public:
// Sets |widget| as a source for drags pertaining to |item|. No
// DownloadItemDrag object is created.
// It is safe to call this multiple times with different values of |icon|.
static void SetSource(GtkWidget* widget,
const content::DownloadItem* item,
gfx::Image* icon);
// Creates a new DownloadItemDrag, the lifetime of which is tied to the
// system drag.
static void BeginDrag(const content::DownloadItem* item, gfx::Image* icon);
private:
class DragData;
DownloadItemDrag(const content::DownloadItem* item, gfx::Image* icon);
virtual ~DownloadItemDrag();
virtual void OnDragDataGet(GtkWidget* widget,
GdkDragContext* context,
GtkSelectionData* selection_data,
guint target_type,
guint time) OVERRIDE;
scoped_ptr<DragData> drag_data_;
DISALLOW_COPY_AND_ASSIGN(DownloadItemDrag);
};
#endif // CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_DRAG_H_
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "chrome/browser/download/download_item_model.h" #include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/gtk/custom_drag.h" #include "chrome/browser/ui/gtk/download/download_item_drag.h"
#include "chrome/browser/ui/gtk/download/download_shelf_context_menu_gtk.h" #include "chrome/browser/ui/gtk/download/download_shelf_context_menu_gtk.h"
#include "chrome/browser/ui/gtk/download/download_shelf_gtk.h" #include "chrome/browser/ui/gtk/download/download_shelf_gtk.h"
#include "chrome/browser/ui/gtk/gtk_theme_service.h" #include "chrome/browser/ui/gtk/gtk_theme_service.h"
......
...@@ -1041,6 +1041,8 @@ ...@@ -1041,6 +1041,8 @@
'browser/ui/gtk/bookmarks/bookmark_bar_instructions_gtk.h', 'browser/ui/gtk/bookmarks/bookmark_bar_instructions_gtk.h',
'browser/ui/gtk/bookmarks/bookmark_bubble_gtk.cc', 'browser/ui/gtk/bookmarks/bookmark_bubble_gtk.cc',
'browser/ui/gtk/bookmarks/bookmark_bubble_gtk.h', 'browser/ui/gtk/bookmarks/bookmark_bubble_gtk.h',
'browser/ui/gtk/bookmarks/bookmark_drag.cc',
'browser/ui/gtk/bookmarks/bookmark_drag.h',
'browser/ui/gtk/bookmarks/bookmark_drag_drop_gtk.cc', 'browser/ui/gtk/bookmarks/bookmark_drag_drop_gtk.cc',
'browser/ui/gtk/bookmarks/bookmark_editor_gtk.cc', 'browser/ui/gtk/bookmarks/bookmark_editor_gtk.cc',
'browser/ui/gtk/bookmarks/bookmark_editor_gtk.h', 'browser/ui/gtk/bookmarks/bookmark_editor_gtk.h',
...@@ -1088,6 +1090,8 @@ ...@@ -1088,6 +1090,8 @@
'browser/ui/gtk/custom_drag.h', 'browser/ui/gtk/custom_drag.h',
'browser/ui/gtk/download/download_in_progress_dialog_gtk.cc', 'browser/ui/gtk/download/download_in_progress_dialog_gtk.cc',
'browser/ui/gtk/download/download_in_progress_dialog_gtk.h', 'browser/ui/gtk/download/download_in_progress_dialog_gtk.h',
'browser/ui/gtk/download/download_item_drag.cc',
'browser/ui/gtk/download/download_item_drag.h',
'browser/ui/gtk/download/download_item_gtk.cc', 'browser/ui/gtk/download/download_item_gtk.cc',
'browser/ui/gtk/download/download_item_gtk.h', 'browser/ui/gtk/download/download_item_gtk.h',
'browser/ui/gtk/download/download_shelf_context_menu_gtk.cc', 'browser/ui/gtk/download/download_shelf_context_menu_gtk.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment