| Index: chrome/browser/profiles/avatar_menu_model.cc
|
| diff --git a/chrome/browser/profiles/avatar_menu_model.cc b/chrome/browser/profiles/avatar_menu_model.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..512c1ceca05c0eacfbe176fcf1b8a4a6e916255c
|
| --- /dev/null
|
| +++ b/chrome/browser/profiles/avatar_menu_model.cc
|
| @@ -0,0 +1,128 @@
|
| +// 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.
|
| +
|
| +#include "chrome/browser/profiles/avatar_menu_model.h"
|
| +
|
| +#include "base/stl_util.h"
|
| +#include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/profiles/avatar_menu_model_observer.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/profiles/profile_info_cache.h"
|
| +#include "chrome/browser/profiles/profile_manager.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/browser/ui/browser_window.h"
|
| +#include "chrome/common/chrome_notification_types.h"
|
| +#include "chrome/common/url_constants.h"
|
| +#include "content/common/notification_service.h"
|
| +#include "ui/gfx/image/image.h"
|
| +
|
| +namespace {
|
| +
|
| +class ProfileSwitchObserver : public ProfileManagerObserver {
|
| + public:
|
| + virtual void OnProfileCreated(Profile* profile, Status status) OVERRIDE {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + if (status == STATUS_INITIALIZED) {
|
| + DCHECK(profile);
|
| + Browser* browser = BrowserList::FindTabbedBrowser(profile, false);
|
| + if (browser)
|
| + browser->window()->Activate();
|
| + else
|
| + Browser::NewWindowWithProfile(profile);
|
| + }
|
| + }
|
| +
|
| + virtual bool DeleteAfter() OVERRIDE { return true; }
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +AvatarMenuModel::AvatarMenuModel(ProfileInfoInterface* profile_cache,
|
| + AvatarMenuModelObserver* observer,
|
| + Browser* browser)
|
| + : profile_info_(profile_cache),
|
| + observer_(observer),
|
| + browser_(browser) {
|
| + DCHECK(profile_info_);
|
| + DCHECK(observer_);
|
| + // Don't DCHECK(browser_) so that unit tests can reuse this ctor.
|
| +
|
| + // Register this as an observer of the info cache.
|
| + registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
|
| + NotificationService::AllSources());
|
| +
|
| + // Build the initial menu.
|
| + RebuildMenu();
|
| +}
|
| +
|
| +AvatarMenuModel::~AvatarMenuModel() {
|
| + ClearMenu();
|
| +}
|
| +
|
| +AvatarMenuModel::Item::Item(size_t model_index, const gfx::Image& icon)
|
| + : icon(icon),
|
| + model_index(model_index) {
|
| +}
|
| +
|
| +AvatarMenuModel::Item::~Item() {
|
| +}
|
| +
|
| +void AvatarMenuModel::SwichToProfile(size_t index) {
|
| + const Item& item = GetItemAt(index);
|
| + FilePath path = profile_info_->GetPathOfProfileAtIndex(item.model_index);
|
| +
|
| + // This will be deleted by the manager after the profile is ready.
|
| + ProfileSwitchObserver* observer = new ProfileSwitchObserver();
|
| + g_browser_process->profile_manager()->CreateProfileAsync(
|
| + path, observer);
|
| +}
|
| +
|
| +void AvatarMenuModel::EditProfile(size_t index) {
|
| + DCHECK(browser_);
|
| + browser_->ShowOptionsTab(chrome::kPersonalOptionsSubPage);
|
| +}
|
| +
|
| +void AvatarMenuModel::AddNewProfile() {
|
| + ProfileManager::CreateMultiProfileAsync();
|
| +}
|
| +
|
| +size_t AvatarMenuModel::GetNumberOfItems() {
|
| + return items_.size();
|
| +}
|
| +
|
| +const AvatarMenuModel::Item& AvatarMenuModel::GetItemAt(size_t index) {
|
| + DCHECK_LT(index, items_.size());
|
| + return *items_[index];
|
| +}
|
| +
|
| +void AvatarMenuModel::Observe(int type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| + DCHECK_EQ(chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, type);
|
| + RebuildMenu();
|
| +}
|
| +
|
| +void AvatarMenuModel::RebuildMenu() {
|
| + ClearMenu();
|
| +
|
| + const size_t count = profile_info_->GetNumberOfProfiles();
|
| + for (size_t i = 0; i < count; ++i) {
|
| + Item* item = new Item(i, profile_info_->GetAvatarIconOfProfileAtIndex(i));
|
| + item->name = profile_info_->GetNameOfProfileAtIndex(i);
|
| + if (browser_) {
|
| + FilePath path = profile_info_->GetPathOfProfileAtIndex(i);
|
| + item->active = browser_->profile()->GetPath() == path;
|
| + }
|
| + items_.push_back(item);
|
| + }
|
| +
|
| + observer_->OnAvatarMenuModelChanged();
|
| +}
|
| +
|
| +void AvatarMenuModel::ClearMenu() {
|
| + STLDeleteContainerPointers(items_.begin(), items_.end());
|
| + items_.clear();
|
| +}
|
|
|