summaryrefslogtreecommitdiff
path: root/chromium/ash/system/logout_button/logout_button_tray.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/system/logout_button/logout_button_tray.cc')
-rw-r--r--chromium/ash/system/logout_button/logout_button_tray.cc158
1 files changed, 158 insertions, 0 deletions
diff --git a/chromium/ash/system/logout_button/logout_button_tray.cc b/chromium/ash/system/logout_button/logout_button_tray.cc
new file mode 100644
index 00000000000..c06073040c5
--- /dev/null
+++ b/chromium/ash/system/logout_button/logout_button_tray.cc
@@ -0,0 +1,158 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/logout_button/logout_button_tray.h"
+
+#include "ash/shelf/shelf_types.h"
+#include "ash/shell.h"
+#include "ash/system/status_area_widget.h"
+#include "ash/system/tray/system_tray_delegate.h"
+#include "ash/system/tray/system_tray_notifier.h"
+#include "ash/system/tray/tray_constants.h"
+#include "ash/system/tray/tray_utils.h"
+#include "base/logging.h"
+#include "grit/ash_resources.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/events/event.h"
+#include "ui/gfx/font.h"
+#include "ui/gfx/insets.h"
+#include "ui/gfx/size.h"
+#include "ui/views/bubble/tray_bubble_view.h"
+#include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/button/label_button_border.h"
+#include "ui/views/painter.h"
+
+namespace ash {
+
+namespace internal {
+
+namespace {
+
+const int kLogoutButtonHorizontalExtraPadding = 7;
+
+const int kLogoutButtonNormalImages[] = {
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_CENTER,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM_RIGHT
+};
+
+const int kLogoutButtonPushedImages[] = {
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_CENTER,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_RIGHT
+};
+
+class LogoutButton : public views::LabelButton {
+ public:
+ LogoutButton(views::ButtonListener* listener);
+ virtual ~LogoutButton();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(LogoutButton);
+};
+
+} // namespace
+
+LogoutButton::LogoutButton(views::ButtonListener* listener)
+ : views::LabelButton(listener, base::string16()) {
+ SetupLabelForTray(label());
+ SetFont(GetFont().DeriveFont(0, gfx::Font::NORMAL));
+ for (size_t state = 0; state < views::Button::STATE_COUNT; ++state)
+ SetTextColor(static_cast<views::Button::ButtonState>(state), SK_ColorWHITE);
+
+ views::LabelButtonBorder* border =
+ new views::LabelButtonBorder(views::Button::STYLE_TEXTBUTTON);
+ border->SetPainter(false, views::Button::STATE_NORMAL,
+ views::Painter::CreateImageGridPainter(kLogoutButtonNormalImages));
+ border->SetPainter(false, views::Button::STATE_HOVERED,
+ views::Painter::CreateImageGridPainter(kLogoutButtonNormalImages));
+ border->SetPainter(false, views::Button::STATE_PRESSED,
+ views::Painter::CreateImageGridPainter(kLogoutButtonPushedImages));
+ gfx::Insets insets = border->GetInsets();
+ insets += gfx::Insets(0, kLogoutButtonHorizontalExtraPadding,
+ 0, kLogoutButtonHorizontalExtraPadding);
+ border->set_insets(insets);
+ set_border(border);
+ set_animate_on_state_change(false);
+
+ set_min_size(gfx::Size(0, GetShelfItemHeight()));
+}
+
+LogoutButton::~LogoutButton() {
+}
+
+LogoutButtonTray::LogoutButtonTray(StatusAreaWidget* status_area_widget)
+ : TrayBackgroundView(status_area_widget),
+ button_(NULL),
+ login_status_(user::LOGGED_IN_NONE),
+ show_logout_button_in_tray_(false) {
+ button_ = new LogoutButton(this);
+ tray_container()->AddChildView(button_);
+ tray_container()->set_border(NULL);
+ Shell::GetInstance()->system_tray_notifier()->AddLogoutButtonObserver(this);
+}
+
+LogoutButtonTray::~LogoutButtonTray() {
+ Shell::GetInstance()->system_tray_notifier()->
+ RemoveLogoutButtonObserver(this);
+}
+
+void LogoutButtonTray::SetShelfAlignment(ShelfAlignment alignment) {
+ TrayBackgroundView::SetShelfAlignment(alignment);
+ tray_container()->set_border(NULL);
+}
+
+base::string16 LogoutButtonTray::GetAccessibleNameForTray() {
+ return button_->GetText();
+}
+
+void LogoutButtonTray::HideBubbleWithView(
+ const views::TrayBubbleView* bubble_view) {
+}
+
+bool LogoutButtonTray::ClickedOutsideBubble() {
+ return false;
+}
+
+void LogoutButtonTray::OnShowLogoutButtonInTrayChanged(bool show) {
+ show_logout_button_in_tray_ = show;
+ UpdateVisibility();
+}
+
+void LogoutButtonTray::ButtonPressed(views::Button* sender,
+ const ui::Event& event) {
+ DCHECK_EQ(sender, button_);
+ Shell::GetInstance()->system_tray_delegate()->SignOut();
+}
+
+void LogoutButtonTray::UpdateAfterLoginStatusChange(
+ user::LoginStatus login_status) {
+ login_status_ = login_status;
+ const base::string16 title =
+ GetLocalizedSignOutStringForStatus(login_status, false);
+ button_->SetText(title);
+ button_->SetAccessibleName(title);
+ UpdateVisibility();
+}
+
+void LogoutButtonTray::UpdateVisibility() {
+ SetVisible(show_logout_button_in_tray_ &&
+ login_status_ != user::LOGGED_IN_NONE &&
+ login_status_ != user::LOGGED_IN_LOCKED);
+}
+
+} // namespace internal
+} // namespace ash