• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/tab_contents/render_view_context_menu_views.h"
6 
7 #include "base/logging.h"
8 #include "chrome/app/chrome_command_ids.h"
9 #include "content/browser/renderer_host/render_widget_host_view.h"
10 #include "content/browser/tab_contents/tab_contents.h"
11 #include "grit/generated_resources.h"
12 #include "ui/base/keycodes/keyboard_codes.h"
13 #include "views/accelerator.h"
14 #include "views/controls/menu/menu_2.h"
15 
16 ////////////////////////////////////////////////////////////////////////////////
17 // RenderViewContextMenuViews, public:
18 
RenderViewContextMenuViews(TabContents * tab_contents,const ContextMenuParams & params)19 RenderViewContextMenuViews::RenderViewContextMenuViews(
20     TabContents* tab_contents,
21     const ContextMenuParams& params)
22     : RenderViewContextMenu(tab_contents, params) {
23 }
24 
~RenderViewContextMenuViews()25 RenderViewContextMenuViews::~RenderViewContextMenuViews() {
26 }
27 
RunMenuAt(int x,int y)28 void RenderViewContextMenuViews::RunMenuAt(int x, int y) {
29   menu_->RunContextMenuAt(gfx::Point(x, y));
30 }
31 
32 #if defined(OS_WIN)
SetExternal()33 void RenderViewContextMenuViews::SetExternal() {
34   external_ = true;
35 }
36 #endif
37 
UpdateMenuItemStates()38 void RenderViewContextMenuViews::UpdateMenuItemStates() {
39   menu_->UpdateStates();
40 }
41 
42 ////////////////////////////////////////////////////////////////////////////////
43 // RenderViewContextMenuViews, protected:
44 
PlatformInit()45 void RenderViewContextMenuViews::PlatformInit() {
46   menu_.reset(new views::Menu2(&menu_model_));
47 
48 #if defined(OS_WIN)
49   if (external_) {
50     // The external tab container needs to be notified by command
51     // and not by index. So we are turning off the MNS_NOTIFYBYPOS
52     // style.
53     HMENU menu = GetMenuHandle();
54     DCHECK(menu != NULL);
55 
56     MENUINFO mi = {0};
57     mi.cbSize = sizeof(mi);
58     mi.fMask = MIM_STYLE | MIM_MENUDATA;
59     mi.dwMenuData = reinterpret_cast<ULONG_PTR>(this);
60     SetMenuInfo(menu, &mi);
61   }
62 #endif
63 }
64 
GetAcceleratorForCommandId(int command_id,ui::Accelerator * accel)65 bool RenderViewContextMenuViews::GetAcceleratorForCommandId(
66     int command_id,
67     ui::Accelerator* accel) {
68   // There are no formally defined accelerators we can query so we assume
69   // that Ctrl+C, Ctrl+V, Ctrl+X, Ctrl-A, etc do what they normally do.
70   switch (command_id) {
71     case IDC_CONTENT_CONTEXT_UNDO:
72       *accel = views::Accelerator(ui::VKEY_Z, false, true, false);
73       return true;
74 
75     case IDC_CONTENT_CONTEXT_REDO:
76       // TODO(jcampan): should it be Ctrl-Y?
77       *accel = views::Accelerator(ui::VKEY_Z, true, true, false);
78       return true;
79 
80     case IDC_CONTENT_CONTEXT_CUT:
81       *accel = views::Accelerator(ui::VKEY_X, false, true, false);
82       return true;
83 
84     case IDC_CONTENT_CONTEXT_COPY:
85       *accel = views::Accelerator(ui::VKEY_C, false, true, false);
86       return true;
87 
88     case IDC_CONTENT_CONTEXT_PASTE:
89       *accel = views::Accelerator(ui::VKEY_V, false, true, false);
90       return true;
91 
92     case IDC_CONTENT_CONTEXT_SELECTALL:
93       *accel = views::Accelerator(ui::VKEY_A, false, true, false);
94       return true;
95 
96     default:
97       return false;
98   }
99 }
100