diff options
author | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-12 15:16:36 +0000 |
---|---|---|
committer | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-12 15:16:36 +0000 |
commit | 7f1e52363a26ea88af22d7894d97d6581b4f2cdb (patch) | |
tree | f5a041ef55e2ad1aa5febf74b3d73085fed8d009 /chrome/browser | |
parent | e7480b637393aeecc29f6afde286994cfd4c90de (diff) | |
download | chromium_src-7f1e52363a26ea88af22d7894d97d6581b4f2cdb.zip chromium_src-7f1e52363a26ea88af22d7894d97d6581b4f2cdb.tar.gz chromium_src-7f1e52363a26ea88af22d7894d97d6581b4f2cdb.tar.bz2 |
Split RecentlyUsedFolderComboModel into its own module, so we can share it
Views and Gtk.
BUG=None
TEST=manually
Review URL: http://codereview.chromium.org/2673005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49633 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/bookmarks/recently_used_folders_combo_model.cc | 74 | ||||
-rw-r--r-- | chrome/browser/bookmarks/recently_used_folders_combo_model.h | 40 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_bubble_gtk.cc | 91 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_bubble_gtk.h | 10 | ||||
-rw-r--r-- | chrome/browser/views/bookmark_bubble_view.cc | 61 | ||||
-rw-r--r-- | chrome/browser/views/bookmark_bubble_view.h | 30 |
6 files changed, 147 insertions, 159 deletions
diff --git a/chrome/browser/bookmarks/recently_used_folders_combo_model.cc b/chrome/browser/bookmarks/recently_used_folders_combo_model.cc new file mode 100644 index 0000000..cd6bfc1 --- /dev/null +++ b/chrome/browser/bookmarks/recently_used_folders_combo_model.cc @@ -0,0 +1,74 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/bookmarks/recently_used_folders_combo_model.h" + +#include "app/l10n_util.h" +#include "chrome/browser/bookmarks/bookmark_utils.h" +#include "grit/generated_resources.h" + +namespace { + +// Max number of most recently used folders. +const size_t kMaxMRUFolders = 5; + +} // namespace + +RecentlyUsedFoldersComboModel::RecentlyUsedFoldersComboModel( + BookmarkModel* model, const BookmarkNode* node) + // Use + 2 to account for bookmark bar and other node. + : nodes_(bookmark_utils::GetMostRecentlyModifiedGroups( + model, kMaxMRUFolders + 2)), + node_parent_index_(0) { + // TODO(sky): bug 1173415 add a separator in the combobox here. + + // We special case the placement of these, so remove them from the list, then + // fix up the order. + RemoveNode(model->GetBookmarkBarNode()); + RemoveNode(model->other_node()); + RemoveNode(node->GetParent()); + + // Make the parent the first item, unless it's the bookmark bar or other node. + if (node->GetParent() != model->GetBookmarkBarNode() && + node->GetParent() != model->other_node()) { + nodes_.insert(nodes_.begin(), node->GetParent()); + } + + // Make sure we only have kMaxMRUFolders in the first chunk. + if (nodes_.size() > kMaxMRUFolders) + nodes_.erase(nodes_.begin() + kMaxMRUFolders, nodes_.end()); + + // And put the bookmark bar and other nodes at the end of the list. + nodes_.push_back(model->GetBookmarkBarNode()); + nodes_.push_back(model->other_node()); + + std::vector<const BookmarkNode*>::iterator it = std::find(nodes_.begin(), + nodes_.end(), + node->GetParent()); + node_parent_index_ = static_cast<int>(it - nodes_.begin()); +} + +int RecentlyUsedFoldersComboModel::GetItemCount() { + return static_cast<int>(nodes_.size() + 1); +} + +std::wstring RecentlyUsedFoldersComboModel::GetItemAt(int index) { + if (index == static_cast<int>(nodes_.size())) + return l10n_util::GetString(IDS_BOOMARK_BUBBLE_CHOOSER_ANOTHER_FOLDER); + return nodes_[index]->GetTitle(); +} + +const BookmarkNode* RecentlyUsedFoldersComboModel::GetNodeAt(int index) { + if (index < 0 || index >= static_cast<int>(nodes_.size())) + return NULL; + return nodes_[index]; +} + +void RecentlyUsedFoldersComboModel::RemoveNode(const BookmarkNode* node) { + std::vector<const BookmarkNode*>::iterator it = std::find(nodes_.begin(), + nodes_.end(), + node); + if (it != nodes_.end()) + nodes_.erase(it); +} diff --git a/chrome/browser/bookmarks/recently_used_folders_combo_model.h b/chrome/browser/bookmarks/recently_used_folders_combo_model.h new file mode 100644 index 0000000..2a8dac0 --- /dev/null +++ b/chrome/browser/bookmarks/recently_used_folders_combo_model.h @@ -0,0 +1,40 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_RECENTLY_FOLDERS_COMBO_MODEL_H_ +#define CHROME_BROWSER_RECENTLY_FOLDERS_COMBO_MODEL_H_ + +#include <vector> + +#include "app/combobox_model.h" +#include "chrome/browser/bookmarks/bookmark_model.h" + +// Model for the combobox showing the list of folders to choose from. The +// list always contains the bookmark bar, other node and parent. The list +// also contains an extra item that shows the text 'Choose another folder...'. +class RecentlyUsedFoldersComboModel : public ComboboxModel { + public: + RecentlyUsedFoldersComboModel(BookmarkModel* model, const BookmarkNode* node); + + // Overridden from ComboboxModel: + virtual int GetItemCount(); + virtual std::wstring GetItemAt(int index); + + // Returns the node at the specified index. + const BookmarkNode* GetNodeAt(int index); + + // Returns the index of the original parent folder. + int node_parent_index() const { return node_parent_index_; } + + private: + // Removes |node| from |nodes_|. Does nothing if |node| is not in |nodes_|. + void RemoveNode(const BookmarkNode* node); + + std::vector<const BookmarkNode*> nodes_; + int node_parent_index_; + + DISALLOW_COPY_AND_ASSIGN(RecentlyUsedFoldersComboModel); +}; + +#endif // CHROME_BROWSER_RECENTLY_FOLDERS_COMBO_MODEL_H_ diff --git a/chrome/browser/gtk/bookmark_bubble_gtk.cc b/chrome/browser/gtk/bookmark_bubble_gtk.cc index ec57adb..d573c84 100644 --- a/chrome/browser/gtk/bookmark_bubble_gtk.cc +++ b/chrome/browser/gtk/bookmark_bubble_gtk.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -15,6 +15,7 @@ #include "chrome/browser/bookmarks/bookmark_editor.h" #include "chrome/browser/bookmarks/bookmark_model.h" #include "chrome/browser/bookmarks/bookmark_utils.h" +#include "chrome/browser/bookmarks/recently_used_folders_combo_model.h" #include "chrome/browser/gtk/gtk_chrome_link_button.h" #include "chrome/browser/gtk/gtk_theme_provider.h" #include "chrome/browser/gtk/gtk_util.h" @@ -31,63 +32,9 @@ namespace { // keeps track of the currently open bubble, or NULL if none is open. BookmarkBubbleGtk* g_bubble = NULL; -// Max number of most recently used folders. -const size_t kMaxMRUFolders = 5; - // Padding between content and edge of info bubble. const int kContentBorder = 7; -std::vector<const BookmarkNode*> PopulateFolderCombo(BookmarkModel* model, - const GURL& url, - GtkWidget* folder_combo) { - const BookmarkNode* bookmark_bar = model->GetBookmarkBarNode(); - const BookmarkNode* other = model->other_node(); - const BookmarkNode* node = model->GetMostRecentlyAddedNodeForURL(url); - const BookmarkNode* parent = node ? node->GetParent() : NULL; - - // Use + 2 to account for bookmark bar and other node. - std::vector<const BookmarkNode*> recent_nodes = - bookmark_utils::GetMostRecentlyModifiedGroups(model, kMaxMRUFolders + 2); - - std::vector<const BookmarkNode*> nodes; - // Make the parent the first item, unless it's the bookmark bar or other node. - if (parent && parent != bookmark_bar && parent != other) - nodes.push_back(parent); - - for (size_t i = 0; i < recent_nodes.size(); ++i) { - if (recent_nodes[i] != parent && - recent_nodes[i] != bookmark_bar && - recent_nodes[i] != other) { - nodes.push_back(recent_nodes[i]); - } - // Make sure we only have kMaxMRUFolders in the first chunk. - if (nodes.size() == kMaxMRUFolders) - break; - } - - // And put the bookmark bar and other nodes at the end of the list. - nodes.push_back(bookmark_bar); - nodes.push_back(other); - - // We always have nodes + 1 entries in the combo. The last entry will be - // the 'Select another folder...' entry that opens the bookmark editor. - for (size_t i = 0; i < nodes.size(); ++i) { - gtk_combo_box_append_text(GTK_COMBO_BOX(folder_combo), - WideToUTF8(nodes[i]->GetTitle()).c_str()); - } - gtk_combo_box_append_text(GTK_COMBO_BOX(folder_combo), - l10n_util::GetStringUTF8( - IDS_BOOMARK_BUBBLE_CHOOSER_ANOTHER_FOLDER).c_str()); - - gint parent_index = 0; - if (parent) { - parent_index = static_cast<gint>( - std::find(nodes.begin(), nodes.end(), parent) - nodes.begin()); - } - gtk_combo_box_set_active(GTK_COMBO_BOX(folder_combo), parent_index); - - return nodes; -} } // namespace @@ -181,12 +128,8 @@ BookmarkBubbleGtk::BookmarkBubbleGtk(GtkWidget* anchor, gtk_box_pack_start(GTK_BOX(top), remove_button_, FALSE, FALSE, 0); - // TODO(deanm): We should show the bookmark bar folder along with the top - // other choices and an entry to go into the bookmark editor. Since we don't - // have the editor up yet on Linux, just show the bookmark bar for now. folder_combo_ = gtk_combo_box_new_text(); - folder_nodes_ = PopulateFolderCombo(profile_->GetBookmarkModel(), - url_, folder_combo_); + InitFolderComboModel(); // Create the edit entry for updating the bookmark name / title. name_entry_ = gtk_entry_new(); @@ -283,8 +226,8 @@ void BookmarkBubbleGtk::OnNameActivate(GtkWidget* widget) { } void BookmarkBubbleGtk::OnFolderChanged(GtkWidget* widget) { - size_t cur_folder = gtk_combo_box_get_active(GTK_COMBO_BOX(folder_combo_)); - if (cur_folder == folder_nodes_.size()) { + int index = gtk_combo_box_get_active(GTK_COMBO_BOX(folder_combo_)); + if (index == folder_combo_model_->GetItemCount() - 1) { UserMetrics::RecordAction( UserMetricsAction("BookmarkBubble_EditFromCombobox"), profile_); // GTK doesn't handle having the combo box destroyed from the changed @@ -346,11 +289,11 @@ void BookmarkBubbleGtk::ApplyEdits() { profile_); } - size_t cur_folder = gtk_combo_box_get_active(GTK_COMBO_BOX(folder_combo_)); + int index = gtk_combo_box_get_active(GTK_COMBO_BOX(folder_combo_)); - // Last index ('Choose another folder...') is not in folder_nodes_. - if (cur_folder < folder_nodes_.size()) { - const BookmarkNode* new_parent = folder_nodes_[cur_folder]; + // Last index means 'Choose another folder...' + if (index < folder_combo_model_->GetItemCount() - 1) { + const BookmarkNode* new_parent = folder_combo_model_->GetNodeAt(index); if (new_parent != node->GetParent()) { UserMetrics::RecordAction( UserMetricsAction("BookmarkBubble_ChangeParent"), profile_); @@ -392,3 +335,19 @@ void BookmarkBubbleGtk::ShowEditor() { BookmarkEditor::SHOW_TREE); } } + +void BookmarkBubbleGtk::InitFolderComboModel() { + folder_combo_model_.reset(new RecentlyUsedFoldersComboModel( + profile_->GetBookmarkModel(), + profile_->GetBookmarkModel()->GetMostRecentlyAddedNodeForURL(url_))); + + // We always have nodes + 1 entries in the combo. The last entry will be + // the 'Select another folder...' entry that opens the bookmark editor. + for (int i = 0; i < folder_combo_model_->GetItemCount(); ++i) { + gtk_combo_box_append_text(GTK_COMBO_BOX(folder_combo_), + WideToUTF8(folder_combo_model_->GetItemAt(i)).c_str()); + } + + gtk_combo_box_set_active(GTK_COMBO_BOX(folder_combo_), + folder_combo_model_->node_parent_index()); +} diff --git a/chrome/browser/gtk/bookmark_bubble_gtk.h b/chrome/browser/gtk/bookmark_bubble_gtk.h index 683457d..0ca7043 100644 --- a/chrome/browser/gtk/bookmark_bubble_gtk.h +++ b/chrome/browser/gtk/bookmark_bubble_gtk.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -19,6 +19,7 @@ #include "app/gtk_signal.h" #include "base/basictypes.h" +#include "base/scoped_ptr.h" #include "base/task.h" #include "chrome/browser/gtk/info_bubble_gtk.h" #include "chrome/common/notification_observer.h" @@ -27,6 +28,7 @@ class BookmarkNode; class Profile; +class RecentlyUsedFoldersComboModel; class BookmarkBubbleGtk : public InfoBubbleGtkDelegate, public NotificationObserver { @@ -74,6 +76,8 @@ class BookmarkBubbleGtk : public InfoBubbleGtkDelegate, // Return the UTF8 encoded title for the current |url_|. std::string GetTitle(); + void InitFolderComboModel(); + // The URL of the bookmark. GURL url_; // Our current profile (used to access the bookmark system). @@ -101,9 +105,7 @@ class BookmarkBubbleGtk : public InfoBubbleGtkDelegate, // The combo box for selecting the bookmark folder. GtkWidget* folder_combo_; - - // The bookmark nodes in |folder_combo_|. - std::vector<const BookmarkNode*> folder_nodes_; + scoped_ptr<RecentlyUsedFoldersComboModel> folder_combo_model_; InfoBubbleGtk* bubble_; diff --git a/chrome/browser/views/bookmark_bubble_view.cc b/chrome/browser/views/bookmark_bubble_view.cc index d0ba7e9..9cc5312b 100644 --- a/chrome/browser/views/bookmark_bubble_view.cc +++ b/chrome/browser/views/bookmark_bubble_view.cc @@ -45,9 +45,6 @@ static const int kTitlePadding = 4; // of the field's left edge. static const int kMinimumFieldSize = 180; -// Max number of most recently used folders. -static const size_t kMaxMRUFolders = 5; - // Bubble close image. static SkBitmap* kCloseImage = NULL; @@ -75,64 +72,6 @@ bool IsBookmarkBubbleViewShowing() { } // namespace browser -// RecentlyUsedFoldersModel --------------------------------------------------- - -BookmarkBubbleView::RecentlyUsedFoldersModel::RecentlyUsedFoldersModel( - BookmarkModel* bb_model, const BookmarkNode* node) - // Use + 2 to account for bookmark bar and other node. - : nodes_(bookmark_utils::GetMostRecentlyModifiedGroups( - bb_model, kMaxMRUFolders + 2)), - node_parent_index_(0) { - // TODO(sky): bug 1173415 add a separator in the combobox here. - - // We special case the placement of these, so remove them from the list, then - // fix up the order. - RemoveNode(bb_model->GetBookmarkBarNode()); - RemoveNode(bb_model->other_node()); - RemoveNode(node->GetParent()); - - // Make the parent the first item, unless it's the bookmark bar or other node. - if (node->GetParent() != bb_model->GetBookmarkBarNode() && - node->GetParent() != bb_model->other_node()) { - nodes_.insert(nodes_.begin(), node->GetParent()); - } - - // Make sure we only have kMaxMRUFolders in the first chunk. - if (nodes_.size() > kMaxMRUFolders) - nodes_.erase(nodes_.begin() + kMaxMRUFolders, nodes_.end()); - - // And put the bookmark bar and other nodes at the end of the list. - nodes_.push_back(bb_model->GetBookmarkBarNode()); - nodes_.push_back(bb_model->other_node()); - - node_parent_index_ = static_cast<int>( - find(nodes_.begin(), nodes_.end(), node->GetParent()) - nodes_.begin()); -} - -int BookmarkBubbleView::RecentlyUsedFoldersModel::GetItemCount() { - return static_cast<int>(nodes_.size() + 1); -} - -std::wstring BookmarkBubbleView::RecentlyUsedFoldersModel::GetItemAt( - int index) { - if (index == static_cast<int>(nodes_.size())) - return l10n_util::GetString(IDS_BOOMARK_BUBBLE_CHOOSER_ANOTHER_FOLDER); - return nodes_[index]->GetTitle(); -} - -const BookmarkNode* BookmarkBubbleView::RecentlyUsedFoldersModel::GetNodeAt( - int index) { - return nodes_[index]; -} - -void BookmarkBubbleView::RecentlyUsedFoldersModel::RemoveNode( - const BookmarkNode* node) { - std::vector<const BookmarkNode*>::iterator i = - find(nodes_.begin(), nodes_.end(), node); - if (i != nodes_.end()) - nodes_.erase(i); -} - // BookmarkBubbleView --------------------------------------------------------- BookmarkBubbleView* BookmarkBubbleView::bubble_ = NULL; diff --git a/chrome/browser/views/bookmark_bubble_view.h b/chrome/browser/views/bookmark_bubble_view.h index 1614ae2..c4c095b 100644 --- a/chrome/browser/views/bookmark_bubble_view.h +++ b/chrome/browser/views/bookmark_bubble_view.h @@ -8,6 +8,7 @@ #include <vector> #include "app/combobox_model.h" +#include "chrome/browser/bookmarks/recently_used_folders_combo_model.h" #include "chrome/browser/views/info_bubble.h" #include "gfx/rect.h" #include "googleurl/src/gurl.h" @@ -64,33 +65,6 @@ class BookmarkBubbleView : public views::View, virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); private: - // Model for the combobox showing the list of folders to choose from. The - // list always contains the bookmark bar, other node and parent. The list - // also contains an extra item that shows the text 'Choose another folder...'. - class RecentlyUsedFoldersModel : public ComboboxModel { - public: - RecentlyUsedFoldersModel(BookmarkModel* bb_model, const BookmarkNode* node); - - // Combobox::Model methods. Call through to nodes_. - virtual int GetItemCount(); - virtual std::wstring GetItemAt(int index); - - // Returns the node at the specified index. - const BookmarkNode* GetNodeAt(int index); - - // Returns the index of the original parent folder. - int node_parent_index() const { return node_parent_index_; } - - private: - // Removes node from nodes_. Does nothing if node is not in nodes_. - void RemoveNode(const BookmarkNode* node); - - std::vector<const BookmarkNode*> nodes_; - int node_parent_index_; - - DISALLOW_COPY_AND_ASSIGN(RecentlyUsedFoldersModel); - }; - // Creates a BookmarkBubbleView. // |title| is the title of the page. If newly_bookmarked is false, title is // ignored and the title of the bookmark is fetched from the database. @@ -158,7 +132,7 @@ class BookmarkBubbleView : public views::View, // If true, the page was just bookmarked. const bool newly_bookmarked_; - RecentlyUsedFoldersModel parent_model_; + RecentlyUsedFoldersComboModel parent_model_; // Link for removing/unstarring the bookmark. views::Link* remove_link_; |