bookmark_node_data.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
16d5ab866fc1492c12b1f2531bbe7dcdb55ac9e15Misha Brukman// Copyright 2014 The Chromium Authors. All rights reserved.
26d5ab866fc1492c12b1f2531bbe7dcdb55ac9e15Misha Brukman// Use of this source code is governed by a BSD-style license that can be
36d5ab866fc1492c12b1f2531bbe7dcdb55ac9e15Misha Brukman// found in the LICENSE file.
46d5ab866fc1492c12b1f2531bbe7dcdb55ac9e15Misha Brukman
557360d1f1cede3b26744d0ce3ade814fcc0f332dChris Lattner#ifndef COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
657360d1f1cede3b26744d0ce3ade814fcc0f332dChris Lattner#define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
79b8f542e2746b28721b3ec603c3aaaa10ea708fcMisha Brukman
86d5ab866fc1492c12b1f2531bbe7dcdb55ac9e15Misha Brukman#include <vector>
97a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
107a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "base/files/file_path.h"
117a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "base/strings/string16.h"
12f1dd2004c07126944c9384d25e866215fd93c3bbBrian Gaeke#include "base/time/time.h"
136d5ab866fc1492c12b1f2531bbe7dcdb55ac9e15Misha Brukman#include "components/bookmarks/browser/bookmark_node.h"
147a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell#include "ui/base/clipboard/clipboard_types.h"
15b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
16b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer#include "url/gurl.h"
17b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer#if defined(TOOLKIT_VIEWS)
18e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer#include "ui/base/dragdrop/os_exchange_data.h"
19b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer#endif
20b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
21b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencerclass BookmarkModel;
22b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencerclass Pickle;
23b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencerclass PickleIterator;
24b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
25b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// BookmarkNodeData is used to represent the following:
26b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer//
27b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// . A single URL.
28b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// . A single node from the bookmark model.
29b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// . A set of nodes from the bookmark model.
30b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer//
31b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// BookmarkNodeData is used by bookmark related views to represent a dragged
32b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// bookmark or bookmarks.
33b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer//
34b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// Typical usage when writing data for a drag is:
35b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer//   BookmarkNodeData data(node_user_is_dragging);
36aea7fe4abd1f54edd3cbdadcbd8f0e2e99c5acf3Reid Spencer//   data.Write(os_exchange_data_for_drag);
37b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer//
38b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer// Typical usage to read is:
391b22fde3b225e4e465e6b53ca9ce03461223488fReid Spencer//   BookmarkNodeData data;
40b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer//   if (data.Read(os_exchange_data))
41b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer//     // data is valid, contents are in elements.
427cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner
437cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattnerstruct BookmarkNodeData {
447cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner  // Element represents a single node.
457cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner  struct Element {
467cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner    Element();
477cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner    explicit Element(const BookmarkNode* node);
48b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    ~Element();
49e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi
50e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi    // If true, this element represents a URL.
511b22fde3b225e4e465e6b53ca9ce03461223488fReid Spencer    bool is_url;
527cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner
537cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner    // The URL, only valid if is_url is true.
547cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner    GURL url;
55e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi
56e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi    // Title of the entry, used for both urls and folders.
57e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi    base::string16 title;
58e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi
59e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi    // Date of when this node was created.
60e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi    base::Time date_added;
61e5ab51d51f6e5cebf57db76c7f8527febc6a2b71NAKAMURA Takumi
6232b169114e586e61a95f11043aa6032f11995fb7Reid Spencer    // Date of the last modification. Only used for folders.
6332b169114e586e61a95f11043aa6032f11995fb7Reid Spencer    base::Time date_folder_modified;
64b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
65b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    // Children, only used for non-URL nodes.
66b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    std::vector<Element> children;
67b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
68b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    // Meta info for the bookmark node.
69b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    BookmarkNode::MetaInfoMap meta_info_map;
70b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
71b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    int64 id() const { return id_; }
72b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
73b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer   private:
74b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    friend struct BookmarkNodeData;
75b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
76b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    // For reading/writing this Element.
77b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    void WriteToPickle(Pickle* pickle) const;
78b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    bool ReadFromPickle(Pickle* pickle, PickleIterator* iterator);
79b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
80b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer    // ID of the node.
817cf8fc7a45373aab97ce58130087b8b5db064f54Chris Lattner    int64 id_;
8232b169114e586e61a95f11043aa6032f11995fb7Reid Spencer  };
8332b169114e586e61a95f11043aa6032f11995fb7Reid Spencer
84b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer  // The MIME type for the clipboard format for BookmarkNodeData.
85b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer  static const char* kClipboardFormatString;
86b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer
87b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer  BookmarkNodeData();
88e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer
898475ec068c213d0bf73f7686d82491a8f12e3b32Reid Spencer  // Created a BookmarkNodeData populated from the arguments.
908475ec068c213d0bf73f7686d82491a8f12e3b32Reid Spencer  explicit BookmarkNodeData(const BookmarkNode* node);
91d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar  explicit BookmarkNodeData(const std::vector<const BookmarkNode*>& nodes);
92d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar
93d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar  ~BookmarkNodeData();
94d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar
95d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar#if defined(TOOLKIT_VIEWS)
96d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar  static const ui::OSExchangeData::CustomFormat& GetBookmarkCustomFormat();
97d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar#endif
98d4076cfc834da5255d2f7a15b6f9c7cd80132223Erick Tryzelaar
9932b169114e586e61a95f11043aa6032f11995fb7Reid Spencer  static bool ClipboardContainsBookmarks();
100bbf7a8af5a7781cf0f721770ab81333f22c0f464Reid Spencer
101bbf7a8af5a7781cf0f721770ab81333f22c0f464Reid Spencer  // Reads bookmarks from the given vector.
102bbf7a8af5a7781cf0f721770ab81333f22c0f464Reid Spencer  bool ReadFromVector(const std::vector<const BookmarkNode*>& nodes);
103bbf7a8af5a7781cf0f721770ab81333f22c0f464Reid Spencer
104e55db741523b51f3f754b6dd62c5e0f52bb83b98Anton Korobeynikov  // Creates a single-bookmark DragData from url/title pair.
1057a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell  bool ReadFromTuple(const GURL& url, const base::string16& title);
106e55db741523b51f3f754b6dd62c5e0f52bb83b98Anton Korobeynikov
107e55db741523b51f3f754b6dd62c5e0f52bb83b98Anton Korobeynikov  // Writes bookmarks to the specified clipboard.
108e55db741523b51f3f754b6dd62c5e0f52bb83b98Anton Korobeynikov  void WriteToClipboard(ui::ClipboardType type);
1097a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
1107659545ceef542dc9951673e1f9085ef2d045699John Criswell  // Reads bookmarks from the specified clipboard. Prefers data written via
1117659545ceef542dc9951673e1f9085ef2d045699John Criswell  // WriteToClipboard() but will also attempt to read a plain bookmark.
1127659545ceef542dc9951673e1f9085ef2d045699John Criswell  bool ReadFromClipboard(ui::ClipboardType type);
113e2cfe5d23225fa74febd5f170b919bba2c495308Reid Spencer
114e2cfe5d23225fa74febd5f170b919bba2c495308Reid Spencer#if defined(TOOLKIT_VIEWS)
115e2cfe5d23225fa74febd5f170b919bba2c495308Reid Spencer  // Writes elements to data. If there is only one element and it is a URL
116e2cfe5d23225fa74febd5f170b919bba2c495308Reid Spencer  // the URL and title are written to the clipboard in a format other apps can
117e2cfe5d23225fa74febd5f170b919bba2c495308Reid Spencer  // use.
118e2cfe5d23225fa74febd5f170b919bba2c495308Reid Spencer  // |profile_path| is used to identify which profile the data came from. Use an
119e2cfe5d23225fa74febd5f170b919bba2c495308Reid Spencer  // empty path to indicate that the data is not associated with any profile.
120673612ec72e0e246ca671a3977666424b5ed77ccJim Grosbach  void Write(const base::FilePath& profile_path,
121673612ec72e0e246ca671a3977666424b5ed77ccJim Grosbach             ui::OSExchangeData* data) const;
122673612ec72e0e246ca671a3977666424b5ed77ccJim Grosbach
123673612ec72e0e246ca671a3977666424b5ed77ccJim Grosbach  // Restores this data from the clipboard, returning true on success.
124673612ec72e0e246ca671a3977666424b5ed77ccJim Grosbach  bool Read(const ui::OSExchangeData& data);
1255e869c353c01f168712ae33cb7de2e9ba5cdf658Shantonu Sen#endif
1265e869c353c01f168712ae33cb7de2e9ba5cdf658Shantonu Sen
1275e869c353c01f168712ae33cb7de2e9ba5cdf658Shantonu Sen  // Writes the data for a drag to |pickle|.
12818224032d3b26cad39991fc569948f15cf5ed953Reid Spencer  void WriteToPickle(const base::FilePath& profile_path, Pickle* pickle) const;
12918224032d3b26cad39991fc569948f15cf5ed953Reid Spencer
13018224032d3b26cad39991fc569948f15cf5ed953Reid Spencer  // Reads the data for a drag from a |pickle|.
131cf9be26e5d99c50b350aa8c5bf6ce6bc8322b213Evan Cheng  bool ReadFromPickle(Pickle* pickle);
132cf9be26e5d99c50b350aa8c5bf6ce6bc8322b213Evan Cheng
133cf9be26e5d99c50b350aa8c5bf6ce6bc8322b213Evan Cheng  // Returns the nodes represented by this DragData. If this DragData was
134e2a91a76dffcf8cda97b835f0693f9dc6f26ba68Daniel Dunbar  // created from the same profile then the nodes from the model are returned.
135e2a91a76dffcf8cda97b835f0693f9dc6f26ba68Daniel Dunbar  // If the nodes can't be found (may have been deleted), an empty vector is
136e2a91a76dffcf8cda97b835f0693f9dc6f26ba68Daniel Dunbar  // returned.
1370021c31b60706f0a35f0858c112ebdc709f3d3e7John Criswell  std::vector<const BookmarkNode*> GetNodes(
1380021c31b60706f0a35f0858c112ebdc709f3d3e7John Criswell      BookmarkModel* model,
1390021c31b60706f0a35f0858c112ebdc709f3d3e7John Criswell      const base::FilePath& profile_path) const;
1407a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
1417a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell  // Convenience for getting the first node. Returns NULL if the data doesn't
1427a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell  // match any nodes or there is more than one node.
1437a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell  const BookmarkNode* GetFirstNode(BookmarkModel* model,
144b5a2e40dd8f6b6550d4191f6d74edcb641d0153fMisha Brukman                                   const base::FilePath& profile_path) const;
1457a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
1467a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell  // Do we contain valid data?
147f1dd2004c07126944c9384d25e866215fd93c3bbBrian Gaeke  bool is_valid() const { return !elements.empty(); }
148b812e76b56f96815c08b850fd688ff835862b22aJohn Criswell
14949bf862719c5ac24ddc9eafa35e51dd68904b1beJohn Criswell  // Returns true if there is a single url.
150f1dd2004c07126944c9384d25e866215fd93c3bbBrian Gaeke  bool has_single_url() const { return is_valid() && elements[0].is_url; }
1517a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
152e55db741523b51f3f754b6dd62c5e0f52bb83b98Anton Korobeynikov  // Number of elements.
1537a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell  size_t size() const { return elements.size(); }
1541bc686433bd5dea7ef4b8b5d97cd9461f041b56fReid Spencer
1551bc686433bd5dea7ef4b8b5d97cd9461f041b56fReid Spencer  // Clears the data.
1561bc686433bd5dea7ef4b8b5d97cd9461f041b56fReid Spencer  void Clear();
157151f8ba3645defc371eb4b68427384e411305734Reid Spencer
1588a2d4718257aa1a97dad9f9f8cce719b539c694bReid Spencer  // Sets |profile_path_|. This is useful for the constructors/readers that
1598a2d4718257aa1a97dad9f9f8cce719b539c694bReid Spencer  // don't set it. This should only be called if the profile path is not
160e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer  // already set.
161e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer  void SetOriginatingProfilePath(const base::FilePath& profile_path);
162e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer
163e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer  // Returns true if this data is from the specified profile path.
164b2cb4861511692d8566b50fa34720eeb09ed617eReid Spencer  bool IsFromProfilePath(const base::FilePath& profile_path) const;
165e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer
166e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer  // The actual elements written to the clipboard.
167e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer  std::vector<Element> elements;
168e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer
169e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer private:
170e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer  // Path of the profile we originated from.
171e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer  base::FilePath profile_path_;
1729b8f542e2746b28721b3ec603c3aaaa10ea708fcMisha Brukman};
173e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer
17468cb31901c590cabceee6e6356d62c84142114cbmike-m#endif  // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
175e1200219ec6f4d6ff7f54933ccad462c8dfdbb70Reid Spencer