1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/views/bookmarks/bookmark_context_menu.h" 6 7 #include "base/i18n/rtl.h" 8 #include "base/utf_string_conversions.h" 9 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/browser/bookmarks/bookmark_model.h" 11 #include "chrome/browser/profiles/profile.h" 12 #include "content/common/notification_service.h" 13 #include "grit/generated_resources.h" 14 #include "ui/base/l10n/l10n_util.h" 15 #include "views/controls/menu/menu_item_view.h" 16 17 //////////////////////////////////////////////////////////////////////////////// 18 // BookmarkContextMenu, public: 19 20 BookmarkContextMenu::BookmarkContextMenu( 21 gfx::NativeWindow parent_window, 22 Profile* profile, 23 PageNavigator* page_navigator, 24 const BookmarkNode* parent, 25 const std::vector<const BookmarkNode*>& selection) 26 : ALLOW_THIS_IN_INITIALIZER_LIST( 27 controller_(new BookmarkContextMenuControllerViews(parent_window, 28 this, profile, page_navigator, parent, selection))), 29 parent_window_(parent_window), 30 ALLOW_THIS_IN_INITIALIZER_LIST(menu_(new views::MenuItemView(this))), 31 parent_node_(parent), 32 observer_(NULL) { 33 controller_->BuildMenu(); 34 } 35 36 BookmarkContextMenu::~BookmarkContextMenu() { 37 } 38 39 void BookmarkContextMenu::RunMenuAt(const gfx::Point& point) { 40 NotificationService::current()->Notify( 41 NotificationType::BOOKMARK_CONTEXT_MENU_SHOWN, 42 Source<BookmarkContextMenu>(this), 43 NotificationService::NoDetails()); 44 // width/height don't matter here. 45 views::MenuItemView::AnchorPosition anchor = base::i18n::IsRTL() ? 46 views::MenuItemView::TOPRIGHT : views::MenuItemView::TOPLEFT; 47 menu_->RunMenuAt(parent_window_, NULL, gfx::Rect(point.x(), point.y(), 0, 0), 48 anchor, true); 49 } 50 51 //////////////////////////////////////////////////////////////////////////////// 52 // BookmarkContextMenu, views::MenuDelegate implementation: 53 54 void BookmarkContextMenu::ExecuteCommand(int command_id) { 55 controller_->ExecuteCommand(command_id); 56 } 57 58 bool BookmarkContextMenu::IsItemChecked(int command_id) const { 59 return controller_->IsItemChecked(command_id); 60 } 61 62 bool BookmarkContextMenu::IsCommandEnabled(int command_id) const { 63 return controller_->IsCommandEnabled(command_id); 64 } 65 66 bool BookmarkContextMenu::ShouldCloseAllMenusOnExecute(int id) { 67 return id != IDC_BOOKMARK_BAR_REMOVE || 68 (parent_node_ == 69 controller_->profile()->GetBookmarkModel()->other_node() && 70 parent_node_->child_count() == 1); 71 } 72 73 //////////////////////////////////////////////////////////////////////////////// 74 // BookmarkContextMenu, BookmarkContextMenuControllerViewsDelegate 75 // implementation: 76 77 void BookmarkContextMenu::CloseMenu() { 78 menu_->Cancel(); 79 } 80 81 void BookmarkContextMenu::AddItemWithStringId(int command_id, int string_id) { 82 menu_->AppendMenuItemWithLabel( 83 command_id, UTF16ToWide(l10n_util::GetStringUTF16(string_id))); 84 } 85 86 void BookmarkContextMenu::AddSeparator() { 87 menu_->AppendSeparator(); 88 } 89 90 void BookmarkContextMenu::AddCheckboxItem(int command_id, int string_id) { 91 menu_->AppendMenuItem(command_id, 92 UTF16ToWide(l10n_util::GetStringUTF16(string_id)), 93 views::MenuItemView::CHECKBOX); 94 } 95 96 void BookmarkContextMenu::WillRemoveBookmarks( 97 const std::vector<const BookmarkNode*>& bookmarks) { 98 if (observer_) 99 observer_->WillRemoveBookmarks(bookmarks); 100 } 101 102 void BookmarkContextMenu::DidRemoveBookmarks() { 103 if (observer_) 104 observer_->DidRemoveBookmarks(); 105 } 106