blob: 39e303e30c0528ee839c264733f239fff7c6e41e [file] [log] [blame]
// Copyright 2014 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.
#ifndef CHROME_BROWSER_UI_VIEWS_PROFILES_AVATAR_MENU_BUBBLE_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_PROFILES_AVATAR_MENU_BUBBLE_VIEW_H_
#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "chrome/browser/profiles/avatar_menu_observer.h"
#include "ui/views/bubble/bubble_delegate.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/link_listener.h"
class AvatarMenu;
class Browser;
class ProfileItemView;
namespace content {
class WebContents;
}
namespace views {
class CustomButton;
class ImageView;
class Label;
class Link;
class Separator;
}
// This bubble view is displayed when the user clicks on the avatar button.
// It displays a list of profiles and allows users to switch between profiles.
class AvatarMenuBubbleView : public views::BubbleDelegateView,
public views::ButtonListener,
public views::LinkListener,
public AvatarMenuObserver {
public:
// Helper function to show the bubble and ensure that it doesn't reshow.
// Normally this bubble is shown when there's a mouse down event on a button.
// If the bubble is already showing when the user clicks on the button then
// this will cause two things to happen:
// - (1) the button will show a new instance of the bubble
// - (2) the old instance of the bubble will get a deactivate event and
// close
// To prevent this reshow this function checks if an instance of the bubble
// is already showing and do nothing. This means that (1) will do nothing
// and (2) will correctly hide the old bubble instance.
static void ShowBubble(views::View* anchor_view,
views::BubbleBorder::Arrow arrow,
views::BubbleBorder::ArrowPaintType arrow_paint_type,
views::BubbleBorder::BubbleAlignment border_alignment,
const gfx::Rect& anchor_rect,
Browser* browser);
static bool IsShowing();
static void Hide();
virtual ~AvatarMenuBubbleView();
// views::View implementation.
virtual gfx::Size GetPreferredSize() const override;
virtual void Layout() override;
virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
// views::ButtonListener implementation.
virtual void ButtonPressed(views::Button* sender,
const ui::Event& event) override;
// views::LinkListener implementation.
virtual void LinkClicked(views::Link* source, int event_flags) override;
// BubbleDelegate implementation.
virtual gfx::Rect GetAnchorRect() const override;
virtual void Init() override;
virtual void WindowClosing() override;
// AvatarMenuObserver implementation.
virtual void OnAvatarMenuChanged(
AvatarMenu* avatar_menu) override;
// We normally close the bubble any time it becomes inactive but this can lead
// to flaky tests where unexpected UI events are triggering this behavior.
// Tests should call this with "false" for more consistent operation.
static void clear_close_on_deactivate_for_testing() {
close_on_deactivate_for_testing_ = false;
}
private:
AvatarMenuBubbleView(views::View* anchor_view,
views::BubbleBorder::Arrow arrow,
const gfx::Rect& anchor_rect,
Browser* browser);
// Sets the colors on all the |item_views_|. Called after the
// BubbleDelegateView is created and has loaded the colors from the
// NativeTheme.
void SetBackgroundColors();
// Create the menu contents for a normal profile.
void InitMenuContents(AvatarMenu* avatar_menu);
// Create the supervised user specific contents of the menu.
void InitSupervisedUserContents(AvatarMenu* avatar_menu);
scoped_ptr<AvatarMenu> avatar_menu_;
gfx::Rect anchor_rect_;
Browser* browser_;
std::vector<ProfileItemView*> item_views_;
// Used to separate the link entry in the avatar menu from the other entries.
views::Separator* separator_;
// This will be non-NULL if and only if
// avatar_menu_->ShouldShowAddNewProfileLink() returns true. See
// OnAvatarMenuChanged().
views::View* buttons_view_;
// This will be non-NULL if and only if |expanded_| is false and
// avatar_menu_->GetSupervisedUserInformation() returns a non-empty string.
// See OnAvatarMenuChanged().
views::Label* supervised_user_info_;
views::ImageView* icon_view_;
views::Separator* separator_switch_users_;
views::Link* switch_profile_link_;
static AvatarMenuBubbleView* avatar_bubble_;
static bool close_on_deactivate_for_testing_;
// Is set to true if the supervised user has clicked on Switch Users.
bool expanded_;
DISALLOW_COPY_AND_ASSIGN(AvatarMenuBubbleView);
};
#endif // CHROME_BROWSER_UI_VIEWS_PROFILES_AVATAR_MENU_BUBBLE_VIEW_H_