tray_user.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/user/tray_user.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <climits> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/popup_message.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/session_state_delegate.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button_border.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_utils.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string16.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string_util.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h" 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/range/range.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/text/text_elider.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/insets.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/render_text.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/tray_bubble_view.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/custom_button.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/link_listener.h" 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/corewm/shadow_types.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h" 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/views/mouse_watcher.h" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/painter.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserDetailsVerticalPadding = 5; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserCardVerticalPadding = 10; 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kInactiveUserCardVerticalPadding = 4; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kProfileRoundedCornerRadius = 2; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kUserIconSize = 27; 72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int kUserLabelToIconPadding = 5; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// When a hover border is used, it is starting this many pixels before the icon 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// position. 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kTrayUserTileHoverBorderInset = 10; 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The border color of the user button. 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kBorderColor = 0xffdcdcdc; 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The invisible word joiner character, used as a marker to indicate the start 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and end of the user's display name in the public account user card's text. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char16 kDisplayNameMark[] = { 0x2060, 0 }; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesNormal[] = { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_NORMAL_BACKGROUND, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPublicAccountLogoutButtonBorderImagesHovered[] = { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Offsetting the popup message relative to the tray menu. 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int kPopupMessageOffset = 25; 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom image view with rounded edges. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RoundedImageView : public views::View { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs a new rounded image view with rounded corners of radius 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |corner_radius|. If |active_user| is set, the icon will be drawn in 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // full colors - otherwise it will fade into the background. 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RoundedImageView(int corner_radius, bool active_user); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~RoundedImageView(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the image that should be displayed. The image contents is copied to the 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // receiver's image. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetImage(const gfx::ImageSkia& img, const gfx::Size& size); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia image_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia resized_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size image_size_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int corner_radius_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if the given user is the active user and the icon should get 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // painted as active. 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool active_user_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RoundedImageView); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The user details shown in public account mode. This is essentially a label 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// but with custom painting code as the text is styled with multiple colors and 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// contains a link. 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PublicAccountUserDetails : public views::View, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public views::LinkListener { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PublicAccountUserDetails(SystemTrayItem* owner, int used_width); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PublicAccountUserDetails(); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::View. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::LinkListener. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate a preferred size that ensures the label text and the following 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // link do not wrap over more than three lines in total for aesthetic reasons 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if possible. 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CalculatePreferredSize(SystemTrayItem* owner, int used_width); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text_; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Link* learn_more_; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size preferred_size_; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<gfx::RenderText> lines_; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PublicAccountUserDetails); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The button which holds the user card in case of multi profile. 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserCard : public views::CustomButton { 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UserCard(views::ButtonListener* listener, bool active_user); 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserCard(); 18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Called when the border should remain even in the non highlighted state. 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void ForceBorderVisible(bool show); 18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from views::View 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE; 19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE; 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Check if the item is hovered. 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_hovered_for_test() {return button_hovered_; } 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Change the hover/active state of the "button" when the status changes. 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void ShowActive(); 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if this is the active user. 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_active_user_; 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if button is hovered. 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool button_hovered_; 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if the border should be visible. 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool show_border_; 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserCard); 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class UserViewMouseWatcherHost : public views::MouseWatcherHost { 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public: 21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit UserViewMouseWatcherHost(const gfx::Rect& screen_area) 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : screen_area_(screen_area) {} 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~UserViewMouseWatcherHost() {} 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Implementation of MouseWatcherHost. 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool Contains(const gfx::Point& screen_point, 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::MouseWatcherHost::MouseEventType type) OVERRIDE { 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return screen_area_.Contains(screen_point); 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)private: 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect screen_area_; 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserViewMouseWatcherHost); 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The view of a user item. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserView : public views::View, 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public views::ButtonListener, 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public views::MouseWatcherListener { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UserView(SystemTrayItem* owner, 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::user::LoginStatus login, 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MultiProfileIndex index); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~UserView(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from MouseWatcherListener: 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void MouseMovedOutOfHost() OVERRIDE; 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TrayUser::TestState GetStateForTest() const; 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect GetBoundsInScreenOfUserButtonForTest(); 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::View. 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual int GetHeightForWidth(int width) OVERRIDE; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::ButtonListener. 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::Event& event) OVERRIDE; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddLogoutButton(ash::user::LoginStatus login); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddUserCard(SystemTrayItem* owner, ash::user::LoginStatus login); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create a user icon representation for the user card. 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* CreateIconForUserCard(ash::user::LoginStatus login); 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the additional user card content for the retail logged in mode. 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddLoggedInRetailModeUserCardContent(); 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the additional user card content for the public mode. 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner); 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the menu option to add another user. If |disabled| is set the user 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // cannot actively click on the item. 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void ToggleAddUserMenuOption(); 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MultiProfileIndex multiprofile_index_; 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The view of the user card. 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* user_card_view_; 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if |user_card_view_| is a |UserView| - otherwise it is only a 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |views::View|. 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_user_card_; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* logout_button_; 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<ash::PopupMessage> popup_message_; 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<views::Widget> add_menu_option_; 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True when the add user panel is visible but not activatable. 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool add_user_visible_but_disabled_; 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The mouse watcher which takes care of out of window hover events. 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<views::MouseWatcher> mouse_watcher_; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserView); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The menu item view which gets shown when the user clicks in multi profile 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// mode onto the user item. 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AddUserView : public views::CustomButton, 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public views::ButtonListener { 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The |owner| is the view for which this view gets created. The |listener| 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // will get notified when this item gets clicked. 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddUserView(UserCard* owner, views::ButtonListener* listener); 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~AddUserView(); 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Get the anchor view for a message. 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* anchor() { return anchor_; } 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from views::ButtonListener. 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ui::Event& event) OVERRIDE; 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from views::View. 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE; 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual int GetHeightForWidth(int width) OVERRIDE; 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Layout() OVERRIDE; 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create the additional client content for this item. 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddContent(); 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This is the content we create and show. 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* add_user_; 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This listener will get informed when someone clicks on this button. 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::ButtonListener* listener_; 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This is the owner view of this item. 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UserCard* owner_; 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The anchor view for targetted bubble messages. 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* anchor_; 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AddUserView); 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RoundedImageView::RoundedImageView(int corner_radius, bool active_user) 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : corner_radius_(corner_radius), 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) active_user_(active_user) {} 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RoundedImageView::~RoundedImageView() {} 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::SetImage(const gfx::ImageSkia& img, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& size) { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_ = img; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_size_ = size; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to get the best image quality for the avatar. 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resized_ = gfx::ImageSkiaOperations::CreateResizedImage(image_, 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::ImageOperations::RESIZE_BEST, size); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetWidget() && visible()) { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PreferredSizeChanged(); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size RoundedImageView::GetPreferredSize() { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(image_size_.width() + GetInsets().width(), 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_size_.height() + GetInsets().height()); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RoundedImageView::OnPaint(gfx::Canvas* canvas) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View::OnPaint(canvas); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect image_bounds(size()); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_bounds.ClampToCenteredSize(GetPreferredSize()); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_bounds.Inset(GetInsets()); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkScalar kRadius = SkIntToScalar(corner_radius_); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPath path; 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.addRoundRect(gfx::RectToSkRect(image_bounds), kRadius, kRadius); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setAntiAlias(true); 36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) paint.setXfermodeMode(active_user_ ? SkXfermode::kSrcOver_Mode : 36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkXfermode::kLuminosity_Mode); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->DrawImageInPath(resized_, image_bounds.x(), image_bounds.y(), 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path, paint); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::PublicAccountUserDetails(SystemTrayItem* owner, 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int used_width) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : learn_more_(NULL) { 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int inner_padding = 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayPopupPaddingHorizontal - kTrayPopupPaddingBetweenItems; 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool rtl = base::i18n::IsRTL(); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_border(views::Border::CreateEmptyBorder( 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kUserDetailsVerticalPadding, rtl ? 0 : inner_padding, 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kUserDetailsVerticalPadding, rtl ? inner_padding : 0)); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retrieve the user's display name and wrap it with markers. 38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that since this is a public account it always has to be the primary 38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // user. 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::string16 display_name = 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate()-> 38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetUserDisplayName(0); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveChars(display_name, kDisplayNameMark, &display_name); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name = kDisplayNameMark[0] + display_name + kDisplayNameMark[0]; 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retrieve the domain managing the device and wrap it with markers. 39390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::string16 domain = UTF8ToUTF16( 39490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_delegate()->GetEnterpriseDomain()); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveChars(domain, kDisplayNameMark, &domain); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::i18n::WrapStringWithLTRFormatting(&domain); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retrieve the label text, inserting the display name and domain. 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_ = l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_PUBLIC_LABEL, 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name, domain); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE)); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_->SetUnderline(false); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_->set_listener(this); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(learn_more_); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CalculatePreferredSize(owner, used_width); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PublicAccountUserDetails::~PublicAccountUserDetails() {} 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::Layout() { 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines_.clear(); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect contents_area = GetContentsBounds(); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents_area.IsEmpty()) 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Word-wrap the label text. 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Font font; 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16> lines; 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ElideRectangleText(text_, font, contents_area.width(), 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_area.height(), ui::ELIDE_LONG_WORDS, &lines); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loop through the lines, creating a renderer for each. 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point position = contents_area.origin(); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::Range display_name(ui::Range::InvalidRange()); 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (std::vector<base::string16>::const_iterator it = lines.begin(); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != lines.end(); ++it) { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RenderText* line = gfx::RenderText::CreateInstance(); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetDirectionalityMode(gfx::DIRECTIONALITY_FROM_UI); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetText(*it); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size size(contents_area.width(), line->GetStringSize().height()); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetDisplayRect(gfx::Rect(position, size)); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_y(position.y() + size.height()); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the default text color for the line. 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->SetColor(kPublicAccountUserCardTextColor); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If a range of the line contains the user's display name, apply a custom 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // text color to it. 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (display_name.is_empty()) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.set_start(it->find(kDisplayNameMark)); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!display_name.is_empty()) { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.set_end( 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->find(kDisplayNameMark, display_name.start() + 1)); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::Range line_range(0, it->size()); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line->ApplyColor(kPublicAccountUserCardNameColor, 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.Intersect(line_range)); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update the range for the next line. 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (display_name.end() >= line_range.end()) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name.set_start(0); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name = ui::Range::InvalidRange(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines_.push_back(line); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Position the link after the label text, separated by a space. If it does 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not fit onto the last line of the text, wrap the link onto its own line. 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size last_line_size = lines_.back()->GetStringSize(); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int space_width = font.GetStringWidth(ASCIIToUTF16(" ")); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size link_size = learn_more_->GetPreferredSize(); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents_area.width() - last_line_size.width() >= 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) space_width + link_size.width()) { 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_x(position.x() + last_line_size.width() + space_width); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_y(position.y() - last_line_size.height()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.set_y(position.y() - learn_more_->GetInsets().top()); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect learn_more_bounds(position, link_size); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_bounds.Intersect(contents_area); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::i18n::IsRTL()) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Insets insets = GetInsets(); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_bounds.Offset(insets.right() - insets.left(), 0); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) learn_more_->SetBoundsRect(learn_more_bounds); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size PublicAccountUserDetails::GetPreferredSize() { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return preferred_size_; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::OnPaint(gfx::Canvas* canvas) { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ScopedVector<gfx::RenderText>::const_iterator it = lines_.begin(); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != lines_.end(); ++it) { 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*it)->Draw(canvas); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View::OnPaint(canvas); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::LinkClicked(views::Link* source, 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int event_flags) { 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(source, learn_more_); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_delegate()->ShowPublicAccountInfo(); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PublicAccountUserDetails::CalculatePreferredSize(SystemTrayItem* owner, 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int used_width) { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Font font; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size link_size = learn_more_->GetPreferredSize(); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int space_width = font.GetStringWidth(ASCIIToUTF16(" ")); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Insets insets = GetInsets(); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::TrayBubbleView* bubble_view = 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner->system_tray()->GetSystemBubble()->bubble_view(); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_width = std::max( 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) link_size.width(), 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view->GetPreferredSize().width() - (used_width + insets.width())); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_width = std::min( 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) font.GetStringWidth(text_) + space_width + link_size.width(), 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view->GetMaximumSize().width() - (used_width + insets.width())); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do a binary search for the minimum width that ensures no more than three 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // lines are needed. The lower bound is the minimum of the current bubble 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // width and the width of the link (as no wrapping is permitted inside the 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // link). The upper bound is the maximum of the largest allowed bubble width 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and the sum of the label text and link widths when put on a single line. 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16> lines; 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (min_width < max_width) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines.clear(); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int width = (min_width + max_width) / 2; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool too_narrow = ui::ElideRectangleText( 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_, font, width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines) != 0; 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int line_count = lines.size(); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!too_narrow && line_count == 3 && 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) width - font.GetStringWidth(lines.back()) <= 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) space_width + link_size.width()) { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++line_count; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (too_narrow || line_count > 3) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_width = width + 1; 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_width = width; 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calculate the corresponding height and set the preferred size. 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lines.clear(); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ElideRectangleText( 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) text_, font, min_width, INT_MAX, ui::TRUNCATE_LONG_WORDS, &lines); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int line_count = lines.size(); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (min_width - font.GetStringWidth(lines.back()) <= 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) space_width + link_size.width()) { 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++line_count; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int line_height = font.GetHeight(); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int link_extra_height = std::max( 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) link_size.height() - learn_more_->GetInsets().top() - line_height, 0); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preferred_size_ = gfx::Size( 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_width + insets.width(), 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) line_count * line_height + link_extra_height + insets.height()); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view->SetWidth(preferred_size_.width() + used_width); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::UserCard(views::ButtonListener* listener, bool active_user) 55290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : CustomButton(listener), 55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_active_user_(active_user), 55490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) button_hovered_(false), 55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) show_border_(false) { 55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_active_user_) { 55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_background( 55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Background::CreateSolidBackground(kBackgroundColor)); 55990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 56090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 56190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 56290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 56390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserCard::~UserCard() {} 56490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ForceBorderVisible(bool show) { 56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) show_border_ = show; 56790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 56990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseEntered(const ui::MouseEvent& event) { 57190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_active_user_) { 57290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) button_hovered_ = true; 57390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) background()->SetNativeControlColor(kHoverBackgroundColor); 57490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 57590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 57690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 57790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::OnMouseExited(const ui::MouseEvent& event) { 57990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_active_user_) { 58090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) button_hovered_ = false; 58190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) background()->SetNativeControlColor(kBackgroundColor); 58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShowActive(); 58390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 58690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCard::ShowActive() { 58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width = button_hovered_ || show_border_ ? 1 : 0; 58890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_border(views::Border::CreateSolidSidedBorder(width, width, width, 1, 58990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kBorderColor)); 59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SchedulePaint(); 59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 59390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)UserView::UserView(SystemTrayItem* owner, 59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::user::LoginStatus login, 59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MultiProfileIndex index) 59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : multiprofile_index_(index), 59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_(NULL), 59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_user_card_(false), 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button_(NULL), 60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_visible_but_disabled_(false) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_NE(ash::user::LOGGED_IN_NONE, login); 60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!index) { 60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only the logged in user will have a background. All other users will have 60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // to allow the TrayPopupContainer highlighting the menu line. 60590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_background(views::Background::CreateSolidBackground( 60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) login == ash::user::LOGGED_IN_PUBLIC ? kPublicAccountBackgroundColor : 60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kBackgroundColor)); 60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayPopupPaddingBetweenItems)); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The logout button must be added before the user card so that the user card 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // can correctly calculate the remaining available width. 61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note that only the current multiprofile user gets a button. 61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddLogoutButton(!multiprofile_index_ ? login : ash::user::LOGGED_IN_LOCKED); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddUserCard(owner, login); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserView::~UserView() {} 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::MouseMovedOutOfHost() { 62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) popup_message_.reset(); 62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_.reset(); 62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_.reset(); 62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 62690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState UserView::GetStateForTest() const { 62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_menu_option_.get()) { 62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return add_user_visible_but_disabled_ ? TrayUser::ACTIVE_BUT_DISABLED : 62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TrayUser::ACTIVE; 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!is_user_card_) 63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return TrayUser::SHOWN; 63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return static_cast<UserCard*>(user_card_view_)->is_hovered_for_test() ? 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TrayUser::HOVERED : TrayUser::SHOWN; 63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect UserView::GetBoundsInScreenOfUserButtonForTest() { 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(user_card_view_); 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return user_card_view_->GetBoundsInScreen(); 64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size UserView::GetPreferredSize() { 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size = views::View::GetPreferredSize(); 64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only the active user panel will be forced to a certain height. 64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!multiprofile_index_) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size.set_height(std::max(size.height(), 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayPopupItemHeight + GetInsets().height())); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return size; 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int UserView::GetHeightForWidth(int width) { 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetPreferredSize().height(); 656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::Layout() { 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect contents_area(GetContentsBounds()); 66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (user_card_view_ && logout_button_) { 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Give the logout button the space it requests. 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect logout_area = contents_area; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_area.ClampToCenteredSize(logout_button_->GetPreferredSize()); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_area.set_x(contents_area.right() - logout_area.width()); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Give the remaining space to the user card. 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect user_card_area = contents_area; 66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int remaining_width = contents_area.width() - logout_area.width(); 66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) { 67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // In multiprofile case |user_card_view_| and |logout_button_| have to 67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // have the same height. 67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int y = std::min(user_card_area.y(), logout_area.y()); 67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height = std::max(user_card_area.height(), logout_area.height()); 67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_area.set_y(y); 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_area.set_height(height); 67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_area.set_y(y); 67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_area.set_height(height); 67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // In multiprofile mode we have also to increase the size of the card by 68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the size of the border to make it overlap with the logout button. 68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_area.set_width(std::max(0, remaining_width + 1)); 68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // To make the logout button symmetrical with the user card we also make 68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the button longer by the same size the hover area in front of the icon 68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // got inset. 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_area.set_width(logout_area.width() + 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayUserTileHoverBorderInset); 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // In all other modes we have to make sure that there is enough spacing 69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // between the two. 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) remaining_width -= kTrayPopupPaddingBetweenItems; 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetBoundsRect(user_card_area); 69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logout_button_->SetBoundsRect(logout_area); 69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (user_card_view_) { 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetBoundsRect(contents_area); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (logout_button_) { 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button_->SetBoundsRect(contents_area); 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::ButtonPressed(views::Button* sender, const ui::Event& event) { 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sender == logout_button_) { 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_delegate()->SignOut(); 70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (sender == user_card_view_ && 70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) { 70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!multiprofile_index_) { 70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ToggleAddUserMenuOption(); 70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::SessionStateDelegate* delegate = 71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->SwitchActiveUser(delegate->GetUserEmail(multiprofile_index_)); 71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (add_menu_option_.get() && 71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sender == add_menu_option_->GetContentsView()) { 71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Let the user add another account to the session. 71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_delegate()->ShowUserLogin(); 718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddLogoutButton(ash::user::LoginStatus login) { 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A user should not be able to modify logged-in state when screen is 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // locked. 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login == ash::user::LOGGED_IN_LOCKED) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16 title = ash::user::GetLocalizedSignOutStringForStatus( 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login, true); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayPopupLabelButton* logout_button = new TrayPopupLabelButton(this, title); 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button->SetAccessibleName(title); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logout_button_ = logout_button; 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In public account mode, the logout button border has a custom color. 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login == ash::user::LOGGED_IN_PUBLIC) { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayPopupLabelButtonBorder* border = 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<TrayPopupLabelButtonBorder*>(logout_button_->border()); 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border->SetPainter(false, views::Button::STATE_NORMAL, 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Painter::CreateImageGridPainter( 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPublicAccountLogoutButtonBorderImagesNormal)); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border->SetPainter(false, views::Button::STATE_HOVERED, 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Painter::CreateImageGridPainter( 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPublicAccountLogoutButtonBorderImagesHovered)); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) border->SetPainter(false, views::Button::STATE_PRESSED, 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Painter::CreateImageGridPainter( 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPublicAccountLogoutButtonBorderImagesHovered)); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(logout_button_); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserView::AddUserCard(SystemTrayItem* owner, 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::user::LoginStatus login) { 75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add padding around the panel. 75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_border(views::Border::CreateEmptyBorder( 75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, kTrayPopupPaddingHorizontal, 75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, kTrayPopupPaddingHorizontal)); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled() && 75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) login != ash::user::LOGGED_IN_RETAIL_MODE) { 76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_ = new UserCard(this, multiprofile_index_ == 0); 76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_user_card_ = true; 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_ = new views::View(); 76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_user_card_ = false; 76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetLayoutManager(new views::BoxLayout( 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems)); 76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddChildViewAt(user_card_view_, 0); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login == ash::user::LOGGED_IN_RETAIL_MODE) { 77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddLoggedInRetailModeUserCardContent(); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The entire user card should trigger hover (the inner items get disabled). 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->SetEnabled(true); 77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->set_notify_enter_exit_on_child(true); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login == ash::user::LOGGED_IN_PUBLIC) { 78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddLoggedInPublicModeUserCardContent(owner); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* icon = CreateIconForUserCard(login); 78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(icon); 78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // To allow the border to start before the icon, reduce the size before and 78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // add an inset to the icon to get the spacing. 79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (multiprofile_index_ == 0 && 79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) { 79290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->set_border(views::Border::CreateEmptyBorder( 79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0, kTrayUserTileHoverBorderInset, 0, 0)); 79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_border(views::Border::CreateEmptyBorder( 79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayPopupPaddingHorizontal - kTrayUserTileHoverBorderInset, 79790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 79890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayPopupPaddingHorizontal)); 79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::SessionStateDelegate* delegate = 80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* username = NULL; 80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!multiprofile_index_) { 80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) username = new views::Label( 80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) login == ash::user::LOGGED_IN_GUEST ? 80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL) : 80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->GetUserDisplayName(multiprofile_index_)); 80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) username->SetHorizontalAlignment(gfx::ALIGN_LEFT); 81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* additional = NULL; 81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (login != ash::user::LOGGED_IN_GUEST) { 81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) additional = new views::Label(); 81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) additional->SetText(login == ash::user::LOGGED_IN_LOCALLY_MANAGED ? 81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL) : 81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UTF8ToUTF16(delegate->GetUserEmail(multiprofile_index_))); 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) additional->SetFont(bundle.GetFont(ui::ResourceBundle::SmallFont)); 82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) additional->SetHorizontalAlignment(gfx::ALIGN_LEFT); 82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Adjust text properties dependent on if it is an active or inactive user. 82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (multiprofile_index_) { 82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Fade the text of non active users to 50%. 82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkColor text_color = additional->enabled_color(); 82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) text_color = SkColorSetA(text_color, SkColorGetA(text_color) / 2); 82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (additional) 82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) additional->SetDisabledColor(text_color); 83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (username) 83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) username->SetDisabledColor(text_color); 83290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 83390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 83490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (additional && username) { 83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::View* details = new views::View; 83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->SetLayoutManager(new views::BoxLayout( 83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BoxLayout::kVertical, 0, kUserDetailsVerticalPadding, 0)); 83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->AddChildView(username); 83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->AddChildView(additional); 84090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(details); 84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (username) 84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(username); 84490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (additional) 84590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(additional); 84690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 84890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 84990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)views::View* UserView::CreateIconForUserCard(ash::user::LoginStatus login) { 85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius, 85190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) multiprofile_index_ == 0); 85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->SetEnabled(false); 85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (login == ash::user::LOGGED_IN_GUEST) { 85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->SetImage(*ui::ResourceBundle::GetSharedInstance(). 85590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(), 85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 85790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 85890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->SetImage( 85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate()-> 86090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetUserImage(multiprofile_index_), 86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 86290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 86390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return icon; 86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 86690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInRetailModeUserCardContent() { 86790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* details = new views::Label; 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->SetText( 87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_KIOSK_LABEL)); 87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->set_border(views::Border::CreateEmptyBorder(0, 4, 0, 1)); 87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) details->SetHorizontalAlignment(gfx::ALIGN_LEFT); 87390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(details); 87490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 87690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) { 87790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView( 87890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CreateIconForUserCard(ash::user::LOGGED_IN_PUBLIC)); 87990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_card_view_->AddChildView(new PublicAccountUserDetails( 88090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems)); 88190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 88290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserView::ToggleAddUserMenuOption() { 88490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_menu_option_.get()) { 88590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) popup_message_.reset(); 88690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_.reset(); 88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_.reset(); 88890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note: We do not need to install a global event handler to delete this 89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // item since it will destroyed automatically before the menu / user menu item 89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // gets destroyed.. 89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const SessionStateDelegate* session_state_delegate = 89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_visible_but_disabled_ = 89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) session_state_delegate->NumberOfLoggedInUsers() >= 89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) session_state_delegate->GetMaximumNumberOfLoggedInUsers(); 89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_.reset(new views::Widget); 90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Widget::InitParams params; 90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.type = views::Widget::InitParams::TYPE_TOOLTIP; 90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.keep_on_top = true; 90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.context = this->GetWidget()->GetNativeWindow(); 90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.accept_events = true; 90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.transparent = true; 90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->Init(params); 90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetOpacity(0xFF); 90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->GetNativeWindow()->set_owned_by_parent(false); 91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetShadowType(add_menu_option_->GetNativeView(), 91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::corewm::SHADOW_TYPE_NONE); 91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 91390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Position it below our user card. 91490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect bounds = user_card_view_->GetBoundsInScreen(); 91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bounds.set_y(bounds.y() + bounds.height()); 91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetBounds(bounds); 91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Show the content. 91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddUserView* add_user_view = new AddUserView( 92090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static_cast<UserCard*>(user_card_view_), this); 92190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetContentsView(add_user_view); 92290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->SetAlwaysOnTop(true); 92390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_menu_option_->Show(); 92490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_user_visible_but_disabled_) { 92590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) popup_message_.reset(new PopupMessage( 92790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER), 92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER), 92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PopupMessage::ICON_WARNING, 93090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_view->anchor(), 93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BubbleBorder::TOP_LEFT, 93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0), 93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2 * kPopupMessageOffset)); 93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Find the screen area which encloses both elements and sets then a mouse 93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // watcher which will close the "menu". 93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect area = user_card_view_->GetBoundsInScreen(); 93890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) area.set_height(2 * area.height()); 93990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_.reset(new views::MouseWatcher( 94090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new UserViewMouseWatcherHost(area), 94190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this)); 94290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_watcher_->Start(); 94390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener) 94690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : CustomButton(listener_), 94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_(NULL), 94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_(listener), 94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner), 95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) anchor_(NULL) { 95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddContent(); 95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_->ForceBorderVisible(true); 95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AddUserView::~AddUserView() { 95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_->ForceBorderVisible(false); 95790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 95890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 95990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size AddUserView::GetPreferredSize() { 96090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return owner_->bounds().size(); 96190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AddUserView::GetHeightForWidth(int width) { 96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return owner_->bounds().size().height(); 96590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 96690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 96790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::Layout() { 96890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect contents_area(GetContentsBounds()); 96990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->SetBoundsRect(contents_area); 97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 97190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::ButtonPressed(views::Button* sender, const ui::Event& event) { 97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_user_ == sender) 97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_->ButtonPressed(this, event); 97590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 97690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AddUserView::AddContent() { 98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_notify_enter_exit_on_child(true); 98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const SessionStateDelegate* delegate = 98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool enable = delegate->NumberOfLoggedInUsers() < 98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->GetMaximumNumberOfLoggedInUsers(); 98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetLayoutManager(new views::FillLayout()); 98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_background(views::Background::CreateSolidBackground(kBackgroundColor)); 98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add padding around the panel. 99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) set_border(views::Border::CreateSolidBorder(1, kBorderColor)); 99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_ = new UserCard(this, enable); 99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->set_border(views::Border::CreateEmptyBorder( 99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset, 99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kUserCardVerticalPadding, 99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset)); 99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->SetLayoutManager(new views::BoxLayout( 100190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems)); 100290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddChildViewAt(add_user_, 0); 100390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 100490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add the [+] icon which is also the anchor for messages. 100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius, 100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) true); 100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) anchor_ = icon; 100990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon->SetImage(*ui::ResourceBundle::GetSharedInstance(). 101090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(), 101190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 101290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->AddChildView(icon); 101390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 101490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add the command text. 101590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Label* command_label = new views::Label( 101690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT)); 101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) add_user_->AddChildView(command_label); 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tray 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TrayUser(SystemTray* system_tray, MultiProfileIndex index) 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SystemTrayItem(system_tray), 102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) multiprofile_index_(index), 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_(NULL), 1027b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_(NULL), 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_(NULL), 102990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) label_(NULL), 103090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) separator_shown_(false) { 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->AddUserObserver(this); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayUser::~TrayUser() { 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->RemoveUserObserver(this); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TrayUser::TestState TrayUser::GetStateForTest() const { 103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (separator_shown_) 104090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return SEPARATOR; 104190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!user_) 104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return HIDDEN; 104390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return user_->GetStateForTest(); 104490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 104690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Rect TrayUser::GetUserPanelBoundsInScreenForTest() const { 104790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(user_); 104890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return user_->GetBoundsInScreenOfUserButtonForTest(); 104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 105090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateTrayView(user::LoginStatus status) { 1052b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) CHECK(layout_view_ == NULL); 105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only the current user gets an icon. All other users will only be 105490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // represented in the tray menu. 105590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (multiprofile_index_) 105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1058b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_ = new views::View(); 1059b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->SetLayoutManager( 1060b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kHorizontal, 1061b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 0, 0, kUserLabelToIconPadding)); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateAfterLoginStatusChange(status); 1063b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return layout_view_; 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDefaultView(user::LoginStatus status) { 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == user::LOGGED_IN_NONE) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(user_ == NULL); 107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const SessionStateDelegate* session_state_delegate = 107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int logged_in_users = session_state_delegate->NumberOfLoggedInUsers(); 107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If there are multiple users logged in, the users will be separated from the 107790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // rest of the menu by a separator. 107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (multiprofile_index_ == 107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) session_state_delegate->GetMaximumNumberOfLoggedInUsers() && 108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) logged_in_users > 1) { 108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) separator_shown_ = true; 108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return new views::View(); 108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 108590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Do not show more UserView's then there are logged in users. 108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (multiprofile_index_ >= logged_in_users) 108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_ = new tray::UserView(this, status, multiprofile_index_); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return user_; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayUser::CreateDetailedView(user::LoginStatus status) { 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyTrayView() { 1098b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_ = NULL; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_ = NULL; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_ = NULL; 110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) separator_shown_ = false; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDefaultView() { 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_ = NULL; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::DestroyDetailedView() { 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) { 111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Only the active user is represented in the tray. 111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!layout_view_) 111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 1115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool need_label = false; 1116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool need_avatar = false; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_LOCKED: 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_USER: 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_OWNER: 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_PUBLIC: 1122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) need_avatar = true; 1123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) break; 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case user::LOGGED_IN_LOCALLY_MANAGED: 1125b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) need_avatar = true; 1126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) need_label = true; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_GUEST: 112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) need_avatar = true; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case user::LOGGED_IN_RETAIL_MODE: 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case user::LOGGED_IN_KIOSK_APP: 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case user::LOGGED_IN_NONE: 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if ((need_avatar != (avatar_ != NULL)) || 1138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (need_label != (label_ != NULL))) { 1139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->RemoveAllChildViews(true); 1140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (need_label) { 1141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) label_ = new views::Label; 1142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SetupLabelForTray(label_); 1143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->AddChildView(label_); 1144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 1145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) label_ = NULL; 1146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (need_avatar) { 114890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) avatar_ = new tray::RoundedImageView(kProfileRoundedCornerRadius, true); 1149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->AddChildView(avatar_); 1150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 1151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) avatar_ = NULL; 1152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 1156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (status == user::LOGGED_IN_LOCALLY_MANAGED) { 1157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) label_->SetText( 1158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL)); 1159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (avatar_) { 116290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (status == user::LOGGED_IN_GUEST) { 116390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) avatar_->SetImage(*ui::ResourceBundle::GetSharedInstance(). 116490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(), 116590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 116690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 116790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) avatar_->SetImage( 116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate()->GetUserImage( 116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) multiprofile_index_), 117090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 117190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { 117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Inactive users won't have a layout. 117790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!layout_view_) 117890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 1179b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (alignment == SHELF_ALIGNMENT_BOTTOM || 1180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) alignment == SHELF_ALIGNMENT_TOP) { 1181b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (avatar_) { 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_->set_border(views::Border::CreateEmptyBorder( 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, kTrayImageItemHorizontalPaddingBottomAlignment + 2, 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, kTrayImageItemHorizontalPaddingBottomAlignment)); 1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (label_) { 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_->set_border(views::Border::CreateEmptyBorder( 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, kTrayLabelItemHorizontalPaddingBottomAlignment, 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, kTrayLabelItemHorizontalPaddingBottomAlignment)); 1191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->SetLayoutManager( 1193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kHorizontal, 1194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 0, 0, kUserLabelToIconPadding)); 1195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (avatar_) 1197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SetTrayImageItemBorder(avatar_, alignment); 1198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (label_) { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_->set_border(views::Border::CreateEmptyBorder( 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayLabelItemVerticalPaddingVeriticalAlignment, 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayLabelItemHorizontalPaddingBottomAlignment, 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayLabelItemVerticalPaddingVeriticalAlignment, 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayLabelItemHorizontalPaddingBottomAlignment)); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layout_view_->SetLayoutManager( 1206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kVertical, 1207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 0, 0, kUserLabelToIconPadding)); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayUser::OnUserUpdate() { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for null to avoid crbug.com/150944. 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (avatar_) { 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avatar_->SetImage( 121590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate()->GetUserImage( 121690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) multiprofile_index_), 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size(kUserIconSize, kUserIconSize)); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1223