browser_non_client_frame_view.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/avatar_menu_model.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/avatar_menu_button.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserNonClientFrameView::BrowserNonClientFrameView(BrowserFrame* frame,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     BrowserView* browser_view)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : frame_(frame),
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_view_(browser_view) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserNonClientFrameView::~BrowserNonClientFrameView() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserNonClientFrameView::UpdateAvatarInfo() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_view_->ShouldShowAvatar()) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!avatar_button_.get()) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_button_.reset(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new AvatarMenuButton(browser_view_->browser(),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               browser_view_->IsOffTheRecord()));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddChildView(avatar_button_.get());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_->GetRootView()->Layout();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (avatar_button_.get()) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveChildView(avatar_button_.get());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar_button_.reset();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_->GetRootView()->Layout();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image avatar;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_gaia_picture = false;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_view_->IsOffTheRecord()) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar = rb.GetImageNamed(browser_view_->GetOTRIconResourceID());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (ManagedMode::IsInManagedMode()) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar = rb.GetImageNamed(IDR_MANAGED_MODE_AVATAR);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (AvatarMenuModel::ShouldShowAvatarMenu()) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProfileInfoCache& cache =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        g_browser_process->profile_manager()->GetProfileInfoCache();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile = browser_view_->browser()->profile();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t index = cache.GetIndexOfProfileWithPath(profile->GetPath());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (index == std::string::npos)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_gaia_picture =
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cache.IsUsingGAIAPictureOfProfileAtIndex(index) &&
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cache.GetGAIAPictureOfProfileAtIndex(index);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar = cache.GetAvatarIconOfProfileAtIndex(index);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = cache.GetNameOfProfileAtIndex(index);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (avatar_button_.get()) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar_button_->SetAvatarIcon(avatar, is_gaia_picture);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!text.empty())
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_button_->SetText(text);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For popups and panels which don't have the avatar button, we still
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to draw the taskbar decoration.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AvatarMenuModel::ShouldShowAvatarMenu() ||
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ManagedMode::IsInManagedMode()) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawTaskBarDecoration(frame_->GetNativeWindow(), &avatar);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawTaskBarDecoration(frame_->GetNativeWindow(), NULL);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserNonClientFrameView::VisibilityChanged(views::View* starting_from,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  bool is_visible) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_visible)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The first time UpdateAvatarInfo() is called the window is not visible so
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DrawTaskBarDecoration() has no effect. Therefore we need to call it again
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once the window is visible.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAvatarInfo();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
89