Index: chrome/browser/views/toolbar_view.cc |
=================================================================== |
--- chrome/browser/views/toolbar_view.cc (revision 6272) |
+++ chrome/browser/views/toolbar_view.cc (working copy) |
@@ -19,6 +19,7 @@ |
#include "chrome/browser/navigation_controller.h" |
#include "chrome/browser/navigation_entry.h" |
#include "chrome/browser/profile.h" |
+#include "chrome/browser/user_data_manager.h" |
#include "chrome/browser/user_metrics.h" |
#include "chrome/browser/views/dom_view.h" |
#include "chrome/browser/views/go_button.h" |
@@ -74,7 +75,9 @@ |
profile_(NULL), |
acc_focused_view_(NULL), |
browser_(browser), |
- tab_(NULL) { |
+ tab_(NULL), |
+ profiles_helper_(new GetProfilesHelper(this)), |
+ profiles_menu_(NULL) { |
back_menu_model_.reset(new BackForwardMenuModel( |
browser, BackForwardMenuModel::BACKWARD_MENU_DELEGATE)); |
forward_menu_model_.reset(new BackForwardMenuModel( |
@@ -87,6 +90,7 @@ |
} |
BrowserToolbarView::~BrowserToolbarView() { |
+ profiles_helper_->OnDelegateDeleted(); |
} |
void BrowserToolbarView::Init(Profile* profile) { |
@@ -538,6 +542,16 @@ |
l10n_util::GetString(IDS_NEWWINDOW)); |
menu.AppendMenuItemWithLabel(IDC_GOOFFTHERECORD, |
l10n_util::GetString(IDS_GOOFFTHERECORD)); |
+ |
+ // Enumerate profiles asynchronously and then create the parent menu item |
+ // "Open new window in profile...". We will create the child menu items for |
+ // this once the asynchronous call is done. See OnGetProfilesDone. |
+ profiles_helper_->GetProfiles(NULL); |
+ Menu* profiles_menu = menu.AppendSubMenu( |
+ IDC_NEWPROFILEWINDOW, |
+ l10n_util::GetString(IDS_NEWPROFILEWINDOW)); |
+ profiles_menu_ = profiles_menu; |
+ |
menu.AppendSeparator(); |
menu.AppendMenuItemWithLabel(IDC_SHOW_BOOKMARKS_BAR, |
l10n_util::GetString(IDS_SHOW_BOOKMARK_BAR)); |
@@ -565,6 +579,9 @@ |
menu.AppendMenuItemWithLabel(IDC_EXIT, l10n_util::GetString(IDS_EXIT)); |
menu.RunMenuAt(pt.x, pt.y); |
+ |
+ // Menu is going away, so set the profiles menu pointer to NULL. |
+ profiles_menu_ = NULL; |
} |
bool BrowserToolbarView::IsItemChecked(int id) const { |
@@ -590,6 +607,39 @@ |
} |
} |
+void BrowserToolbarView::OnGetProfilesDone( |
+ const std::vector<std::wstring>& profiles) { |
+ // Nothing to do if the menu has gone away. |
+ if (!profiles_menu_) |
+ return; |
+ |
+ // Store the latest list of profiles in the browser. |
+ browser_->set_user_data_dir_profiles(profiles); |
+ |
+ // Number of sub menu items that we can show directly. |
+ const int sub_items_count = IDC_NEWPROFILEWINDOW_MAX_ID - |
+ IDC_NEWPROFILEWINDOW_MIN_ID + 1; |
+ std::vector<std::wstring>::const_iterator iter = profiles.begin(); |
+ // Add direct sub menu items for profiles. |
+ for (int i = IDC_NEWPROFILEWINDOW_MIN_ID; |
+ i <= IDC_NEWPROFILEWINDOW_MAX_ID && iter != profiles.end(); |
+ ++i, ++iter) { |
+ profiles_menu_->AppendMenuItemWithLabel(i, *iter); |
+ } |
+ // If there are more profiles then show "Other" link. |
+ if (iter != profiles.end()) { |
+ profiles_menu_->AppendSeparator(); |
+ profiles_menu_->AppendMenuItemWithLabel( |
+ IDC_SELECT_PROFILE, |
+ l10n_util::GetString(IDS_NEWPROFILEWINDOW_OTHERPROFILE)); |
+ } |
+ // Always show a link to select a new profile. |
+ profiles_menu_->AppendSeparator(); |
+ profiles_menu_->AppendMenuItemWithLabel( |
+ IDC_NEW_PROFILE, |
+ l10n_util::GetString(IDS_SELECT_PROFILE_DIALOG_NEW_PROFILE_ENTRY)); |
+} |
+ |
bool BrowserToolbarView::GetAccessibleRole(VARIANT* role) { |
DCHECK(role); |
@@ -698,6 +748,19 @@ |
} |
} |
+void BrowserToolbarView::ExecuteCommand(int id) { |
+ // If the command id is for one of the sub-menu-items of the new profile |
+ // window menu then we need to get the name of the profile from the menu |
+ // item id and then pass on that to the browser to take action. |
+ if (id >= IDC_NEWPROFILEWINDOW_MIN_ID && id <= IDC_NEWPROFILEWINDOW_MAX_ID) { |
+ browser_->NewProfileWindowByIndex(id - IDC_NEWPROFILEWINDOW_MIN_ID); |
+ return; |
+ } |
+ |
+ // For all other menu items, use the method in the base class. |
+ EncodingMenuControllerDelegate::ExecuteCommand(id); |
+} |
+ |
bool BrowserToolbarView::GetAcceleratorInfo(int id, |
views::Accelerator* accel) { |
// The standard Ctrl-X, Ctrl-V and Ctrl-C are not defined as accelerators |