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