Index: chrome/browser/ui/cocoa/profile_menu_controller.mm |
diff --git a/chrome/browser/ui/cocoa/profile_menu_controller.mm b/chrome/browser/ui/cocoa/profile_menu_controller.mm |
deleted file mode 100644 |
index 3ac91ee60cf56aac53f2067a972297011edd81a1..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/profile_menu_controller.mm |
+++ /dev/null |
@@ -1,258 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-#import "chrome/browser/ui/cocoa/profile_menu_controller.h" |
- |
-#include "base/mac/scoped_nsobject.h" |
-#include "base/strings/sys_string_conversions.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/profiles/avatar_menu.h" |
-#include "chrome/browser/profiles/avatar_menu_observer.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/profiles/profile_info_cache.h" |
-#include "chrome/browser/profiles/profile_info_interface.h" |
-#include "chrome/browser/profiles/profile_info_util.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "chrome/browser/profiles/profile_metrics.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/browser_list_observer.h" |
-#include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" |
-#include "grit/generated_resources.h" |
-#include "ui/base/l10n/l10n_util_mac.h" |
-#include "ui/gfx/image/image.h" |
- |
-@interface ProfileMenuController (Private) |
-- (void)initializeMenu; |
-@end |
- |
-namespace ProfileMenuControllerInternal { |
- |
-class Observer : public chrome::BrowserListObserver, |
- public AvatarMenuObserver { |
- public: |
- Observer(ProfileMenuController* controller) : controller_(controller) { |
- BrowserList::AddObserver(this); |
- } |
- |
- virtual ~Observer() { |
- BrowserList::RemoveObserver(this); |
- } |
- |
- // chrome::BrowserListObserver: |
- virtual void OnBrowserAdded(Browser* browser) OVERRIDE {} |
- virtual void OnBrowserRemoved(Browser* browser) OVERRIDE { |
- [controller_ activeBrowserChangedTo:chrome::GetLastActiveBrowser()]; |
- } |
- virtual void OnBrowserSetLastActive(Browser* browser) OVERRIDE { |
- [controller_ activeBrowserChangedTo:browser]; |
- } |
- |
- // AvatarMenuObserver: |
- virtual void OnAvatarMenuChanged(AvatarMenu* menu) OVERRIDE { |
- [controller_ rebuildMenu]; |
- } |
- |
- private: |
- ProfileMenuController* controller_; // Weak; owns this. |
-}; |
- |
-} // namespace ProfileMenuControllerInternal |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-@implementation ProfileMenuController |
- |
-- (id)initWithMainMenuItem:(NSMenuItem*)item { |
- if ((self = [super init])) { |
- mainMenuItem_ = item; |
- |
- base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle: |
- l10n_util::GetNSStringWithFixup(IDS_PROFILES_OPTIONS_GROUP_NAME)]); |
- [mainMenuItem_ setSubmenu:menu]; |
- |
- // This object will be constructed as part of nib loading, which happens |
- // before the message loop starts and g_browser_process is available. |
- // Schedule this on the loop to do work when the browser is ready. |
- [self performSelector:@selector(initializeMenu) |
- withObject:nil |
- afterDelay:0]; |
- } |
- return self; |
-} |
- |
-- (IBAction)switchToProfileFromMenu:(id)sender { |
- menu_->SwitchToProfile([sender tag], false, |
- ProfileMetrics::SWITCH_PROFILE_MENU); |
-} |
- |
-- (IBAction)switchToProfileFromDock:(id)sender { |
- // Explicitly bring to the foreground when taking action from the dock. |
- [NSApp activateIgnoringOtherApps:YES]; |
- menu_->SwitchToProfile([sender tag], false, |
- ProfileMetrics::SWITCH_PROFILE_DOCK); |
-} |
- |
-- (IBAction)editProfile:(id)sender { |
- menu_->EditProfile(menu_->GetActiveProfileIndex()); |
-} |
- |
-- (IBAction)newProfile:(id)sender { |
- menu_->AddNewProfile(ProfileMetrics::ADD_NEW_USER_MENU); |
-} |
- |
-- (BOOL)insertItemsIntoMenu:(NSMenu*)menu |
- atOffset:(NSInteger)offset |
- fromDock:(BOOL)dock { |
- if (!menu_ || !menu_->ShouldShowAvatarMenu()) |
- return NO; |
- |
- if (dock) { |
- NSString* headerName = |
- l10n_util::GetNSStringWithFixup(IDS_PROFILES_OPTIONS_GROUP_NAME); |
- base::scoped_nsobject<NSMenuItem> header( |
- [[NSMenuItem alloc] initWithTitle:headerName |
- action:NULL |
- keyEquivalent:@""]); |
- [header setEnabled:NO]; |
- [menu insertItem:header atIndex:offset++]; |
- } |
- |
- for (size_t i = 0; i < menu_->GetNumberOfItems(); ++i) { |
- const AvatarMenu::Item& itemData = menu_->GetItemAt(i); |
- NSString* name = base::SysUTF16ToNSString(itemData.name); |
- SEL action = dock ? @selector(switchToProfileFromDock:) |
- : @selector(switchToProfileFromMenu:); |
- NSMenuItem* item = [self createItemWithTitle:name |
- action:action]; |
- [item setTag:itemData.menu_index]; |
- if (dock) { |
- [item setIndentationLevel:1]; |
- } else { |
- gfx::Image itemIcon = itemData.icon; |
- // The image might be too large and need to be resized (i.e. if this is |
- // a signed-in user using the GAIA profile photo). |
- if (itemIcon.Width() > profiles::kAvatarIconWidth || |
- itemIcon.Height() > profiles::kAvatarIconHeight) { |
- itemIcon = profiles::GetAvatarIconForWebUI(itemIcon, true); |
- } |
- DCHECK(itemIcon.Width() <= profiles::kAvatarIconWidth); |
- DCHECK(itemIcon.Height() <= profiles::kAvatarIconHeight); |
- [item setImage:itemIcon.ToNSImage()]; |
- [item setState:itemData.active ? NSOnState : NSOffState]; |
- } |
- [menu insertItem:item atIndex:i + offset]; |
- } |
- |
- return YES; |
-} |
- |
-- (BOOL)validateMenuItem:(NSMenuItem*)menuItem { |
- // In guest mode, chrome://settings isn't available, so disallow creating |
- // or editing a profile. |
- Profile* activeProfile = ProfileManager::GetLastUsedProfile(); |
- if (activeProfile->IsGuestSession()) { |
- return [menuItem action] != @selector(newProfile:) && |
- [menuItem action] != @selector(editProfile:); |
- } |
- |
- const AvatarMenu::Item& itemData = menu_->GetItemAt( |
- menu_->GetActiveProfileIndex()); |
- if ([menuItem action] == @selector(switchToProfileFromDock:) || |
- [menuItem action] == @selector(switchToProfileFromMenu:)) { |
- if (!itemData.managed) |
- return YES; |
- |
- return [menuItem tag] == static_cast<NSInteger>(itemData.menu_index); |
- } |
- |
- if ([menuItem action] == @selector(newProfile:)) |
- return !itemData.managed; |
- |
- return YES; |
-} |
- |
-// Private ///////////////////////////////////////////////////////////////////// |
- |
-- (NSMenu*)menu { |
- return [mainMenuItem_ submenu]; |
-} |
- |
-- (void)initializeMenu { |
- observer_.reset(new ProfileMenuControllerInternal::Observer(self)); |
- menu_.reset(new AvatarMenu( |
- &g_browser_process->profile_manager()->GetProfileInfoCache(), |
- observer_.get(), |
- NULL)); |
- menu_->RebuildMenu(); |
- |
- [[self menu] addItem:[NSMenuItem separatorItem]]; |
- |
- NSMenuItem* item = [self createItemWithTitle: |
- l10n_util::GetNSStringWithFixup(IDS_PROFILES_CUSTOMIZE_PROFILE) |
- action:@selector(editProfile:)]; |
- [[self menu] addItem:item]; |
- |
- [[self menu] addItem:[NSMenuItem separatorItem]]; |
- item = [self createItemWithTitle:l10n_util::GetNSStringWithFixup( |
- IDS_PROFILES_CREATE_NEW_PROFILE_OPTION) |
- action:@selector(newProfile:)]; |
- [[self menu] addItem:item]; |
- |
- [self rebuildMenu]; |
-} |
- |
-// Notifies the controller that the active browser has changed and that the |
-// menu item and menu need to be updated to reflect that. |
-- (void)activeBrowserChangedTo:(Browser*)browser { |
- // Tell the menu that the browser has changed. |
- menu_->ActiveBrowserChanged(browser); |
- |
- // If |browser| is NULL, it may be because the current profile was deleted |
- // and there are no other loaded profiles. In this case, calling |
- // |menu_->GetActiveProfileIndex()| may result in a profile being loaded, |
- // which is inappropriate to do on the UI thread. |
- // |
- // An early return provides the desired behavior: |
- // a) If the profile was deleted, the menu would have been rebuilt and no |
- // profile will have a check mark. |
- // b) If the profile was not deleted, but there is no active browser, then |
- // the previous profile will remain checked. |
- if (!browser) |
- return; |
- |
- // In guest mode, there is no active menu item. |
- size_t activeProfileIndex = browser->profile()->IsGuestSession() ? |
- std::string::npos : menu_->GetActiveProfileIndex(); |
- |
- // Update the state for the menu items. |
- for (size_t i = 0; i < menu_->GetNumberOfItems(); ++i) { |
- size_t tag = menu_->GetItemAt(i).menu_index; |
- [[[self menu] itemWithTag:tag] |
- setState:activeProfileIndex == tag ? NSOnState : NSOffState]; |
- } |
-} |
- |
-- (void)rebuildMenu { |
- NSMenu* menu = [self menu]; |
- |
- for (NSMenuItem* item = [menu itemAtIndex:0]; |
- ![item isSeparatorItem]; |
- item = [menu itemAtIndex:0]) { |
- [menu removeItemAtIndex:0]; |
- } |
- |
- BOOL hasContent = [self insertItemsIntoMenu:menu atOffset:0 fromDock:NO]; |
- |
- [mainMenuItem_ setHidden:!hasContent]; |
-} |
- |
-- (NSMenuItem*)createItemWithTitle:(NSString*)title action:(SEL)sel { |
- base::scoped_nsobject<NSMenuItem> item( |
- [[NSMenuItem alloc] initWithTitle:title action:sel keyEquivalent:@""]); |
- [item setTarget:self]; |
- return [item.release() autorelease]; |
-} |
- |
-@end |