summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/bookmarks/bookmark_context_menu_controller.cc530
-rw-r--r--chrome/browser/bookmarks/bookmark_context_menu_controller.h (renamed from chrome/browser/views/bookmark_context_menu.h)117
-rw-r--r--chrome/browser/views/bookmark_bar_view.cc8
-rw-r--r--chrome/browser/views/bookmark_context_menu.cc562
-rw-r--r--chrome/browser/views/bookmark_context_menu_test.cc42
-rw-r--r--chrome/browser/views/bookmark_context_menu_views.cc43
-rw-r--r--chrome/browser/views/bookmark_manager_view.cc31
-rw-r--r--chrome/browser/views/bookmark_manager_view.h2
-rw-r--r--chrome/browser/views/bookmark_menu_controller_views.cc5
9 files changed, 660 insertions, 680 deletions
diff --git a/chrome/browser/bookmarks/bookmark_context_menu_controller.cc b/chrome/browser/bookmarks/bookmark_context_menu_controller.cc
new file mode 100644
index 0000000..5065fc7
--- /dev/null
+++ b/chrome/browser/bookmarks/bookmark_context_menu_controller.cc
@@ -0,0 +1,530 @@
+// Copyright (c) 2009 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/views/bookmark_context_menu.h"
+
+#include "app/l10n_util.h"
+#include "base/compiler_specific.h"
+#include "chrome/browser/bookmarks/bookmark_editor.h"
+#include "chrome/browser/bookmarks/bookmark_manager.h"
+#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/bookmarks/bookmark_utils.h"
+#include "chrome/browser/input_window_dialog.h"
+#include "chrome/browser/metrics/user_metrics.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/tab_contents/page_navigator.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/pref_service.h"
+#include "grit/generated_resources.h"
+
+namespace {
+
+// Returns true if the specified node is of type URL, or has a descendant
+// of type URL.
+bool NodeHasURLs(const BookmarkNode* node) {
+ if (node->is_url())
+ return true;
+
+ for (int i = 0; i < node->GetChildCount(); ++i) {
+ if (NodeHasURLs(node->GetChild(i)))
+ return true;
+ }
+ return false;
+}
+
+// EditFolderController -------------------------------------------------------
+
+// EditFolderController manages the editing and/or creation of a folder. If the
+// user presses ok, the name change is committed to the model.
+//
+// EditFolderController deletes itself when the window is closed.
+class EditFolderController : public InputWindowDialog::Delegate,
+ public BookmarkModelObserver {
+ public:
+ virtual ~EditFolderController() {
+ if (model_)
+ model_->RemoveObserver(this);
+ }
+
+ static void Show(Profile* profile,
+ gfx::NativeView wnd,
+ const BookmarkNode* node,
+ bool is_new,
+ bool show_in_manager) {
+ // EditFolderController deletes itself when done.
+ EditFolderController* controller =
+ new EditFolderController(profile, wnd, node, is_new, show_in_manager);
+ controller->Show();
+ }
+
+ private:
+ EditFolderController(Profile* profile,
+ gfx::NativeView wnd,
+ const BookmarkNode* node,
+ bool is_new,
+ bool show_in_manager)
+ : profile_(profile),
+ model_(profile->GetBookmarkModel()),
+ node_(node),
+ is_new_(is_new),
+ show_in_manager_(show_in_manager) {
+ DCHECK(is_new_ || node);
+
+ std::wstring title = is_new_ ?
+ l10n_util::GetString(IDS_BOOMARK_FOLDER_EDITOR_WINDOW_TITLE_NEW) :
+ l10n_util::GetString(IDS_BOOMARK_FOLDER_EDITOR_WINDOW_TITLE);
+ std::wstring label =
+ l10n_util::GetString(IDS_BOOMARK_BAR_EDIT_FOLDER_LABEL);
+ std::wstring contents = is_new_ ?
+ l10n_util::GetString(IDS_BOOMARK_EDITOR_NEW_FOLDER_NAME) :
+ node_->GetTitle();
+
+ dialog_ = InputWindowDialog::Create(wnd, title, label, contents, this);
+ model_->AddObserver(this);
+ }
+
+ void Show() {
+ dialog_->Show();
+ }
+
+ // InputWindowDialog::Delegate methods.
+ virtual bool IsValid(const std::wstring& text) {
+ return !text.empty();
+ }
+
+ virtual void InputAccepted(const std::wstring& text) {
+ if (is_new_) {
+ ALLOW_UNUSED const BookmarkNode* node =
+ model_->AddGroup(node_, node_->GetChildCount(), text);
+ if (show_in_manager_) {
+ BookmarkManager::SelectInTree(profile_, node);
+ }
+ } else {
+ model_->SetTitle(node_, text);
+ }
+ }
+
+ virtual void InputCanceled() {
+ }
+
+ // BookmarkModelObserver methods, all invoke ModelChanged and close the
+ // dialog.
+ virtual void Loaded(BookmarkModel* model) {}
+ virtual void BookmarkModelBeingDeleted(BookmarkModel* model) {
+ model_->RemoveObserver(this);
+ model_ = NULL;
+ ModelChanged();
+ }
+
+ virtual void BookmarkNodeMoved(BookmarkModel* model,
+ const BookmarkNode* old_parent,
+ int old_index,
+ const BookmarkNode* new_parent,
+ int new_index) {
+ ModelChanged();
+ }
+
+ virtual void BookmarkNodeAdded(BookmarkModel* model,
+ const BookmarkNode* parent,
+ int index) {
+ ModelChanged();
+ }
+
+ virtual void BookmarkNodeRemoved(BookmarkModel* model,
+ const BookmarkNode* parent,
+ int index,
+ const BookmarkNode* node) {
+ ModelChanged();
+ }
+
+ virtual void BookmarkNodeChanged(BookmarkModel* model,
+ const BookmarkNode* node) {
+ ModelChanged();
+ }
+
+ virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model,
+ const BookmarkNode* node) {}
+
+ virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
+ const BookmarkNode* node) {
+ ModelChanged();
+ }
+
+ void ModelChanged() {
+ dialog_->Close();
+ }
+
+ Profile* profile_;
+ BookmarkModel* model_;
+ // If is_new is true, this is the parent to create the new node under.
+ // Otherwise this is the node to change the title of.
+ const BookmarkNode* node_;
+
+ bool is_new_;
+
+ // If is_new_ is true and a new node is created, it is selected in the
+ // bookmark manager.
+ bool show_in_manager_;
+ InputWindowDialog* dialog_;
+
+ DISALLOW_COPY_AND_ASSIGN(EditFolderController);
+};
+
+// SelectOnCreationHandler ----------------------------------------------------
+
+// Used when adding a new bookmark. If a new bookmark is created it is selected
+// in the bookmark manager.
+class SelectOnCreationHandler : public BookmarkEditor::Handler {
+ public:
+ explicit SelectOnCreationHandler(Profile* profile) : profile_(profile) {
+ }
+
+ virtual void NodeCreated(const BookmarkNode* new_node) {
+ BookmarkManager::SelectInTree(profile_, new_node);
+ }
+
+ private:
+ Profile* profile_;
+
+ DISALLOW_COPY_AND_ASSIGN(SelectOnCreationHandler);
+};
+
+} // namespace
+
+BookmarkContextMenuController::BookmarkContextMenuController(
+ gfx::NativeWindow parent_window,
+ BookmarkContextMenuControllerDelegate* delegate,
+ Profile* profile,
+ PageNavigator* navigator,
+ const BookmarkNode* parent,
+ const std::vector<const BookmarkNode*>& selection,
+ ConfigurationType configuration)
+ : parent_window_(parent_window),
+ delegate_(delegate),
+ profile_(profile),
+ navigator_(navigator),
+ parent_(parent),
+ selection_(selection),
+ configuration_(configuration),
+ model_(profile->GetBookmarkModel()) {
+ DCHECK(profile_);
+ DCHECK(model_->IsLoaded());
+ model_->AddObserver(this);
+}
+
+BookmarkContextMenuController::~BookmarkContextMenuController() {
+ if (model_)
+ model_->RemoveObserver(this);
+}
+
+void BookmarkContextMenuController::BuildMenu() {
+ if (configuration_ != BOOKMARK_MANAGER_ORGANIZE_MENU) {
+ if (selection_.size() == 1 && selection_[0]->is_url()) {
+ delegate_->AddItemWithStringId(IDS_BOOMARK_BAR_OPEN_ALL,
+ IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB);
+ delegate_->AddItemWithStringId(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW,
+ IDS_BOOMARK_BAR_OPEN_IN_NEW_WINDOW);
+ delegate_->AddItemWithStringId(IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO,
+ IDS_BOOMARK_BAR_OPEN_INCOGNITO);
+ } else {
+ delegate_->AddItem(IDS_BOOMARK_BAR_OPEN_ALL);
+ delegate_->AddItem(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW);
+ delegate_->AddItem(IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO);
+ }
+ delegate_->AddSeparator();
+ }
+
+ if (selection_.size() == 1 && selection_[0]->is_folder()) {
+ delegate_->AddItem(IDS_BOOKMARK_BAR_RENAME_FOLDER);
+ } else {
+ delegate_->AddItem(IDS_BOOKMARK_BAR_EDIT);
+ }
+ delegate_->AddItem(IDS_BOOKMARK_BAR_REMOVE);
+
+ if (configuration_ == BOOKMARK_MANAGER_TABLE ||
+ configuration_ == BOOKMARK_MANAGER_TABLE_OTHER ||
+ configuration_ == BOOKMARK_MANAGER_ORGANIZE_MENU ||
+ configuration_ == BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER) {
+ delegate_->AddItem(IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER);
+ }
+
+ if (configuration_ == BOOKMARK_MANAGER_TABLE ||
+ configuration_ == BOOKMARK_MANAGER_TABLE_OTHER ||
+ configuration_ == BOOKMARK_MANAGER_TREE ||
+ configuration_ == BOOKMARK_MANAGER_ORGANIZE_MENU ||
+ configuration_ == BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER) {
+ delegate_->AddSeparator();
+ delegate_->AddItem(IDS_CUT);
+ delegate_->AddItem(IDS_COPY);
+ delegate_->AddItem(IDS_PASTE);
+ }
+
+ if (configuration_ == BOOKMARK_MANAGER_ORGANIZE_MENU) {
+ delegate_->AddSeparator();
+ delegate_->AddItem(IDS_BOOKMARK_MANAGER_SORT);
+ }
+
+ delegate_->AddSeparator();
+
+ delegate_->AddItem(IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK);
+ delegate_->AddItem(IDS_BOOMARK_BAR_NEW_FOLDER);
+
+ if (configuration_ == BOOKMARK_BAR) {
+ delegate_->AddSeparator();
+ delegate_->AddItem(IDS_BOOKMARK_MANAGER);
+ delegate_->AddCheckboxItem(IDS_BOOMARK_BAR_ALWAYS_SHOW);
+ }
+}
+
+void BookmarkContextMenuController::ExecuteCommand(int id) {
+ switch (id) {
+ case IDS_BOOMARK_BAR_OPEN_ALL:
+ case IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO:
+ case IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW: {
+ WindowOpenDisposition initial_disposition;
+ if (id == IDS_BOOMARK_BAR_OPEN_ALL) {
+ initial_disposition = NEW_FOREGROUND_TAB;
+ UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_OpenAll",
+ profile_);
+ } else if (id == IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW) {
+ initial_disposition = NEW_WINDOW;
+ UserMetrics::RecordAction(
+ L"BookmarkBar_ContextMenu_OpenAllInNewWindow", profile_);
+ } else {
+ initial_disposition = OFF_THE_RECORD;
+ UserMetrics::RecordAction(
+ L"BookmarkBar_ContextMenu_OpenAllIncognito", profile_);
+ }
+ bookmark_utils::OpenAll(parent_window_, profile_, navigator_, selection_,
+ initial_disposition);
+ break;
+ }
+
+ case IDS_BOOKMARK_BAR_RENAME_FOLDER:
+ case IDS_BOOKMARK_BAR_EDIT:
+ UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_Edit", profile_);
+
+ if (selection_.size() != 1) {
+ NOTREACHED();
+ return;
+ }
+
+ if (selection_[0]->is_url()) {
+ BookmarkEditor::Configuration editor_config;
+ if (configuration_ == BOOKMARK_BAR)
+ editor_config = BookmarkEditor::SHOW_TREE;
+ else
+ editor_config = BookmarkEditor::NO_TREE;
+ BookmarkEditor::Show(parent_window_, profile_, NULL, selection_[0],
+ editor_config, NULL);
+ } else {
+ EditFolderController::Show(profile_, parent_window_, selection_[0],
+ false, false);
+ }
+ break;
+
+ case IDS_BOOKMARK_BAR_REMOVE: {
+ UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_Remove", profile_);
+ BookmarkModel* model = RemoveModelObserver();
+
+ for (size_t i = 0; i < selection_.size(); ++i) {
+ model->Remove(selection_[i]->GetParent(),
+ selection_[i]->GetParent()->IndexOfChild(selection_[i]));
+ }
+ selection_.clear();
+ break;
+ }
+
+ case IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK: {
+ UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_Add", profile_);
+
+ BookmarkEditor::Configuration editor_config;
+ BookmarkEditor::Handler* handler = NULL;
+ if (configuration_ == BOOKMARK_BAR) {
+ editor_config = BookmarkEditor::SHOW_TREE;
+ } else {
+ editor_config = BookmarkEditor::NO_TREE;
+ // This is owned by the BookmarkEditorView.
+ handler = new SelectOnCreationHandler(profile_);
+ }
+ BookmarkEditor::Show(parent_window_, profile_, GetParentForNewNodes(),
+ NULL, editor_config, handler);
+ break;
+ }
+
+ case IDS_BOOMARK_BAR_NEW_FOLDER: {
+ UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_NewFolder",
+ profile_);
+ EditFolderController::Show(profile_, parent_window_,
+ GetParentForNewNodes(), true,
+ configuration_ != BOOKMARK_BAR);
+ break;
+ }
+
+ case IDS_BOOMARK_BAR_ALWAYS_SHOW:
+ bookmark_utils::ToggleWhenVisible(profile_);
+ break;
+
+ case IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER:
+ UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_ShowInFolder",
+ profile_);
+
+ if (selection_.size() != 1) {
+ NOTREACHED();
+ return;
+ }
+
+ BookmarkManager::SelectInTree(profile_, selection_[0]);
+ break;
+
+ case IDS_BOOKMARK_MANAGER:
+ UserMetrics::RecordAction(L"ShowBookmarkManager", profile_);
+ BookmarkManager::Show(profile_);
+ break;
+
+ case IDS_BOOKMARK_MANAGER_SORT:
+ UserMetrics::RecordAction(L"BookmarkManager_Sort", profile_);
+ model_->SortChildren(parent_);
+ break;
+
+ case IDS_COPY:
+ case IDS_CUT:
+ bookmark_utils::CopyToClipboard(profile_->GetBookmarkModel(),
+ selection_, id == IDS_CUT);
+ break;
+
+ case IDS_PASTE: {
+ // Always paste to parent.
+ if (!parent_)
+ return;
+
+ int index = (selection_.size() == 1) ?
+ parent_->IndexOfChild(selection_[0]) : -1;
+ if (index != -1)
+ index++;
+ bookmark_utils::PasteFromClipboard(profile_->GetBookmarkModel(),
+ parent_, index);
+ break;
+ }
+
+ default:
+ NOTREACHED();
+ }
+}
+
+bool BookmarkContextMenuController::IsItemChecked(int id) const {
+ DCHECK(id == IDS_BOOMARK_BAR_ALWAYS_SHOW);
+ return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
+}
+
+bool BookmarkContextMenuController::IsCommandEnabled(int id) const {
+ bool is_root_node =
+ (selection_.size() == 1 &&
+ selection_[0]->GetParent() == model_->root_node());
+ switch (id) {
+ case IDS_BOOMARK_BAR_OPEN_INCOGNITO:
+ return !profile_->IsOffTheRecord();
+
+ case IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO:
+ return HasURLs() && !profile_->IsOffTheRecord();
+
+ case IDS_BOOMARK_BAR_OPEN_ALL:
+ case IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW:
+ return HasURLs();
+
+ case IDS_BOOKMARK_BAR_RENAME_FOLDER:
+ case IDS_BOOKMARK_BAR_EDIT:
+ return selection_.size() == 1 && !is_root_node;
+
+ case IDS_BOOKMARK_BAR_REMOVE:
+ return !selection_.empty() && !is_root_node;
+
+ case IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER:
+ return (configuration_ == BOOKMARK_MANAGER_TABLE_OTHER ||
+ configuration_ == BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER) &&
+ selection_.size() == 1;
+
+ case IDS_BOOKMARK_MANAGER_SORT:
+ return parent_ && parent_ != model_->root_node();
+
+ case IDS_BOOMARK_BAR_NEW_FOLDER:
+ case IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK:
+ return GetParentForNewNodes() != NULL;
+
+ case IDS_COPY:
+ case IDS_CUT:
+ return selection_.size() > 0 && !is_root_node;
+
+ case IDS_PASTE:
+ // Always paste to parent.
+ return bookmark_utils::CanPasteFromClipboard(parent_);
+ }
+ return true;
+}
+
+void BookmarkContextMenuController::BookmarkModelBeingDeleted(
+ BookmarkModel* model) {
+ ModelChanged();
+}
+
+void BookmarkContextMenuController::BookmarkNodeMoved(
+ BookmarkModel* model,
+ const BookmarkNode* old_parent,
+ int old_index,
+ const BookmarkNode* new_parent,
+ int new_index) {
+ ModelChanged();
+}
+
+void BookmarkContextMenuController::BookmarkNodeAdded(
+ BookmarkModel* model,
+ const BookmarkNode* parent,
+ int index) {
+ ModelChanged();
+}
+
+void BookmarkContextMenuController::BookmarkNodeRemoved(
+ BookmarkModel* model,
+ const BookmarkNode* parent,
+ int index,
+ const BookmarkNode* node) {
+ ModelChanged();
+}
+
+void BookmarkContextMenuController::BookmarkNodeChanged(
+ BookmarkModel* model,
+ const BookmarkNode* node) {
+ ModelChanged();
+}
+
+void BookmarkContextMenuController::BookmarkNodeChildrenReordered(
+ BookmarkModel* model,
+ const BookmarkNode* node) {
+ ModelChanged();
+}
+
+void BookmarkContextMenuController::ModelChanged() {
+ delegate_->CloseMenu();
+}
+
+BookmarkModel* BookmarkContextMenuController::RemoveModelObserver() {
+ BookmarkModel* model = model_;
+ model_->RemoveObserver(this);
+ model_ = NULL;
+ return model;
+}
+
+bool BookmarkContextMenuController::HasURLs() const {
+ for (size_t i = 0; i < selection_.size(); ++i) {
+ if (NodeHasURLs(selection_[i]))
+ return true;
+ }
+ return false;
+}
+
+const BookmarkNode*
+ BookmarkContextMenuController::GetParentForNewNodes() const {
+ return (selection_.size() == 1 && selection_[0]->is_folder()) ?
+ selection_[0] : parent_;
+}
diff --git a/chrome/browser/views/bookmark_context_menu.h b/chrome/browser/bookmarks/bookmark_context_menu_controller.h
index f9e6584..7fc529f 100644
--- a/chrome/browser/views/bookmark_context_menu.h
+++ b/chrome/browser/bookmarks/bookmark_context_menu_controller.h
@@ -2,37 +2,38 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_H_
-#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_H_
+#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_
+#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_
#include <vector>
#include "base/basictypes.h"
#include "base/gfx/native_widget_types.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
-
-// TODO(port): Port this file.
-#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
#include "views/controls/menu/chrome_menu.h"
-#elif defined(OS_LINUX)
-#include "chrome/browser/gtk/menu_gtk.h"
-#else
-#include "chrome/common/temp_scaffolding_stubs.h"
-#endif
class Browser;
class PageNavigator;
-// BookmarkContextMenu manages the context menu shown for the
-// bookmark bar, items on the bookmark bar, submenus of the bookmark bar and
-// the bookmark manager.
-class BookmarkContextMenu : public BookmarkModelObserver,
-#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
- public views::MenuDelegate
-#elif defined(OS_LINUX)
- public MenuGtk::Delegate
-#endif
-{
+// An interface implemented by an object that performs actions on the actual
+// menu for the controller.
+class BookmarkContextMenuControllerDelegate {
+ public:
+ virtual ~BookmarkContextMenuControllerDelegate() {}
+
+ // Closes the bookmark context menu.
+ virtual void CloseMenu() = 0;
+
+ // Methods that add items to the underlying menu.
+ virtual void AddItem(int command_id) = 0;
+ virtual void AddItemWithStringId(int command_id, int string_id) = 0;
+ virtual void AddSeparator() = 0;
+ virtual void AddCheckboxItem(int command_id) = 0;
+};
+
+// BookmarkContextMenuController creates and manages state for the context menu
+// shown for any bookmark item.
+class BookmarkContextMenuController : public BookmarkModelObserver {
public:
// Used to configure what the context menu shows.
enum ConfigurationType {
@@ -55,36 +56,28 @@ class BookmarkContextMenu : public BookmarkModelObserver,
// |parent| is the parent for newly created nodes if |selection| is empty.
// |selection| is the nodes the context menu operates on and may be empty.
// |configuration| determines which items to show.
- BookmarkContextMenu(gfx::NativeView hwnd,
- Profile* profile,
- Browser* browser,
- PageNavigator* navigator,
- const BookmarkNode* parent,
- const std::vector<const BookmarkNode*>& selection,
- ConfigurationType configuration);
- virtual ~BookmarkContextMenu();
-
-#if defined(TOOLKIT_VIEWS)
- // Shows the menu at the specified place.
- void RunMenuAt(int x, int y);
-
- // Returns the menu.
- views::MenuItemView* menu() const { return menu_.get(); }
-#elif defined(OS_LINUX)
- // Pops up this menu. This call doesn't block.
- void PopupAsContext(guint32 event_time);
-
- // Returns the menu.
- GtkWidget* menu() const { return menu_->widget(); }
-#endif
-
- // Menu::Delegate / MenuGtk::Delegate methods.
- virtual void ExecuteCommand(int id);
- virtual bool IsItemChecked(int id) const;
- virtual bool IsCommandEnabled(int id) const;
+ BookmarkContextMenuController(
+ gfx::NativeWindow parent_window,
+ BookmarkContextMenuControllerDelegate* delegate,
+ Profile* profile,
+ PageNavigator* navigator,
+ const BookmarkNode* parent,
+ const std::vector<const BookmarkNode*>& selection,
+ ConfigurationType configuration);
+ virtual ~BookmarkContextMenuController();
+
+ void BuildMenu();
+
+ void ExecuteCommand(int id);
+ bool IsItemChecked(int id) const;
+ bool IsCommandEnabled(int id) const;
+
+ // Accessors:
+ Profile* profile() const { return profile_; }
+ PageNavigator* navigator() const { return navigator_; }
private:
- // BookmarkModelObserver method. Any change to the model results in closing
+ // BookmarkModelObserver methods. Any change to the model results in closing
// the menu.
virtual void Loaded(BookmarkModel* model) {}
virtual void BookmarkModelBeingDeleted(BookmarkModel* model);
@@ -110,18 +103,6 @@ class BookmarkContextMenu : public BookmarkModelObserver,
// Invoked from the various bookmark model observer methods. Closes the menu.
void ModelChanged();
- // Builds the platform specific menu object.
- void CreateMenuObject();
-
- // Adds a IDS_* style command to the menu.
- void AppendItem(int id);
- // Adds a IDS_* style command to the menu with a different localized string.
- void AppendItem(int id, int localization_id);
- // Adds a separator to the menu.
- void AppendSeparator();
- // Adds a checkable item to the menu.
- void AppendCheckboxItem(int id);
-
// Removes the observer from the model and NULLs out model_.
BookmarkModel* RemoveModelObserver();
@@ -133,22 +114,16 @@ class BookmarkContextMenu : public BookmarkModelObserver,
// parent_ is returned.
const BookmarkNode* GetParentForNewNodes() const;
- gfx::NativeView wnd_;
+ gfx::NativeWindow parent_window_;
+ BookmarkContextMenuControllerDelegate* delegate_;
Profile* profile_;
- Browser* browser_;
PageNavigator* navigator_;
const BookmarkNode* parent_;
std::vector<const BookmarkNode*> selection_;
- BookmarkModel* model_;
ConfigurationType configuration_;
+ BookmarkModel* model_;
-#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
- scoped_ptr<views::MenuItemView> menu_;
-#elif defined(OS_LINUX)
- scoped_ptr<MenuGtk> menu_;
-#endif
-
- DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenu);
+ DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenuController);
};
-#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_H_
+#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_
diff --git a/chrome/browser/views/bookmark_bar_view.cc b/chrome/browser/views/bookmark_bar_view.cc
index 459e4c2..a9ca39b 100644
--- a/chrome/browser/views/bookmark_bar_view.cc
+++ b/chrome/browser/views/bookmark_bar_view.cc
@@ -1236,11 +1236,11 @@ void BookmarkBarView::ShowContextMenu(View* source,
parent = model_->GetBookmarkBarNode();
nodes.push_back(parent);
}
- BookmarkContextMenu controller(GetWidget()->GetNativeView(),
- GetProfile(), browser(), GetPageNavigator(),
+ BookmarkContextMenu controller(GetWidget()->GetNativeView(), GetProfile(),
+ browser()->GetSelectedTabContents(),
parent, nodes,
- BookmarkContextMenu::BOOKMARK_BAR);
- controller.RunMenuAt(x, y);
+ BookmarkContextMenuController::BOOKMARK_BAR);
+ controller.RunMenuAt(gfx::Point(x, y));
}
views::View* BookmarkBarView::CreateBookmarkButton(const BookmarkNode* node) {
diff --git a/chrome/browser/views/bookmark_context_menu.cc b/chrome/browser/views/bookmark_context_menu.cc
index 9d9ca29..65fc854 100644
--- a/chrome/browser/views/bookmark_context_menu.cc
+++ b/chrome/browser/views/bookmark_context_menu.cc
@@ -5,554 +5,72 @@
#include "chrome/browser/views/bookmark_context_menu.h"
#include "app/l10n_util.h"
-#include "base/compiler_specific.h"
-#include "chrome/browser/bookmarks/bookmark_editor.h"
-#include "chrome/browser/bookmarks/bookmark_manager.h"
-#include "chrome/browser/bookmarks/bookmark_model.h"
-#include "chrome/browser/bookmarks/bookmark_utils.h"
-#include "chrome/browser/browser.h"
-#include "chrome/browser/browser_list.h"
-#include "chrome/browser/input_window_dialog.h"
-#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/profile.h"
-#include "chrome/browser/tab_contents/page_navigator.h"
-#include "chrome/browser/tab_contents/tab_contents.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/common/pref_service.h"
#include "grit/generated_resources.h"
-// TODO(port): Port these files.
-#if defined(OS_WIN)
-#include "views/window/window.h"
-#endif
-
-namespace {
-
-// Returns true if the specified node is of type URL, or has a descendant
-// of type URL.
-bool NodeHasURLs(const BookmarkNode* node) {
- if (node->is_url())
- return true;
-
- for (int i = 0; i < node->GetChildCount(); ++i) {
- if (NodeHasURLs(node->GetChild(i)))
- return true;
- }
- return false;
-}
-
-// EditFolderController -------------------------------------------------------
-
-// EditFolderController manages the editing and/or creation of a folder. If the
-// user presses ok, the name change is committed to the model.
-//
-// EditFolderController deletes itself when the window is closed.
-class EditFolderController : public InputWindowDialog::Delegate,
- public BookmarkModelObserver {
- public:
- virtual ~EditFolderController() {
- if (model_)
- model_->RemoveObserver(this);
- }
-
- static void Show(Profile* profile,
- gfx::NativeView wnd,
- const BookmarkNode* node,
- bool is_new,
- bool show_in_manager) {
- // EditFolderController deletes itself when done.
- EditFolderController* controller =
- new EditFolderController(profile, wnd, node, is_new, show_in_manager);
- controller->Show();
- }
-
- private:
- EditFolderController(Profile* profile,
- gfx::NativeView wnd,
- const BookmarkNode* node,
- bool is_new,
- bool show_in_manager)
- : profile_(profile),
- model_(profile->GetBookmarkModel()),
- node_(node),
- is_new_(is_new),
- show_in_manager_(show_in_manager) {
- DCHECK(is_new_ || node);
-
- std::wstring title = is_new_ ?
- l10n_util::GetString(IDS_BOOMARK_FOLDER_EDITOR_WINDOW_TITLE_NEW) :
- l10n_util::GetString(IDS_BOOMARK_FOLDER_EDITOR_WINDOW_TITLE);
- std::wstring label =
- l10n_util::GetString(IDS_BOOMARK_BAR_EDIT_FOLDER_LABEL);
- std::wstring contents = is_new_ ?
- l10n_util::GetString(IDS_BOOMARK_EDITOR_NEW_FOLDER_NAME) :
- node_->GetTitle();
-
- dialog_ = InputWindowDialog::Create(wnd, title, label, contents, this);
- model_->AddObserver(this);
- }
-
- void Show() {
- dialog_->Show();
- }
-
- // InputWindowDialog::Delegate methods.
- virtual bool IsValid(const std::wstring& text) {
- return !text.empty();
- }
-
- virtual void InputAccepted(const std::wstring& text) {
- if (is_new_) {
- ALLOW_UNUSED const BookmarkNode* node =
- model_->AddGroup(node_, node_->GetChildCount(), text);
- if (show_in_manager_) {
-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS))
- BookmarkManager::SelectInTree(profile_, node);
-#else
- NOTIMPLEMENTED() << "BookmarkManager not yet implemented";
-#endif
- }
- } else {
- model_->SetTitle(node_, text);
- }
- }
-
- virtual void InputCanceled() {
- }
-
- // BookmarkModelObserver methods, all invoke ModelChanged and close the
- // dialog.
- virtual void Loaded(BookmarkModel* model) {}
- virtual void BookmarkModelBeingDeleted(BookmarkModel* model) {
- model_->RemoveObserver(this);
- model_ = NULL;
- ModelChanged();
- }
-
- virtual void BookmarkNodeMoved(BookmarkModel* model,
- const BookmarkNode* old_parent,
- int old_index,
- const BookmarkNode* new_parent,
- int new_index) {
- ModelChanged();
- }
-
- virtual void BookmarkNodeAdded(BookmarkModel* model,
- const BookmarkNode* parent,
- int index) {
- ModelChanged();
- }
-
- virtual void BookmarkNodeRemoved(BookmarkModel* model,
- const BookmarkNode* parent,
- int index,
- const BookmarkNode* node) {
- ModelChanged();
- }
-
- virtual void BookmarkNodeChanged(BookmarkModel* model,
- const BookmarkNode* node) {
- ModelChanged();
- }
-
- virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model,
- const BookmarkNode* node) {}
-
- virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
- const BookmarkNode* node) {
- ModelChanged();
- }
-
- void ModelChanged() {
- dialog_->Close();
- }
-
- Profile* profile_;
- BookmarkModel* model_;
- // If is_new is true, this is the parent to create the new node under.
- // Otherwise this is the node to change the title of.
- const BookmarkNode* node_;
-
- bool is_new_;
-
- // If is_new_ is true and a new node is created, it is selected in the
- // bookmark manager.
- bool show_in_manager_;
- InputWindowDialog* dialog_;
-
- DISALLOW_COPY_AND_ASSIGN(EditFolderController);
-};
-
-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS))
-// SelectOnCreationHandler ----------------------------------------------------
-
-// Used when adding a new bookmark. If a new bookmark is created it is selected
-// in the bookmark manager.
-class SelectOnCreationHandler : public BookmarkEditor::Handler {
- public:
- explicit SelectOnCreationHandler(Profile* profile) : profile_(profile) {
- }
-
- virtual void NodeCreated(const BookmarkNode* new_node) {
- BookmarkManager::SelectInTree(profile_, new_node);
- }
-
- private:
- Profile* profile_;
-
- DISALLOW_COPY_AND_ASSIGN(SelectOnCreationHandler);
-};
-#endif // #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS))
-
-} // namespace
-
-// BookmarkContextMenu -------------------------------------------
+////////////////////////////////////////////////////////////////////////////////
+// BookmarkContextMenu, public:
BookmarkContextMenu::BookmarkContextMenu(
- gfx::NativeView wnd,
+ gfx::NativeView parent_window,
Profile* profile,
- Browser* browser,
- PageNavigator* navigator,
+ PageNavigator* page_navigator,
const BookmarkNode* parent,
const std::vector<const BookmarkNode*>& selection,
- ConfigurationType configuration)
- : wnd_(wnd),
- profile_(profile),
- browser_(browser),
- navigator_(navigator),
- parent_(parent),
- selection_(selection),
- model_(profile->GetBookmarkModel()),
- configuration_(configuration) {
- DCHECK(profile_);
- DCHECK(model_->IsLoaded());
- CreateMenuObject();
-
- if (configuration != BOOKMARK_MANAGER_ORGANIZE_MENU) {
- if (selection.size() == 1 && selection[0]->is_url()) {
- AppendItem(IDS_BOOMARK_BAR_OPEN_ALL, IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB);
- AppendItem(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW,
- IDS_BOOMARK_BAR_OPEN_IN_NEW_WINDOW);
- AppendItem(IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO,
- IDS_BOOMARK_BAR_OPEN_INCOGNITO);
- } else {
- AppendItem(IDS_BOOMARK_BAR_OPEN_ALL, IDS_BOOMARK_BAR_OPEN_ALL);
- AppendItem(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW,
- IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW);
- AppendItem(IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO,
- IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO);
- }
- AppendSeparator();
- }
-
- if (selection.size() == 1 && selection[0]->is_folder()) {
- AppendItem(IDS_BOOKMARK_BAR_RENAME_FOLDER);
- } else {
- AppendItem(IDS_BOOKMARK_BAR_EDIT);
- }
- AppendItem(IDS_BOOKMARK_BAR_REMOVE);
-
- if (configuration == BOOKMARK_MANAGER_TABLE ||
- configuration == BOOKMARK_MANAGER_TABLE_OTHER ||
- configuration == BOOKMARK_MANAGER_ORGANIZE_MENU ||
- configuration == BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER) {
- AppendItem(IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER);
- }
-
- if (configuration == BOOKMARK_MANAGER_TABLE ||
- configuration == BOOKMARK_MANAGER_TABLE_OTHER ||
- configuration == BOOKMARK_MANAGER_TREE ||
- configuration == BOOKMARK_MANAGER_ORGANIZE_MENU ||
- configuration == BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER) {
- AppendSeparator();
- AppendItem(IDS_CUT);
- AppendItem(IDS_COPY);
- AppendItem(IDS_PASTE);
- }
-
- if (configuration == BOOKMARK_MANAGER_ORGANIZE_MENU) {
- AppendSeparator();
- AppendItem(IDS_BOOKMARK_MANAGER_SORT);
- }
-
- AppendSeparator();
-
- AppendItem(IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK);
- AppendItem(IDS_BOOMARK_BAR_NEW_FOLDER);
-
- if (configuration == BOOKMARK_BAR) {
- AppendSeparator();
- AppendItem(IDS_BOOKMARK_MANAGER);
- AppendCheckboxItem(IDS_BOOMARK_BAR_ALWAYS_SHOW);
- }
-
- model_->AddObserver(this);
-}
-
-BookmarkContextMenu::~BookmarkContextMenu() {
- if (model_)
- model_->RemoveObserver(this);
-}
-
-void BookmarkContextMenu::ExecuteCommand(int id) {
- switch (id) {
- case IDS_BOOMARK_BAR_OPEN_ALL:
- case IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO:
- case IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW: {
- PageNavigator* navigator = browser_ ?
- browser_->GetSelectedTabContents() : navigator_;
- WindowOpenDisposition initial_disposition;
- if (id == IDS_BOOMARK_BAR_OPEN_ALL) {
- initial_disposition = NEW_FOREGROUND_TAB;
- UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_OpenAll",
- profile_);
- } else if (id == IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW) {
- initial_disposition = NEW_WINDOW;
- UserMetrics::RecordAction(
- L"BookmarkBar_ContextMenu_OpenAllInNewWindow", profile_);
- } else {
- initial_disposition = OFF_THE_RECORD;
- UserMetrics::RecordAction(
- L"BookmarkBar_ContextMenu_OpenAllIncognito", profile_);
- }
-
- bookmark_utils::OpenAll(wnd_, profile_, navigator, selection_,
- initial_disposition);
- break;
- }
-
- case IDS_BOOKMARK_BAR_RENAME_FOLDER:
- case IDS_BOOKMARK_BAR_EDIT:
- UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_Edit", profile_);
-
- if (selection_.size() != 1) {
- NOTREACHED();
- return;
- }
-
- if (selection_[0]->is_url()) {
-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS))
- BookmarkEditor::Configuration editor_config;
- if (configuration_ == BOOKMARK_BAR)
- editor_config = BookmarkEditor::SHOW_TREE;
- else
- editor_config = BookmarkEditor::NO_TREE;
- BookmarkEditor::Show(wnd_, profile_, NULL, selection_[0],
- editor_config, NULL);
-#else
- NOTIMPLEMENTED();
-#endif
- } else {
- EditFolderController::Show(profile_, wnd_, selection_[0], false,
- false);
- }
- break;
-
- case IDS_BOOKMARK_BAR_REMOVE: {
- UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_Remove", profile_);
- BookmarkModel* model = RemoveModelObserver();
-
- for (size_t i = 0; i < selection_.size(); ++i) {
- model->Remove(selection_[i]->GetParent(),
- selection_[i]->GetParent()->IndexOfChild(selection_[i]));
- }
- selection_.clear();
- break;
- }
-
- case IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK: {
- UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_Add", profile_);
-
-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS))
- BookmarkEditor::Configuration editor_config;
- BookmarkEditor::Handler* handler = NULL;
- if (configuration_ == BOOKMARK_BAR) {
- editor_config = BookmarkEditor::SHOW_TREE;
- } else {
- editor_config = BookmarkEditor::NO_TREE;
- // This is owned by the BookmarkEditorView.
- handler = new SelectOnCreationHandler(profile_);
- }
- BookmarkEditor::Show(wnd_, profile_, GetParentForNewNodes(), NULL,
- editor_config, handler);
-#else
- NOTIMPLEMENTED();
-#endif
- break;
- }
-
- case IDS_BOOMARK_BAR_NEW_FOLDER: {
- UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_NewFolder",
- profile_);
- EditFolderController::Show(profile_, wnd_, GetParentForNewNodes(),
- true, (configuration_ != BOOKMARK_BAR));
- break;
- }
-
- case IDS_BOOMARK_BAR_ALWAYS_SHOW:
- bookmark_utils::ToggleWhenVisible(profile_);
- break;
-
- case IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER:
- UserMetrics::RecordAction(L"BookmarkBar_ContextMenu_ShowInFolder",
- profile_);
-
- if (selection_.size() != 1) {
- NOTREACHED();
- return;
- }
-
-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS))
- BookmarkManager::SelectInTree(profile_, selection_[0]);
-#else
- NOTIMPLEMENTED() << "Bookmark Manager not implemented";
-#endif
- break;
-
- case IDS_BOOKMARK_MANAGER:
- UserMetrics::RecordAction(L"ShowBookmarkManager", profile_);
-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS))
- BookmarkManager::Show(profile_);
-#else
- NOTIMPLEMENTED() << "Bookmark Manager not implemented";
-#endif
- break;
-
- case IDS_BOOKMARK_MANAGER_SORT:
- UserMetrics::RecordAction(L"BookmarkManager_Sort", profile_);
- model_->SortChildren(parent_);
- break;
-
- case IDS_COPY:
- case IDS_CUT:
- bookmark_utils::CopyToClipboard(profile_->GetBookmarkModel(),
- selection_, id == IDS_CUT);
- break;
-
- case IDS_PASTE: {
- // Always paste to parent.
- if (!parent_)
- return;
-
- int index = (selection_.size() == 1) ?
- parent_->IndexOfChild(selection_[0]) : -1;
- if (index != -1)
- index++;
- bookmark_utils::PasteFromClipboard(profile_->GetBookmarkModel(),
- parent_, index);
- break;
- }
-
- default:
- NOTREACHED();
- }
+ BookmarkContextMenuController::ConfigurationType configuration)
+ : controller_(new BookmarkContextMenuController(parent_window, this,
+ profile, page_navigator,
+ parent, selection,
+ configuration)),
+ parent_window_(parent_window),
+ menu_(new views::MenuItemView(this)) {
+ controller_->BuildMenu();
}
-bool BookmarkContextMenu::IsItemChecked(int id) const {
- DCHECK(id == IDS_BOOMARK_BAR_ALWAYS_SHOW);
- return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
-}
-
-bool BookmarkContextMenu::IsCommandEnabled(int id) const {
- bool is_root_node =
- (selection_.size() == 1 &&
- selection_[0]->GetParent() == model_->root_node());
- switch (id) {
- case IDS_BOOMARK_BAR_OPEN_INCOGNITO:
- return !profile_->IsOffTheRecord();
-
- case IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO:
- return HasURLs() && !profile_->IsOffTheRecord();
-
- case IDS_BOOMARK_BAR_OPEN_ALL:
- case IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW:
- return HasURLs();
-
- case IDS_BOOKMARK_BAR_RENAME_FOLDER:
- case IDS_BOOKMARK_BAR_EDIT:
- return selection_.size() == 1 && !is_root_node;
-
- case IDS_BOOKMARK_BAR_REMOVE:
- return !selection_.empty() && !is_root_node;
-
- case IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER:
- return (configuration_ == BOOKMARK_MANAGER_TABLE_OTHER ||
- configuration_ == BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER) &&
- selection_.size() == 1;
-
- case IDS_BOOKMARK_MANAGER_SORT:
- return parent_ && parent_ != model_->root_node();
-
- case IDS_BOOMARK_BAR_NEW_FOLDER:
- case IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK:
- return GetParentForNewNodes() != NULL;
-
- case IDS_COPY:
- case IDS_CUT:
- return selection_.size() > 0 && !is_root_node;
-
- case IDS_PASTE:
- // Always paste to parent.
- return bookmark_utils::CanPasteFromClipboard(parent_);
- }
- return true;
+void BookmarkContextMenu::RunMenuAt(const gfx::Point& point) {
+ // width/height don't matter here.
+ views::MenuItemView::AnchorPosition anchor =
+ (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) ?
+ views::MenuItemView::TOPRIGHT : views::MenuItemView::TOPLEFT;
+ menu_->RunMenuAt(parent_window_, gfx::Rect(point.x(), point.y(), 0, 0),
+ anchor, true);
}
-void BookmarkContextMenu::BookmarkModelBeingDeleted(BookmarkModel* model) {
- ModelChanged();
-}
+////////////////////////////////////////////////////////////////////////////////
+// BookmarkContextMenu, views::MenuDelegate implementation:
-void BookmarkContextMenu::BookmarkNodeMoved(BookmarkModel* model,
- const BookmarkNode* old_parent,
- int old_index,
- const BookmarkNode* new_parent,
- int new_index) {
- ModelChanged();
+void BookmarkContextMenu::ExecuteCommand(int command_id) {
+ controller_->ExecuteCommand(command_id);
}
-void BookmarkContextMenu::BookmarkNodeAdded(BookmarkModel* model,
- const BookmarkNode* parent,
- int index) {
- ModelChanged();
+bool BookmarkContextMenu::IsItemChecked(int command_id) const {
+ return controller_->IsItemChecked(command_id);
}
-void BookmarkContextMenu::BookmarkNodeRemoved(BookmarkModel* model,
- const BookmarkNode* parent,
- int index,
- const BookmarkNode* node) {
- ModelChanged();
+bool BookmarkContextMenu::IsCommandEnabled(int command_id) const {
+ return controller_->IsCommandEnabled(command_id);
}
-void BookmarkContextMenu::BookmarkNodeChanged(BookmarkModel* model,
- const BookmarkNode* node) {
- ModelChanged();
-}
+////////////////////////////////////////////////////////////////////////////////
+// BookmarkContextMenu, BookmarkContextMenuControllerDelegate implementation:
-void BookmarkContextMenu::BookmarkNodeChildrenReordered(
- BookmarkModel* model, const BookmarkNode* node) {
- ModelChanged();
+void BookmarkContextMenu::CloseMenu() {
+ menu_->Cancel();
}
-void BookmarkContextMenu::ModelChanged() {
- menu_->Cancel();
+void BookmarkContextMenu::AddItem(int command_id) {
+ menu_->AppendMenuItemWithLabel(command_id, l10n_util::GetString(command_id));
}
-BookmarkModel* BookmarkContextMenu::RemoveModelObserver() {
- BookmarkModel* model = model_;
- model_->RemoveObserver(this);
- model_ = NULL;
- return model;
+void BookmarkContextMenu::AddItemWithStringId(int command_id, int string_id) {
+ menu_->AppendMenuItemWithLabel(command_id, l10n_util::GetString(string_id));
}
-bool BookmarkContextMenu::HasURLs() const {
- for (size_t i = 0; i < selection_.size(); ++i) {
- if (NodeHasURLs(selection_[i]))
- return true;
- }
- return false;
+void BookmarkContextMenu::AddSeparator() {
+ menu_->AppendSeparator();
}
-const BookmarkNode* BookmarkContextMenu::GetParentForNewNodes() const {
- return (selection_.size() == 1 && selection_[0]->is_folder()) ?
- selection_[0] : parent_;
+void BookmarkContextMenu::AddCheckboxItem(int command_id) {
+ menu_->AppendMenuItem(command_id, l10n_util::GetString(command_id),
+ views::MenuItemView::CHECKBOX);
}
diff --git a/chrome/browser/views/bookmark_context_menu_test.cc b/chrome/browser/views/bookmark_context_menu_test.cc
index 217764c..97e222f 100644
--- a/chrome/browser/views/bookmark_context_menu_test.cc
+++ b/chrome/browser/views/bookmark_context_menu_test.cc
@@ -104,8 +104,8 @@ TEST_F(BookmarkContextMenuTest, DeleteURL) {
std::vector<const BookmarkNode*> nodes;
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0));
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0]->GetParent(), nodes,
- BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes,
+ BookmarkContextMenuController::BOOKMARK_BAR);
GURL url = model_->GetBookmarkBarNode()->GetChild(0)->GetURL();
ASSERT_TRUE(controller.IsCommandEnabled(IDS_BOOKMARK_BAR_REMOVE));
// Delete the URL.
@@ -130,8 +130,9 @@ TEST_F(BookmarkContextMenuTest, OpenAll) {
// Tests the enabled state of the menus when supplied an empty vector.
TEST_F(BookmarkContextMenuTest, EmptyNodes) {
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, model_->other_node(),
- std::vector<const BookmarkNode*>(), BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, model_->other_node(),
+ std::vector<const BookmarkNode*>(),
+ BookmarkContextMenuController::BOOKMARK_BAR);
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL));
EXPECT_FALSE(
controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW));
@@ -151,8 +152,8 @@ TEST_F(BookmarkContextMenuTest, SingleURL) {
std::vector<const BookmarkNode*> nodes;
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0));
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0]->GetParent(),
- nodes, BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0]->GetParent(),
+ nodes, BookmarkContextMenuController::BOOKMARK_BAR);
EXPECT_TRUE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL));
EXPECT_TRUE(
controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW));
@@ -173,8 +174,8 @@ TEST_F(BookmarkContextMenuTest, MultipleURLs) {
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0));
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(1)->GetChild(0));
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0]->GetParent(),
- nodes, BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0]->GetParent(),
+ nodes, BookmarkContextMenuController::BOOKMARK_BAR);
EXPECT_TRUE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL));
EXPECT_TRUE(
controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW));
@@ -194,8 +195,8 @@ TEST_F(BookmarkContextMenuTest, SingleFolder) {
std::vector<const BookmarkNode*> nodes;
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(2));
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0]->GetParent(),
- nodes, BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0]->GetParent(),
+ nodes, BookmarkContextMenuController::BOOKMARK_BAR);
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL));
EXPECT_FALSE(
controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW));
@@ -216,8 +217,8 @@ TEST_F(BookmarkContextMenuTest, MultipleEmptyFolders) {
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(2));
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(3));
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0]->GetParent(),
- nodes, BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0]->GetParent(),
+ nodes, BookmarkContextMenuController::BOOKMARK_BAR);
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL));
EXPECT_FALSE(
controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW));
@@ -238,8 +239,8 @@ TEST_F(BookmarkContextMenuTest, MultipleFoldersWithURLs) {
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(3));
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(4));
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0]->GetParent(),
- nodes, BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0]->GetParent(),
+ nodes, BookmarkContextMenuController::BOOKMARK_BAR);
EXPECT_TRUE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL));
EXPECT_TRUE(
controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW));
@@ -258,8 +259,8 @@ TEST_F(BookmarkContextMenuTest, DisableIncognito) {
std::vector<const BookmarkNode*> nodes;
nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0));
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0]->GetParent(),
- nodes, BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0]->GetParent(),
+ nodes, BookmarkContextMenuController::BOOKMARK_BAR);
profile_->set_off_the_record(true);
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_INCOGNITO));
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO));
@@ -270,8 +271,8 @@ TEST_F(BookmarkContextMenuTest, DisabledItemsWithOtherNode) {
std::vector<const BookmarkNode*> nodes;
nodes.push_back(model_->other_node());
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, nodes[0], nodes,
- BookmarkContextMenu::BOOKMARK_BAR);
+ NULL, profile_.get(), NULL, nodes[0], nodes,
+ BookmarkContextMenuController::BOOKMARK_BAR);
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOKMARK_BAR_EDIT));
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOKMARK_BAR_REMOVE));
}
@@ -280,9 +281,8 @@ TEST_F(BookmarkContextMenuTest, DisabledItemsWithOtherNode) {
// parent.
TEST_F(BookmarkContextMenuTest, EmptyNodesNullParent) {
BookmarkContextMenu controller(
- NULL, profile_.get(), NULL, NULL, NULL,
- std::vector<const BookmarkNode*>(),
- BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU);
+ NULL, profile_.get(), NULL, NULL, std::vector<const BookmarkNode*>(),
+ BookmarkContextMenuController::BOOKMARK_MANAGER_ORGANIZE_MENU);
EXPECT_FALSE(controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL));
EXPECT_FALSE(
controller.IsCommandEnabled(IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW));
diff --git a/chrome/browser/views/bookmark_context_menu_views.cc b/chrome/browser/views/bookmark_context_menu_views.cc
deleted file mode 100644
index 6d00085..0000000
--- a/chrome/browser/views/bookmark_context_menu_views.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2009 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/views/bookmark_context_menu.h"
-
-#include "app/l10n_util.h"
-
-void BookmarkContextMenu::RunMenuAt(int x, int y) {
- if (!model_->IsLoaded()) {
- NOTREACHED();
- return;
- }
- // width/height don't matter here.
- views::MenuItemView::AnchorPosition anchor =
- (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) ?
- views::MenuItemView::TOPRIGHT : views::MenuItemView::TOPLEFT;
- menu_->RunMenuAt(wnd_, gfx::Rect(x, y, 0, 0), anchor, true);
-}
-
-void BookmarkContextMenu::CreateMenuObject() {
- menu_.reset(new views::MenuItemView(this));
-}
-
-void BookmarkContextMenu::AppendItem(int id) {
- menu_->AppendMenuItemWithLabel(
- id, l10n_util::GetString(id));
-}
-
-void BookmarkContextMenu::AppendItem(int id, int localization_id) {
- menu_->AppendMenuItemWithLabel(
- id, l10n_util::GetString(localization_id));
-}
-
-void BookmarkContextMenu::AppendSeparator() {
- menu_->AppendSeparator();
-}
-
-void BookmarkContextMenu::AppendCheckboxItem(int id) {
- menu_->AppendMenuItem(id,
- l10n_util::GetString(id),
- views::MenuItemView::CHECKBOX);
-}
diff --git a/chrome/browser/views/bookmark_manager_view.cc b/chrome/browser/views/bookmark_manager_view.cc
index b873249..f21c350 100644
--- a/chrome/browser/views/bookmark_manager_view.cc
+++ b/chrome/browser/views/bookmark_manager_view.cc
@@ -516,8 +516,8 @@ void BookmarkManagerView::ShowContextMenu(views::View* source,
DCHECK(source == table_view_ || source == tree_view_);
bool is_table = (source == table_view_);
ShowMenu(GetWidget()->GetNativeView(), x, y,
- is_table ? BookmarkContextMenu::BOOKMARK_MANAGER_TABLE :
- BookmarkContextMenu::BOOKMARK_MANAGER_TREE);
+ is_table ? BookmarkContextMenuController::BOOKMARK_MANAGER_TABLE :
+ BookmarkContextMenuController::BOOKMARK_MANAGER_TREE);
}
void BookmarkManagerView::RunMenu(views::View* source,
@@ -534,7 +534,7 @@ void BookmarkManagerView::RunMenu(views::View* source,
(-source->width() + 5);
if (source->GetID() == kOrganizeMenuButtonID) {
ShowMenu(hwnd, menu_x, pt.y() + 2,
- BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU);
+ BookmarkContextMenuController::BOOKMARK_MANAGER_ORGANIZE_MENU);
} else if (source->GetID() == kToolsMenuButtonID) {
ShowToolsMenu(hwnd, menu_x, pt.y() + 2);
} else {
@@ -686,32 +686,33 @@ void BookmarkManagerView::ShowMenu(
HWND host,
int x,
int y,
- BookmarkContextMenu::ConfigurationType config) {
+ BookmarkContextMenuController::ConfigurationType config) {
if (!GetBookmarkModel()->IsLoaded())
return;
- if (config == BookmarkContextMenu::BOOKMARK_MANAGER_TABLE ||
- (config == BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU &&
+ if (config == BookmarkContextMenuController::BOOKMARK_MANAGER_TABLE ||
+ (config == BookmarkContextMenuController::BOOKMARK_MANAGER_ORGANIZE_MENU &&
table_view_->HasFocus())) {
std::vector<const BookmarkNode*> nodes = GetSelectedTableNodes();
const BookmarkNode* parent = GetSelectedFolder();
if (!parent) {
- if (config == BookmarkContextMenu::BOOKMARK_MANAGER_TABLE)
- config = BookmarkContextMenu::BOOKMARK_MANAGER_TABLE_OTHER;
- else
- config = BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER;
+ if (config == BookmarkContextMenuController::BOOKMARK_MANAGER_TABLE) {
+ config = BookmarkContextMenuController::BOOKMARK_MANAGER_TABLE_OTHER;
+ } else {
+ config =
+ BookmarkContextMenuController::BOOKMARK_MANAGER_ORGANIZE_MENU_OTHER;
+ }
}
- BookmarkContextMenu menu(host, profile_, NULL, NULL, parent, nodes,
- config);
- menu.RunMenuAt(x, y);
+ BookmarkContextMenu menu(host, profile_, NULL, parent, nodes, config);
+ menu.RunMenuAt(gfx::Point(x, y));
} else {
const BookmarkNode* node = GetSelectedFolder();
std::vector<const BookmarkNode*> nodes;
if (node)
nodes.push_back(node);
- BookmarkContextMenu menu(GetWidget()->GetNativeView(), profile_, NULL, NULL,
+ BookmarkContextMenu menu(GetWidget()->GetNativeView(), profile_, NULL,
node, nodes, config);
- menu.RunMenuAt(x, y);
+ menu.RunMenuAt(gfx::Point(x, y));
}
}
diff --git a/chrome/browser/views/bookmark_manager_view.h b/chrome/browser/views/bookmark_manager_view.h
index a8f3ca6..6bf103b 100644
--- a/chrome/browser/views/bookmark_manager_view.h
+++ b/chrome/browser/views/bookmark_manager_view.h
@@ -188,7 +188,7 @@ class BookmarkManagerView : public views::View,
void ShowMenu(HWND host,
int x,
int y,
- BookmarkContextMenu::ConfigurationType config);
+ BookmarkContextMenuController::ConfigurationType config);
// Invoked to handle cut/copy/paste from the table or tree. If |from_table|
// is true the source is the table.
diff --git a/chrome/browser/views/bookmark_menu_controller_views.cc b/chrome/browser/views/bookmark_menu_controller_views.cc
index 5fc5c97..45aea99 100644
--- a/chrome/browser/views/bookmark_menu_controller_views.cc
+++ b/chrome/browser/views/bookmark_menu_controller_views.cc
@@ -161,12 +161,11 @@ bool BookmarkMenuController::ShowContextMenu(views::MenuItemView* source,
context_menu_.reset(
new BookmarkContextMenu(parent_,
profile_,
- browser_,
page_navigator_,
nodes[0]->GetParent(),
nodes,
- BookmarkContextMenu::BOOKMARK_BAR));
- context_menu_->RunMenuAt(x, y);
+ BookmarkContextMenuController::BOOKMARK_BAR));
+ context_menu_->RunMenuAt(gfx::Point(x, y));
context_menu_.reset(NULL);
return true;
}