1 // Copyright (c) 2012 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.
5 #include "chrome/browser/ui/views/tab_contents/render_view_context_menu_views.h"
7 #include "base/logging.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/app/chrome_command_ids.h"
10 #include "content/public/browser/render_widget_host_view.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/browser/web_contents_view.h"
13 #include "grit/generated_resources.h"
14 #include "ui/base/accelerators/accelerator.h"
15 #include "ui/events/keycodes/keyboard_codes.h"
16 #include "ui/gfx/point.h"
17 #include "ui/views/controls/menu/menu_item_view.h"
18 #include "ui/views/controls/menu/menu_runner.h"
20 using content::WebContents;
22 ////////////////////////////////////////////////////////////////////////////////
23 // RenderViewContextMenuViews, public:
25 RenderViewContextMenuViews::RenderViewContextMenuViews(
26 WebContents* web_contents,
27 const content::ContextMenuParams& params)
28 : RenderViewContextMenu(web_contents, params) {
31 RenderViewContextMenuViews::~RenderViewContextMenuViews() {
36 RenderViewContextMenuViews* RenderViewContextMenuViews::Create(
37 content::WebContents* web_contents,
38 const content::ContextMenuParams& params) {
39 return new RenderViewContextMenuViews(web_contents, params);
43 void RenderViewContextMenuViews::RunMenuAt(views::Widget* parent,
44 const gfx::Point& point,
45 ui::MenuSourceType type) {
46 views::MenuItemView::AnchorPosition anchor_position =
47 (type == ui::MENU_SOURCE_TOUCH ||
48 type == ui::MENU_SOURCE_TOUCH_EDIT_MENU) ?
49 views::MenuItemView::BOTTOMCENTER : views::MenuItemView::TOPLEFT;
51 if (menu_runner_->RunMenuAt(parent, NULL, gfx::Rect(point, gfx::Size()),
52 anchor_position, type, views::MenuRunner::HAS_MNEMONICS |
53 views::MenuRunner::CONTEXT_MENU) ==
54 views::MenuRunner::MENU_DELETED)
58 ////////////////////////////////////////////////////////////////////////////////
59 // RenderViewContextMenuViews, protected:
61 void RenderViewContextMenuViews::PlatformInit() {
62 menu_runner_.reset(new views::MenuRunner(&menu_model_));
65 void RenderViewContextMenuViews::PlatformCancel() {
66 DCHECK(menu_runner_.get());
67 menu_runner_->Cancel();
70 bool RenderViewContextMenuViews::GetAcceleratorForCommandId(
72 ui::Accelerator* accel) {
73 // There are no formally defined accelerators we can query so we assume
74 // that Ctrl+C, Ctrl+V, Ctrl+X, Ctrl-A, etc do what they normally do.
76 case IDC_CONTENT_CONTEXT_UNDO:
77 *accel = ui::Accelerator(ui::VKEY_Z, ui::EF_CONTROL_DOWN);
80 case IDC_CONTENT_CONTEXT_REDO:
81 // TODO(jcampan): should it be Ctrl-Y?
82 *accel = ui::Accelerator(ui::VKEY_Z,
83 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
86 case IDC_CONTENT_CONTEXT_CUT:
87 *accel = ui::Accelerator(ui::VKEY_X, ui::EF_CONTROL_DOWN);
90 case IDC_CONTENT_CONTEXT_COPY:
91 *accel = ui::Accelerator(ui::VKEY_C, ui::EF_CONTROL_DOWN);
94 case IDC_CONTENT_CONTEXT_PASTE:
95 *accel = ui::Accelerator(ui::VKEY_V, ui::EF_CONTROL_DOWN);
98 case IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE:
99 *accel = ui::Accelerator(ui::VKEY_V,
100 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
103 case IDC_CONTENT_CONTEXT_SELECTALL:
104 *accel = ui::Accelerator(ui::VKEY_A, ui::EF_CONTROL_DOWN);
112 void RenderViewContextMenuViews::UpdateMenuItem(int command_id,
115 const string16& title) {
116 views::MenuItemView* item =
117 menu_runner_->GetMenu()->GetMenuItemByID(command_id);
121 item->SetEnabled(enabled);
122 item->SetTitle(title);
123 item->SetVisible(!hidden);
125 views::MenuItemView* parent = item->GetParentMenuItem();
129 parent->ChildrenChanged();