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
BookmarkContextMenu(gfx::NativeWindow parent_window,Profile * profile,PageNavigator * page_navigator,const BookmarkNode * parent,const std::vector<const BookmarkNode * > & selection)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
~BookmarkContextMenu()36 BookmarkContextMenu::~BookmarkContextMenu() {
37 }
38
RunMenuAt(const gfx::Point & point)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
ExecuteCommand(int command_id)54 void BookmarkContextMenu::ExecuteCommand(int command_id) {
55 controller_->ExecuteCommand(command_id);
56 }
57
IsItemChecked(int command_id) const58 bool BookmarkContextMenu::IsItemChecked(int command_id) const {
59 return controller_->IsItemChecked(command_id);
60 }
61
IsCommandEnabled(int command_id) const62 bool BookmarkContextMenu::IsCommandEnabled(int command_id) const {
63 return controller_->IsCommandEnabled(command_id);
64 }
65
ShouldCloseAllMenusOnExecute(int id)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
CloseMenu()77 void BookmarkContextMenu::CloseMenu() {
78 menu_->Cancel();
79 }
80
AddItemWithStringId(int command_id,int string_id)81 void BookmarkContextMenu::AddItemWithStringId(int command_id, int string_id) {
82 menu_->AppendMenuItemWithLabel(
83 command_id, UTF16ToWide(l10n_util::GetStringUTF16(string_id)));
84 }
85
AddSeparator()86 void BookmarkContextMenu::AddSeparator() {
87 menu_->AppendSeparator();
88 }
89
AddCheckboxItem(int command_id,int string_id)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
WillRemoveBookmarks(const std::vector<const BookmarkNode * > & bookmarks)96 void BookmarkContextMenu::WillRemoveBookmarks(
97 const std::vector<const BookmarkNode*>& bookmarks) {
98 if (observer_)
99 observer_->WillRemoveBookmarks(bookmarks);
100 }
101
DidRemoveBookmarks()102 void BookmarkContextMenu::DidRemoveBookmarks() {
103 if (observer_)
104 observer_->DidRemoveBookmarks();
105 }
106