1 // Copyright (c) 2011 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_UTILS_H_ 6 #define CHROME_BROWSER_BOOKMARKS_BOOKMARK_UTILS_H_ 7 #pragma once 8 9 #include <string> 10 #include <vector> 11 12 #include "base/string16.h" 13 #include "chrome/browser/bookmarks/bookmark_editor.h" 14 #include "chrome/browser/bookmarks/bookmark_node_data.h" 15 #include "chrome/browser/history/snippet.h" 16 #include "ui/gfx/native_widget_types.h" 17 #include "webkit/glue/window_open_disposition.h" 18 19 class BookmarkModel; 20 class BookmarkNode; 21 class Browser; 22 class PageNavigator; 23 class PrefService; 24 class Profile; 25 class TabContents; 26 27 namespace views { 28 class DropTargetEvent; 29 } 30 31 // A collection of bookmark utility functions used by various parts of the UI 32 // that show bookmarks: bookmark manager, bookmark bar view ... 33 namespace bookmark_utils { 34 35 // Calculates the drop operation given |source_operations| and the ideal 36 // set of drop operations (|operations|). This prefers the following ordering: 37 // COPY, LINK then MOVE. 38 int PreferredDropOperation(int source_operations, int operations); 39 40 // Returns the drag operations for the specified node. 41 int BookmarkDragOperation(Profile* profile, const BookmarkNode* node); 42 43 // Returns the preferred drop operation on a bookmark menu/bar. 44 // |parent| is the parent node the drop is to occur on and |index| the index the 45 // drop is over. 46 int BookmarkDropOperation(Profile* profile, 47 const views::DropTargetEvent& event, 48 const BookmarkNodeData& data, 49 const BookmarkNode* parent, 50 int index); 51 52 // Performs a drop of bookmark data onto |parent_node| at |index|. Returns the 53 // type of drop the resulted. 54 int PerformBookmarkDrop(Profile* profile, 55 const BookmarkNodeData& data, 56 const BookmarkNode* parent_node, 57 int index); 58 59 // Returns true if the bookmark data can be dropped on |drop_parent| at 60 // |index|. A drop from a separate profile is always allowed, where as 61 // a drop from the same profile is only allowed if none of the nodes in 62 // |data| are an ancestor of |drop_parent| and one of the nodes isn't already 63 // a child of |drop_parent| at |index|. 64 bool IsValidDropLocation(Profile* profile, 65 const BookmarkNodeData& data, 66 const BookmarkNode* drop_parent, 67 int index); 68 69 // Clones bookmark node, adding newly created nodes to |parent| starting at 70 // |index_to_add_at|. 71 void CloneBookmarkNode(BookmarkModel* model, 72 const std::vector<BookmarkNodeData::Element>& elements, 73 const BookmarkNode* parent, 74 int index_to_add_at); 75 76 // Begins dragging a folder of bookmarks. 77 void DragBookmarks(Profile* profile, 78 const std::vector<const BookmarkNode*>& nodes, 79 gfx::NativeView view); 80 81 // Opens all the bookmarks in |nodes| that are of type url and all the child 82 // bookmarks that are of type url for folders in |nodes|. |initial_disposition| 83 // dictates how the first URL is opened, all subsequent URLs are opened as 84 // background tabs. |navigator| is used to open the URLs. If |navigator| is 85 // NULL the last tabbed browser with the profile |profile| is used. If there is 86 // no browser with the specified profile a new one is created. 87 void OpenAll(gfx::NativeWindow parent, 88 Profile* profile, 89 PageNavigator* navigator, 90 const std::vector<const BookmarkNode*>& nodes, 91 WindowOpenDisposition initial_disposition); 92 93 // Convenience for |OpenAll| with a single BookmarkNode. 94 void OpenAll(gfx::NativeWindow parent, 95 Profile* profile, 96 PageNavigator* navigator, 97 const BookmarkNode* node, 98 WindowOpenDisposition initial_disposition); 99 100 // Copies nodes onto the clipboard. If |remove_nodes| is true the nodes are 101 // removed after copied to the clipboard. The nodes are copied in such a way 102 // that if pasted again copies are made. 103 void CopyToClipboard(BookmarkModel* model, 104 const std::vector<const BookmarkNode*>& nodes, 105 bool remove_nodes); 106 107 // Pastes from the clipboard. The new nodes are added to |parent|, unless 108 // |parent| is null in which case this does nothing. The nodes are inserted 109 // at |index|. If |index| is -1 the nodes are added to the end. 110 void PasteFromClipboard(BookmarkModel* model, 111 const BookmarkNode* parent, 112 int index); 113 114 // Returns true if the user can copy from the pasteboard. 115 bool CanPasteFromClipboard(const BookmarkNode* node); 116 117 // Returns a name for the given URL. Used for drags into bookmark areas when 118 // the source doesn't specify a title. 119 string16 GetNameForURL(const GURL& url); 120 121 // Returns a vector containing up to |max_count| of the most recently modified 122 // folders. This never returns an empty vector. 123 std::vector<const BookmarkNode*> GetMostRecentlyModifiedFolders( 124 BookmarkModel* model, size_t max_count); 125 126 // Returns the most recently added bookmarks. This does not return folders, 127 // only nodes of type url. 128 void GetMostRecentlyAddedEntries(BookmarkModel* model, 129 size_t count, 130 std::vector<const BookmarkNode*>* nodes); 131 132 // Used by GetBookmarksMatchingText to return a matching node and the location 133 // of the match in the title. 134 struct TitleMatch { 135 TitleMatch(); 136 ~TitleMatch(); 137 138 const BookmarkNode* node; 139 140 // Location of the matching words in the title of the node. 141 Snippet::MatchPositions match_positions; 142 }; 143 144 // Returns true if |n1| was added more recently than |n2|. 145 bool MoreRecentlyAdded(const BookmarkNode* n1, const BookmarkNode* n2); 146 147 // Returns up to |max_count| bookmarks from |model| whose url or title contains 148 // the text |text|. |languages| is user's accept-language setting to decode 149 // IDN. 150 void GetBookmarksContainingText(BookmarkModel* model, 151 const string16& text, 152 size_t max_count, 153 const std::string& languages, 154 std::vector<const BookmarkNode*>* nodes); 155 156 // Returns true if |node|'s url or title contains the string |text|. 157 // |languages| is user's accept-language setting to decode IDN. 158 bool DoesBookmarkContainText(const BookmarkNode* node, 159 const string16& text, 160 const std::string& languages); 161 162 // Modifies a bookmark node (assuming that there's no magic that needs to be 163 // done regarding moving from one folder to another). If a new node is 164 // explicitly being added, returns a pointer to the new node that was created. 165 // Otherwise the return value is identically |node|. 166 const BookmarkNode* ApplyEditsWithNoFolderChange( 167 BookmarkModel* model, 168 const BookmarkNode* parent, 169 const BookmarkEditor::EditDetails& details, 170 const string16& new_title, 171 const GURL& new_url); 172 173 // Modifies a bookmark node assuming that the parent of the node may have 174 // changed and the node will need to be removed and reinserted. If a new node 175 // is explicitly being added, returns a pointer to the new node that was 176 // created. Otherwise the return value is identically |node|. 177 const BookmarkNode* ApplyEditsWithPossibleFolderChange( 178 BookmarkModel* model, 179 const BookmarkNode* new_parent, 180 const BookmarkEditor::EditDetails& details, 181 const string16& new_title, 182 const GURL& new_url); 183 184 // Toggles whether the bookmark bar is shown only on the new tab page or on 185 // all tabs. This is a preference modifier, not a visual modifier. 186 void ToggleWhenVisible(Profile* profile); 187 188 // Register user preferences for BookmarksBar. 189 void RegisterUserPrefs(PrefService* prefs); 190 191 // Fills in the URL and title for a bookmark of |tab_contents|. 192 void GetURLAndTitleToBookmark(TabContents* tab_contents, 193 GURL* url, 194 string16* title); 195 196 // Returns, by reference in |urls|, the url and title pairs for each open 197 // tab in browser. 198 void GetURLsForOpenTabs(Browser* browser, 199 std::vector<std::pair<GURL, string16> >* urls); 200 201 // Returns the parent for newly created folders/bookmarks. If |selection| has 202 // one element and it is a folder, |selection[0]| is returned, otherwise 203 // |parent| is returned. If |index| is non-null it is set to the index newly 204 // added nodes should be added at. 205 const BookmarkNode* GetParentForNewNodes( 206 const BookmarkNode* parent, 207 const std::vector<const BookmarkNode*>& selection, 208 int* index); 209 210 // Returns true if the specified node is of type URL, or has a descendant 211 // of type URL. 212 bool NodeHasURLs(const BookmarkNode* node); 213 214 // Number of bookmarks we'll open before prompting the user to see if they 215 // really want to open all. 216 // 217 // NOTE: treat this as a const. It is not const as various tests change the 218 // value. 219 extern int num_urls_before_prompting; 220 221 } // namespace bookmark_utils 222 223 #endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_UTILS_H_ 224