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