diff options
Diffstat (limited to 'chrome/browser/wrench_menu_model.cc')
-rw-r--r-- | chrome/browser/wrench_menu_model.cc | 172 |
1 files changed, 98 insertions, 74 deletions
diff --git a/chrome/browser/wrench_menu_model.cc b/chrome/browser/wrench_menu_model.cc index 031d0d9..b1d39d1 100644 --- a/chrome/browser/wrench_menu_model.cc +++ b/chrome/browser/wrench_menu_model.cc @@ -20,6 +20,7 @@ #include "chrome/browser/defaults.h" #include "chrome/browser/encoding_menu_controller.h" #include "chrome/browser/host_zoom_map.h" +#include "chrome/browser/pref_service.h" #include "chrome/browser/profile.h" #include "chrome/browser/sync/profile_sync_service.h" #include "chrome/browser/sync/sync_ui_util.h" @@ -29,6 +30,7 @@ #include "chrome/common/notification_service.h" #include "chrome/common/notification_source.h" #include "chrome/common/notification_type.h" +#include "chrome/common/pref_names.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" @@ -37,6 +39,10 @@ #include <gtk/gtk.h> #endif +#if defined(OS_MACOSX) +#include "chrome/browser/browser_window.h" +#endif + //////////////////////////////////////////////////////////////////////////////// // EncodingMenuModel @@ -163,10 +169,10 @@ void ToolsMenuModel::Build(Browser* browser) { //////////////////////////////////////////////////////////////////////////////// // WrenchMenuModel -WrenchMenuModel::WrenchMenuModel(menus::SimpleMenuModel::Delegate* delegate, +WrenchMenuModel::WrenchMenuModel(menus::AcceleratorProvider* provider, Browser* browser) - : menus::SimpleMenuModel(delegate), - delegate_(delegate), + : ALLOW_THIS_IN_INITIALIZER_LIST(model_(this)), + provider_(provider), browser_(browser), tabstrip_model_(browser_->tabstrip_model()) { Build(); @@ -185,50 +191,64 @@ WrenchMenuModel::~WrenchMenuModel() { tabstrip_model_->RemoveObserver(this); } -bool WrenchMenuModel::IsLabelDynamicAt(int index) const { - return IsDynamicItem(index) || SimpleMenuModel::IsLabelDynamicAt(index); +bool WrenchMenuModel::IsLabelForCommandIdDynamic(int command_id) const { + return command_id == IDC_ZOOM_PERCENT_DISPLAY || + command_id == IDC_SYNC_BOOKMARKS || +#if defined(OS_MACOSX) + command_id == IDC_FULLSCREEN || +#endif + command_id == IDC_ABOUT; } -string16 WrenchMenuModel::GetLabelAt(int index) const { - if (!IsDynamicItem(index)) - return SimpleMenuModel::GetLabelAt(index); - - int command_id = GetCommandIdAt(index); - +string16 WrenchMenuModel::GetLabelForCommandId(int command_id) const { switch (command_id) { case IDC_ABOUT: return GetAboutEntryMenuLabel(); case IDC_SYNC_BOOKMARKS: return GetSyncMenuLabel(); + case IDC_ZOOM_PERCENT_DISPLAY: + return zoom_label_; +#if defined(OS_MACOSX) + case IDC_FULLSCREEN: { + int string_id = IDS_ENTER_FULLSCREEN_MAC; // Default to Enter. + // Note: On startup, |window()| may be NULL. + if (browser_->window() && browser_->window()->IsFullscreen()) + string_id = IDS_EXIT_FULLSCREEN_MAC; + return l10n_util::GetStringUTF16(string_id); + } +#endif default: NOTREACHED(); return string16(); } } -bool WrenchMenuModel::GetIconAt(int index, SkBitmap* icon) const { - if (GetCommandIdAt(index) == IDC_ABOUT && - Singleton<UpgradeDetector>::get()->notify_upgrade()) { - // Show the exclamation point next to the menu item. - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - *icon = *rb.GetBitmapNamed(IDR_UPDATE_AVAILABLE); - return true; - } - return false; +void WrenchMenuModel::ExecuteCommand(int command_id) { + browser_->ExecuteCommand(command_id); } -bool WrenchMenuModel::IsLabelForCommandIdDynamic(int command_id) const { - return command_id == IDC_ZOOM_PERCENT_DISPLAY; +bool WrenchMenuModel::IsCommandIdChecked(int command_id) const { +#if defined(OS_CHROMEOS) + if (command_id == IDC_TOGGLE_VERTICAL_TABS) { + return browser_->UseVerticalTabs(); + } +#endif + + if (command_id == IDC_SHOW_BOOKMARK_BAR) { + return browser_->profile()->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); + } + + return false; } -string16 WrenchMenuModel::GetLabelForCommandId(int command_id) const { - DCHECK_EQ(IDC_ZOOM_PERCENT_DISPLAY, command_id); - return zoom_label_; +bool WrenchMenuModel::IsCommandIdEnabled(int command_id) const { + return browser_->command_updater()->IsCommandEnabled(command_id); } -void WrenchMenuModel::ExecuteCommand(int command_id) { - if (delegate_) - delegate_->ExecuteCommand(command_id); +bool WrenchMenuModel::GetAcceleratorForCommandId( + int command_id, + menus::Accelerator* accelerator) { + return provider_->GetAcceleratorForCommandId(command_id, accelerator); } void WrenchMenuModel::TabSelectedAt(TabContents* old_contents, @@ -258,12 +278,17 @@ void WrenchMenuModel::Observe(NotificationType type, UpdateZoomControls(); } +// For testing. +WrenchMenuModel::WrenchMenuModel() : model_(NULL) { +} + void WrenchMenuModel::Build() { - AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); - AddItemWithStringId(IDC_NEW_WINDOW, IDS_NEW_WINDOW); - AddItemWithStringId(IDC_NEW_INCOGNITO_WINDOW, IDS_NEW_INCOGNITO_WINDOW); + model_.AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); + model_.AddItemWithStringId(IDC_NEW_WINDOW, IDS_NEW_WINDOW); + model_.AddItemWithStringId(IDC_NEW_INCOGNITO_WINDOW, + IDS_NEW_INCOGNITO_WINDOW); - AddSeparator(); + model_.AddSeparator(); #if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS)) // WARNING: Mac does not use the ButtonMenuItemModel, but instead defines the // layout for this menu item in Toolbar.xib. It does, however, use the @@ -272,13 +297,13 @@ void WrenchMenuModel::Build() { edit_menu_item_model_->AddGroupItemWithStringId(IDC_CUT, IDS_CUT); edit_menu_item_model_->AddGroupItemWithStringId(IDC_COPY, IDS_COPY); edit_menu_item_model_->AddGroupItemWithStringId(IDC_PASTE, IDS_PASTE); - AddButtonItem(IDC_EDIT_MENU, edit_menu_item_model_.get()); + model_.AddButtonItem(IDC_EDIT_MENU, edit_menu_item_model_.get()); #else // TODO(port): Move to the above. CreateCutCopyPaste(); #endif - AddSeparator(); + model_.AddSeparator(); #if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(TOOLKIT_VIEWS)) // WARNING: See above comment. zoom_menu_item_model_.reset( @@ -292,68 +317,79 @@ void WrenchMenuModel::Build() { zoom_menu_item_model_->AddSpace(); zoom_menu_item_model_->AddItemWithImage( IDC_FULLSCREEN, IDR_FULLSCREEN_MENU_BUTTON); - AddButtonItem(IDC_ZOOM_MENU, zoom_menu_item_model_.get()); + model_.AddButtonItem(IDC_ZOOM_MENU, zoom_menu_item_model_.get()); #else // TODO(port): Move to the above. CreateZoomFullscreen(); #endif - AddSeparator(); - AddItemWithStringId(IDC_SAVE_PAGE, IDS_SAVE_PAGE); - AddItemWithStringId(IDC_FIND, IDS_FIND); - AddItemWithStringId(IDC_PRINT, IDS_PRINT); + model_.AddSeparator(); + model_.AddItemWithStringId(IDC_SAVE_PAGE, IDS_SAVE_PAGE); + model_.AddItemWithStringId(IDC_FIND, IDS_FIND); + model_.AddItemWithStringId(IDC_PRINT, IDS_PRINT); - tools_menu_model_.reset(new ToolsMenuModel(delegate(), browser_)); - AddSubMenuWithStringId(IDC_ZOOM_MENU, IDS_TOOLS_MENU, + tools_menu_model_.reset(new ToolsMenuModel(this, browser_)); + model_.AddSubMenuWithStringId(IDC_ZOOM_MENU, IDS_TOOLS_MENU, tools_menu_model_.get()); - AddSeparator(); + model_.AddSeparator(); #if defined(ENABLE_REMOTING) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableRemoting)) { - AddItem(IDC_REMOTING_SETUP, + model_.AddItem(IDC_REMOTING_SETUP, l10n_util::GetStringUTF16(IDS_REMOTING_SETUP_LABEL)); } #endif - AddItemWithStringId(IDC_SHOW_BOOKMARK_MANAGER, IDS_BOOKMARK_MANAGER); - AddItemWithStringId(IDC_SHOW_HISTORY, IDS_SHOW_HISTORY); - AddItemWithStringId(IDC_SHOW_DOWNLOADS, IDS_SHOW_DOWNLOADS); - AddSeparator(); + model_.AddItemWithStringId(IDC_SHOW_BOOKMARK_MANAGER, IDS_BOOKMARK_MANAGER); + model_.AddItemWithStringId(IDC_SHOW_HISTORY, IDS_SHOW_HISTORY); + model_.AddItemWithStringId(IDC_SHOW_DOWNLOADS, IDS_SHOW_DOWNLOADS); + model_.AddSeparator(); #if defined(OS_MACOSX) - AddItemWithStringId(IDC_OPTIONS, IDS_PREFERENCES_MAC); + model_.AddItemWithStringId(IDC_OPTIONS, IDS_PREFERENCES_MAC); #elif defined(OS_LINUX) GtkStockItem stock_item; if (gtk_stock_lookup(GTK_STOCK_PREFERENCES, &stock_item)) { const char16 kUnderscore[] = { '_', 0 }; string16 preferences; RemoveChars(UTF8ToUTF16(stock_item.label), kUnderscore, &preferences); - AddItem(IDC_OPTIONS, preferences); + model_.AddItem(IDC_OPTIONS, preferences); + } else { + model_.AddItemWithStringId(IDC_OPTIONS, IDS_OPTIONS); } #else - AddItemWithStringId(IDC_OPTIONS, IDS_OPTIONS); + model_.AddItemWithStringId(IDC_OPTIONS, IDS_OPTIONS); #endif #if defined(OS_CHROMEOS) - AddCheckItemWithStringId(IDC_TOGGLE_VERTICAL_TABS, + model_.AddCheckItemWithStringId(IDC_TOGGLE_VERTICAL_TABS, IDS_TAB_CXMENU_USE_VERTICAL_TABS); #endif + // TODO(erg): This entire section needs to be reworked and is out of scope of + // the first cleanup patch I'm doing. Part 1 (crbug.com/47320) is moving most + // of the logic from each platform specific UI code into the model here. Part + // 2 (crbug.com/46221) is normalizing the about menu item/hidden update menu + // item behaviour across the three platforms. + // On Mac, there is no About item unless it is replaced with the update // available notification. if (browser_defaults::kShowAboutMenuItem || Singleton<UpgradeDetector>::get()->notify_upgrade()) { - AddItem(IDC_ABOUT, + model_.AddItem(IDC_ABOUT, l10n_util::GetStringFUTF16( IDS_ABOUT, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); + // ResourceBundle& rb = ResourceBundle::GetSharedInstance(); + // model_.SetIcon(model_.GetIndexOfCommandId(IDC_ABOUT), + // *rb.GetBitmapNamed(IDR_UPDATE_AVAILABLE)); } - AddItemWithStringId(IDC_HELP_PAGE, IDS_HELP_PAGE); + model_.AddItemWithStringId(IDC_HELP_PAGE, IDS_HELP_PAGE); if (browser_defaults::kShowExitMenuItem) { - AddSeparator(); + model_.AddSeparator(); #if defined(OS_CHROMEOS) - AddItemWithStringId(IDC_EXIT, IDS_SIGN_OUT); + model_.AddItemWithStringId(IDC_EXIT, IDS_SIGN_OUT); #else - AddItemWithStringId(IDC_EXIT, IDS_EXIT); + model_.AddItemWithStringId(IDC_EXIT, IDS_EXIT); #endif } } @@ -361,17 +397,17 @@ void WrenchMenuModel::Build() { void WrenchMenuModel::CreateCutCopyPaste() { // WARNING: views/wrench_menu assumes these items are added in this order. If // you change the order you'll need to update wrench_menu as well. - AddItemWithStringId(IDC_CUT, IDS_CUT); - AddItemWithStringId(IDC_COPY, IDS_COPY); - AddItemWithStringId(IDC_PASTE, IDS_PASTE); + model_.AddItemWithStringId(IDC_CUT, IDS_CUT); + model_.AddItemWithStringId(IDC_COPY, IDS_COPY); + model_.AddItemWithStringId(IDC_PASTE, IDS_PASTE); } void WrenchMenuModel::CreateZoomFullscreen() { // WARNING: views/wrench_menu assumes these items are added in this order. If // you change the order you'll need to update wrench_menu as well. - AddItemWithStringId(IDC_ZOOM_MINUS, IDS_ZOOM_MINUS); - AddItemWithStringId(IDC_ZOOM_PLUS, IDS_ZOOM_PLUS); - AddItemWithStringId(IDC_FULLSCREEN, IDS_FULLSCREEN); + model_.AddItemWithStringId(IDC_ZOOM_MINUS, IDS_ZOOM_MINUS); + model_.AddItemWithStringId(IDC_ZOOM_PLUS, IDS_ZOOM_PLUS); + model_.AddItemWithStringId(IDC_FULLSCREEN, IDS_FULLSCREEN); } void WrenchMenuModel::UpdateZoomControls() { @@ -415,15 +451,3 @@ string16 WrenchMenuModel::GetAboutEntryMenuLabel() const { return l10n_util::GetStringFUTF16( IDS_ABOUT, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); } - -bool WrenchMenuModel::IsDynamicItem(int index) const { - int command_id = GetCommandIdAt(index); - return command_id == IDC_SYNC_BOOKMARKS || - command_id == IDC_ABOUT; -} - -bool WrenchMenuModel::IsCommandIdEnabled(int command_id) const { - if (delegate_) - return delegate_->IsCommandIdEnabled(command_id); - return true; -} |