diff options
Diffstat (limited to 'chromium/ash/system/date/tray_date.cc')
-rw-r--r-- | chromium/ash/system/date/tray_date.cc | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/chromium/ash/system/date/tray_date.cc b/chromium/ash/system/date/tray_date.cc new file mode 100644 index 00000000000..c2a4b923646 --- /dev/null +++ b/chromium/ash/system/date/tray_date.cc @@ -0,0 +1,240 @@ +// 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/date/tray_date.h" + +#include "ash/metrics/user_metrics_recorder.h" +#include "ash/session_state_delegate.h" +#include "ash/shell.h" +#include "ash/shell_delegate.h" +#include "ash/system/date/date_view.h" +#include "ash/system/tray/system_tray.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_item_view.h" +#include "ash/system/tray/tray_popup_header_button.h" +#include "base/i18n/time_formatting.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" +#include "base/timer/timer.h" +#include "grit/ash_resources.h" +#include "grit/ash_strings.h" +#include "third_party/icu/source/i18n/unicode/datefmt.h" +#include "third_party/icu/source/i18n/unicode/fieldpos.h" +#include "third_party/icu/source/i18n/unicode/fmtable.h" +#include "third_party/skia/include/core/SkRect.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/gfx/size.h" +#include "ui/views/controls/button/button.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/painter.h" +#include "ui/views/view.h" +#include "ui/views/widget/widget.h" + +#if defined(OS_CHROMEOS) +#include "ash/system/chromeos/system_clock_observer.h" +#endif + +namespace { + +const int kPaddingVertical = 19; + +} // namespace + +namespace ash { +namespace internal { + +class DateDefaultView : public views::View, + public views::ButtonListener { + public: + explicit DateDefaultView(ash::user::LoginStatus login) + : help_(NULL), + shutdown_(NULL), + lock_(NULL), + date_view_(NULL) { + SetLayoutManager(new views::FillLayout); + + date_view_ = new tray::DateView(); + date_view_->set_border(views::Border::CreateEmptyBorder(kPaddingVertical, + ash::kTrayPopupPaddingHorizontal, + 0, + 0)); + SpecialPopupRow* view = new SpecialPopupRow(); + view->SetContent(date_view_); + AddChildView(view); + + if (login == ash::user::LOGGED_IN_LOCKED || + login == ash::user::LOGGED_IN_NONE) + return; + + date_view_->SetActionable(true); + + help_ = new TrayPopupHeaderButton(this, + IDR_AURA_UBER_TRAY_HELP, + IDR_AURA_UBER_TRAY_HELP, + IDR_AURA_UBER_TRAY_HELP_HOVER, + IDR_AURA_UBER_TRAY_HELP_HOVER, + IDS_ASH_STATUS_TRAY_HELP); + help_->SetTooltipText(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_HELP)); + view->AddButton(help_); + +#if !defined(OS_WIN) + if (login != ash::user::LOGGED_IN_LOCKED && + login != ash::user::LOGGED_IN_RETAIL_MODE) { + shutdown_ = new TrayPopupHeaderButton(this, + IDR_AURA_UBER_TRAY_SHUTDOWN, + IDR_AURA_UBER_TRAY_SHUTDOWN, + IDR_AURA_UBER_TRAY_SHUTDOWN_HOVER, + IDR_AURA_UBER_TRAY_SHUTDOWN_HOVER, + IDS_ASH_STATUS_TRAY_SHUTDOWN); + shutdown_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SHUTDOWN)); + view->AddButton(shutdown_); + } + + if (ash::Shell::GetInstance()->session_state_delegate()->CanLockScreen()) { + lock_ = new TrayPopupHeaderButton(this, + IDR_AURA_UBER_TRAY_LOCKSCREEN, + IDR_AURA_UBER_TRAY_LOCKSCREEN, + IDR_AURA_UBER_TRAY_LOCKSCREEN_HOVER, + IDR_AURA_UBER_TRAY_LOCKSCREEN_HOVER, + IDS_ASH_STATUS_TRAY_LOCK); + lock_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_LOCK)); + view->AddButton(lock_); + } +#endif // !defined(OS_WIN) + } + + virtual ~DateDefaultView() {} + + views::View* GetHelpButtonView() const { + return help_; + } + + tray::DateView* GetDateView() const { + return date_view_; + } + + private: + // Overridden from views::ButtonListener. + virtual void ButtonPressed(views::Button* sender, + const ui::Event& event) OVERRIDE { + ash::Shell* shell = ash::Shell::GetInstance(); + ash::SystemTrayDelegate* tray_delegate = shell->system_tray_delegate(); + if (sender == help_) { + shell->metrics()->RecordUserMetricsAction(ash::UMA_TRAY_HELP); + tray_delegate->ShowHelp(); + } else if (sender == shutdown_) { + shell->metrics()->RecordUserMetricsAction(ash::UMA_TRAY_SHUT_DOWN); + tray_delegate->ShutDown(); + } else if (sender == lock_) { + shell->metrics()->RecordUserMetricsAction(ash::UMA_TRAY_LOCK_SCREEN); + tray_delegate->RequestLockScreen(); + } else { + NOTREACHED(); + } + } + + TrayPopupHeaderButton* help_; + TrayPopupHeaderButton* shutdown_; + TrayPopupHeaderButton* lock_; + tray::DateView* date_view_; + + DISALLOW_COPY_AND_ASSIGN(DateDefaultView); +}; + +TrayDate::TrayDate(SystemTray* system_tray) + : SystemTrayItem(system_tray), + time_tray_(NULL), + default_view_(NULL) { +#if defined(OS_CHROMEOS) + system_clock_observer_.reset(new SystemClockObserver()); +#endif + Shell::GetInstance()->system_tray_notifier()->AddClockObserver(this); +} + +TrayDate::~TrayDate() { + Shell::GetInstance()->system_tray_notifier()->RemoveClockObserver(this); +} + +views::View* TrayDate::GetHelpButtonView() const { + if (!default_view_) + return NULL; + return default_view_->GetHelpButtonView(); +} + +views::View* TrayDate::CreateTrayView(user::LoginStatus status) { + CHECK(time_tray_ == NULL); + ClockLayout clock_layout = + (system_tray()->shelf_alignment() == SHELF_ALIGNMENT_BOTTOM || + system_tray()->shelf_alignment() == SHELF_ALIGNMENT_TOP) ? + HORIZONTAL_CLOCK : VERTICAL_CLOCK; + time_tray_ = new tray::TimeView(clock_layout); + views::View* view = new TrayItemView(this); + view->AddChildView(time_tray_); + return view; +} + +views::View* TrayDate::CreateDefaultView(user::LoginStatus status) { + default_view_ = new DateDefaultView(status); + return default_view_; +} + +views::View* TrayDate::CreateDetailedView(user::LoginStatus status) { + return NULL; +} + +void TrayDate::DestroyTrayView() { + time_tray_ = NULL; +} + +void TrayDate::DestroyDefaultView() { + default_view_ = NULL; +} + +void TrayDate::DestroyDetailedView() { +} + +void TrayDate::UpdateAfterLoginStatusChange(user::LoginStatus status) { +} + +void TrayDate::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { + if (time_tray_) { + ClockLayout clock_layout = (alignment == SHELF_ALIGNMENT_BOTTOM || + alignment == SHELF_ALIGNMENT_TOP) ? + HORIZONTAL_CLOCK : VERTICAL_CLOCK; + time_tray_->UpdateClockLayout(clock_layout); + } +} + +void TrayDate::OnDateFormatChanged() { + if (time_tray_) + time_tray_->UpdateTimeFormat(); + if (default_view_) + default_view_->GetDateView()->UpdateTimeFormat(); +} + +void TrayDate::OnSystemClockTimeUpdated() { + if (time_tray_) + time_tray_->UpdateTimeFormat(); + if (default_view_) + default_view_->GetDateView()->UpdateTimeFormat(); +} + +void TrayDate::Refresh() { + if (time_tray_) + time_tray_->UpdateText(); +} + +} // namespace internal +} // namespace ash |