browser_non_client_frame_view.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
6
7#include "chrome/browser/browser_process.h"
8#include "chrome/browser/managed_mode/managed_mode.h"
9#include "chrome/browser/profiles/avatar_menu_model.h"
10#include "chrome/browser/profiles/profile.h"
11#include "chrome/browser/profiles/profile_info_cache.h"
12#include "chrome/browser/profiles/profile_manager.h"
13#include "chrome/browser/ui/views/avatar_menu_button.h"
14#include "chrome/browser/ui/views/frame/browser_view.h"
15#include "grit/theme_resources.h"
16#include "ui/base/resource/resource_bundle.h"
17#include "ui/gfx/image/image.h"
18
19BrowserNonClientFrameView::BrowserNonClientFrameView(BrowserFrame* frame,
20                                                     BrowserView* browser_view)
21    : frame_(frame),
22      browser_view_(browser_view) {
23}
24
25BrowserNonClientFrameView::~BrowserNonClientFrameView() {
26}
27
28void BrowserNonClientFrameView::UpdateAvatarInfo() {
29  if (browser_view_->ShouldShowAvatar()) {
30    if (!avatar_button_.get()) {
31      avatar_button_.reset(
32          new AvatarMenuButton(browser_view_->browser(),
33                               browser_view_->IsOffTheRecord()));
34      AddChildView(avatar_button_.get());
35      frame_->GetRootView()->Layout();
36    }
37  } else if (avatar_button_.get()) {
38    RemoveChildView(avatar_button_.get());
39    avatar_button_.reset();
40    frame_->GetRootView()->Layout();
41  }
42
43  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
44  gfx::Image avatar;
45  string16 text;
46  bool is_gaia_picture = false;
47  if (browser_view_->IsOffTheRecord()) {
48    avatar = rb.GetImageNamed(browser_view_->GetOTRIconResourceID());
49  } else if (ManagedMode::IsInManagedMode()) {
50    avatar = rb.GetImageNamed(IDR_MANAGED_MODE_AVATAR);
51  } else if (AvatarMenuModel::ShouldShowAvatarMenu()) {
52    ProfileInfoCache& cache =
53        g_browser_process->profile_manager()->GetProfileInfoCache();
54    Profile* profile = browser_view_->browser()->profile();
55    size_t index = cache.GetIndexOfProfileWithPath(profile->GetPath());
56    if (index == std::string::npos)
57      return;
58    is_gaia_picture =
59        cache.IsUsingGAIAPictureOfProfileAtIndex(index) &&
60        cache.GetGAIAPictureOfProfileAtIndex(index);
61    avatar = cache.GetAvatarIconOfProfileAtIndex(index);
62    text = cache.GetNameOfProfileAtIndex(index);
63  }
64  if (avatar_button_.get()) {
65    avatar_button_->SetAvatarIcon(avatar, is_gaia_picture);
66    if (!text.empty())
67      avatar_button_->SetText(text);
68  }
69
70  // For popups and panels which don't have the avatar button, we still
71  // need to draw the taskbar decoration.
72  if (AvatarMenuModel::ShouldShowAvatarMenu() ||
73      ManagedMode::IsInManagedMode()) {
74    DrawTaskBarDecoration(frame_->GetNativeWindow(), &avatar);
75  } else {
76    DrawTaskBarDecoration(frame_->GetNativeWindow(), NULL);
77  }
78}
79
80void BrowserNonClientFrameView::VisibilityChanged(views::View* starting_from,
81                                                  bool is_visible) {
82  if (!is_visible)
83    return;
84  // The first time UpdateAvatarInfo() is called the window is not visible so
85  // DrawTaskBarDecoration() has no effect. Therefore we need to call it again
86  // once the window is visible.
87  UpdateAvatarInfo();
88}
89