diff options
author | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-03 23:14:01 +0000 |
---|---|---|
committer | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-03 23:14:01 +0000 |
commit | 3ec1a3af311b95b325a3302679be1eb68e89e58e (patch) | |
tree | 61049c73993b824ce537cf62cea8acfb74cbf14a /chrome/browser/bookmarks/bookmark_table_model.cc | |
parent | 32f720c5a051885d45b79533522c06870e7037ff (diff) | |
download | chromium_src-3ec1a3af311b95b325a3302679be1eb68e89e58e.zip chromium_src-3ec1a3af311b95b325a3302679be1eb68e89e58e.tar.gz chromium_src-3ec1a3af311b95b325a3302679be1eb68e89e58e.tar.bz2 |
Miscellaneous bookmark manager polish:
. Adds a menu button on the bookmark manager. If I finish up import
I'll add a second one for importing.
. Creating new page/folder from menu items selects new item in table.
. I changed around the FolderBookmarkTableModel to copy the contents
into a vector (now extends VectorBackedTabledModel). This is
necessitated by TableView not providing a moved notification. The
problem with previous approach is that I sent out ModelChanged on
any change, which loses selection and causes things to snap around.
I considered adding a moved method to TableView, but it's too much
work at this time.
. Added persisting of divider location in bookmark manager.
. When focus is on table pressing enter on a folder descends into the
folder, and pressing backspace goes back up a folder.
BUG=674
TEST=none
Review URL: http://codereview.chromium.org/8967
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4512 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/bookmarks/bookmark_table_model.cc')
-rw-r--r-- | chrome/browser/bookmarks/bookmark_table_model.cc | 161 |
1 files changed, 88 insertions, 73 deletions
diff --git a/chrome/browser/bookmarks/bookmark_table_model.cc b/chrome/browser/bookmarks/bookmark_table_model.cc index c55f6ff..a9122fa 100644 --- a/chrome/browser/bookmarks/bookmark_table_model.cc +++ b/chrome/browser/bookmarks/bookmark_table_model.cc @@ -20,22 +20,72 @@ namespace { // Number of bookmarks shown in recently bookmarked. const int kRecentlyBookmarkedCount = 50; -// FolderBookmarkTableModel ---------------------------------------------------- +// VectorBackedBookmarkTableModel ---------------------------------------------- -class FolderBookmarkTableModel : public BookmarkTableModel { +class VectorBackedBookmarkTableModel : public BookmarkTableModel { public: - FolderBookmarkTableModel(BookmarkModel* model, BookmarkNode* root_node) - : BookmarkTableModel(model), - root_node_(root_node) { + explicit VectorBackedBookmarkTableModel(BookmarkModel* model) + : BookmarkTableModel(model) { + } + + virtual BookmarkNode* GetNodeForRow(int row) { + return nodes_[row]; } virtual int RowCount() { - return root_node_ ? root_node_->GetChildCount() : 0; + return static_cast<int>(nodes_.size()); } - virtual BookmarkNode* GetNodeForRow(int row) { - DCHECK(root_node_); - return root_node_->GetChild(row); + virtual void BookmarkNodeMoved(BookmarkModel* model, + BookmarkNode* old_parent, + int old_index, + BookmarkNode* new_parent, + int new_index) { + NotifyObserverOfChange(new_parent->GetChild(new_index)); + } + + virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model, + BookmarkNode* node) { + NotifyObserverOfChange(node); + } + + virtual void BookmarkNodeChanged(BookmarkModel* model, + BookmarkNode* node) { + NotifyObserverOfChange(node); + } + + protected: + void NotifyObserverOfChange(BookmarkNode* node) { + if (!observer()) + return; + + int index = IndexOfNode(node); + if (index != -1) + observer()->OnItemsChanged(index, 1); + } + + typedef std::vector<BookmarkNode*> Nodes; + Nodes& nodes() { return nodes_; } + + private: + Nodes nodes_; + + DISALLOW_COPY_AND_ASSIGN(VectorBackedBookmarkTableModel); +}; + +// FolderBookmarkTableModel ---------------------------------------------------- + +// FolderBookmarkTableModel is a TableModel implementation backed by the +// contents of a bookmark folder. FolderBookmarkTableModel caches the contents +// of the folder so that it can send out the correct events when a bookmark +// node is moved. +class FolderBookmarkTableModel : public VectorBackedBookmarkTableModel { + public: + FolderBookmarkTableModel(BookmarkModel* model, BookmarkNode* root_node) + : VectorBackedBookmarkTableModel(model), + root_node_(root_node) { + for (int i = 0; i < root_node->GetChildCount(); ++i) + nodes().push_back(root_node->GetChild(i)); } virtual void BookmarkNodeMoved(BookmarkModel* model, @@ -43,15 +93,27 @@ class FolderBookmarkTableModel : public BookmarkTableModel { int old_index, BookmarkNode* new_parent, int new_index) { - if (observer() && (old_parent == root_node_ || new_parent == root_node_)) - observer()->OnModelChanged(); + if (old_parent == root_node_) { + nodes().erase(nodes().begin() + old_index); + if (observer()) + observer()->OnItemsRemoved(old_index, 1); + } + if (new_parent == root_node_) { + nodes().insert(nodes().begin() + new_index, + root_node_->GetChild(new_index)); + if (observer()) + observer()->OnItemsAdded(new_index, 1); + } } virtual void BookmarkNodeAdded(BookmarkModel* model, BookmarkNode* parent, int index) { - if (root_node_ == parent && observer()) - observer()->OnItemsAdded(index, 1); + if (root_node_ == parent) { + nodes().insert(nodes().begin() + index, parent->GetChild(index)); + if (observer()) + observer()->OnItemsAdded(index, 1); + } } virtual void BookmarkNodeRemoved(BookmarkModel* model, @@ -59,14 +121,18 @@ class FolderBookmarkTableModel : public BookmarkTableModel { int index, BookmarkNode* node) { if (root_node_->HasAncestor(node)) { - // We, our one of our ancestors was removed. + // We, or one of our ancestors was removed. root_node_ = NULL; + nodes().clear(); if (observer()) observer()->OnModelChanged(); return; } - if (root_node_ == parent && observer()) - observer()->OnItemsRemoved(index, 1); + if (root_node_ == parent) { + nodes().erase(nodes().begin() + index); + if (observer()) + observer()->OnItemsRemoved(index, 1); + } } virtual void BookmarkNodeChanged(BookmarkModel* model, @@ -92,57 +158,6 @@ class FolderBookmarkTableModel : public BookmarkTableModel { DISALLOW_COPY_AND_ASSIGN(FolderBookmarkTableModel); }; -// VectorBackedBookmarkTableModel ---------------------------------------------- - -class VectorBackedBookmarkTableModel : public BookmarkTableModel { - public: - explicit VectorBackedBookmarkTableModel(BookmarkModel* model) - : BookmarkTableModel(model) { - } - - virtual BookmarkNode* GetNodeForRow(int row) { - return nodes_[row]; - } - - virtual int RowCount() { - return static_cast<int>(nodes_.size()); - } - - virtual void BookmarkNodeMoved(BookmarkModel* model, - BookmarkNode* old_parent, - int old_index, - BookmarkNode* new_parent, - int new_index) { - NotifyObserverOfChange(new_parent->GetChild(new_index)); - } - - virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model, - BookmarkNode* node) { - NotifyObserverOfChange(node); - } - - virtual void BookmarkNodeChanged(BookmarkModel* model, - BookmarkNode* node) { - NotifyObserverOfChange(node); - } - - protected: - void NotifyObserverOfChange(BookmarkNode* node) { - if (!observer()) - return; - - int index = IndexOfNode(node); - if (index != -1) - observer()->OnItemsChanged(index, 1); - } - - typedef std::vector<BookmarkNode*> Nodes; - Nodes nodes_; - - private: - DISALLOW_COPY_AND_ASSIGN(VectorBackedBookmarkTableModel); -}; - // RecentlyBookmarkedTableModel ------------------------------------------------ class RecentlyBookmarkedTableModel : public VectorBackedBookmarkTableModel { @@ -169,8 +184,8 @@ class RecentlyBookmarkedTableModel : public VectorBackedBookmarkTableModel { private: void UpdateRecentlyBookmarked() { - nodes_.clear(); - model()->GetMostRecentlyAddedEntries(kRecentlyBookmarkedCount, &nodes_); + nodes().clear(); + model()->GetMostRecentlyAddedEntries(kRecentlyBookmarkedCount, &nodes()); if (observer()) observer()->OnModelChanged(); } @@ -190,7 +205,7 @@ class BookmarkSearchTableModel : public VectorBackedBookmarkTableModel { model->GetBookmarksMatchingText(search_text, std::numeric_limits<int>::max(), &matches); for (size_t i = 0; i < matches.size(); ++i) - nodes_.push_back(matches[i].node); + nodes().push_back(matches[i].node); } virtual void BookmarkNodeAdded(BookmarkModel* model, @@ -198,9 +213,9 @@ class BookmarkSearchTableModel : public VectorBackedBookmarkTableModel { int index) { BookmarkNode* node = parent->GetChild(index); if (model->DoesBookmarkMatchText(search_text_, node)) { - nodes_.push_back(node); + nodes().push_back(node); if (observer()) - observer()->OnItemsAdded(static_cast<int>(nodes_.size() - 1), 1); + observer()->OnItemsAdded(static_cast<int>(nodes().size() - 1), 1); } } @@ -212,7 +227,7 @@ class BookmarkSearchTableModel : public VectorBackedBookmarkTableModel { if (internal_index == -1) return; - nodes_.erase(nodes_.begin() + static_cast<int>(internal_index)); + nodes().erase(nodes().begin() + static_cast<int>(internal_index)); if (observer()) observer()->OnItemsRemoved(internal_index, 1); } |