diff options
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.cc | 63 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_toolbar_gtk.h | 2 | ||||
-rw-r--r-- | chrome/browser/wrench_menu_model.cc | 174 | ||||
-rw-r--r-- | chrome/browser/wrench_menu_model.h | 74 |
4 files changed, 291 insertions, 22 deletions
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc index a73b1db..04b361b 100644 --- a/chrome/browser/gtk/browser_toolbar_gtk.cc +++ b/chrome/browser/gtk/browser_toolbar_gtk.cc @@ -13,6 +13,7 @@ #include "app/menus/accelerator_gtk.h" #include "app/resource_bundle.h" #include "base/base_paths.h" +#include "base/command_line.h" #include "base/i18n/rtl.h" #include "base/keyboard_codes_posix.h" #include "base/logging.h" @@ -42,6 +43,7 @@ #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/upgrade_detector.h" +#include "chrome/common/chrome_switches.h" #include "chrome/common/notification_details.h" #include "chrome/common/notification_service.h" #include "chrome/common/notification_type.h" @@ -88,6 +90,7 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window) model_(browser->toolbar_model()), page_menu_model_(this, browser), app_menu_model_(this, browser), + wrench_menu_model_(this, browser), browser_(browser), window_(window), profile_(NULL), @@ -212,17 +215,21 @@ void BrowserToolbarGtk::Init(Profile* profile, // We need another hbox for the menu buttons so we can place them together, // but still have some padding to their collective left/right. + bool use_wrench_menu = + CommandLine::ForCurrentProcess()->HasSwitch(switches::kNewWrenchMenu); GtkWidget* menus_hbox = gtk_hbox_new(FALSE, 0); - GtkWidget* page_menu = BuildToolbarMenuButton( - l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP), - &page_menu_button_); - menu_bar_helper_.Add(page_menu_button_.get()); - page_menu_image_ = gtk_image_new_from_pixbuf( - theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE)); - gtk_container_add(GTK_CONTAINER(page_menu), page_menu_image_); + if (!use_wrench_menu) { + GtkWidget* page_menu = BuildToolbarMenuButton( + l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP), + &page_menu_button_); + menu_bar_helper_.Add(page_menu_button_.get()); + page_menu_image_ = gtk_image_new_from_pixbuf( + theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE)); + gtk_container_add(GTK_CONTAINER(page_menu), page_menu_image_); - page_menu_.reset(new MenuGtk(this, &page_menu_model_)); - gtk_box_pack_start(GTK_BOX(menus_hbox), page_menu, FALSE, FALSE, 0); + page_menu_.reset(new MenuGtk(this, &page_menu_model_)); + gtk_box_pack_start(GTK_BOX(menus_hbox), page_menu, FALSE, FALSE, 0); + } GtkWidget* chrome_menu = BuildToolbarMenuButton( l10n_util::GetStringFUTF8(IDS_APPMENU_TOOLTIP, @@ -235,7 +242,10 @@ void BrowserToolbarGtk::Init(Profile* profile, g_signal_connect_after(app_menu_image_, "expose-event", G_CALLBACK(OnAppMenuImageExposeThunk), this); - app_menu_.reset(new MenuGtk(this, &app_menu_model_)); + if (use_wrench_menu) + app_menu_.reset(new MenuGtk(this, &wrench_menu_model_)); + else + app_menu_.reset(new MenuGtk(this, &app_menu_model_)); gtk_box_pack_start(GTK_BOX(menus_hbox), chrome_menu, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(toolbar_right_), menus_hbox, FALSE, FALSE, kToolbarWidgetSpacing); @@ -275,7 +285,8 @@ void BrowserToolbarGtk::SetViewIDs() { ViewIDUtil::SetID(home_->widget(), VIEW_ID_HOME_BUTTON); ViewIDUtil::SetID(location_bar_->widget(), VIEW_ID_LOCATION_BAR); ViewIDUtil::SetID(go_->widget(), VIEW_ID_GO_BUTTON); - ViewIDUtil::SetID(page_menu_button_.get(), VIEW_ID_PAGE_MENU); + if (page_menu_button_.get()) + ViewIDUtil::SetID(page_menu_button_.get(), VIEW_ID_PAGE_MENU); ViewIDUtil::SetID(app_menu_button_.get(), VIEW_ID_APP_MENU); } @@ -300,7 +311,8 @@ void BrowserToolbarGtk::UpdateForBookmarkBarVisibility( } void BrowserToolbarGtk::ShowPageMenu() { - PopupForButton(page_menu_button_.get()); + if (page_menu_button_.get()) + PopupForButton(page_menu_button_.get()); } void BrowserToolbarGtk::ShowAppMenu() { @@ -346,13 +358,15 @@ void BrowserToolbarGtk::EnabledStateChangedForCommand(int id, bool enabled) { void BrowserToolbarGtk::StoppedShowing() { // Without these calls, the hover state can get stuck since the leave-notify // event is not sent when clicking a button brings up the menu. - gtk_chrome_button_set_hover_state( - GTK_CHROME_BUTTON(page_menu_button_.get()), 0.0); + if (page_menu_button_.get()) { + gtk_chrome_button_set_hover_state( + GTK_CHROME_BUTTON(page_menu_button_.get()), 0.0); + gtk_chrome_button_unset_paint_state( + GTK_CHROME_BUTTON(page_menu_button_.get())); + } + gtk_chrome_button_set_hover_state( GTK_CHROME_BUTTON(app_menu_button_.get()), 0.0); - - gtk_chrome_button_unset_paint_state( - GTK_CHROME_BUTTON(page_menu_button_.get())); gtk_chrome_button_unset_paint_state( GTK_CHROME_BUTTON(app_menu_button_.get())); } @@ -406,14 +420,18 @@ void BrowserToolbarGtk::Observe(NotificationType type, // Update the spacing around the menu buttons bool use_gtk = theme_provider_->UseGtkTheme(); int border = use_gtk ? 0 : 2; - gtk_container_set_border_width( - GTK_CONTAINER(page_menu_button_.get()), border); + if (page_menu_button_.get()) { + gtk_container_set_border_width( + GTK_CONTAINER(page_menu_button_.get()), border); + } gtk_container_set_border_width( GTK_CONTAINER(app_menu_button_.get()), border); // Update the menu button images. - gtk_image_set_from_pixbuf(GTK_IMAGE(page_menu_image_), - theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE)); + if (page_menu_button_.get()) { + gtk_image_set_from_pixbuf(GTK_IMAGE(page_menu_image_), + theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_PAGE)); + } gtk_image_set_from_pixbuf(GTK_IMAGE(app_menu_image_), theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_CHROME)); @@ -785,7 +803,8 @@ bool BrowserToolbarGtk::ShouldOnlyShowLocation() const { } void BrowserToolbarGtk::PopupForButton(GtkWidget* button) { - page_menu_->Cancel(); + if (page_menu_.get()) + page_menu_->Cancel(); app_menu_->Cancel(); gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(button), diff --git a/chrome/browser/gtk/browser_toolbar_gtk.h b/chrome/browser/gtk/browser_toolbar_gtk.h index 26df479..73f889c 100644 --- a/chrome/browser/gtk/browser_toolbar_gtk.h +++ b/chrome/browser/gtk/browser_toolbar_gtk.h @@ -20,6 +20,7 @@ #include "chrome/browser/page_menu_model.h" #include "chrome/browser/pref_member.h" #include "chrome/browser/sync/profile_sync_service.h" +#include "chrome/browser/wrench_menu_model.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_registrar.h" #include "chrome/common/owned_widget_gtk.h" @@ -243,6 +244,7 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver, PageMenuModel page_menu_model_; AppMenuModel app_menu_model_; + WrenchMenuModel wrench_menu_model_; Browser* browser_; BrowserWindowGtk* window_; diff --git a/chrome/browser/wrench_menu_model.cc b/chrome/browser/wrench_menu_model.cc new file mode 100644 index 0000000..9462af3 --- /dev/null +++ b/chrome/browser/wrench_menu_model.cc @@ -0,0 +1,174 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/wrench_menu_model.h" + +#include <algorithm> + +#include "app/l10n_util.h" +#include "app/resource_bundle.h" +#include "base/command_line.h" +#include "chrome/app/chrome_dll_resource.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/defaults.h" +#include "chrome/browser/page_menu_model.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/sync/profile_sync_service.h" +#include "chrome/browser/sync/sync_ui_util.h" +#include "chrome/browser/upgrade_detector.h" +#include "chrome/common/chrome_switches.h" +#include "grit/chromium_strings.h" +#include "grit/generated_resources.h" +#include "grit/theme_resources.h" + +//////////////////////////////////////////////////////////////////////////////// +// ToolsMenuModel + +ToolsMenuModel::ToolsMenuModel(menus::SimpleMenuModel::Delegate* delegate, + Browser* browser) + : SimpleMenuModel(delegate) { + Build(browser); +} + +ToolsMenuModel::~ToolsMenuModel() {} + +void ToolsMenuModel::Build(Browser* browser) { + AddCheckItemWithStringId(IDC_SHOW_BOOKMARK_BAR, IDS_SHOW_BOOKMARK_BAR); + + AddSeparator(); + + AddItemWithStringId(IDC_MANAGE_EXTENSIONS, IDS_SHOW_EXTENSIONS); + AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER); + AddItemWithStringId(IDC_CLEAR_BROWSING_DATA, IDS_CLEAR_BROWSING_DATA); + + AddSeparator(); + + encoding_menu_model_.reset(new EncodingMenuModel(browser)); + AddSubMenuWithStringId(IDC_ENCODING_MENU, IDS_ENCODING_MENU, + encoding_menu_model_.get()); + AddItemWithStringId(IDC_VIEW_SOURCE, IDS_VIEW_SOURCE); + if (g_browser_process->have_inspector_files()) { + AddItemWithStringId(IDC_DEV_TOOLS, IDS_DEV_TOOLS); + AddItemWithStringId(IDC_DEV_TOOLS_CONSOLE, IDS_DEV_TOOLS_CONSOLE); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// WrenchMenuModel + +WrenchMenuModel::WrenchMenuModel(menus::SimpleMenuModel::Delegate* delegate, + Browser* browser) + : menus::SimpleMenuModel(delegate), + browser_(browser) { + Build(); +} + +WrenchMenuModel::~WrenchMenuModel() { +} + +bool WrenchMenuModel::IsLabelDynamicAt(int index) const { + return IsDynamicItem(index) || SimpleMenuModel::IsLabelDynamicAt(index); +} + +string16 WrenchMenuModel::GetLabelAt(int index) const { + if (!IsDynamicItem(index)) + return SimpleMenuModel::GetLabelAt(index); + + int command_id = GetCommandIdAt(index); + + switch (command_id) { + case IDC_ABOUT: + return GetAboutEntryMenuLabel(); + case IDC_SYNC_BOOKMARKS: + return GetSyncMenuLabel(); + 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::Build() { + AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); + AddItemWithStringId(IDC_NEW_WINDOW, IDS_NEW_WINDOW); + AddItemWithStringId(IDC_NEW_INCOGNITO_WINDOW, IDS_NEW_INCOGNITO_WINDOW); + + AddSeparator(); + CreateCutCopyPaste(); + AddSeparator(); + CreateZoomFullscreen(); + AddSeparator(); + AddItemWithStringId(IDC_SAVE_PAGE, IDS_SAVE_PAGE); + AddItemWithStringId(IDC_FIND, IDS_FIND); + AddItemWithStringId(IDC_PRINT, IDS_PRINT); + + tools_menu_model_.reset(new ToolsMenuModel(delegate(), browser_)); + AddSubMenuWithStringId(IDC_ZOOM_MENU, IDS_TOOLS_MENU, + tools_menu_model_.get()); + + AddSeparator(); + AddItemWithStringId(IDC_SHOW_BOOKMARK_MANAGER, IDS_BOOKMARK_MANAGER); + AddItemWithStringId(IDC_SHOW_HISTORY, IDS_SHOW_HISTORY); + AddItemWithStringId(IDC_SHOW_DOWNLOADS, IDS_SHOW_DOWNLOADS); + AddSeparator(); + +#if defined(OS_MACOSX) + AddItemWithStringId(IDC_OPTIONS, IDS_PREFERENCES_MAC); +#else + AddItemWithStringId(IDC_OPTIONS, IDS_OPTIONS); +#endif + + AddItemWithStringId(IDC_HELP_PAGE, IDS_HELP_PAGE); + if (browser_defaults::kShowExitMenuItem) { + AddSeparator(); +#if defined(OS_CHROMEOS) + AddItemWithStringId(IDC_EXIT, IDS_SIGN_OUT); +#else + AddItemWithStringId(IDC_EXIT, IDS_EXIT); +#endif + } +} + +void WrenchMenuModel::CreateCutCopyPaste() { + AddItemWithStringId(IDC_CUT, IDS_CUT); + AddItemWithStringId(IDC_COPY, IDS_COPY); + AddItemWithStringId(IDC_PASTE, IDS_PASTE); +} + +void WrenchMenuModel::CreateZoomFullscreen() { + AddItemWithStringId(IDC_ZOOM_PLUS, IDS_ZOOM_PLUS); + AddItemWithStringId(IDC_ZOOM_MINUS, IDS_ZOOM_MINUS); + AddItemWithStringId(IDC_FULLSCREEN, IDS_FULLSCREEN); +} + +string16 WrenchMenuModel::GetSyncMenuLabel() const { + return sync_ui_util::GetSyncMenuLabel( + browser_->profile()->GetOriginalProfile()->GetProfileSyncService()); +} + +string16 WrenchMenuModel::GetAboutEntryMenuLabel() const { + if (Singleton<UpgradeDetector>::get()->notify_upgrade()) { + return l10n_util::GetStringFUTF16( + IDS_UPDATE_NOW, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); + } + 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; +} diff --git a/chrome/browser/wrench_menu_model.h b/chrome/browser/wrench_menu_model.h new file mode 100644 index 0000000..d010518 --- /dev/null +++ b/chrome/browser/wrench_menu_model.h @@ -0,0 +1,74 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WRENCH_MENU_MODEL_H_ +#define CHROME_BROWSER_WRENCH_MENU_MODEL_H_ + +#include <set> +#include <vector> + +#include "app/menus/simple_menu_model.h" +#include "base/ref_counted.h" +#include "base/scoped_ptr.h" +#include "chrome/browser/user_data_manager.h" + +class Browser; +class EncodingMenuModel; + +class ToolsMenuModel : public menus::SimpleMenuModel { + public: + explicit ToolsMenuModel(menus::SimpleMenuModel::Delegate* delegate, + Browser* browser); + virtual ~ToolsMenuModel(); + + private: + void Build(Browser* browser); + + scoped_ptr<EncodingMenuModel> encoding_menu_model_; + + DISALLOW_COPY_AND_ASSIGN(ToolsMenuModel); +}; + +// A menu model that builds the contents of the wrench menu. +class WrenchMenuModel : public menus::SimpleMenuModel { + public: + explicit WrenchMenuModel(menus::SimpleMenuModel::Delegate* delegate, + Browser* browser); + virtual ~WrenchMenuModel(); + + // Overridden from menus::SimpleMenuModel: + virtual bool IsLabelDynamicAt(int index) const; + virtual string16 GetLabelAt(int index) const; + virtual bool HasIcons() const { return true; } + virtual bool GetIconAt(int index, SkBitmap* icon) const; + + protected: + // Adds the cut/copy/paste items to the menu. The default implementation adds + // three real menu items, while platform specific subclasses add their own + // native monstrosities. + virtual void CreateCutCopyPaste(); + + // Adds the zoom/fullscreen items to the menu. Like CreateCutCopyPaste(). + virtual void CreateZoomFullscreen(); + + private: + void Build(); + + string16 GetSyncMenuLabel() const; + string16 GetAboutEntryMenuLabel() const; + bool IsDynamicItem(int index) const; + + // Profile names that are in profiles_menu_contents_. This is used to + // detect profile change. + std::vector<std::wstring> known_profiles_; + + // Tools menu. + scoped_ptr<ToolsMenuModel> tools_menu_model_; + + Browser* browser_; // weak + + DISALLOW_COPY_AND_ASSIGN(WrenchMenuModel); +}; + +#endif // CHROME_BROWSER_WRENCH_MENU_MODEL_H_ |