summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authortfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-12 15:16:36 +0000
committertfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-12 15:16:36 +0000
commit7f1e52363a26ea88af22d7894d97d6581b4f2cdb (patch)
treef5a041ef55e2ad1aa5febf74b3d73085fed8d009 /chrome/browser
parente7480b637393aeecc29f6afde286994cfd4c90de (diff)
downloadchromium_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.cc74
-rw-r--r--chrome/browser/bookmarks/recently_used_folders_combo_model.h40
-rw-r--r--chrome/browser/gtk/bookmark_bubble_gtk.cc91
-rw-r--r--chrome/browser/gtk/bookmark_bubble_gtk.h10
-rw-r--r--chrome/browser/views/bookmark_bubble_view.cc61
-rw-r--r--chrome/browser/views/bookmark_bubble_view.h30
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_;