summaryrefslogtreecommitdiffstats
path: root/chrome/browser/bookmarks/bookmark_table_model.cc
diff options
context:
space:
mode:
authorsky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-03 23:14:01 +0000
committersky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-03 23:14:01 +0000
commit3ec1a3af311b95b325a3302679be1eb68e89e58e (patch)
tree61049c73993b824ce537cf62cea8acfb74cbf14a /chrome/browser/bookmarks/bookmark_table_model.cc
parent32f720c5a051885d45b79533522c06870e7037ff (diff)
downloadchromium_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.cc161
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);
}