diff options
Diffstat (limited to 'chromium/ash/system/chromeos/settings/tray_settings.cc')
-rw-r--r-- | chromium/ash/system/chromeos/settings/tray_settings.cc | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/chromium/ash/system/chromeos/settings/tray_settings.cc b/chromium/ash/system/chromeos/settings/tray_settings.cc new file mode 100644 index 00000000000..8868b7cf50d --- /dev/null +++ b/chromium/ash/system/chromeos/settings/tray_settings.cc @@ -0,0 +1,172 @@ +// Copyright (c) 2012 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/chromeos/settings/tray_settings.h" + +#include "ash/shell.h" +#include "ash/system/chromeos/power/power_status.h" +#include "ash/system/chromeos/power/power_status_view.h" +#include "ash/system/tray/actionable_view.h" +#include "ash/system/tray/fixed_sized_image_view.h" +#include "ash/system/tray/system_tray_delegate.h" +#include "ash/system/tray/tray_constants.h" +#include "base/logging.h" +#include "base/strings/utf_string_conversions.h" +#include "grit/ash_resources.h" +#include "grit/ash_strings.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/base/accessibility/accessible_view_state.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image.h" +#include "ui/views/controls/image_view.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/box_layout.h" +#include "ui/views/layout/fill_layout.h" +#include "ui/views/view.h" + +namespace ash { +namespace internal { + +namespace tray { + +class SettingsDefaultView : public ActionableView, + public PowerStatus::Observer { + public: + explicit SettingsDefaultView(user::LoginStatus status) + : login_status_(status), + label_(NULL), + power_status_view_(NULL) { + PowerStatus::Get()->AddObserver(this); + SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, + ash::kTrayPopupPaddingHorizontal, 0, + ash::kTrayPopupPaddingBetweenItems)); + + bool power_view_right_align = false; + if (login_status_ != user::LOGGED_IN_NONE && + login_status_ != user::LOGGED_IN_LOCKED) { + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + views::ImageView* icon = + new ash::internal::FixedSizedImageView(0, ash::kTrayPopupItemHeight); + icon->SetImage( + rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia()); + AddChildView(icon); + + base::string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_SETTINGS); + label_ = new views::Label(text); + AddChildView(label_); + SetAccessibleName(text); + + power_view_right_align = true; + } + + if (PowerStatus::Get()->IsBatteryPresent()) { + power_status_view_ = new ash::internal::PowerStatusView( + ash::internal::PowerStatusView::VIEW_DEFAULT, power_view_right_align); + AddChildView(power_status_view_); + OnPowerStatusChanged(); + } + } + + virtual ~SettingsDefaultView() { + PowerStatus::Get()->RemoveObserver(this); + } + + // Overridden from ash::internal::ActionableView. + virtual bool PerformAction(const ui::Event& event) OVERRIDE { + if (login_status_ == user::LOGGED_IN_NONE || + login_status_ == user::LOGGED_IN_LOCKED) + return false; + + ash::Shell::GetInstance()->system_tray_delegate()->ShowSettings(); + return true; + } + + // Overridden from views::View. + virtual void Layout() OVERRIDE { + views::View::Layout(); + + if (label_ && power_status_view_) { + // Let the box-layout do the layout first. Then move power_status_view_ + // to right align if it is created. + gfx::Size size = power_status_view_->GetPreferredSize(); + gfx::Rect bounds(size); + bounds.set_x(width() - size.width() - ash::kTrayPopupPaddingBetweenItems); + bounds.set_y((height() - size.height()) / 2); + power_status_view_->SetBoundsRect(bounds); + } + } + + // Overridden from views::View. + virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { + views::View::ChildPreferredSizeChanged(child); + Layout(); + } + + // Overridden from PowerStatus::Observer. + virtual void OnPowerStatusChanged() OVERRIDE { + if (!PowerStatus::Get()->IsBatteryPresent()) + return; + + base::string16 accessible_name = label_ ? + label_->text() + ASCIIToUTF16(", ") + + PowerStatus::Get()->GetAccessibleNameString() : + PowerStatus::Get()->GetAccessibleNameString(); + SetAccessibleName(accessible_name); + } + + private: + user::LoginStatus login_status_; + views::Label* label_; + ash::internal::PowerStatusView* power_status_view_; + + DISALLOW_COPY_AND_ASSIGN(SettingsDefaultView); + }; + +} // namespace tray + +TraySettings::TraySettings(SystemTray* system_tray) + : SystemTrayItem(system_tray), + default_view_(NULL) { +} + +TraySettings::~TraySettings() { +} + +views::View* TraySettings::CreateTrayView(user::LoginStatus status) { + return NULL; +} + +views::View* TraySettings::CreateDefaultView(user::LoginStatus status) { + if ((status == user::LOGGED_IN_NONE || status == user::LOGGED_IN_LOCKED) && + !PowerStatus::Get()->IsBatteryPresent()) + return NULL; + + if (!ash::Shell::GetInstance()->system_tray_delegate()->ShouldShowSettings()) + return NULL; + + CHECK(default_view_ == NULL); + default_view_ = new tray::SettingsDefaultView(status); + return default_view_; +} + +views::View* TraySettings::CreateDetailedView(user::LoginStatus status) { + NOTIMPLEMENTED(); + return NULL; +} + +void TraySettings::DestroyTrayView() { +} + +void TraySettings::DestroyDefaultView() { + default_view_ = NULL; +} + +void TraySettings::DestroyDetailedView() { +} + +void TraySettings::UpdateAfterLoginStatusChange(user::LoginStatus status) { +} + +} // namespace internal +} // namespace ash |