Index: ash/system/user/tray_user.cc |
diff --git a/ash/system/user/tray_user.cc b/ash/system/user/tray_user.cc |
index 51d09015404a7632e08c4d86d5e55681eff809fb..5c56e901e4c5e76cdd483e156419db2da71ff86e 100644 |
--- a/ash/system/user/tray_user.cc |
+++ b/ash/system/user/tray_user.cc |
@@ -8,6 +8,7 @@ |
#include <climits> |
#include <vector> |
+#include "ash/popup_message.h" |
#include "ash/session_state_delegate.h" |
#include "ash/shell.h" |
#include "ash/shell_delegate.h" |
@@ -105,6 +106,9 @@ const int kPublicAccountLogoutButtonBorderImagesHovered[] = { |
IDR_AURA_TRAY_POPUP_PUBLIC_ACCOUNT_LOGOUT_BUTTON_BORDER, |
}; |
+// Offsetting the popup message relative to the tray menu. |
+const int kPopupMessageOffset = 25; |
+ |
} // namespace |
namespace ash { |
@@ -262,6 +266,7 @@ class UserView : public views::View, |
MultiProfileIndex multiprofile_index_; |
views::View* user_card_; |
views::View* logout_button_; |
+ scoped_ptr<ash::PopupMessage> popup_message_; |
scoped_ptr<views::Widget> add_menu_option_; |
// The mouse watcher which takes care of out of window hover events. |
@@ -280,6 +285,9 @@ class AddUserView : public views::CustomButton, |
AddUserView(UserCard* owner, views::ButtonListener* listener); |
virtual ~AddUserView(); |
+ // Get the anchor view for a message. |
+ views::View* anchor() { return anchor_; } |
+ |
// Overridden from views::ButtonListener. |
virtual void ButtonPressed(views::Button* sender, |
const ui::Event& event) OVERRIDE; |
@@ -302,6 +310,9 @@ class AddUserView : public views::CustomButton, |
// This is the owner view of this item. |
UserCard* owner_; |
+ // The anchor view for targetted bubble messages. |
+ views::View* anchor_; |
+ |
DISALLOW_COPY_AND_ASSIGN(AddUserView); |
}; |
@@ -591,8 +602,7 @@ UserView::UserView(SystemTrayItem* owner, |
UserView::~UserView() {} |
void UserView::MouseMovedOutOfHost() { |
- // Make sure that the MouseWatcher does not outlive our add menu option. |
- DCHECK(!add_menu_option_.get()); |
+ popup_message_.reset(); |
mouse_watcher_.reset(); |
add_menu_option_.reset(); |
} |
@@ -832,6 +842,7 @@ void UserView::AddLoggedInPublicModeUserCardContent(SystemTrayItem* owner) { |
void UserView::ToggleAddUserMenuOption() { |
if (add_menu_option_.get()) { |
+ popup_message_.reset(); |
mouse_watcher_.reset(); |
add_menu_option_.reset(); |
return; |
@@ -865,14 +876,21 @@ void UserView::ToggleAddUserMenuOption() { |
add_menu_option_->SetBounds(bounds); |
// Show the content. |
- add_menu_option_->SetContentsView(new AddUserView( |
- static_cast<UserCard*>(user_card_), this)); |
+ AddUserView* add_user_view = new AddUserView( |
+ static_cast<UserCard*>(user_card_), this); |
+ add_menu_option_->SetContentsView(add_user_view); |
add_menu_option_->SetAlwaysOnTop(true); |
add_menu_option_->Show(); |
if (cannot_add_more_users) { |
- // TODO(skuhne): Use IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER and |
- // IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER when showing the error |
- // message that no more users can be added. |
+ ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
+ popup_message_.reset(new PopupMessage( |
+ bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_CAPTION_CANNOT_ADD_USER), |
+ bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_MESSAGE_CANNOT_ADD_USER), |
+ PopupMessage::ICON_WARNING, |
+ add_user_view->anchor(), |
+ views::BubbleBorder::TOP_LEFT, |
+ gfx::Size(parent()->bounds().width() - kPopupMessageOffset, 0), |
+ 2 * kPopupMessageOffset)); |
} |
// Find the screen area which encloses both elements and sets then a mouse |
// watcher which will close the "menu". |
@@ -888,7 +906,8 @@ AddUserView::AddUserView(UserCard* owner, views::ButtonListener* listener) |
: CustomButton(listener_), |
add_user_(NULL), |
listener_(listener), |
- owner_(owner) { |
+ owner_(owner), |
+ anchor_(NULL) { |
AddContent(); |
owner_->ForceBorderVisible(true); |
} |
@@ -942,13 +961,13 @@ void AddUserView::AddContent() { |
views::BoxLayout::kHorizontal, 0, 0 , kTrayPopupPaddingBetweenItems)); |
AddChildViewAt(add_user_, 0); |
- // Add the [+] icon. |
+ // Add the [+] icon which is also the anchor for messages. |
ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
RoundedImageView* icon = new RoundedImageView(kProfileRoundedCornerRadius, |
true); |
- // TODO(skuhne): Add the resource and load the proper icon. |
+ anchor_ = icon; |
icon->SetImage(*ui::ResourceBundle::GetSharedInstance(). |
- GetImageNamed(IDR_AURA_UBER_TRAY_GUEST_ICON).ToImageSkia(), |
+ GetImageNamed(IDR_AURA_UBER_TRAY_ADD_MULTIPROFILE_USER).ToImageSkia(), |
gfx::Size(kUserIconSize, kUserIconSize)); |
add_user_->AddChildView(icon); |
@@ -1010,7 +1029,7 @@ views::View* TrayUser::CreateDefaultView(user::LoginStatus status) { |
// Do not show more UserView's then there are logged in users. |
if (multiprofile_index_ >= logged_in_users) |
- return NULL;; |
+ return NULL; |
user_ = new tray::UserView(this, status, multiprofile_index_); |
return user_; |