bookmark_context_menu.cc revision 868fa2fe829687343ffae624259930155e16dbd8
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Copyright (c) 2012 The Chromium Authors. All rights reserved.
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Use of this source code is governed by a BSD-style license that can be
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// found in the LICENSE file.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#include "chrome/browser/ui/views/bookmarks/bookmark_context_menu.h"
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base/i18n/rtl.h"
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base/strings/utf_string_conversions.h"
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "chrome/app/chrome_command_ids.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "chrome/browser/bookmarks/bookmark_model.h"
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "chrome/common/chrome_notification_types.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "content/public/browser/notification_service.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "grit/generated_resources.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/base/l10n/l10n_util.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/views/controls/menu/menu_item_view.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/views/controls/menu/menu_runner.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ui/views/widget/widget.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing content::PageNavigator;
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace {
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Returns true if |command_id| corresponds to a command that causes one or more
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// bookmarks to be removed.
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool IsRemoveBookmarksCommand(int command_id) {
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return command_id == IDC_CUT || command_id == IDC_BOOKMARK_BAR_REMOVE;
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}  // namespace
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// BookmarkContextMenu, public:
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtBookmarkContextMenu::BookmarkContextMenu(
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    views::Widget* parent_widget,
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Browser* browser,
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Profile* profile,
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    PageNavigator* page_navigator,
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const BookmarkNode* parent,
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const std::vector<const BookmarkNode*>& selection,
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    bool close_on_remove)
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    : controller_(new BookmarkContextMenuController(
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          parent_widget ? parent_widget->GetNativeWindow() : NULL, this,
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          browser, profile, page_navigator, parent, selection)),
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      parent_widget_(parent_widget),
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      menu_(new views::MenuItemView(this)),
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      menu_runner_(new views::MenuRunner(menu_)),
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      parent_node_(parent),
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      observer_(NULL),
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      close_on_remove_(close_on_remove) {
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  ui::SimpleMenuModel* menu_model = controller_->menu_model();
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  for (int i = 0; i < menu_model->GetItemCount(); ++i) {
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    menu_->AppendMenuItemFromModel(
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        menu_model, i, menu_model->GetCommandIdAt(i));
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtBookmarkContextMenu::~BookmarkContextMenu() {
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid BookmarkContextMenu::RunMenuAt(const gfx::Point& point) {
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  content::NotificationService::current()->Notify(
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      chrome::NOTIFICATION_BOOKMARK_CONTEXT_MENU_SHOWN,
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      content::Source<BookmarkContextMenu>(this),
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      content::NotificationService::NoDetails());
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // width/height don't matter here.
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (menu_runner_->RunMenuAt(
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          parent_widget_, NULL, gfx::Rect(point.x(), point.y(), 0, 0),
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          views::MenuItemView::TOPLEFT,
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          (views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::IS_NESTED |
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt           views::MenuRunner::CONTEXT_MENU)) ==
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      views::MenuRunner::MENU_DELETED)
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return;
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid BookmarkContextMenu::SetPageNavigator(PageNavigator* navigator) {
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  controller_->set_navigator(navigator);
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// BookmarkContextMenu, views::MenuDelegate implementation:
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid BookmarkContextMenu::ExecuteCommand(int command_id, int event_flags) {
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  controller_->ExecuteCommand(command_id, event_flags);
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool BookmarkContextMenu::IsItemChecked(int command_id) const {
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return controller_->IsCommandIdChecked(command_id);
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool BookmarkContextMenu::IsCommandEnabled(int command_id) const {
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return controller_->IsCommandIdEnabled(command_id);
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool BookmarkContextMenu::ShouldCloseAllMenusOnExecute(int id) {
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return (id != IDC_BOOKMARK_BAR_REMOVE) || close_on_remove_;
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt////////////////////////////////////////////////////////////////////////////////
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// BookmarkContextMenuControllerDelegate
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// implementation:
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid BookmarkContextMenu::CloseMenu() {
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  menu_->Cancel();
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid BookmarkContextMenu::WillExecuteCommand(
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    int command_id,
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const std::vector<const BookmarkNode*>& bookmarks) {
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (observer_ && IsRemoveBookmarksCommand(command_id))
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    observer_->WillRemoveBookmarks(bookmarks);
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid BookmarkContextMenu::DidExecuteCommand(int command_id) {
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (observer_ && IsRemoveBookmarksCommand(command_id))
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    observer_->DidRemoveBookmarks();
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt