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. 4 5 #include "chrome/browser/ui/views/tab_contents/render_view_context_menu_views.h" 6 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/base/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" 19 20 using content::WebContents; 21 22 //////////////////////////////////////////////////////////////////////////////// 23 // RenderViewContextMenuViews, public: 24 25 RenderViewContextMenuViews::RenderViewContextMenuViews( 26 WebContents* web_contents, 27 const content::ContextMenuParams& params) 28 : RenderViewContextMenu(web_contents, params) { 29 } 30 31 RenderViewContextMenuViews::~RenderViewContextMenuViews() { 32 } 33 34 #if !defined(OS_WIN) 35 // static 36 RenderViewContextMenuViews* RenderViewContextMenuViews::Create( 37 content::WebContents* web_contents, 38 const content::ContextMenuParams& params) { 39 return new RenderViewContextMenuViews(web_contents, params); 40 } 41 #endif // OS_WIN 42 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; 50 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) 55 return; 56 } 57 58 //////////////////////////////////////////////////////////////////////////////// 59 // RenderViewContextMenuViews, protected: 60 61 void RenderViewContextMenuViews::PlatformInit() { 62 menu_runner_.reset(new views::MenuRunner(&menu_model_)); 63 } 64 65 void RenderViewContextMenuViews::PlatformCancel() { 66 DCHECK(menu_runner_.get()); 67 menu_runner_->Cancel(); 68 } 69 70 bool RenderViewContextMenuViews::GetAcceleratorForCommandId( 71 int command_id, 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. 75 switch (command_id) { 76 case IDC_CONTENT_CONTEXT_UNDO: 77 *accel = ui::Accelerator(ui::VKEY_Z, ui::EF_CONTROL_DOWN); 78 return true; 79 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); 84 return true; 85 86 case IDC_CONTENT_CONTEXT_CUT: 87 *accel = ui::Accelerator(ui::VKEY_X, ui::EF_CONTROL_DOWN); 88 return true; 89 90 case IDC_CONTENT_CONTEXT_COPY: 91 *accel = ui::Accelerator(ui::VKEY_C, ui::EF_CONTROL_DOWN); 92 return true; 93 94 case IDC_CONTENT_CONTEXT_PASTE: 95 *accel = ui::Accelerator(ui::VKEY_V, ui::EF_CONTROL_DOWN); 96 return true; 97 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); 101 return true; 102 103 case IDC_CONTENT_CONTEXT_SELECTALL: 104 *accel = ui::Accelerator(ui::VKEY_A, ui::EF_CONTROL_DOWN); 105 return true; 106 107 default: 108 return false; 109 } 110 } 111 112 void RenderViewContextMenuViews::UpdateMenuItem(int command_id, 113 bool enabled, 114 bool hidden, 115 const string16& title) { 116 views::MenuItemView* item = 117 menu_runner_->GetMenu()->GetMenuItemByID(command_id); 118 if (!item) 119 return; 120 121 item->SetEnabled(enabled); 122 item->SetTitle(title); 123 item->SetVisible(!hidden); 124 125 views::MenuItemView* parent = item->GetParentMenuItem(); 126 if (!parent) 127 return; 128 129 parent->ChildrenChanged(); 130 } 131