tray_user.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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 "ash/system/user/tray_user.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <climits>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/popup_message.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/session_state_delegate.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button_border.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h"
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/range/range.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/text/text_elider.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/insets.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/render_text.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/tray_bubble_view.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/custom_button.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link_listener.h"
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/corewm/shadow_types.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/mouse_watcher.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/painter.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserDetailsVerticalPadding = 5;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserCardVerticalPadding = 10;
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kInactiveUserCardVerticalPadding = 4;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kProfileRoundedCornerRadius = 2;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserIconSize = 27;
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int kUserLabelToIconPadding = 5;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// When a hover border is used, it is starting this many pixels before the icon
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// position.
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kTrayUserTileHoverBorderInset = 10;
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The border color of the user button.
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kBorderColor = 0xffdcdcdc;
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The invisible word joiner character, used as a marker to indicate the start
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and end of the user's display name in the public account user card's text.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char16 kDisplayNameMark[] = { 0x2060, 0 };
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesNormal[] = {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesHovered[] = {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Offsetting the popup message relative to the tray menu.
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kPopupMessageOffset = 25;
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom image view with rounded edges.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RoundedImageView : public views::View {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a new rounded image view with rounded corners of radius
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |corner_radius|. If |active_user| is set, the icon will be drawn in
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // full colors - otherwise it will fade into the background.
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView(int corner_radius, bool active_user);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RoundedImageView();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the image that should be displayed. The image contents is copied to the
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // receiver's image.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetImage(const gfx::ImageSkia& img, const gfx::Size& size);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia image_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia resized_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size image_size_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int corner_radius_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the given user is the active user and the icon should get
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // painted as active.
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool active_user_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RoundedImageView);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The user details shown in public account mode. This is essentially a label
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but with custom painting code as the text is styled with multiple colors and
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// contains a link.
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PublicAccountUserDetails : public views::View,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 public views::LinkListener {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PublicAccountUserDetails(SystemTrayItem* owner, int used_width);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PublicAccountUserDetails();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::LinkListener.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate a preferred size that ensures the label text and the following
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link do not wrap over more than three lines in total for aesthetic reasons
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if possible.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CalculatePreferredSize(SystemTrayItem* owner, int used_width);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 text_;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Link* learn_more_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size preferred_size_;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<gfx::RenderText> lines_;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The button which holds the user card in case of multi profile.
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserCard : public views::CustomButton {
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard(views::ButtonListener* listener, bool active_user);
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~UserCard();
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Called when the border should remain even in the non highlighted state.
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ForceBorderVisible(bool show);
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Check if the item is hovered.
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_hovered_for_test() {return button_hovered_; }
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Change the hover/active state of the "button" when the status changes.
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ShowActive();
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if this is the active user.
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_active_user_;
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if button is hovered.
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool button_hovered_;
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the border should be visible.
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool show_border_;
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserCard);
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserViewMouseWatcherHost : public views::MouseWatcherHost {
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public:
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area)
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     : screen_area_(screen_area) {}
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserViewMouseWatcherHost() {}
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Implementation of MouseWatcherHost.
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool Contains(const gfx::Point& screen_point,
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       views::MouseWatcherHost::MouseEventType type) OVERRIDE {
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   return screen_area_.Contains(screen_point);
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)private:
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect screen_area_;
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserViewMouseWatcherHost);
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The view of a user item.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserView : public views::View,
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::ButtonListener,
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::MouseWatcherListener {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserView(SystemTrayItem* owner,
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           ash::user::LoginStatus login,
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           MultiProfileIndex index);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~UserView();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from MouseWatcherListener:
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void MouseMovedOutOfHost() OVERRIDE;
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TrayUser::TestState GetStateForTest() const;
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect GetBoundsInScreenOfUserButtonForTest();
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::ButtonListener.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddLogoutButton(ash::user::LoginStatus login);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddUserCard(SystemTrayItem* owner, ash::user::LoginStatus login);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a user icon representation for the user card.
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* CreateIconForUserCard(ash::user::LoginStatus login);
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the retail logged in mode.
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInRetailModeUserCardContent();
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the public mode.
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner);
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the menu option to add another user. If |disabled| is set the user
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // cannot actively click on the item.
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ToggleAddUserMenuOption();
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MultiProfileIndex multiprofile_index_;
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The view of the user card.
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* user_card_view_;
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This is the owner system tray item of this view.
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SystemTrayItem* owner_;
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if |user_card_view_| is a |UserView| - otherwise it is only a
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |views::View|.
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_user_card_;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* logout_button_;
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<ash::PopupMessage> popup_message_;
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::Widget> add_menu_option_;
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True when the add user panel is visible but not activatable.
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool add_user_visible_but_disabled_;
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The mouse watcher which takes care of out of window hover events.
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::MouseWatcher> mouse_watcher_;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserView);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The menu item view which gets shown when the user clicks in multi profile
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mode onto the user item.
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AddUserView : public views::CustomButton,
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    public views::ButtonListener {
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The |owner| is the view for which this view gets created. The |listener|
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // will get notified when this item gets clicked.
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView(UserCard* owner, views::ButtonListener* listener);
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~AddUserView();
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the anchor view for a message.
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor() { return anchor_; }
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::ButtonListener.
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View.
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Layout() OVERRIDE;
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional client content for this item.
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddContent();
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the content we create and show.
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* add_user_;
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This listener will get informed when someone clicks on this button.
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::ButtonListener* listener_;
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the owner view of this item.
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard* owner_;
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The anchor view for targetted bubble messages.
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor_;
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AddUserView);
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RoundedImageView::RoundedImageView(int corner_radius, bool active_user)
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : corner_radius_(corner_radius),
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      active_user_(active_user) {}
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RoundedImageView::~RoundedImageView() {}
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::SetImage(const gfx::ImageSkia& img,
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const gfx::Size& size) {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_ = img;
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_size_ = size;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to get the best image quality for the avatar.
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_,
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::ImageOperations::RESIZE_BEST, size);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget() && visible()) {
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SchedulePaint();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RoundedImageView::GetPreferredSize() {
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size(image_size_.width() + GetInsets().width(),
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   image_size_.height() + GetInsets().height());
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::OnPaint(gfx::Canvas* canvas) {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View::OnPaint(canvas);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect image_bounds(size());
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.ClampToCenteredSize(GetPreferredSize());
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.Inset(GetInsets());
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SkScalar kRadius = SkIntToScalar(corner_radius_);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPath path;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius, kRadius);
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPaint paint;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  paint.setAntiAlias(true);
37190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode :
37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       SkXfermode::kLuminosity_Mode);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(),
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          path, paint);
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner,
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   int used_width)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : learn_more_(NULL) {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int inner_padding =
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool rtl = base::i18n::IsRTL();
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_border(views::Border::CreateEmptyBorder(
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kUserDetailsVerticalPadding, rtl ? 0 : inner_padding,
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kUserDetailsVerticalPadding, rtl ? inner_padding : 0));
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the user's display name and wrap it with markers.
38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that since this is a public account it always has to be the primary
38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // user.
39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 display_name =
39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate()->
39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          GetUserDisplayName(0);
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveChars(display_name, kDisplayNameMark, &display_name);
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0];
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the domain managing the device and wrap it with markers.
39690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 domain = UTF8ToUTF16(
39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain());
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveChars(domain, kDisplayNameMark, &domain);
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::i18n::WrapStringWithLTRFormatting(&domain);
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the label text, inserting the display name and domain.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     display_name, domain);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE));
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetUnderline(false);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->set_listener(this);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(learn_more_);
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CalculatePreferredSize(owner, used_width);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::~PublicAccountUserDetails() {}
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::Layout() {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines_.clear();
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect contents_area = GetContentsBounds();
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.IsEmpty())
41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Word-wrap the label text.
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Font font;
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ElideRectangleText(text_, font, contents_area.width(),
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         contents_area.height(), ui::ELIDE_LONG_WORDS, &lines);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loop through the lines, creating a renderer for each.
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point position = contents_area.origin();
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Range display_name(ui::Range::InvalidRange());
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (std::vector<base::string16>::const_iterator it = lines.begin();
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines.end(); ++it) {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::RenderText* line = gfx::RenderText::CreateInstance();
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_UI);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetText(*it);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size size(contents_area.width(), line->GetStringSize().height());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDisplayRect(gfx::Rect(position, size));
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() + size.height());
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set the default text color for the line.
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetColor(kPublicAccountUserCardTextColor);
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If a range of the line contains the user's display name, apply a custom
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // text color to it.
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (display_name.is_empty())
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_start(it->find(kDisplayNameMark));
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!display_name.is_empty()) {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_end(
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          it->find(kDisplayNameMark, display_name.start() + 1));
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Range line_range(0, it->size());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line->ApplyColor(kPublicAccountUserCardNameColor,
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       display_name.Intersect(line_range));
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Update the range for the next line.
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (display_name.end() >= line_range.end())
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_name.set_start(0);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_name = ui::Range::InvalidRange();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines_.push_back(line);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Position the link after the label text, separated by a space. If it does
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not fit onto the last line of the text, wrap the link onto its own line.
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size last_line_size = lines_.back()->GetStringSize();
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int space_width = font.GetStringWidth(ASCIIToUTF16(" "));
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.width() - last_line_size.width() >=
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      space_width + link_size.width()) {
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_x(position.x() + last_line_size.width() + space_width);
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() - last_line_size.height());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  position.set_y(position.y() - learn_more_->GetInsets().top());
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect learn_more_bounds(position, link_size);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_bounds.Intersect(contents_area);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::i18n::IsRTL()) {
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Insets insets = GetInsets();
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    learn_more_bounds.Offset(insets.right() - insets.left(), 0);
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetBoundsRect(learn_more_bounds);
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size PublicAccountUserDetails::GetPreferredSize() {
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return preferred_size_;
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::OnPaint(gfx::Canvas* canvas) {
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ScopedVector<gfx::RenderText>::const_iterator it = lines_.begin();
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines_.end(); ++it) {
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*it)->Draw(canvas);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View::OnPaint(canvas);
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::LinkClicked(views::Link* source,
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           int event_flags) {
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(source, learn_more_);
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->system_tray_delegate()->ShowPublicAccountInfo();
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::CalculatePreferredSize(SystemTrayItem* owner,
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      int used_width) {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Font font;
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int space_width = font.GetStringWidth(ASCIIToUTF16(" "));
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Insets insets = GetInsets();
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::TrayBubbleView* bubble_view =
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      owner->system_tray()->GetSystemBubble()->bubble_view();
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_width = std::max(
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.width(),
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetPreferredSize().width() - (used_width + insets.width()));
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_width = std::min(
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      font.GetStringWidth(text_) + space_width + link_size.width(),
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetMaximumSize().width() - (used_width + insets.width()));
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do a binary search for the minimum width that ensures no more than three
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // lines are needed. The lower bound is the minimum of the current bubble
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // width and the width of the link (as no wrapping is permitted inside the
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link). The upper bound is the maximum of the largest allowed bubble width
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and the sum of the label text and link widths when put on a single line.
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (min_width < max_width) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines.clear();
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int width = (min_width + max_width) / 2;
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const bool too_narrow = ui::ElideRectangleText(
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        text_, font, width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines) != 0;
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int line_count = lines.size();
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!too_narrow && line_count == 3 &&
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            width - font.GetStringWidth(lines.back()) <=
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            space_width + link_size.width()) {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++line_count;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (too_narrow || line_count > 3)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width = width + 1;
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width = width;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate the corresponding height and set the preferred size.
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines.clear();
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ElideRectangleText(
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      text_, font, min_width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines);
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int line_count = lines.size();
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (min_width - font.GetStringWidth(lines.back()) <=
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      space_width + link_size.width()) {
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++line_count;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int line_height = font.GetHeight();
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int link_extra_height = std::max(
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.height() - learn_more_->GetInsets().top() - line_height, 0);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  preferred_size_ = gfx::Size(
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width + insets.width(),
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line_count * line_height + link_extra_height + insets.height());
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bubble_view->SetWidth(preferred_size_.width() + used_width);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::UserCard(views::ButtonListener* listener, bool active_user)
55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : CustomButton(listener),
55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_active_user_(active_user),
55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      button_hovered_(false),
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      show_border_(false) {
55990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
56090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(
56190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::Background::CreateSolidBackground(kBackgroundColor));
56290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
56390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
56490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::~UserCard() {}
56790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ForceBorderVisible(bool show) {
56990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  show_border_ = show;
57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ShowActive();
57190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
57290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
57390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseEntered(const ui::MouseEvent& event) {
57490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
57590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = true;
57690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kHoverBackgroundColor);
57790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
57990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
58090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
58190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseExited(const ui::MouseEvent& event) {
58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
58390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = false;
58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kBackgroundColor);
58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
58690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
58890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
58990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ShowActive() {
59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int width = button_hovered_ || show_border_ ? 1 : 0;
59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateSolidSidedBorder(width, width, width, 1,
59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                   kBorderColor));
59390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SchedulePaint();
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserView::UserView(SystemTrayItem* owner,
59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   ash::user::LoginStatus login,
59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   MultiProfileIndex index)
59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : multiprofile_index_(index),
60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_(NULL),
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner_(owner),
60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_user_card_(false),
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      logout_button_(NULL),
60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_visible_but_disabled_(false) {
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_NE(ash::user::LOGGED_IN_NONE, login);
60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!index) {
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Only the logged in user will have a background. All other users will have
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // to allow the TrayPopupContainer highlighting the menu line.
60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(views::Background::CreateSolidBackground(
61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        login == ash::user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor :
61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               kBackgroundColor));
61290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        kTrayPopupPaddingBetweenItems));
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The logout button must be added before the user card so that the user card
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can correctly calculate the remaining available width.
61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that only the current multiprofile user gets a button.
61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddLogoutButton(!multiprofile_index_ ? login : ash::user::LOGGED_IN_LOCKED);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddUserCard(owner, login);
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserView::~UserView() {}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::MouseMovedOutOfHost() {
62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  popup_message_.reset();
62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset();
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset();
62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState UserView::GetStateForTest() const {
63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return add_user_visible_but_disabled_ ? TrayUser::ACTIVE_BUT_DISABLED :
63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                            TrayUser::ACTIVE;
63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!is_user_card_)
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return TrayUser::SHOWN;
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return static_cast<UserCard*>(user_card_view_)->is_hovered_for_test() ?
64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TrayUser::HOVERED : TrayUser::SHOWN;
64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() {
64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_card_view_);
64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_card_view_->GetBoundsInScreen();
64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size UserView::GetPreferredSize() {
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size size = views::View::GetPreferredSize();
65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user panel will be forced to a certain height.
65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size.set_height(std::max(size.height(),
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             kTrayPopupItemHeight + GetInsets().height()));
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return size;
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int UserView::GetHeightForWidth(int width) {
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return GetPreferredSize().height();
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::Layout() {
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (user_card_view_ && logout_button_) {
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the logout button the space it requests.
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect logout_area = contents_area;
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize());
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.set_x(contents_area.right() - logout_area.width());
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the remaining space to the user card.
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect user_card_area = contents_area;
67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int remaining_width = contents_area.width() - logout_area.width();
67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile case |user_card_view_| and |logout_button_| have to
67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // have the same height.
67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int y = std::min(user_card_area.y(), logout_area.y());
67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int height = std::max(user_card_area.height(), logout_area.height());
67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_y(y);
67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_height(height);
68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_y(y);
68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_height(height);
68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile mode we have also to increase the size of the card by
68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the size of the border to make it overlap with the logout button.
68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_width(std::max(0, remaining_width + 1));
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // To make the logout button symmetrical with the user card we also make
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the button longer by the same size the hover area in front of the icon
68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // got inset.
69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_width(logout_area.width() +
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            kTrayUserTileHoverBorderInset);
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In all other modes we have to make sure that there is enough spacing
69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // between the two.
69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      remaining_width -= kTrayPopupPaddingBetweenItems;
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    user_card_area.set_width(remaining_width);
69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(user_card_area);
69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    logout_button_->SetBoundsRect(logout_area);
70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (user_card_view_) {
70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(contents_area);
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (logout_button_) {
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_button_->SetBoundsRect(contents_area);
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sender == logout_button_) {
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->SignOut();
71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (sender == user_card_view_ &&
71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!multiprofile_index_) {
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ToggleAddUserMenuOption();
71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::SessionStateDelegate* delegate =
71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          ash::Shell::GetInstance()->session_state_delegate();
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      delegate->SwitchActiveUser(delegate->GetUserEmail(multiprofile_index_));
718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Since the user list is about to change the system menu should get
719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // closed.
720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner_->system_tray()->CloseSystemBubble();
72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (add_menu_option_.get() &&
72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             sender == add_menu_option_->GetContentsView()) {
72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Let the user add another account to the session.
72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->ShowUserLogin();
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddLogoutButton(ash::user::LoginStatus login) {
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A user should not be able to modify logged-in state when screen is
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // locked.
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_LOCKED)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 title = ash::user::GetLocalizedSignOutStringForStatus(
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      login, true);
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayPopupLabelButton* logout_button = new TrayPopupLabelButton(this, title);
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button->SetAccessibleName(title);
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button_ = logout_button;
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In public account mode, the logout button border has a custom color.
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_PUBLIC) {
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrayPopupLabelButtonBorder* border =
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<TrayPopupLabelButtonBorder*>(logout_button_->border());
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_NORMAL,
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesNormal));
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_HOVERED,
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_PRESSED,
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(logout_button_);
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddUserCard(SystemTrayItem* owner,
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ash::user::LoginStatus login) {
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateEmptyBorder(
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding, kTrayPopupPaddingHorizontal,
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding, kTrayPopupPaddingHorizontal));
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled() &&
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      login != ash::user::LOGGED_IN_RETAIL_MODE) {
76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new UserCard(this, multiprofile_index_ == 0);
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = true;
77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new views::View();
77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = false;
77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetLayoutManager(new views::BoxLayout(
77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(user_card_view_, 0);
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_RETAIL_MODE) {
78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInRetailModeUserCardContent();
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The entire user card should trigger hover (the inner items get disabled).
78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetEnabled(true);
78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->set_notify_enter_exit_on_child(true);
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_PUBLIC) {
78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInPublicModeUserCardContent(owner);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* icon = CreateIconForUserCard(login);
79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(icon);
79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To allow the border to start before the icon, reduce the size before and
79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // add an inset to the icon to get the spacing.
79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ == 0 &&
79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->set_border(views::Border::CreateEmptyBorder(
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        0, kTrayUserTileHoverBorderInset, 0, 0));
80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_border(views::Border::CreateEmptyBorder(
80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset,
80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal));
80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ash::SessionStateDelegate* delegate =
80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* username = NULL;
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
81290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 user_name_string =
81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        login == ash::user::LOGGED_IN_GUEST ?
81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) :
816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            delegate->GetUserDisplayName(multiprofile_index_);
817eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!user_name_string.empty()) {
818eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      username = new views::Label(user_name_string);
819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      username->SetHorizontalAlignment(gfx::ALIGN_LEFT);
820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* additional = NULL;
82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (login != ash::user::LOGGED_IN_GUEST) {
825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 user_email_string =
826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        login == ash::user::LOGGED_IN_LOCALLY_MANAGED ?
827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            bundle.GetLocalizedString(
828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) :
829eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            UTF8ToUTF16(delegate->GetUserEmail(multiprofile_index_));
830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!user_email_string.empty()) {
831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional = new views::Label(user_email_string);
832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional->SetFont(bundle.GetFont(ui::ResourceBundle::SmallFont));
833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional->SetHorizontalAlignment(gfx::ALIGN_LEFT);
834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Adjust text properties dependent on if it is an active or inactive user.
83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_) {
83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Fade the text of non active users to 50%.
84090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SkColor text_color = additional->enabled_color();
84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2);
84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      additional->SetDisabledColor(text_color);
84490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
84590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      username->SetDisabledColor(text_color);
84690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
84890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (additional && username) {
84990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* details = new views::View;
85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->SetLayoutManager(new views::BoxLayout(
85190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0));
85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(username);
85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(additional);
85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->AddChildView(details);
85590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
85790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(username);
85890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(additional);
86090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
86290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
86390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)views::View* UserView::CreateIconForUserCard(ash::user::LoginStatus login) {
86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
86590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                multiprofile_index_ == 0);
86690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetEnabled(false);
86790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_GUEST) {
86890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->SetImage(
87390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ash::Shell::GetInstance()->session_state_delegate()->
87490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetUserImage(multiprofile_index_),
87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
87690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
87790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return icon;
87890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
88090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInRetailModeUserCardContent() {
88190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* details = new views::Label;
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetText(
88490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL));
88590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->set_border(views::Border::CreateEmptyBorder(0, 4, 0, 1));
88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetHorizontalAlignment(gfx::ALIGN_LEFT);
88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(details);
88890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
89090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) {
89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(
89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      CreateIconForUserCard(ash::user::LOGGED_IN_PUBLIC));
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(new PublicAccountUserDetails(
89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems));
89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::ToggleAddUserMenuOption() {
89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset();
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    mouse_watcher_.reset();
90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    add_menu_option_.reset();
90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note: We do not need to install a global event handler to delete this
90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // item since it will destroyed automatically before the menu / user menu item
90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // gets destroyed..
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_visible_but_disabled_ =
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      session_state_delegate->NumberOfLoggedInUsers() >=
91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          session_state_delegate->GetMaximumNumberOfLoggedInUsers();
91390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset(new views::Widget);
91490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Widget::InitParams params;
91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.type = views::Widget::InitParams::TYPE_TOOLTIP;
91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.keep_on_top = true;
91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.context = this->GetWidget()->GetNativeWindow();
91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.accept_events = true;
91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
920eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
92190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Init(params);
92290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetOpacity(0xFF);
92390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->GetNativeWindow()->set_owned_by_parent(false);
92490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetShadowType(add_menu_option_->GetNativeView(),
92590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                views::corewm::SHADOW_TYPE_NONE);
92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
92790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Position it below our user card.
92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect bounds = user_card_view_->GetBoundsInScreen();
92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bounds.set_y(bounds.y() + bounds.height());
93090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetBounds(bounds);
93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Show the content.
93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView* add_user_view = new AddUserView(
93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      static_cast<UserCard*>(user_card_view_), this);
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetContentsView(add_user_view);
93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetAlwaysOnTop(true);
93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Show();
93890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_visible_but_disabled_) {
93990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
94090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset(new PopupMessage(
94190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER),
94290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER),
94390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        PopupMessage::ICON_WARNING,
94490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        add_user_view->anchor(),
94590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BubbleBorder::TOP_LEFT,
94690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0),
94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        2 * kPopupMessageOffset));
94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Find the screen area which encloses both elements and sets then a mouse
95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // watcher which will close the "menu".
95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect area = user_card_view_->GetBoundsInScreen();
95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  area.set_height(2 * area.height());
95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset(new views::MouseWatcher(
95490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new UserViewMouseWatcherHost(area),
95590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this));
95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_->Start();
95790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener)
96090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : CustomButton(listener_),
96190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_(NULL),
96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      listener_(listener),
96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner_(owner),
96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      anchor_(NULL) {
96590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddContent();
96690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(true);
96790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::~AddUserView() {
97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(false);
97190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size AddUserView::GetPreferredSize() {
97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size();
97590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
97690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AddUserView::GetHeightForWidth(int width) {
97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size().height();
97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::Layout() {
98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetBoundsRect(contents_area);
98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_ == sender)
98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    listener_->ButtonPressed(this, event);
98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else
99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NOTREACHED();
99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::AddContent() {
99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_notify_enter_exit_on_child(true);
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* delegate =
99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool enable = delegate->NumberOfLoggedInUsers() <
99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    delegate->GetMaximumNumberOfLoggedInUsers();
100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
100190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetLayoutManager(new views::FillLayout());
100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_background(views::Background::CreateSolidBackground(kBackgroundColor));
100390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
100490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateSolidBorder(1, kBorderColor));
100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_ = new UserCard(this, enable);
100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->set_border(views::Border::CreateEmptyBorder(
100990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
101090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset,
101190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
101290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset));
101390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
101490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetLayoutManager(new views::BoxLayout(
101590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
101690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(add_user_, 0);
101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the [+] icon which is also the anchor for messages.
101990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
102090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
102190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                true);
102290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  anchor_ = icon;
102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(),
102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gfx::Size(kUserIconSize, kUserIconSize));
102690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(icon);
102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
102890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the command text.
102990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* command_label = new views::Label(
103090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT));
103190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(command_label);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      multiprofile_index_(index),
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_(NULL),
1041b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_(NULL),
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_(NULL),
104390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      label_(NULL),
104490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      separator_shown_(false) {
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayUser::~TrayUser() {
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState TrayUser::GetStateForTest() const {
105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (separator_shown_)
105490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return SEPARATOR;
105590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!user_)
105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return HIDDEN;
105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetStateForTest();
105890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
105990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
106090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const {
106190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_);
106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetBoundsInScreenOfUserButtonForTest();
106390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateTrayView(user::LoginStatus status) {
1066b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK(layout_view_ == NULL);
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the current user gets an icon. All other users will only be
106890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // represented in the tray menu.
106990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_)
107090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1072b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = new views::View();
1073b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_->SetLayoutManager(
1074b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal,
1075b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                           0, 0, kUserLabelToIconPadding));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAfterLoginStatusChange(status);
1077b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return layout_view_;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDefaultView(user::LoginStatus status) {
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(user_ == NULL);
108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int logged_in_users = session_state_delegate->NumberOfLoggedInUsers();
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If there are multiple users logged in, the users will be separated from the
109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // rest of the menu by a separator.
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ ==
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          session_state_delegate->GetMaximumNumberOfLoggedInUsers() &&
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logged_in_users > 1) {
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    separator_shown_ = true;
109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return new views::View();
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Do not show more UserView's then there are logged in users.
110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ >= logged_in_users)
110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
110290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
110390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_ = new tray::UserView(this, status, multiprofile_index_);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return user_;
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDetailedView(user::LoginStatus status) {
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyTrayView() {
1112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = NULL;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  avatar_ = NULL;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label_ = NULL;
111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  separator_shown_ = false;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDefaultView() {
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_ = NULL;
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDetailedView() {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user is represented in the tray.
112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1129b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_label = false;
1130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_avatar = false;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status) {
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_LOCKED:
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_USER:
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_OWNER:
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_PUBLIC:
1136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_LOCALLY_MANAGED:
1139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_label = true;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_GUEST:
114390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      need_avatar = true;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_RETAIL_MODE:
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_KIOSK_APP:
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_NONE:
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if ((need_avatar != (avatar_ != NULL)) ||
1152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      (need_label != (label_ != NULL))) {
1153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->RemoveAllChildViews(true);
1154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_label) {
1155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = new views::Label;
1156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SetupLabelForTray(label_);
1157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(label_);
1158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = NULL;
1160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_avatar) {
116290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius, true);
1163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(avatar_);
1164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      avatar_ = NULL;
1166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (status == user::LOGGED_IN_LOCALLY_MANAGED) {
1171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    label_->SetText(
1172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL));
1173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1174b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (avatar_) {
117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (status == user::LOGGED_IN_GUEST) {
117790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        avatar_->SetImage(*ui::ResourceBundle::GetSharedInstance().
117890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
117990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            gfx::Size(kUserIconSize, kUserIconSize));
118090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      avatar_->SetImage(
118290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
118390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              multiprofile_index_),
118490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          gfx::Size(kUserIconSize, kUserIconSize));
118590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
1186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
119090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Inactive users won't have a layout.
119190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
119290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (alignment == SHELF_ALIGNMENT_BOTTOM ||
1194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      alignment == SHELF_ALIGNMENT_TOP) {
1195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (avatar_) {
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_->set_border(views::Border::CreateEmptyBorder(
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayImageItemHorizontalPaddingBottomAlignment + 2,
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayImageItemHorizontalPaddingBottomAlignment));
1199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      label_->set_border(views::Border::CreateEmptyBorder(
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayLabelItemHorizontalPaddingBottomAlignment,
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayLabelItemHorizontalPaddingBottomAlignment));
1205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal,
1208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
1209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
1210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (avatar_)
1211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SetTrayImageItemBorder(avatar_, alignment);
1212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      label_->set_border(views::Border::CreateEmptyBorder(
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemVerticalPaddingVeriticalAlignment,
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment,
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemVerticalPaddingVeriticalAlignment,
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment));
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kVertical,
1221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::OnUserUpdate() {
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for null to avoid crbug.com/150944.
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (avatar_) {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar_->SetImage(
122990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
123090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            multiprofile_index_),
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1237