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