Home | History | Annotate | Download | only in tab_contents
      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