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