1// Copyright (c) 2010 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.
4
5#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_NODE_DATA_H_
6#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_NODE_DATA_H_
7#pragma once
8
9#include <vector>
10
11#include "base/file_path.h"
12#include "base/string16.h"
13#include "googleurl/src/gurl.h"
14
15#if defined(TOOLKIT_VIEWS)
16#include "ui/base/dragdrop/os_exchange_data.h"
17#endif
18
19class BookmarkNode;
20class Pickle;
21class Profile;
22
23// BookmarkNodeData is used to represent the following:
24//
25// . A single URL.
26// . A single node from the bookmark model.
27// . A set of nodes from the bookmark model.
28//
29// BookmarkNodeData is used by bookmark related views to represent a dragged
30// bookmark or bookmarks.
31//
32// Typical usage when writing data for a drag is:
33//   BookmarkNodeData data(node_user_is_dragging);
34//   data.Write(os_exchange_data_for_drag);
35//
36// Typical usage to read is:
37//   BookmarkNodeData data;
38//   if (data.Read(os_exchange_data))
39//     // data is valid, contents are in elements.
40
41struct BookmarkNodeData {
42  // Element represents a single node.
43  struct Element {
44    Element();
45    explicit Element(const BookmarkNode* node);
46    ~Element();
47
48    // If true, this element represents a URL.
49    bool is_url;
50
51    // The URL, only valid if is_url is true.
52    GURL url;
53
54    // Title of the entry, used for both urls and folders.
55    string16 title;
56
57    // Children, only used for non-URL nodes.
58    std::vector<Element> children;
59
60    int64 get_id() {
61      return id_;
62    }
63   private:
64    friend struct BookmarkNodeData;
65
66    // For reading/writing this Element.
67    void WriteToPickle(Pickle* pickle) const;
68    bool ReadFromPickle(Pickle* pickle, void** iterator);
69
70    // ID of the node.
71    int64 id_;
72  };
73
74  BookmarkNodeData();
75
76#if defined(TOOLKIT_VIEWS)
77  static ui::OSExchangeData::CustomFormat GetBookmarkCustomFormat();
78#endif
79
80  // Created a BookmarkNodeData populated from the arguments.
81  explicit BookmarkNodeData(const BookmarkNode* node);
82  explicit BookmarkNodeData(const std::vector<const BookmarkNode*>& nodes);
83
84  ~BookmarkNodeData();
85
86  // Reads bookmarks from the given vector.
87  bool ReadFromVector(const std::vector<const BookmarkNode*>& nodes);
88
89  // Creates a single-bookmark DragData from url/title pair.
90  bool ReadFromTuple(const GURL& url, const string16& title);
91
92  // Writes elements to the clipboard.
93  void WriteToClipboard(Profile* profile) const;
94
95  // Reads bookmarks from the general copy/paste clipboard. Prefers data
96  // written via WriteToClipboard but will also attempt to read a plain
97  // bookmark.
98  bool ReadFromClipboard();
99#if defined(OS_MACOSX)
100  // Reads bookmarks that are being dragged from the drag and drop
101  // pasteboard.
102  bool ReadFromDragClipboard();
103#endif
104
105#if defined(TOOLKIT_VIEWS)
106  // Writes elements to data. If there is only one element and it is a URL
107  // the URL and title are written to the clipboard in a format other apps can
108  // use.
109  // |profile| is used to identify which profile the data came from. Use a
110  // value of null to indicate the data is not associated with any profile.
111  void Write(Profile* profile, ui::OSExchangeData* data) const;
112
113  // Restores this data from the clipboard, returning true on success.
114  bool Read(const ui::OSExchangeData& data);
115#endif
116
117  // Writes the data for a drag to |pickle|.
118  void WriteToPickle(Profile* profile, Pickle* pickle) const;
119
120  // Reads the data for a drag from a |pickle|.
121  bool ReadFromPickle(Pickle* pickle);
122
123  // Returns the nodes represented by this DragData. If this DragData was
124  // created from the same profile then the nodes from the model are returned.
125  // If the nodes can't be found (may have been deleted), an empty vector is
126  // returned.
127  std::vector<const BookmarkNode*> GetNodes(Profile* profile) const;
128
129  // Convenience for getting the first node. Returns NULL if the data doesn't
130  // match any nodes or there is more than one node.
131  const BookmarkNode* GetFirstNode(Profile* profile) const;
132
133  // Do we contain valid data?
134  bool is_valid() const { return !elements.empty(); }
135
136  // Returns true if there is a single url.
137  bool has_single_url() const { return is_valid() && elements[0].is_url; }
138
139  // Number of elements.
140  size_t size() const { return elements.size(); }
141
142  // Clears the data.
143  void Clear();
144
145  // Sets |profile_path_| to that of |profile|. This is useful for the
146  // constructors/readers that don't set it. This should only be called if the
147  // profile path is not already set.
148  void SetOriginatingProfile(Profile* profile);
149
150  // Returns true if this data is from the specified profile.
151  bool IsFromProfile(Profile* profile) const;
152
153  // The actual elements written to the clipboard.
154  std::vector<Element> elements;
155
156  // The MIME type for the clipboard format for BookmarkNodeData.
157  static const char* kClipboardFormatString;
158
159  static bool ClipboardContainsBookmarks();
160
161 private:
162  // Path of the profile we originated from.
163  FilePath::StringType profile_path_;
164};
165
166#endif  // CHROME_BROWSER_BOOKMARKS_BOOKMARK_NODE_DATA_H_
167