Home | History | Annotate | Download | only in frame
      1 // Copyright (c) 2013 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/frame/system_menu_model_builder.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/strings/utf_string_conversions.h"
      9 #include "chrome/app/chrome_command_ids.h"
     10 #include "chrome/browser/ui/browser_commands.h"
     11 #include "chrome/browser/ui/host_desktop.h"
     12 #include "chrome/browser/ui/toolbar/wrench_menu_model.h"
     13 #include "chrome/common/chrome_switches.h"
     14 #include "grit/generated_resources.h"
     15 #include "ui/base/accelerators/accelerator.h"
     16 #include "ui/base/models/simple_menu_model.h"
     17 
     18 SystemMenuModelBuilder::SystemMenuModelBuilder(
     19     ui::AcceleratorProvider* provider,
     20     Browser* browser)
     21     : menu_delegate_(provider, browser) {
     22 }
     23 
     24 SystemMenuModelBuilder::~SystemMenuModelBuilder() {
     25 }
     26 
     27 void SystemMenuModelBuilder::Init() {
     28   ui::SimpleMenuModel* model = new ui::SimpleMenuModel(&menu_delegate_);
     29   menu_model_.reset(model);
     30   BuildMenu(model);
     31 #if defined(OS_WIN)
     32   // On Windows with HOST_DESKTOP_TYPE_NATIVE we put the menu items in the
     33   // system menu (not at the end). Doing this necessitates adding a trailing
     34   // separator.
     35   if (browser()->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_NATIVE)
     36     model->AddSeparator(ui::NORMAL_SEPARATOR);
     37 #endif
     38 }
     39 
     40 void SystemMenuModelBuilder::BuildMenu(ui::SimpleMenuModel* model) {
     41   // We add the menu items in reverse order so that insertion_index never needs
     42   // to change.
     43   if (browser()->is_type_tabbed())
     44     BuildSystemMenuForBrowserWindow(model);
     45   else
     46     BuildSystemMenuForAppOrPopupWindow(model);
     47   AddFrameToggleItems(model);
     48 }
     49 
     50 void SystemMenuModelBuilder::BuildSystemMenuForBrowserWindow(
     51     ui::SimpleMenuModel* model) {
     52   model->AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB);
     53   model->AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB);
     54   if (chrome::CanOpenTaskManager()) {
     55     model->AddSeparator(ui::NORMAL_SEPARATOR);
     56     model->AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
     57   }
     58   // If it's a regular browser window with tabs, we don't add any more items,
     59   // since it already has menus (Page, Chrome).
     60 }
     61 
     62 void SystemMenuModelBuilder::BuildSystemMenuForAppOrPopupWindow(
     63     ui::SimpleMenuModel* model) {
     64   model->AddItemWithStringId(IDC_BACK, IDS_CONTENT_CONTEXT_BACK);
     65   model->AddItemWithStringId(IDC_FORWARD, IDS_CONTENT_CONTEXT_FORWARD);
     66   model->AddItemWithStringId(IDC_RELOAD, IDS_APP_MENU_RELOAD);
     67   model->AddSeparator(ui::NORMAL_SEPARATOR);
     68   if (browser()->is_app())
     69     model->AddItemWithStringId(IDC_NEW_TAB, IDS_APP_MENU_NEW_WEB_PAGE);
     70   else
     71     model->AddItemWithStringId(IDC_SHOW_AS_TAB, IDS_SHOW_AS_TAB);
     72   model->AddSeparator(ui::NORMAL_SEPARATOR);
     73   model->AddItemWithStringId(IDC_CUT, IDS_CUT);
     74   model->AddItemWithStringId(IDC_COPY, IDS_COPY);
     75   model->AddItemWithStringId(IDC_PASTE, IDS_PASTE);
     76   model->AddSeparator(ui::NORMAL_SEPARATOR);
     77   model->AddItemWithStringId(IDC_FIND, IDS_FIND);
     78   model->AddItemWithStringId(IDC_PRINT, IDS_PRINT);
     79   zoom_menu_contents_.reset(new ZoomMenuModel(&menu_delegate_));
     80   model->AddSubMenuWithStringId(IDC_ZOOM_MENU, IDS_ZOOM_MENU,
     81                                 zoom_menu_contents_.get());
     82   encoding_menu_contents_.reset(new EncodingMenuModel(browser()));
     83   model->AddSubMenuWithStringId(IDC_ENCODING_MENU,
     84                                 IDS_ENCODING_MENU,
     85                                 encoding_menu_contents_.get());
     86   if (browser()->is_app() && chrome::CanOpenTaskManager()) {
     87     model->AddSeparator(ui::NORMAL_SEPARATOR);
     88     model->AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
     89   }
     90 }
     91 
     92 void SystemMenuModelBuilder::AddFrameToggleItems(ui::SimpleMenuModel* model) {
     93   if (CommandLine::ForCurrentProcess()->HasSwitch(
     94           switches::kDebugEnableFrameToggle)) {
     95     model->AddSeparator(ui::NORMAL_SEPARATOR);
     96     model->AddItem(IDC_DEBUG_FRAME_TOGGLE, ASCIIToUTF16("Toggle Frame Type"));
     97   }
     98 }
     99 
    100