summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/profile_menu_controller.mm
blob: f97a092e3cd2d65ed4f51666ed11e125de731554 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright (c) 2011 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/sys_string_conversions.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#import "chrome/browser/ui/cocoa/menu_controller.h"
#include "chrome/browser/ui/profile_menu_model.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util_mac.h"

@interface ProfileMenuController (Private)
- (void)activeBrowserChangedTo:(Browser*)browser;
@end

namespace ProfileMenuControllerInternal {

class Observer : public BrowserList::Observer {
 public:
  Observer(ProfileMenuController* controller) : controller_(controller) {
    BrowserList::AddObserver(this);
  }

  ~Observer() {
    BrowserList::RemoveObserver(this);
  }

  // BrowserList::Observer:
  virtual void OnBrowserAdded(const Browser* browser) {}
  virtual void OnBrowserRemoved(const Browser* browser) {}
  virtual void OnBrowserSetLastActive(const Browser* browser) {
    [controller_ activeBrowserChangedTo:const_cast<Browser*>(browser)];
  }

 private:
  ProfileMenuController* controller_;  // Weak; owns this.
};

}  // namespace ProfileMenuControllerInternal

////////////////////////////////////////////////////////////////////////////////

@implementation ProfileMenuController

- (id)initWithMainMenuItem:(NSMenuItem*)item {
  if ((self = [super init])) {
    mainMenuItem_ = item;
    observer_.reset(new ProfileMenuControllerInternal::Observer(self));
  }
  return self;
}

// Private /////////////////////////////////////////////////////////////////////

// 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 {
  submenuModel_.reset(new ProfileMenuModel(browser));
  submenuController_.reset(
      [[MenuController alloc] initWithModel:submenuModel_.get()
                     useWithPopUpButtonCell:NO]);

  [mainMenuItem_ setSubmenu:[submenuController_ menu]];

  NSMenu* submenu = [mainMenuItem_ submenu];
  if (browser) {
    [submenu setTitle:
        base::SysUTF8ToNSString(browser->profile()->GetProfileName())];
  }

  if (![[submenu title] length])
    [submenu setTitle:l10n_util::GetNSString(IDS_PROFILES_OPTIONS_GROUP_NAME)];
}

@end