summaryrefslogtreecommitdiffstats
path: root/chrome/browser/bookmarks/bookmark_drag_data.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/bookmarks/bookmark_drag_data.h')
-rw-r--r--chrome/browser/bookmarks/bookmark_drag_data.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/chrome/browser/bookmarks/bookmark_drag_data.h b/chrome/browser/bookmarks/bookmark_drag_data.h
new file mode 100644
index 0000000..b4b65da
--- /dev/null
+++ b/chrome/browser/bookmarks/bookmark_drag_data.h
@@ -0,0 +1,168 @@
+// Copyright (c) 2010 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_BOOKMARKS_BOOKMARK_DRAG_DATA_H_
+#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_DRAG_DATA_H_
+
+#include <string>
+#include <vector>
+
+#include "base/file_path.h"
+#include "base/string16.h"
+#include "googleurl/src/gurl.h"
+
+#if defined(TOOLKIT_VIEWS)
+#include "app/os_exchange_data.h"
+#endif
+
+class BookmarkModel;
+class BookmarkNode;
+class OSExchangeData;
+class Pickle;
+class Profile;
+
+// TODO(mrossetti): Rename BookmarkDragData to BookmarkNodeData, update comment.
+// See: http://crbug.com/37891
+
+// BookmarkDragData is used to represent the following:
+//
+// . A single URL.
+// . A single node from the bookmark model.
+// . A set of nodes from the bookmark model.
+//
+// BookmarkDragData is used by bookmark related views to represent a dragged
+// bookmark or bookmarks.
+//
+// Typical usage when writing data for a drag is:
+// BookmarkDragData data(node_user_is_dragging);
+// data.Write(os_exchange_data_for_drag);
+//
+// Typical usage to read is:
+// BookmarkDragData data;
+// if (data.Read(os_exchange_data))
+// // data is valid, contents are in elements.
+
+struct BookmarkDragData {
+ // Element represents a single node.
+ struct Element {
+ explicit Element(const BookmarkNode* node);
+
+ Element() : is_url(false), id_(0) {}
+
+ // If true, this element represents a URL.
+ bool is_url;
+
+ // The URL, only valid if is_url is true.
+ GURL url;
+
+ // Title of the entry, used for both urls and groups/folders.
+ string16 title;
+
+ // Children, only used for non-URL nodes.
+ std::vector<Element> children;
+
+ int64 get_id() {
+ return id_;
+ }
+ private:
+ friend struct BookmarkDragData;
+
+ // For reading/writing this Element.
+ void WriteToPickle(Pickle* pickle) const;
+ bool ReadFromPickle(Pickle* pickle, void** iterator);
+
+ // ID of the node.
+ int64 id_;
+ };
+
+ BookmarkDragData() { }
+
+#if defined(TOOLKIT_VIEWS)
+ static OSExchangeData::CustomFormat GetBookmarkCustomFormat();
+#endif
+
+ // Created a BookmarkDragData populated from the arguments.
+ explicit BookmarkDragData(const BookmarkNode* node);
+ explicit BookmarkDragData(const std::vector<const BookmarkNode*>& nodes);
+
+ // Reads bookmarks from the given vector.
+ bool ReadFromVector(const std::vector<const BookmarkNode*>& nodes);
+
+ // Creates a single-bookmark DragData from url/title pair.
+ bool ReadFromTuple(const GURL& url, const string16& title);
+
+ // Writes elements to the clipboard.
+ void WriteToClipboard(Profile* profile) const;
+
+ // Reads bookmarks from the general copy/paste clipboard. Prefers data
+ // written via WriteToClipboard but will also attempt to read a plain bookmark.
+ bool ReadFromClipboard();
+#if defined(OS_MACOSX)
+ // Reads bookmarks that are being dragged from the drag and drop
+ // pasteboard.
+ bool ReadFromDragClipboard();
+#endif
+
+#if defined(TOOLKIT_VIEWS)
+ // Writes elements to data. If there is only one element and it is a URL
+ // the URL and title are written to the clipboard in a format other apps can
+ // use.
+ // |profile| is used to identify which profile the data came from. Use a
+ // value of null to indicate the data is not associated with any profile.
+ void Write(Profile* profile, OSExchangeData* data) const;
+
+ // Restores this data from the clipboard, returning true on success.
+ bool Read(const OSExchangeData& data);
+#endif
+
+ // Writes the data for a drag to |pickle|.
+ void WriteToPickle(Profile* profile, Pickle* pickle) const;
+
+ // Reads the data for a drag from a |pickle|.
+ bool ReadFromPickle(Pickle* pickle);
+
+ // Returns the nodes represented by this DragData. If this DragData was
+ // created from the same profile then the nodes from the model are returned.
+ // If the nodes can't be found (may have been deleted), an empty vector is
+ // returned.
+ std::vector<const BookmarkNode*> GetNodes(Profile* profile) const;
+
+ // Convenience for getting the first node. Returns NULL if the data doesn't
+ // match any nodes or there is more than one node.
+ const BookmarkNode* GetFirstNode(Profile* profile) const;
+
+ // Do we contain valid data?
+ bool is_valid() const { return !elements.empty(); }
+
+ // Returns true if there is a single url.
+ bool has_single_url() const { return is_valid() && elements[0].is_url; }
+
+ // Number of elements.
+ size_t size() const { return elements.size(); }
+
+ // Clears the data.
+ void Clear();
+
+ // Sets |profile_path_| to that of |profile|. This is useful for the
+ // constructors/readers that don't set it. This should only be called if the
+ // profile path is not already set.
+ void SetOriginatingProfile(Profile* profile);
+
+ // Returns true if this data is from the specified profile.
+ bool IsFromProfile(Profile* profile) const;
+
+ // The actual elements written to the clipboard.
+ std::vector<Element> elements;
+
+ // The MIME type for the clipboard format for BookmarkDragData.
+ static const char* kClipboardFormatString;
+
+ static bool ClipboardContainsBookmarks();
+
+ private:
+ // Path of the profile we originated from.
+ FilePath::StringType profile_path_;
+};
+
+#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_DRAG_DATA_H_