1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
6 #define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
10 #include "base/files/file_path.h"
11 #include "base/strings/string16.h"
12 #include "base/time/time.h"
13 #include "components/bookmarks/browser/bookmark_node.h"
14 #include "ui/base/clipboard/clipboard_types.h"
17 #if defined(TOOLKIT_VIEWS)
18 #include "ui/base/dragdrop/os_exchange_data.h"
30 // BookmarkNodeData is used to represent the following:
33 // . A single node from the bookmark model.
34 // . A set of nodes from the bookmark model.
36 // BookmarkNodeData is used by bookmark related views to represent a dragged
37 // bookmark or bookmarks.
39 // Typical usage when writing data for a drag is:
40 // BookmarkNodeData data(node_user_is_dragging);
41 // data.Write(os_exchange_data_for_drag);
43 // Typical usage to read is:
44 // BookmarkNodeData data;
45 // if (data.Read(os_exchange_data))
46 // // data is valid, contents are in elements.
48 struct BookmarkNodeData
{
49 // Element represents a single node.
52 explicit Element(const BookmarkNode
* node
);
55 // If true, this element represents a URL.
58 // The URL, only valid if is_url is true.
61 // Title of the entry, used for both urls and folders.
64 // Date of when this node was created.
65 base::Time date_added
;
67 // Date of the last modification. Only used for folders.
68 base::Time date_folder_modified
;
70 // Children, only used for non-URL nodes.
71 std::vector
<Element
> children
;
73 // Meta info for the bookmark node.
74 BookmarkNode::MetaInfoMap meta_info_map
;
76 int64
id() const { return id_
; }
79 friend struct BookmarkNodeData
;
81 // For reading/writing this Element.
82 void WriteToPickle(base::Pickle
* pickle
) const;
83 bool ReadFromPickle(base::PickleIterator
* iterator
);
89 // The MIME type for the clipboard format for BookmarkNodeData.
90 static const char* kClipboardFormatString
;
94 // Created a BookmarkNodeData populated from the arguments.
95 explicit BookmarkNodeData(const BookmarkNode
* node
);
96 explicit BookmarkNodeData(const std::vector
<const BookmarkNode
*>& nodes
);
100 #if defined(TOOLKIT_VIEWS)
101 static const ui::OSExchangeData::CustomFormat
& GetBookmarkCustomFormat();
104 static bool ClipboardContainsBookmarks();
106 // Reads bookmarks from the given vector.
107 bool ReadFromVector(const std::vector
<const BookmarkNode
*>& nodes
);
109 // Creates a single-bookmark DragData from url/title pair.
110 bool ReadFromTuple(const GURL
& url
, const base::string16
& title
);
112 // Writes bookmarks to the specified clipboard.
113 void WriteToClipboard(ui::ClipboardType type
);
115 // Reads bookmarks from the specified clipboard. Prefers data written via
116 // WriteToClipboard() but will also attempt to read a plain bookmark.
117 bool ReadFromClipboard(ui::ClipboardType type
);
119 #if defined(TOOLKIT_VIEWS)
120 // Writes elements to data. If there is only one element and it is a URL
121 // the URL and title are written to the clipboard in a format other apps can
123 // |profile_path| is used to identify which profile the data came from. Use an
124 // empty path to indicate that the data is not associated with any profile.
125 void Write(const base::FilePath
& profile_path
,
126 ui::OSExchangeData
* data
) const;
128 // Restores this data from the clipboard, returning true on success.
129 bool Read(const ui::OSExchangeData
& data
);
132 // Writes the data for a drag to |pickle|.
133 void WriteToPickle(const base::FilePath
& profile_path
,
134 base::Pickle
* pickle
) const;
136 // Reads the data for a drag from a |pickle|.
137 bool ReadFromPickle(base::Pickle
* pickle
);
139 // Returns the nodes represented by this DragData. If this DragData was
140 // created from the same profile then the nodes from the model are returned.
141 // If the nodes can't be found (may have been deleted), an empty vector is
143 std::vector
<const BookmarkNode
*> GetNodes(
144 BookmarkModel
* model
,
145 const base::FilePath
& profile_path
) const;
147 // Convenience for getting the first node. Returns NULL if the data doesn't
148 // match any nodes or there is more than one node.
149 const BookmarkNode
* GetFirstNode(BookmarkModel
* model
,
150 const base::FilePath
& profile_path
) const;
152 // Do we contain valid data?
153 bool is_valid() const { return !elements
.empty(); }
155 // Returns true if there is a single url.
156 bool has_single_url() const { return size() == 1 && elements
[0].is_url
; }
158 // Number of elements.
159 size_t size() const { return elements
.size(); }
164 // Sets |profile_path_|. This is useful for the constructors/readers that
165 // don't set it. This should only be called if the profile path is not
167 void SetOriginatingProfilePath(const base::FilePath
& profile_path
);
169 // Returns true if this data is from the specified profile path.
170 bool IsFromProfilePath(const base::FilePath
& profile_path
) const;
172 // The actual elements written to the clipboard.
173 std::vector
<Element
> elements
;
176 // Path of the profile we originated from.
177 base::FilePath profile_path_
;
180 } // namespace bookmarks
182 #endif // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_