- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / tab_contents / render_view_context_menu_views.cc
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/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"
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 }