Home | History | Annotate | Download | only in tab_contents
      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 
     19 RenderViewContextMenuViews::RenderViewContextMenuViews(
     20     TabContents* tab_contents,
     21     const ContextMenuParams& params)
     22     : RenderViewContextMenu(tab_contents, params) {
     23 }
     24 
     25 RenderViewContextMenuViews::~RenderViewContextMenuViews() {
     26 }
     27 
     28 void RenderViewContextMenuViews::RunMenuAt(int x, int y) {
     29   menu_->RunContextMenuAt(gfx::Point(x, y));
     30 }
     31 
     32 #if defined(OS_WIN)
     33 void RenderViewContextMenuViews::SetExternal() {
     34   external_ = true;
     35 }
     36 #endif
     37 
     38 void RenderViewContextMenuViews::UpdateMenuItemStates() {
     39   menu_->UpdateStates();
     40 }
     41 
     42 ////////////////////////////////////////////////////////////////////////////////
     43 // RenderViewContextMenuViews, protected:
     44 
     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 
     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