summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.cc63
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.h2
-rw-r--r--chrome/browser/wrench_menu_model.cc174
-rw-r--r--chrome/browser/wrench_menu_model.h74
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_