diff options
author | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-27 22:05:08 +0000 |
---|---|---|
committer | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-27 22:05:08 +0000 |
commit | 58b359d1055914da02ca1b79ea228118dff5ba44 (patch) | |
tree | cfd33e8ddbaf6afed4a6df441799320d758e7577 /chrome/browser/bookmarks/bookmark_folder_tree_model.cc | |
parent | cb9bb1317104cc8a7f219fdaeec45723a9e59e0e (diff) | |
download | chromium_src-58b359d1055914da02ca1b79ea228118dff5ba44.zip chromium_src-58b359d1055914da02ca1b79ea228118dff5ba44.tar.gz chromium_src-58b359d1055914da02ca1b79ea228118dff5ba44.tar.bz2 |
Wires up sorting of bookmarks to the 'organize menu' in the bookmark
manager (Glen says no context menus for now). All
BookmarkModelObservers have been updated appropriately.
BUG=1750
TEST=bring up the bookmark manager and try the 'Reorder by title' menu
item, make sure it works and I didn't screw up anything around it.
Review URL: http://codereview.chromium.org/27262
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10633 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/bookmarks/bookmark_folder_tree_model.cc')
-rw-r--r-- | chrome/browser/bookmarks/bookmark_folder_tree_model.cc | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/chrome/browser/bookmarks/bookmark_folder_tree_model.cc b/chrome/browser/bookmarks/bookmark_folder_tree_model.cc index a743255..de09b13 100644 --- a/chrome/browser/bookmarks/bookmark_folder_tree_model.cc +++ b/chrome/browser/bookmarks/bookmark_folder_tree_model.cc @@ -130,6 +130,40 @@ void BookmarkFolderTreeModel::BookmarkNodeChanged(BookmarkModel* model, GetObserver()->TreeNodeChanged(this, folder_node); } +void BookmarkFolderTreeModel::BookmarkNodeChildrenReordered( + BookmarkModel* model, + BookmarkNode* node) { + FolderNode* folder_node = GetFolderNodeForBookmarkNode(node); + DCHECK(folder_node); + if (folder_node->GetChildCount() <= 1) + return; // Order won't have changed if 1 or fewer nodes. + + // Build a map between folder node and bookmark node. + std::map<BookmarkNode*, FolderNode*> bn_to_folder; + for (int i = 0; i < folder_node->GetChildCount(); ++i) + bn_to_folder[folder_node->GetChild(i)->value] = folder_node->GetChild(i); + + // Remove all the folder nodes. + int original_count = folder_node->GetChildCount(); + folder_node->RemoveAll(); + + // And add them back in the new order. + for (int i = 0; i < node->GetChildCount(); ++i) { + BookmarkNode* child = node->GetChild(i); + if (child->is_folder()) { + DCHECK(bn_to_folder.find(child) != bn_to_folder.end()); + folder_node->Add(folder_node->GetChildCount(), bn_to_folder[child]); + } + } + // The new count better match the original count, otherwise we're leaking and + // treeview is likely to get way out of sync. + DCHECK(original_count == folder_node->GetChildCount()); + + // Finally, notify observers. + if (GetObserver()) + GetObserver()->TreeNodeChildrenReordered(this, folder_node); +} + void BookmarkFolderTreeModel::GetIcons(std::vector<SkBitmap>* icons) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); icons->push_back(*rb.GetBitmapNamed(IDR_BOOKMARK_MANAGER_RECENT_ICON)); |