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 19 class BookmarkNode; 20 class Pickle; 21 class 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 41 struct 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