172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tab_contents/render_view_context_menu_views.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/logging.h" 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/tab_contents/tab_contents.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_codes.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/accelerator.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/menu/menu_2.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RenderViewContextMenuViews, public: 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRenderViewContextMenuViews::RenderViewContextMenuViews( 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents, 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ContextMenuParams& params) 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : RenderViewContextMenu(tab_contents, params) { 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRenderViewContextMenuViews::~RenderViewContextMenuViews() { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenuViews::RunMenuAt(int x, int y) { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_->RunContextMenuAt(gfx::Point(x, y)); 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenuViews::SetExternal() { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_ = true; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenuViews::UpdateMenuItemStates() { 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_->UpdateStates(); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RenderViewContextMenuViews, protected: 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenuViews::PlatformInit() { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_.reset(new views::Menu2(&menu_model_)); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (external_) { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The external tab container needs to be notified by command 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // and not by index. So we are turning off the MNS_NOTIFYBYPOS 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // style. 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HMENU menu = GetMenuHandle(); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(menu != NULL); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MENUINFO mi = {0}; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mi.cbSize = sizeof(mi); 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mi.fMask = MIM_STYLE | MIM_MENUDATA; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mi.dwMenuData = reinterpret_cast<ULONG_PTR>(this); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetMenuInfo(menu, &mi); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RenderViewContextMenuViews::GetAcceleratorForCommandId( 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int command_id, 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::Accelerator* accel) { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // There are no formally defined accelerators we can query so we assume 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that Ctrl+C, Ctrl+V, Ctrl+X, Ctrl-A, etc do what they normally do. 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (command_id) { 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_UNDO: 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *accel = views::Accelerator(ui::VKEY_Z, false, true, false); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_REDO: 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jcampan): should it be Ctrl-Y? 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *accel = views::Accelerator(ui::VKEY_Z, true, true, false); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_CUT: 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *accel = views::Accelerator(ui::VKEY_X, false, true, false); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPY: 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *accel = views::Accelerator(ui::VKEY_C, false, true, false); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_PASTE: 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *accel = views::Accelerator(ui::VKEY_V, false, true, false); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SELECTALL: 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *accel = views::Accelerator(ui::VKEY_A, false, true, false); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 100