Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: ash/system/user/tray_user.cc

Issue 15329005: Adding new general bubble error message consisting of icon, message and caption. Using this message… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed comment issue with C++ compiler Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ash/resources/ash_resources.grd ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/system/user/tray_user.h" 5 #include "ash/system/user/tray_user.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <climits> 8 #include <climits>
9 #include <vector> 9 #include <vector>
10 10
11 #include "ash/popup_message.h"
11 #include "ash/session_state_delegate.h" 12 #include "ash/session_state_delegate.h"
12 #include "ash/shell.h" 13 #include "ash/shell.h"
13 #include "ash/shell_delegate.h" 14 #include "ash/shell_delegate.h"
14 #include "ash/system/tray/system_tray.h" 15 #include "ash/system/tray/system_tray.h"
15 #include "ash/system/tray/system_tray_delegate.h" 16 #include "ash/system/tray/system_tray_delegate.h"
16 #include "ash/system/tray/system_tray_notifier.h" 17 #include "ash/system/tray/system_tray_notifier.h"
17 #include "ash/system/tray/tray_constants.h" 18 #include "ash/system/tray/tray_constants.h"
18 #include "ash/system/tray/tray_item_view.h" 19 #include "ash/system/tray/tray_item_view.h"
19 #include "ash/system/tray/tray_popup_label_button.h" 20 #include "ash/system/tray/tray_popup_label_button.h"
20 #include "ash/system/tray/tray_popup_label_button_border.h" 21 #include "ash/system/tray/tray_popup_label_button_border.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 99 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
99 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 100 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
100 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 101 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
101 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND, 102 IDR_AURA_TRAY_POPUP_LABEL_BUTTON_HOVER_BACKGROUND,
102 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 103 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
103 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 104 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
104 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 105 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
105 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, 106 IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER,
106 }; 107 };
107 108
109 // Offsetting the popup message relative to the tray menu.
110 const int kPopupMessageOffset = 25;
111
108 } // namespace 112 } // namespace
109 113
110 namespace ash { 114 namespace ash {
111 namespace internal { 115 namespace internal {
112 116
113 namespace tray { 117 namespace tray {
114 118
115 // A custom image view with rounded edges. 119 // A custom image view with rounded edges.
116 class RoundedImageView : public views::View { 120 class RoundedImageView : public views::View {
117 public: 121 public:
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 // Create the additional user card content for the public mode. 259 // Create the additional user card content for the public mode.
256 void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner); 260 void AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner);
257 261
258 // Create the menu option to add another user. If |disabled| is set the user 262 // Create the menu option to add another user. If |disabled| is set the user
259 // cannot actively click on the item. 263 // cannot actively click on the item.
260 void ToggleAddUserMenuOption(); 264 void ToggleAddUserMenuOption();
261 265
262 MultiProfileIndex multiprofile_index_; 266 MultiProfileIndex multiprofile_index_;
263 views::View* user_card_; 267 views::View* user_card_;
264 views::View* logout_button_; 268 views::View* logout_button_;
269 scoped_ptr<ash::PopupMessage> popup_message_;
265 scoped_ptr<views::Widget> add_menu_option_; 270 scoped_ptr<views::Widget> add_menu_option_;
266 271
267 // The mouse watcher which takes care of out of window hover events. 272 // The mouse watcher which takes care of out of window hover events.
268 scoped_ptr<views::MouseWatcher> mouse_watcher_; 273 scoped_ptr<views::MouseWatcher> mouse_watcher_;
269 274
270 DISALLOW_COPY_AND_ASSIGN(UserView); 275 DISALLOW_COPY_AND_ASSIGN(UserView);
271 }; 276 };
272 277
273 // The menu item view which gets shown when the user clicks in multi profile 278 // The menu item view which gets shown when the user clicks in multi profile
274 // mode onto the user item. 279 // mode onto the user item.
275 class AddUserView : public views::CustomButton, 280 class AddUserView : public views::CustomButton,
276 public views::ButtonListener { 281 public views::ButtonListener {
277 public: 282 public:
278 // The |owner| is the view for which this view gets created. The |listener| 283 // The |owner| is the view for which this view gets created. The |listener|
279 // will get notified when this item gets clicked. 284 // will get notified when this item gets clicked.
280 AddUserView(UserCard* owner, views::ButtonListener* listener); 285 AddUserView(UserCard* owner, views::ButtonListener* listener);
281 virtual ~AddUserView(); 286 virtual ~AddUserView();
282 287
288 // Get the anchor view for a message.
289 views::View* anchor() { return anchor_; }
290
283 // Overridden from views::ButtonListener. 291 // Overridden from views::ButtonListener.
284 virtual void ButtonPressed(views::Button* sender, 292 virtual void ButtonPressed(views::Button* sender,
285 const ui::Event& event) OVERRIDE; 293 const ui::Event& event) OVERRIDE;
286 294
287 private: 295 private:
288 // Overridden from views::View. 296 // Overridden from views::View.
289 virtual gfx::Size GetPreferredSize() OVERRIDE; 297 virtual gfx::Size GetPreferredSize() OVERRIDE;
290 virtual int GetHeightForWidth(int width) OVERRIDE; 298 virtual int GetHeightForWidth(int width) OVERRIDE;
291 virtual void Layout() OVERRIDE; 299 virtual void Layout() OVERRIDE;
292 300
293 // Create the additional client content for this item. 301 // Create the additional client content for this item.
294 void AddContent(); 302 void AddContent();
295 303
296 // This is the content we create and show. 304 // This is the content we create and show.
297 views::View* add_user_; 305 views::View* add_user_;
298 306
299 // This listener will get informed when someone clicks on this button. 307 // This listener will get informed when someone clicks on this button.
300 views::ButtonListener* listener_; 308 views::ButtonListener* listener_;
301 309
302 // This is the owner view of this item. 310 // This is the owner view of this item.
303 UserCard* owner_; 311 UserCard* owner_;
304 312
313 // The anchor view for targetted bubble messages.
314 views::View* anchor_;
315
305 DISALLOW_COPY_AND_ASSIGN(AddUserView); 316 DISALLOW_COPY_AND_ASSIGN(AddUserView);
306 }; 317 };
307 318
308 RoundedImageView::RoundedImageView(int corner_radius, bool active_user) 319 RoundedImageView::RoundedImageView(int corner_radius, bool active_user)
309 : corner_radius_(corner_radius), 320 : corner_radius_(corner_radius),
310 active_user_(active_user) {} 321 active_user_(active_user) {}
311 322
312 RoundedImageView::~RoundedImageView() {} 323 RoundedImageView::~RoundedImageView() {}
313 324
314 void RoundedImageView::SetImage(const gfx::ImageSkia& img, 325 void RoundedImageView::SetImage(const gfx::ImageSkia& img,
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 // The logout button must be added before the user card so that the user card 595 // The logout button must be added before the user card so that the user card
585 // can correctly calculate the remaining available width. 596 // can correctly calculate the remaining available width.
586 // Note that only the current multiprofile user gets a button. 597 // Note that only the current multiprofile user gets a button.
587 AddLogoutButton(!multiprofile_index_ ? login : ash::user::LOGGED_IN_LOCKED); 598 AddLogoutButton(!multiprofile_index_ ? login : ash::user::LOGGED_IN_LOCKED);
588 AddUserCard(owner, login); 599 AddUserCard(owner, login);
589 } 600 }
590 601
591 UserView::~UserView() {} 602 UserView::~UserView() {}
592 603
593 void UserView::MouseMovedOutOfHost() { 604 void UserView::MouseMovedOutOfHost() {
594 // Make sure that the MouseWatcher does not outlive our add menu option. 605 popup_message_.reset();
595 DCHECK(!add_menu_option_.get());
596 mouse_watcher_.reset(); 606 mouse_watcher_.reset();
597 add_menu_option_.reset(); 607 add_menu_option_.reset();
598 } 608 }
599 609
600 gfx::Size UserView::GetPreferredSize() { 610 gfx::Size UserView::GetPreferredSize() {
601 gfx::Size size = views::View::GetPreferredSize(); 611 gfx::Size size = views::View::GetPreferredSize();
602 // Only the active user panel will be forced to a certain height. 612 // Only the active user panel will be forced to a certain height.
603 if (!multiprofile_index_) { 613 if (!multiprofile_index_) {
604 size.set_height(std::max(size.height(), 614 size.set_height(std::max(size.height(),
605 kTrayPopupItemHeight + GetInsets().height())); 615 kTrayPopupItemHeight + GetInsets().height()));
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 } 835 }
826 836
827 void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) { 837 void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) {
828 user_card_->AddChildView(CreateIconForUserCard(ash::user::LOGGED_IN_PUBLIC)); 838 user_card_->AddChildView(CreateIconForUserCard(ash::user::LOGGED_IN_PUBLIC));
829 user_card_->AddChildView(new PublicAccountUserDetails( 839 user_card_->AddChildView(new PublicAccountUserDetails(
830 owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems)); 840 owner, GetPreferredSize().width() + kTrayPopupPaddingBetweenItems));
831 } 841 }
832 842
833 void UserView::ToggleAddUserMenuOption() { 843 void UserView::ToggleAddUserMenuOption() {
834 if (add_menu_option_.get()) { 844 if (add_menu_option_.get()) {
845 popup_message_.reset();
835 mouse_watcher_.reset(); 846 mouse_watcher_.reset();
836 add_menu_option_.reset(); 847 add_menu_option_.reset();
837 return; 848 return;
838 } 849 }
839 850
840 // Note: We do not need to install a global event handler to delete this 851 // Note: We do not need to install a global event handler to delete this
841 // item since it will destroyed automatically before the menu / user menu item 852 // item since it will destroyed automatically before the menu / user menu item
842 // gets destroyed.. 853 // gets destroyed..
843 const SessionStateDelegate* session_state_delegate = 854 const SessionStateDelegate* session_state_delegate =
844 ash::Shell::GetInstance()->session_state_delegate(); 855 ash::Shell::GetInstance()->session_state_delegate();
(...skipping 13 matching lines...) Expand all
858 add_menu_option_->GetNativeWindow()->set_owned_by_parent(false); 869 add_menu_option_->GetNativeWindow()->set_owned_by_parent(false);
859 SetShadowType(add_menu_option_->GetNativeView(), 870 SetShadowType(add_menu_option_->GetNativeView(),
860 views::corewm::SHADOW_TYPE_NONE); 871 views::corewm::SHADOW_TYPE_NONE);
861 872
862 // Position it below our user card. 873 // Position it below our user card.
863 gfx::Rect bounds = user_card_->GetBoundsInScreen(); 874 gfx::Rect bounds = user_card_->GetBoundsInScreen();
864 bounds.set_y(bounds.y() + bounds.height()); 875 bounds.set_y(bounds.y() + bounds.height());
865 add_menu_option_->SetBounds(bounds); 876 add_menu_option_->SetBounds(bounds);
866 877
867 // Show the content. 878 // Show the content.
868 add_menu_option_->SetContentsView(new AddUserView( 879 AddUserView* add_user_view = new AddUserView(
869 static_cast<UserCard*>(user_card_), this)); 880 static_cast<UserCard*>(user_card_), this);
881 add_menu_option_->SetContentsView(add_user_view);
870 add_menu_option_->SetAlwaysOnTop(true); 882 add_menu_option_->SetAlwaysOnTop(true);
871 add_menu_option_->Show(); 883 add_menu_option_->Show();
872 if (cannot_add_more_users) { 884 if (cannot_add_more_users) {
873 // TODO(skuhne): Use IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER and 885 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
874 // IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER when showing the error 886 popup_message_.reset(new PopupMessage(
875 // message that no more users can be added. 887 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER),
888 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER),
889 PopupMessage::ICON_WARNING,
890 add_user_view->anchor(),
891 views::BubbleBorder::TOP_LEFT,
892 gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0),
893 2 * kPopupMessageOffset));
876 } 894 }
877 // Find the screen area which encloses both elements and sets then a mouse 895 // Find the screen area which encloses both elements and sets then a mouse
878 // watcher which will close the "menu". 896 // watcher which will close the "menu".
879 gfx::Rect area = user_card_->GetBoundsInScreen(); 897 gfx::Rect area = user_card_->GetBoundsInScreen();
880 area.set_height(2 * area.height()); 898 area.set_height(2 * area.height());
881 mouse_watcher_.reset(new views::MouseWatcher( 899 mouse_watcher_.reset(new views::MouseWatcher(
882 new UserViewMouseWatcherHost(area), 900 new UserViewMouseWatcherHost(area),
883 this)); 901 this));
884 mouse_watcher_->Start(); 902 mouse_watcher_->Start();
885 } 903 }
886 904
887 AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener) 905 AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener)
888 : CustomButton(listener_), 906 : CustomButton(listener_),
889 add_user_(NULL), 907 add_user_(NULL),
890 listener_(listener), 908 listener_(listener),
891 owner_(owner) { 909 owner_(owner),
910 anchor_(NULL) {
892 AddContent(); 911 AddContent();
893 owner_->ForceBorderVisible(true); 912 owner_->ForceBorderVisible(true);
894 } 913 }
895 914
896 AddUserView::~AddUserView() { 915 AddUserView::~AddUserView() {
897 owner_->ForceBorderVisible(false); 916 owner_->ForceBorderVisible(false);
898 } 917 }
899 918
900 gfx::Size AddUserView::GetPreferredSize() { 919 gfx::Size AddUserView::GetPreferredSize() {
901 return owner_->bounds().size(); 920 return owner_->bounds().size();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 add_user_->set_border(views::Border::CreateEmptyBorder( 954 add_user_->set_border(views::Border::CreateEmptyBorder(
936 kUserCardVerticalPadding, 955 kUserCardVerticalPadding,
937 kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset, 956 kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset,
938 kUserCardVerticalPadding, 957 kUserCardVerticalPadding,
939 kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset)); 958 kTrayPopupPaddingHorizontal- kTrayUserTileHoverBorderInset));
940 959
941 add_user_->SetLayoutManager(new views::BoxLayout( 960 add_user_->SetLayoutManager(new views::BoxLayout(
942 views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems)); 961 views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems));
943 AddChildViewAt(add_user_, 0); 962 AddChildViewAt(add_user_, 0);
944 963
945 // Add the [+] icon. 964 // Add the [+] icon which is also the anchor for messages.
946 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 965 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
947 RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius, 966 RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius,
948 true); 967 true);
949 // TODO(skuhne): Add the resource and load the proper icon. 968 anchor_ = icon;
950 icon->SetImage(*ui::ResourceBundle::GetSharedInstance(). 969 icon->SetImage(*ui::ResourceBundle::GetSharedInstance().
951 GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(), 970 GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(),
952 gfx::Size(kUserIconSize, kUserIconSize)); 971 gfx::Size(kUserIconSize, kUserIconSize));
953 add_user_->AddChildView(icon); 972 add_user_->AddChildView(icon);
954 973
955 // Add the command text. 974 // Add the command text.
956 views::Label* command_label = new views::Label( 975 views::Label* command_label = new views::Label(
957 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT)); 976 bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_SIGN_IN_ANOTHER_ACCOUNT));
958 command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 977 command_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
959 add_user_->AddChildView(command_label); 978 add_user_->AddChildView(command_label);
960 } 979 }
961 980
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 // If there are multiple users logged in, the users will be separated from the 1022 // If there are multiple users logged in, the users will be separated from the
1004 // rest of the menu by a separator. 1023 // rest of the menu by a separator.
1005 if (multiprofile_index_ == 1024 if (multiprofile_index_ ==
1006 session_state_delegate->GetMaximumNumberOfLoggedInUsers() && 1025 session_state_delegate->GetMaximumNumberOfLoggedInUsers() &&
1007 logged_in_users > 1) { 1026 logged_in_users > 1) {
1008 return new views::View(); 1027 return new views::View();
1009 } 1028 }
1010 1029
1011 // Do not show more UserView's then there are logged in users. 1030 // Do not show more UserView's then there are logged in users.
1012 if (multiprofile_index_ >= logged_in_users) 1031 if (multiprofile_index_ >= logged_in_users)
1013 return NULL;; 1032 return NULL;
1014 1033
1015 user_ = new tray::UserView(this, status, multiprofile_index_); 1034 user_ = new tray::UserView(this, status, multiprofile_index_);
1016 return user_; 1035 return user_;
1017 } 1036 }
1018 1037
1019 views::View* TrayUser::CreateDetailedView(user::LoginStatus status) { 1038 views::View* TrayUser::CreateDetailedView(user::LoginStatus status) {
1020 return NULL; 1039 return NULL;
1021 } 1040 }
1022 1041
1023 void TrayUser::DestroyTrayView() { 1042 void TrayUser::DestroyTrayView() {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 if (avatar_) { 1157 if (avatar_) {
1139 avatar_->SetImage( 1158 avatar_->SetImage(
1140 ash::Shell::GetInstance()->session_state_delegate()->GetUserImage( 1159 ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
1141 multiprofile_index_), 1160 multiprofile_index_),
1142 gfx::Size(kUserIconSize, kUserIconSize)); 1161 gfx::Size(kUserIconSize, kUserIconSize));
1143 } 1162 }
1144 } 1163 }
1145 1164
1146 } // namespace internal 1165 } // namespace internal
1147 } // namespace ash 1166 } // namespace ash
OLDNEW
« no previous file with comments | « ash/resources/ash_resources.grd ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698