diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-18 15:37:20 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-18 15:37:20 +0000 |
commit | f29bbb655c535a6977cb13093ad42f51ca23b461 (patch) | |
tree | a40b052d99bd18e62bd8de20dd46376020d04966 /app | |
parent | 89c4ee8206b89e9e7407f37c1ab6002cbd23acd3 (diff) | |
download | chromium_src-f29bbb655c535a6977cb13093ad42f51ca23b461.zip chromium_src-f29bbb655c535a6977cb13093ad42f51ca23b461.tar.gz chromium_src-f29bbb655c535a6977cb13093ad42f51ca23b461.tar.bz2 |
Moves GtkDndUtil into app.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/165423
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23627 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app')
-rw-r--r-- | app/app.gyp | 8 | ||||
-rw-r--r-- | app/gtk_dnd_util.cc | 151 | ||||
-rw-r--r-- | app/gtk_dnd_util.h | 70 |
3 files changed, 229 insertions, 0 deletions
diff --git a/app/app.gyp b/app/app.gyp index 902efde..4422d03 100644 --- a/app/app.gyp +++ b/app/app.gyp @@ -88,6 +88,8 @@ 'gfx/path.h', 'gfx/text_elider.cc', 'gfx/text_elider.h', + 'gtk_dnd_util.cc', + 'gtk_dnd_util.h', 'l10n_util.cc', 'l10n_util.h', 'l10n_util_mac.h', @@ -165,6 +167,12 @@ 'os_exchange_data.cc', ], }], + ['OS!="linux"', { + 'sources!': [ + 'gtk_dnd_util.cc', + 'gtk_dnd_util.h', + ], + }], ], }, { diff --git a/app/gtk_dnd_util.cc b/app/gtk_dnd_util.cc new file mode 100644 index 0000000..8fbca2f --- /dev/null +++ b/app/gtk_dnd_util.cc @@ -0,0 +1,151 @@ +// Copyright (c) 2009 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 "app/gtk_dnd_util.h" + +#include "base/string_util.h" +#include "base/logging.h" +#include "base/pickle.h" +#include "googleurl/src/gurl.h" + +// static +GdkAtom GtkDndUtil::GetAtomForTarget(int target) { + switch (target) { + case CHROME_TAB: + static GdkAtom tab_atom = gdk_atom_intern( + const_cast<char*>("application/x-chrome-tab"), false); + return tab_atom; + + case TEXT_HTML: + static GdkAtom html_atom = gdk_atom_intern( + const_cast<char*>("text/html"), false); + return html_atom; + + case CHROME_BOOKMARK_ITEM: + static GdkAtom bookmark_atom = gdk_atom_intern( + const_cast<char*>("application/x-chrome-bookmark-item"), false); + return bookmark_atom; + + case TEXT_PLAIN: + static GdkAtom text_atom = gdk_atom_intern( + const_cast<char*>("text/plain"), false); + return text_atom; + + case TEXT_URI_LIST: + static GdkAtom uris_atom = gdk_atom_intern( + const_cast<char*>("text/uri-list"), false); + return uris_atom; + + case CHROME_NAMED_URL: + static GdkAtom named_url = gdk_atom_intern( + const_cast<char*>("application/x-chrome-named-url"), false); + return named_url; + + default: + NOTREACHED(); + } + + return NULL; +} + +// static +GtkTargetList* GtkDndUtil::GetTargetListFromCodeMask(int code_mask) { + GtkTargetList* targets = gtk_target_list_new(NULL, 0); + + for (size_t i = 1; i < INVALID_TARGET; i = i << 1) { + if (i == CHROME_WEBDROP_FILE_CONTENTS) + continue; + + if (i & code_mask) + AddTargetToList(targets, i); + } + + return targets; +} + +// static +void GtkDndUtil::SetSourceTargetListFromCodeMask(GtkWidget* source, + int code_mask) { + GtkTargetList* targets = GetTargetListFromCodeMask(code_mask); + gtk_drag_source_set_target_list(source, targets); + gtk_target_list_unref(targets); +} + +// static +void GtkDndUtil::SetDestTargetList(GtkWidget* dest, const int* target_codes) { + GtkTargetList* targets = gtk_target_list_new(NULL, 0); + + for (size_t i = 0; target_codes[i] != -1; ++i) { + AddTargetToList(targets, target_codes[i]); + } + + gtk_drag_dest_set_target_list(dest, targets); + gtk_target_list_unref(targets); +} + +// static +void GtkDndUtil::AddTargetToList(GtkTargetList* targets, int target_code) { + switch (target_code) { + case TEXT_PLAIN: + gtk_target_list_add_text_targets(targets, TEXT_PLAIN); + break; + + case TEXT_URI_LIST: + gtk_target_list_add_uri_targets(targets, TEXT_URI_LIST); + break; + + case TEXT_HTML: + gtk_target_list_add(targets, GetAtomForTarget(TEXT_PLAIN), 0, TEXT_HTML); + break; + + case CHROME_TAB: + case CHROME_BOOKMARK_ITEM: + case CHROME_NAMED_URL: + gtk_target_list_add(targets, GtkDndUtil::GetAtomForTarget(target_code), + GTK_TARGET_SAME_APP, target_code); + break; + + default: + NOTREACHED() << " Unexpected target code: " << target_code; + } +} + +// static +bool GtkDndUtil::ExtractNamedURL(GtkSelectionData* selection_data, + GURL* url, + string16* title) { + Pickle data(reinterpret_cast<char*>(selection_data->data), + selection_data->length); + void* iter = NULL; + std::string title_utf8, url_utf8; + if (!data.ReadString(&iter, &title_utf8) || + !data.ReadString(&iter, &url_utf8)) { + return false; + } + + GURL gurl(url_utf8); + if (!gurl.is_valid()) + return false; + + *url = gurl; + *title = UTF8ToUTF16(title_utf8); + return true; +} + +// static void +bool GtkDndUtil::ExtractURIList(GtkSelectionData* selection_data, + std::vector<GURL>* urls) { + gchar** uris = gtk_selection_data_get_uris(selection_data); + if (!uris) + return false; + + for (size_t i = 0; uris[i] != NULL; ++i) { + GURL url(uris[i]); + if (url.is_valid()) + urls->push_back(url); + } + + g_strfreev(uris); + return true; +} diff --git a/app/gtk_dnd_util.h b/app/gtk_dnd_util.h new file mode 100644 index 0000000..0698d57 --- /dev/null +++ b/app/gtk_dnd_util.h @@ -0,0 +1,70 @@ +// Copyright (c) 2009 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 APP_GTK_DND_UTIL_H_ +#define APP_GTK_DND_UTIL_H_ + +#include <gtk/gtk.h> +#include <vector> + +#include "base/string16.h" + +class GURL; + +class GtkDndUtil { + public: + // Registry of all internal int codes for drag and drop. + enum { + // Intra-application types. + CHROME_TAB = 1 << 0, + CHROME_BOOKMARK_ITEM = 1 << 1, + CHROME_WEBDROP_FILE_CONTENTS = 1 << 2, + CHROME_NAMED_URL = 1 << 3, + + // Standard types. + TEXT_PLAIN = 1 << 4, + TEXT_URI_LIST = 1 << 5, + TEXT_HTML = 1 << 6, + + INVALID_TARGET = 1 << 7, + }; + + // Get the atom for a given target (of the above enum type). Will return NULL + // for non-custom targets, such as CHROME_TEXT_PLAIN. + static GdkAtom GetAtomForTarget(int target); + + // Creates a target list from the given mask. The mask should be an OR of + // CHROME_* values. The target list is returned with ref count 1; the caller + // is responsible for unreffing it when it is no longer needed. + // Since the MIME type for WEBDROP_FILE_CONTENTS depends on the file's + // contents, that flag is ignored by this function. It is the responsibility + // of the client code to do the right thing. + static GtkTargetList* GetTargetListFromCodeMask(int code_mask); + + // Set the drag target list for |source| with the target list that + // corresponds to |code_mask|. + static void SetSourceTargetListFromCodeMask(GtkWidget* source, int code_mask); + + // Set the accepted targets list for |dest|. The |target_codes| array should + // be sorted in preference order and should be terminated with -1. + static void SetDestTargetList(GtkWidget* dest, const int* target_codes); + + // Extracts data of type CHROME_NAMED_URL from |selection_data| into + // |url| and |title|. Returns true if the url/title were safely extracted + // and the url is valid. + static bool ExtractNamedURL(GtkSelectionData* selection_data, + GURL* url, + string16* title); + + // Extracts data of type TEXT_URI_LIST from |selection_data| into |urls|. + static bool ExtractURIList(GtkSelectionData* selection_data, + std::vector<GURL>* urls); + + private: + GtkDndUtil(); + + static void AddTargetToList(GtkTargetList* targets, int target_code); +}; + +#endif // APP_GTK_DND_UTIL_H_ |