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