Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3124)

Unified Diff: chrome/browser/ui/toolbar/wrench_menu_model.cc

Issue 7138002: Add profiles to wrench menu (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Opening windows Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/toolbar/wrench_menu_model.cc
diff --git a/chrome/browser/ui/toolbar/wrench_menu_model.cc b/chrome/browser/ui/toolbar/wrench_menu_model.cc
index 6d97478615b78cb8e533a0621c5fe6e46cda60a5..741d624fa912a0af2ac9785fd13e5faebe32832f 100644
--- a/chrome/browser/ui/toolbar/wrench_menu_model.cc
+++ b/chrome/browser/ui/toolbar/wrench_menu_model.cc
@@ -9,6 +9,7 @@
#include "base/command_line.h"
#include "base/i18n/number_formatting.h"
+#include "base/path_service.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
@@ -17,6 +18,7 @@
#include "chrome/browser/defaults.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/sync/sync_ui_util.h"
#include "chrome/browser/tabs/tab_strip_model.h"
@@ -24,6 +26,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/toolbar/encoding_menu_controller.h"
#include "chrome/browser/upgrade_detector.h"
+#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/profiling.h"
@@ -210,6 +213,111 @@ void BookmarkSubMenuModel::Build(Browser* browser) {
////////////////////////////////////////////////////////////////////////////////
+// ProfilesSubMenuModel
+
+ProfilesSubMenuModel::ProfilesSubMenuModel(
+ ui::SimpleMenuModel::Delegate* delegate, Browser* browser)
+ : SimpleMenuModel(this),
+ browser_(browser),
+ delegate_(delegate) {
+ Build();
+}
+
+void ProfilesSubMenuModel::Build() {
sky 2011/06/10 16:24:14 Rename this Init and have the caller invoke it (ht
sail 2011/06/11 01:27:37 I agree but all the other classes in this file do
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ size_t count = profile_manager->GetNumberOfProfiles();
+ for (size_t i = 0; i < count; ++i) {
+ AddItem(COMMAND_SWITCH_TO_PROFILE + i,
+ profile_manager->GetNameOfProfileAtIndex(i));
+ }
+
+ AddSeparator();
+ AddItemWithStringId(IDC_CREATE_NEW_PROFILE,
sky 2011/06/10 16:24:14 Are you sure you don't want this first? Having the
sail 2011/06/11 01:27:37 This menu will mainly be used for switching betwee
+ IDS_PROFILES_CREATE_NEW_PROFILE_OPTION);
+}
+
+void ProfilesSubMenuModel::ExecuteCommand(int command_id) {
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ size_t index = command_id;
+ if (index < profile_manager->GetNumberOfProfiles()) {
+ FilePath userDataFolder;
+ PathService::Get(chrome::DIR_USER_DATA, &userDataFolder);
+ FilePath profile_path =
+ profile_manager->GetFilePathOfProfileAtIndex(index, userDataFolder);
+
+ if (profile_manager->GetProfileByPath(profile_path)) {
+ OpenWindowWithProfile(profile_path);
+ } else {
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ NewRunnableMethod(this, &ProfilesSubMenuModel::GetProfileOnIOThread,
+ profile_path));
Miranda Callahan 2011/06/11 15:09:08 You don't want to do this on the IO Thread -- see
sail 2011/06/13 19:00:01 Done.
+ }
+ } else {
+ delegate_->ExecuteCommand(command_id);
+ }
+}
+
+void ProfilesSubMenuModel::GetProfileOnIOThread(FilePath profile_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
sky 2011/06/10 16:24:14 Is ProfileManager, Profile and all the classes tha
sail 2011/06/11 01:27:37 The GetProfile() function is meant to be called on
Miranda Callahan 2011/06/11 15:09:08 I am trying to remember a discussion about this, b
sail 2011/06/13 19:00:01 Hey Miranda, we didn't discuss this. I just confus
+ Profile* profile = profile_manager->GetProfile(profile_path);
+ if (profile) {
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &ProfilesSubMenuModel::OpenWindowWithProfile,
+ profile_path));
+ }
+}
+
+void ProfilesSubMenuModel::OpenWindowWithProfile(FilePath profile_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ Profile* profile = profile_manager->GetProfileByPath(profile_path);
+ if (!profile)
+ return;
+
+ Browser* browser = BrowserList::FindAnyBrowser(profile, false);
sky 2011/06/10 16:24:14 Are you sure you don't want FindTabbedBrowser(prof
sail 2011/06/11 01:27:37 Ahh, right. Switched to FindTabbedBrowser(). I don
Miranda Callahan 2011/06/11 15:09:08 Could you rename this FindAnyBrowserWithProfile, t
Miranda Callahan 2011/06/11 15:13:36 nm -- I see that these are existing methods in Bro
+ if (browser) {
+ browser->window()->Activate();
+ } else {
+ Browser::NewWindowWithProfile(profile);
+ }
+}
+
+bool ProfilesSubMenuModel::IsCommandIdChecked(int command_id) const {
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ size_t index = command_id;
+ if (index < profile_manager->GetNumberOfProfiles()) {
+ FilePath userDataFolder;
+ PathService::Get(chrome::DIR_USER_DATA, &userDataFolder);
+ FilePath profile_path =
+ profile_manager->GetFilePathOfProfileAtIndex(index, userDataFolder);
+
+ return browser_->GetProfile()->GetPath() == profile_path;
+ }
+ return delegate_->IsCommandIdChecked(command_id);
+}
+
+bool ProfilesSubMenuModel::IsCommandIdEnabled(int command_id) const {
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ size_t index = command_id;
+ if (index < profile_manager->GetNumberOfProfiles())
+ return true;
+ return delegate_->IsCommandIdEnabled(command_id);
+}
+
+bool ProfilesSubMenuModel::GetAcceleratorForCommandId(
+ int command_id,
+ ui::Accelerator* accelerator) {
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ size_t index = command_id;
+ if (index < profile_manager->GetNumberOfProfiles())
+ return false;
+ return delegate_->GetAcceleratorForCommandId(command_id, accelerator);
+}
+
+////////////////////////////////////////////////////////////////////////////////
// WrenchMenuModel
WrenchMenuModel::WrenchMenuModel(ui::AcceleratorProvider* provider,
@@ -227,6 +335,8 @@ WrenchMenuModel::WrenchMenuModel(ui::AcceleratorProvider* provider,
Source<HostZoomMap>(browser_->profile()->GetHostZoomMap()));
registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED,
NotificationService::AllSources());
+ registrar_.Add(this, NotificationType::PROFILE_ADDED,
+ NotificationService::AllSources());
}
WrenchMenuModel::~WrenchMenuModel() {
@@ -304,7 +414,14 @@ bool WrenchMenuModel::GetIconForCommandId(int command_id,
}
void WrenchMenuModel::ExecuteCommand(int command_id) {
- browser_->ExecuteCommand(command_id);
+ switch (command_id) {
+ case IDC_CREATE_NEW_PROFILE:
+ ProfileManager::CreateMultiProfileAsync();
+ break;
+ default:
+ browser_->ExecuteCommand(command_id);
+ break;
+ }
}
bool WrenchMenuModel::IsCommandIdChecked(int command_id) const {
@@ -318,11 +435,15 @@ bool WrenchMenuModel::IsCommandIdChecked(int command_id) const {
}
bool WrenchMenuModel::IsCommandIdEnabled(int command_id) const {
- if (command_id == IDC_SHOW_BOOKMARK_BAR) {
- return !browser_->profile()->GetPrefs()->IsManagedPreference(
- prefs::kEnableBookmarkBar);
+ switch (command_id) {
+ case IDC_SHOW_BOOKMARK_BAR:
+ return !browser_->profile()->GetPrefs()->IsManagedPreference(
+ prefs::kEnableBookmarkBar);
+ case IDC_CREATE_NEW_PROFILE:
+ return true;
+ default:
+ return browser_->command_updater()->IsCommandEnabled(command_id);
}
- return browser_->command_updater()->IsCommandEnabled(command_id);
}
bool WrenchMenuModel::IsCommandIdVisible(int command_id) const {
@@ -382,6 +503,16 @@ void WrenchMenuModel::Observe(NotificationType type,
case NotificationType::NAV_ENTRY_COMMITTED:
UpdateZoomControls();
break;
+ case NotificationType::PROFILE_ADDED: {
sky 2011/06/10 16:24:14 This will cause problems if the menu is showing. S
sail 2011/06/11 01:27:37 Agreed, removed.
+ int index = GetIndexOfCommandId(IDC_CREATE_NEW_PROFILE);
+ if (index == -1)
+ index = GetIndexOfCommandId(IDC_PROFILE_MENU);
+ if (index != -1) {
+ RemoveItemAt(index);
+ AddProfilesMenuItemAt(index);
+ }
+ break;
+ }
default:
NOTREACHED();
}
@@ -458,6 +589,11 @@ void WrenchMenuModel::Build() {
AddItemWithStringId(IDC_SHOW_DOWNLOADS, IDS_SHOW_DOWNLOADS);
AddSeparator();
+#if !defined(OS_CHROMEOS)
+ AddProfilesMenuItemAt(GetItemCount());
+ AddSeparator();
+#endif
+
#if defined(OS_CHROMEOS)
AddItemWithStringId(IDC_OPTIONS, IDS_SETTINGS);
#elif defined(OS_MACOSX)
@@ -550,3 +686,15 @@ string16 WrenchMenuModel::GetSyncMenuLabel() const {
return sync_ui_util::GetSyncMenuLabel(
browser_->profile()->GetOriginalProfile()->GetProfileSyncService());
}
+
+void WrenchMenuModel::AddProfilesMenuItemAt(int index) {
+ if (g_browser_process->profile_manager()->GetNumberOfProfiles() > 1) {
sky 2011/06/10 16:24:14 Seems weird to me to change the type based on cont
sail 2011/06/11 01:27:37 Yea, we went through this UI in the profile meetin
+ profiles_sub_menu_model_.reset(new ProfilesSubMenuModel(this, browser_));
+ InsertSubMenuWithStringIdAt(index, IDC_PROFILE_MENU, IDS_PROFILES_MENU,
+ profiles_sub_menu_model_.get());
+ } else {
+ profiles_sub_menu_model_.reset();
+ InsertItemWithStringIdAt(index, IDC_CREATE_NEW_PROFILE,
+ IDS_PROFILES_CREATE_NEW_PROFILE_OPTION);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698