tray_user.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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)
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/popup_message.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/session_state_delegate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button_border.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h"
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/range/range.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/text/text_elider.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/insets.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/render_text.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/tray_bubble_view.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/custom_button.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link.h"
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link_listener.h"
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/corewm/shadow_types.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h"
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/mouse_watcher.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/painter.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserDetailsVerticalPadding = 5;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserCardVerticalPadding = 10;
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kInactiveUserCardVerticalPadding = 4;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kProfileRoundedCornerRadius = 2;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserIconSize = 27;
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kUserIconLargeSize = 32;
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kUserIconLargeCornerRadius = 2;
75b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int kUserLabelToIconPadding = 5;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// When a hover border is used, it is starting this many pixels before the icon
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// position.
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kTrayUserTileHoverBorderInset = 10;
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The border color of the user button.
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kBorderColor = 0xffdcdcdc;
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The invisible word joiner character, used as a marker to indicate the start
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and end of the user's display name in the public account user card's text.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char16 kDisplayNameMark[] = { 0x2060, 0 };
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesNormal[] = {
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)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesHovered[] = {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
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_LABEL_BUTTON_HOVER_BACKGROUND,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Offsetting the popup message relative to the tray menu.
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kPopupMessageOffset = 25;
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom image view with rounded edges.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RoundedImageView : public views::View {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a new rounded image view with rounded corners of radius
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |corner_radius|. If |active_user| is set, the icon will be drawn in
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // full colors - otherwise it will fade into the background.
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView(int corner_radius, bool active_user);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RoundedImageView();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the image that should be displayed. The image contents is copied to the
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // receiver's image.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetImage(const gfx::ImageSkia& img, const gfx::Size& size);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Set the radii of the corners independantly.
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void SetCornerRadii(int top_left,
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      int top_right,
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      int bottom_right,
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      int bottom_left);
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia image_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia resized_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size image_size_;
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int corner_radius_[4];
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the given user is the active user and the icon should get
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // painted as active.
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool active_user_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RoundedImageView);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The user details shown in public account mode. This is essentially a label
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but with custom painting code as the text is styled with multiple colors and
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// contains a link.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PublicAccountUserDetails : public views::View,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 public views::LinkListener {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PublicAccountUserDetails(SystemTrayItem* owner, int used_width);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~PublicAccountUserDetails();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::LinkListener.
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate a preferred size that ensures the label text and the following
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link do not wrap over more than three lines in total for aesthetic reasons
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if possible.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CalculatePreferredSize(SystemTrayItem* owner, int used_width);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 text_;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Link* learn_more_;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size preferred_size_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<gfx::RenderText> lines_;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The button which holds the user card in case of multi profile.
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserCard : public views::CustomButton {
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard(views::ButtonListener* listener, bool active_user);
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~UserCard();
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Called when the border should remain even in the non highlighted state.
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ForceBorderVisible(bool show);
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Check if the item is hovered.
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_hovered_for_test() {return button_hovered_; }
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Change the hover/active state of the "button" when the status changes.
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ShowActive();
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if this is the active user.
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_active_user_;
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if button is hovered.
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool button_hovered_;
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if the border should be visible.
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool show_border_;
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserCard);
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserViewMouseWatcherHost : public views::MouseWatcherHost {
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public:
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area)
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     : screen_area_(screen_area) {}
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserViewMouseWatcherHost() {}
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Implementation of MouseWatcherHost.
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool Contains(const gfx::Point& screen_point,
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       views::MouseWatcherHost::MouseEventType type) OVERRIDE {
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   return screen_area_.Contains(screen_point);
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)private:
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect screen_area_;
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserViewMouseWatcherHost);
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The view of a user item.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserView : public views::View,
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::ButtonListener,
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 public views::MouseWatcherListener {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserView(SystemTrayItem* owner,
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           ash::user::LoginStatus login,
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           MultiProfileIndex index);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~UserView();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from MouseWatcherListener:
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void MouseMovedOutOfHost() OVERRIDE;
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TrayUser::TestState GetStateForTest() const;
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect GetBoundsInScreenOfUserButtonForTest();
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View.
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::ButtonListener.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddLogoutButton(ash::user::LoginStatus login);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddUserCard(SystemTrayItem* owner, ash::user::LoginStatus login);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a user icon representation for the user card.
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* CreateIconForUserCard(ash::user::LoginStatus login);
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the retail logged in mode.
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInRetailModeUserCardContent();
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional user card content for the public mode.
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner);
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the menu option to add another user. If |disabled| is set the user
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // cannot actively click on the item.
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ToggleAddUserMenuOption();
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MultiProfileIndex multiprofile_index_;
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The view of the user card.
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* user_card_view_;
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This is the owner system tray item of this view.
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SystemTrayItem* owner_;
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True if |user_card_view_| is a |UserView| - otherwise it is only a
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // |views::View|.
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool is_user_card_;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* logout_button_;
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<ash::PopupMessage> popup_message_;
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::Widget> add_menu_option_;
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // True when the add user panel is visible but not activatable.
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool add_user_visible_but_disabled_;
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The mouse watcher which takes care of out of window hover events.
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<views::MouseWatcher> mouse_watcher_;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UserView);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The menu item view which gets shown when the user clicks in multi profile
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mode onto the user item.
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AddUserView : public views::CustomButton,
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    public views::ButtonListener {
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The |owner| is the view for which this view gets created. The |listener|
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // will get notified when this item gets clicked.
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView(UserCard* owner, views::ButtonListener* listener);
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~AddUserView();
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the anchor view for a message.
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor() { return anchor_; }
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::ButtonListener.
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Overridden from views::View.
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE;
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual int GetHeightForWidth(int width) OVERRIDE;
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Layout() OVERRIDE;
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create the additional client content for this item.
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddContent();
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the content we create and show.
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* add_user_;
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This listener will get informed when someone clicks on this button.
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::ButtonListener* listener_;
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This is the owner view of this item.
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UserCard* owner_;
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The anchor view for targetted bubble messages.
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* anchor_;
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AddUserView);
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RoundedImageView::RoundedImageView(int corner_radius, bool active_user)
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : active_user_(active_user) {
3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (int i = 0; i < 4; ++i)
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    corner_radius_[i] = corner_radius;
3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RoundedImageView::~RoundedImageView() {}
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::SetImage(const gfx::ImageSkia& img,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const gfx::Size& size) {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_ = img;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_size_ = size;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to get the best image quality for the avatar.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_,
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::ImageOperations::RESIZE_BEST, size);
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWidget() && visible()) {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SchedulePaint();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RoundedImageView::SetCornerRadii(int top_left,
3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      int top_right,
3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      int bottom_right,
3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      int bottom_left) {
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[0] = top_left;
3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[1] = top_right;
3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[2] = bottom_right;
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corner_radius_[3] = bottom_left;
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RoundedImageView::GetPreferredSize() {
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size(image_size_.width() + GetInsets().width(),
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   image_size_.height() + GetInsets().height());
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::OnPaint(gfx::Canvas* canvas) {
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View::OnPaint(canvas);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect image_bounds(size());
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.ClampToCenteredSize(GetPreferredSize());
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  image_bounds.Inset(GetInsets());
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const SkScalar kRadius[8] = {
3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[0]),
3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[0]),
3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[1]),
3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[1]),
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[2]),
3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[2]),
3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[3]),
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkIntToScalar(corner_radius_[3])
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPath path;
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius);
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkPaint paint;
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  paint.setAntiAlias(true);
40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode :
40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       SkXfermode::kLuminosity_Mode);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(),
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          path, paint);
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   int used_width)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : learn_more_(NULL) {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int inner_padding =
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool rtl = base::i18n::IsRTL();
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_border(views::Border::CreateEmptyBorder(
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kUserDetailsVerticalPadding, rtl ? 0 : inner_padding,
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kUserDetailsVerticalPadding, rtl ? inner_padding : 0));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the user's display name and wrap it with markers.
41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that since this is a public account it always has to be the primary
41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // user.
42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 display_name =
42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate()->
42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          GetUserDisplayName(0);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveChars(display_name, kDisplayNameMark, &display_name);
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0];
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the domain managing the device and wrap it with markers.
42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 domain = UTF8ToUTF16(
42790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain());
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveChars(domain, kDisplayNameMark, &domain);
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::i18n::WrapStringWithLTRFormatting(&domain);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieve the label text, inserting the display name and domain.
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL,
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     display_name, domain);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE));
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetUnderline(false);
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->set_listener(this);
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(learn_more_);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CalculatePreferredSize(owner, used_width);
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::~PublicAccountUserDetails() {}
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::Layout() {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines_.clear();
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect contents_area = GetContentsBounds();
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.IsEmpty())
44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Word-wrap the label text.
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Font font;
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ElideRectangleText(text_, font, contents_area.width(),
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         contents_area.height(), ui::ELIDE_LONG_WORDS, &lines);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loop through the lines, creating a renderer for each.
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point position = contents_area.origin();
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Range display_name(ui::Range::InvalidRange());
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (std::vector<base::string16>::const_iterator it = lines.begin();
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines.end(); ++it) {
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::RenderText* line = gfx::RenderText::CreateInstance();
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_UI);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetText(*it);
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size size(contents_area.width(), line->GetStringSize().height());
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetDisplayRect(gfx::Rect(position, size));
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() + size.height());
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set the default text color for the line.
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    line->SetColor(kPublicAccountUserCardTextColor);
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If a range of the line contains the user's display name, apply a custom
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // text color to it.
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (display_name.is_empty())
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_start(it->find(kDisplayNameMark));
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!display_name.is_empty()) {
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_name.set_end(
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          it->find(kDisplayNameMark, display_name.start() + 1));
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Range line_range(0, it->size());
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line->ApplyColor(kPublicAccountUserCardNameColor,
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       display_name.Intersect(line_range));
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Update the range for the next line.
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (display_name.end() >= line_range.end())
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_name.set_start(0);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_name = ui::Range::InvalidRange();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines_.push_back(line);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Position the link after the label text, separated by a space. If it does
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not fit onto the last line of the text, wrap the link onto its own line.
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size last_line_size = lines_.back()->GetStringSize();
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int space_width = font.GetStringWidth(ASCIIToUTF16(" "));
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_area.width() - last_line_size.width() >=
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      space_width + link_size.width()) {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_x(position.x() + last_line_size.width() + space_width);
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    position.set_y(position.y() - last_line_size.height());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  position.set_y(position.y() - learn_more_->GetInsets().top());
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect learn_more_bounds(position, link_size);
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_bounds.Intersect(contents_area);
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::i18n::IsRTL()) {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Insets insets = GetInsets();
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    learn_more_bounds.Offset(insets.right() - insets.left(), 0);
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  learn_more_->SetBoundsRect(learn_more_bounds);
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size PublicAccountUserDetails::GetPreferredSize() {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return preferred_size_;
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::OnPaint(gfx::Canvas* canvas) {
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ScopedVector<gfx::RenderText>::const_iterator it = lines_.begin();
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != lines_.end(); ++it) {
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*it)->Draw(canvas);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View::OnPaint(canvas);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::LinkClicked(views::Link* source,
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           int event_flags) {
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(source, learn_more_);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->system_tray_delegate()->ShowPublicAccountInfo();
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::CalculatePreferredSize(SystemTrayItem* owner,
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      int used_width) {
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Font font;
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size link_size = learn_more_->GetPreferredSize();
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int space_width = font.GetStringWidth(ASCIIToUTF16(" "));
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Insets insets = GetInsets();
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::TrayBubbleView* bubble_view =
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      owner->system_tray()->GetSystemBubble()->bubble_view();
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_width = std::max(
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.width(),
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetPreferredSize().width() - (used_width + insets.width()));
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_width = std::min(
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      font.GetStringWidth(text_) + space_width + link_size.width(),
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bubble_view->GetMaximumSize().width() - (used_width + insets.width()));
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do a binary search for the minimum width that ensures no more than three
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // lines are needed. The lower bound is the minimum of the current bubble
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // width and the width of the link (as no wrapping is permitted inside the
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // link). The upper bound is the maximum of the largest allowed bubble width
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and the sum of the label text and link widths when put on a single line.
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> lines;
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (min_width < max_width) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines.clear();
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int width = (min_width + max_width) / 2;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const bool too_narrow = ui::ElideRectangleText(
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        text_, font, width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines) != 0;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int line_count = lines.size();
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!too_narrow && line_count == 3 &&
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            width - font.GetStringWidth(lines.back()) <=
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            space_width + link_size.width()) {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++line_count;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (too_narrow || line_count > 3)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width = width + 1;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width = width;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate the corresponding height and set the preferred size.
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lines.clear();
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ElideRectangleText(
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      text_, font, min_width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines);
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int line_count = lines.size();
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (min_width - font.GetStringWidth(lines.back()) <=
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      space_width + link_size.width()) {
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++line_count;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int line_height = font.GetHeight();
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int link_extra_height = std::max(
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      link_size.height() - learn_more_->GetInsets().top() - line_height, 0);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  preferred_size_ = gfx::Size(
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      min_width + insets.width(),
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      line_count * line_height + link_extra_height + insets.height());
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bubble_view->SetWidth(preferred_size_.width() + used_width);
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::UserCard(views::ButtonListener* listener, bool active_user)
58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : CustomButton(listener),
58690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_active_user_(active_user),
58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      button_hovered_(false),
58890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      show_border_(false) {
58990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(
59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::Background::CreateSolidBackground(kBackgroundColor));
59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
59390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::~UserCard() {}
59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ForceBorderVisible(bool show) {
59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  show_border_ = show;
60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ShowActive();
60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseEntered(const ui::MouseEvent& event) {
60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
60590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = true;
60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kHoverBackgroundColor);
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseExited(const ui::MouseEvent& event) {
61290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_active_user_) {
61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    button_hovered_ = false;
61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    background()->SetNativeControlColor(kBackgroundColor);
61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ShowActive();
61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ShowActive() {
62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int width = button_hovered_ || show_border_ ? 1 : 0;
62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateSolidSidedBorder(width, width, width, 1,
62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                   kBorderColor));
62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SchedulePaint();
62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserView::UserView(SystemTrayItem* owner,
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   ash::user::LoginStatus login,
62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   MultiProfileIndex index)
62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : multiprofile_index_(index),
63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_(NULL),
631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner_(owner),
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      is_user_card_(false),
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      logout_button_(NULL),
63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_visible_but_disabled_(false) {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK_NE(ash::user::LOGGED_IN_NONE, login);
63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!index) {
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Only the logged in user will have a background. All other users will have
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // to allow the TrayPopupContainer highlighting the menu line.
63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_background(views::Background::CreateSolidBackground(
64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        login == ash::user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor :
64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               kBackgroundColor));
64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0,
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        kTrayPopupPaddingBetweenItems));
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The logout button must be added before the user card so that the user card
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can correctly calculate the remaining available width.
64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note that only the current multiprofile user gets a button.
64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddLogoutButton(!multiprofile_index_ ? login : ash::user::LOGGED_IN_LOCKED);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddUserCard(owner, login);
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserView::~UserView() {}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::MouseMovedOutOfHost() {
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  popup_message_.reset();
65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset();
65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset();
65890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState UserView::GetStateForTest() const {
66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return add_user_visible_but_disabled_ ? TrayUser::ACTIVE_BUT_DISABLED :
66390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                            TrayUser::ACTIVE;
66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!is_user_card_)
66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return TrayUser::SHOWN;
66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return static_cast<UserCard*>(user_card_view_)->is_hovered_for_test() ?
67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TrayUser::HOVERED : TrayUser::SHOWN;
67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() {
67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_card_view_);
67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_card_view_->GetBoundsInScreen();
67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size UserView::GetPreferredSize() {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size size = views::View::GetPreferredSize();
68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user panel will be forced to a certain height.
68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size.set_height(std::max(size.height(),
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             kTrayPopupItemHeight + GetInsets().height()));
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return size;
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int UserView::GetHeightForWidth(int width) {
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return GetPreferredSize().height();
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::Layout() {
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (user_card_view_ && logout_button_) {
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the logout button the space it requests.
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect logout_area = contents_area;
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize());
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_area.set_x(contents_area.right() - logout_area.width());
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the remaining space to the user card.
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect user_card_area = contents_area;
70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int remaining_width = contents_area.width() - logout_area.width();
70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile case |user_card_view_| and |logout_button_| have to
70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // have the same height.
70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int y = std::min(user_card_area.y(), logout_area.y());
70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int height = std::max(user_card_area.height(), logout_area.height());
70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_y(y);
70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_height(height);
71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_y(y);
71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_height(height);
71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In multiprofile mode we have also to increase the size of the card by
71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the size of the border to make it overlap with the logout button.
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_area.set_width(std::max(0, remaining_width + 1));
71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // To make the logout button symmetrical with the user card we also make
71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the button longer by the same size the hover area in front of the icon
71990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // got inset.
72090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logout_area.set_width(logout_area.width() +
72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            kTrayUserTileHoverBorderInset);
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // In all other modes we have to make sure that there is enough spacing
72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // between the two.
72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      remaining_width -= kTrayPopupPaddingBetweenItems;
72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    user_card_area.set_width(remaining_width);
72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(user_card_area);
72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    logout_button_->SetBoundsRect(logout_area);
73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (user_card_view_) {
73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->SetBoundsRect(contents_area);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (logout_button_) {
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logout_button_->SetBoundsRect(contents_area);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (sender == logout_button_) {
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->SignOut();
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (sender == user_card_view_ &&
74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!multiprofile_index_) {
74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ToggleAddUserMenuOption();
74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::SessionStateDelegate* delegate =
74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          ash::Shell::GetInstance()->session_state_delegate();
74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      delegate->SwitchActiveUser(delegate->GetUserEmail(multiprofile_index_));
748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Since the user list is about to change the system menu should get
749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // closed.
750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      owner_->system_tray()->CloseSystemBubble();
75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (add_menu_option_.get() &&
75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             sender == add_menu_option_->GetContentsView()) {
75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Let the user add another account to the session.
75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->ShowUserLogin();
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddLogoutButton(ash::user::LoginStatus login) {
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A user should not be able to modify logged-in state when screen is
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // locked.
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_LOCKED)
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 title = ash::user::GetLocalizedSignOutStringForStatus(
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      login, true);
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayPopupLabelButton* logout_button = new TrayPopupLabelButton(this, title);
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button->SetAccessibleName(title);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logout_button_ = logout_button;
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In public account mode, the logout button border has a custom color.
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_PUBLIC) {
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrayPopupLabelButtonBorder* border =
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<TrayPopupLabelButtonBorder*>(logout_button_->border());
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_NORMAL,
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesNormal));
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_HOVERED,
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    border->SetPainter(false, views::Button::STATE_PRESSED,
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       views::Painter::CreateImageGridPainter(
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           kPublicAccountLogoutButtonBorderImagesHovered));
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(logout_button_);
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddUserCard(SystemTrayItem* owner,
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ash::user::LoginStatus login) {
79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
79290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateEmptyBorder(
79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding, kTrayPopupPaddingHorizontal,
79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding, kTrayPopupPaddingHorizontal));
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled() &&
79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      login != ash::user::LOGGED_IN_RETAIL_MODE) {
79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new UserCard(this, multiprofile_index_ == 0);
79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = true;
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_ = new views::View();
80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    is_user_card_ = false;
80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetLayoutManager(new views::BoxLayout(
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(user_card_view_, 0);
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_RETAIL_MODE) {
81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInRetailModeUserCardContent();
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The entire user card should trigger hover (the inner items get disabled).
81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->SetEnabled(true);
81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->set_notify_enter_exit_on_child(true);
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_PUBLIC) {
81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AddLoggedInPublicModeUserCardContent(owner);
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::View* icon = CreateIconForUserCard(login);
82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(icon);
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To allow the border to start before the icon, reduce the size before and
82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // add an inset to the icon to get the spacing.
82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ == 0 &&
82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) {
83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->set_border(views::Border::CreateEmptyBorder(
83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        0, kTrayUserTileHoverBorderInset, 0, 0));
83290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    set_border(views::Border::CreateEmptyBorder(
83390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
83490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset,
83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kUserCardVerticalPadding,
83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kTrayPopupPaddingHorizontal));
83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ash::SessionStateDelegate* delegate =
83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
84090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* username = NULL;
84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!multiprofile_index_) {
843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 user_name_string =
84490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        login == ash::user::LOGGED_IN_GUEST ?
84590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) :
846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            delegate->GetUserDisplayName(multiprofile_index_);
847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!user_name_string.empty()) {
848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      username = new views::Label(user_name_string);
849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      username->SetHorizontalAlignment(gfx::ALIGN_LEFT);
850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
85190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* additional = NULL;
85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (login != ash::user::LOGGED_IN_GUEST) {
855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 user_email_string =
856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        login == ash::user::LOGGED_IN_LOCALLY_MANAGED ?
857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            bundle.GetLocalizedString(
858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) :
859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            UTF8ToUTF16(delegate->GetUserEmail(multiprofile_index_));
860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!user_email_string.empty()) {
861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional = new views::Label(user_email_string);
862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional->SetFont(bundle.GetFont(ui::ResourceBundle::SmallFont));
863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      additional->SetHorizontalAlignment(gfx::ALIGN_LEFT);
864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
86590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
86690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
86790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Adjust text properties dependent on if it is an active or inactive user.
86890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_) {
86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Fade the text of non active users to 50%.
87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SkColor text_color = additional->enabled_color();
87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2);
87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
87390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      additional->SetDisabledColor(text_color);
87490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      username->SetDisabledColor(text_color);
87690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
87790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
87890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (additional && username) {
87990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::View* details = new views::View;
88090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->SetLayoutManager(new views::BoxLayout(
88190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0));
88290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(username);
88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    details->AddChildView(additional);
88490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    user_card_view_->AddChildView(details);
88590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (username)
88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(username);
88890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (additional)
88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_card_view_->AddChildView(additional);
89090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)views::View* UserView::CreateIconForUserCard(ash::user::LoginStatus login) {
89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                multiprofile_index_ == 0);
89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetEnabled(false);
89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (login == ash::user::LOGGED_IN_GUEST) {
89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(),
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    icon->SetImage(
90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ash::Shell::GetInstance()->session_state_delegate()->
90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetUserImage(multiprofile_index_),
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(kUserIconSize, kUserIconSize));
90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return icon;
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInRetailModeUserCardContent() {
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* details = new views::Label;
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
91390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetText(
91490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL));
91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->set_border(views::Border::CreateEmptyBorder(0, 4, 0, 1));
91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details->SetHorizontalAlignment(gfx::ALIGN_LEFT);
91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(details);
91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
92090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) {
92190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(
92290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      CreateIconForUserCard(ash::user::LOGGED_IN_PUBLIC));
92390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_card_view_->AddChildView(new PublicAccountUserDetails(
92490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems));
92590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
92790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::ToggleAddUserMenuOption() {
92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_menu_option_.get()) {
92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset();
93090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    mouse_watcher_.reset();
93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    add_menu_option_.reset();
93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Note: We do not need to install a global event handler to delete this
93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // item since it will destroyed automatically before the menu / user menu item
93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // gets destroyed..
93890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
93990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
94090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_visible_but_disabled_ =
94190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      session_state_delegate->NumberOfLoggedInUsers() >=
94290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          session_state_delegate->GetMaximumNumberOfLoggedInUsers();
94390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_.reset(new views::Widget);
94490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Widget::InitParams params;
94590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.type = views::Widget::InitParams::TYPE_TOOLTIP;
94690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.keep_on_top = true;
94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.context = this->GetWidget()->GetNativeWindow();
94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.accept_events = true;
94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Init(params);
95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetOpacity(0xFF);
95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->GetNativeWindow()->set_owned_by_parent(false);
95490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetShadowType(add_menu_option_->GetNativeView(),
95590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                views::corewm::SHADOW_TYPE_NONE);
95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
95790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Position it below our user card.
95890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect bounds = user_card_view_->GetBoundsInScreen();
95990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bounds.set_y(bounds.y() + bounds.height());
96090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetBounds(bounds);
96190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Show the content.
96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddUserView* add_user_view = new AddUserView(
96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      static_cast<UserCard*>(user_card_view_), this);
96590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetContentsView(add_user_view);
96690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->SetAlwaysOnTop(true);
96790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_menu_option_->Show();
96890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_visible_but_disabled_) {
96990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    popup_message_.reset(new PopupMessage(
97190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER),
97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER),
97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        PopupMessage::ICON_WARNING,
97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        add_user_view->anchor(),
97590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        views::BubbleBorder::TOP_LEFT,
97690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0),
97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        2 * kPopupMessageOffset));
97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Find the screen area which encloses both elements and sets then a mouse
98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // watcher which will close the "menu".
98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect area = user_card_view_->GetBoundsInScreen();
98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  area.set_height(2 * area.height());
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_.reset(new views::MouseWatcher(
98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new UserViewMouseWatcherHost(area),
98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this));
98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mouse_watcher_->Start();
98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener)
99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : CustomButton(listener_),
99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      add_user_(NULL),
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      listener_(listener),
99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      owner_(owner),
99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      anchor_(NULL) {
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddContent();
99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(true);
99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::~AddUserView() {
100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  owner_->ForceBorderVisible(false);
100190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
100390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size AddUserView::GetPreferredSize() {
100490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size();
100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AddUserView::GetHeightForWidth(int width) {
100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return owner_->bounds().size().height();
100990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
101090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
101190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::Layout() {
101290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect contents_area(GetContentsBounds());
101390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetBoundsRect(contents_area);
101490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
101590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
101690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::ButtonPressed(views::Button* sender, const ui::Event& event) {
101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (add_user_ == sender)
101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    listener_->ButtonPressed(this, event);
101990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else
102090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NOTREACHED();
102190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
102290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::AddContent() {
102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_notify_enter_exit_on_child(true);
102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
102690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* delegate =
102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
102890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool enable = delegate->NumberOfLoggedInUsers() <
102990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    delegate->GetMaximumNumberOfLoggedInUsers();
103090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetLayoutManager(new views::FillLayout());
103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_background(views::Background::CreateSolidBackground(kBackgroundColor));
103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add padding around the panel.
103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  set_border(views::Border::CreateSolidBorder(1, kBorderColor));
103690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
103790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_ = new UserCard(this, enable);
103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->set_border(views::Border::CreateEmptyBorder(
103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
104090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset,
104190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kUserCardVerticalPadding,
104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset));
104390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
104490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->SetLayoutManager(new views::BoxLayout(
104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
104690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddChildViewAt(add_user_, 0);
104790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
104890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the [+] icon which is also the anchor for messages.
104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
105090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
105190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                true);
105290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  anchor_ = icon;
105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
105490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(),
105590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gfx::Size(kUserIconSize, kUserIconSize));
105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(icon);
105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
105890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add the command text.
105990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Label* command_label = new views::Label(
106090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT));
106190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  add_user_->AddChildView(command_label);
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index)
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
106990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      multiprofile_index_(index),
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_(NULL),
1071b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_(NULL),
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avatar_(NULL),
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      label_(NULL),
107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      separator_shown_(false) {
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayUser::~TrayUser() {
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState TrayUser::GetStateForTest() const {
108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (separator_shown_)
108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return SEPARATOR;
108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!user_)
108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return HIDDEN;
108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetStateForTest();
108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const {
109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(user_);
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return user_->GetBoundsInScreenOfUserButtonForTest();
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateTrayView(user::LoginStatus status) {
1096b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK(layout_view_ == NULL);
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the current user gets an icon. All other users will only be
109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // represented in the tray menu.
109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_)
110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = new views::View();
1103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_->SetLayoutManager(
1104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kHorizontal,
1105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                           0, 0, kUserLabelToIconPadding));
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAfterLoginStatusChange(status);
1107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return layout_view_;
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDefaultView(user::LoginStatus status) {
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(user_ == NULL);
111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const SessionStateDelegate* session_state_delegate =
111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ash::Shell::GetInstance()->session_state_delegate();
111890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int logged_in_users = session_state_delegate->NumberOfLoggedInUsers();
111990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
112090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If there are multiple users logged in, the users will be separated from the
112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // rest of the menu by a separator.
112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ ==
112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          session_state_delegate->GetMaximumNumberOfLoggedInUsers() &&
112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      logged_in_users > 1) {
112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    separator_shown_ = true;
112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return new views::View();
112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Do not show more UserView's then there are logged in users.
113090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (multiprofile_index_ >= logged_in_users)
113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
113290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
113390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  user_ = new tray::UserView(this, status, multiprofile_index_);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return user_;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDetailedView(user::LoginStatus status) {
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyTrayView() {
1142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  layout_view_ = NULL;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  avatar_ = NULL;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label_ = NULL;
114590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  separator_shown_ = false;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDefaultView() {
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_ = NULL;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDetailedView() {
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
115690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only the active user is represented in the tray.
115790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
115890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_label = false;
1160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool need_avatar = false;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status) {
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_LOCKED:
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_USER:
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_OWNER:
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_PUBLIC:
1166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_LOCALLY_MANAGED:
1169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_avatar = true;
1170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      need_label = true;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_GUEST:
117390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      need_avatar = true;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_RETAIL_MODE:
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case user::LOGGED_IN_KIOSK_APP:
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case user::LOGGED_IN_NONE:
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1181b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if ((need_avatar != (avatar_ != NULL)) ||
1182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      (need_label != (label_ != NULL))) {
1183b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->RemoveAllChildViews(true);
1184b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_label) {
1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = new views::Label;
1186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SetupLabelForTray(label_);
1187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(label_);
1188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      label_ = NULL;
1190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (need_avatar) {
119290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius, true);
1193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layout_view_->AddChildView(avatar_);
1194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      avatar_ = NULL;
1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (status == user::LOGGED_IN_LOCALLY_MANAGED) {
1201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    label_->SetText(
1202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL));
1203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
12057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int icon_size = kUserIconSize;
12067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (avatar_ && ash::switches::UseAlternateShelfLayout()) {
12077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    icon_size = kUserIconLargeSize;
12087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    avatar_->SetCornerRadii(0,
12097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            kUserIconLargeCornerRadius,
12107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            kUserIconLargeCornerRadius,
12117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            0);
12127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    avatar_->set_border(NULL);
12137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (avatar_) {
121590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (status == user::LOGGED_IN_GUEST) {
12167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      int image_name = ash::switches::UseAlternateShelfLayout() ?
12177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          IDR_AURA_UBER_TRAY_GUEST_ICON_LARGE :
12187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          IDR_AURA_UBER_TRAY_GUEST_ICON;
12197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      avatar_->SetImage(*ui::ResourceBundle::GetSharedInstance().
12207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetImageNamed(image_name).ToImageSkia(),
12217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          gfx::Size(icon_size, icon_size));
122290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      avatar_->SetImage(
122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              multiprofile_index_),
12267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          gfx::Size(icon_size, icon_size));
122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
1228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
123290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Inactive users won't have a layout.
123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!layout_view_)
123490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
1235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (alignment == SHELF_ALIGNMENT_BOTTOM ||
1236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      alignment == SHELF_ALIGNMENT_TOP) {
1237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (avatar_) {
12387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (ash::switches::UseAlternateShelfLayout()) {
12397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        avatar_->set_border(NULL);
12407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        avatar_->SetCornerRadii(0,
12417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                kUserIconLargeCornerRadius,
12427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                kUserIconLargeCornerRadius,
12437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                0);
12447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      } else {
12457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        avatar_->set_border(views::Border::CreateEmptyBorder(
12467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            0, kTrayImageItemHorizontalPaddingBottomAlignment + 2,
12477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            0, kTrayImageItemHorizontalPaddingBottomAlignment));
12487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      label_->set_border(views::Border::CreateEmptyBorder(
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayLabelItemHorizontalPaddingBottomAlignment,
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, kTrayLabelItemHorizontalPaddingBottomAlignment));
1254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1255b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal,
1257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
1258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
12597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (avatar_) {
12607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (ash::switches::UseAlternateShelfLayout()) {
12617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        avatar_->set_border(NULL);
12627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        avatar_->SetCornerRadii(0,
12637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                0,
12647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                kUserIconLargeCornerRadius,
12657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                kUserIconLargeCornerRadius);
12667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      } else {
12677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        SetTrayImageItemBorder(avatar_, alignment);
12687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
12697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
1270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (label_) {
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      label_->set_border(views::Border::CreateEmptyBorder(
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemVerticalPaddingVeriticalAlignment,
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment,
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemVerticalPaddingVeriticalAlignment,
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTrayLabelItemHorizontalPaddingBottomAlignment));
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1277b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    layout_view_->SetLayoutManager(
1278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kVertical,
1279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             0, 0, kUserLabelToIconPadding));
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::OnUserUpdate() {
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for null to avoid crbug.com/150944.
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (avatar_) {
12867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int icon_size = ash::switches::UseAlternateShelfLayout() ?
12877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        kUserIconLargeSize : kUserIconSize;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avatar_->SetImage(
128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            multiprofile_index_),
12917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        gfx::Size(icon_size, icon_size));
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1297