| // 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/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; |
| |
| class DateDefaultView : public views::View, |
| public views::ButtonListener { |
| public: |
| explicit DateDefaultView(ash::user::LoginStatus login) |
| : help_(NULL), |
| shutdown_(NULL), |
| lock_(NULL) { |
| SetLayoutManager(new views::FillLayout); |
| |
| ash::internal::tray::DateView* date_view = |
| new ash::internal::tray::DateView(); |
| date_view->set_border(views::Border::CreateEmptyBorder(kPaddingVertical, |
| ash::kTrayPopupPaddingHorizontal, |
| 0, |
| 0)); |
| ash::internal::SpecialPopupRow* view = new ash::internal::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 ash::internal::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 ash::internal::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 ash::internal::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_; |
| } |
| |
| private: |
| // Overridden from views::ButtonListener. |
| virtual void ButtonPressed(views::Button* sender, |
| const ui::Event& event) OVERRIDE { |
| ash::Shell* shell = ash::Shell::GetInstance(); |
| ash::ShellDelegate* shell_delegate = shell->delegate(); |
| ash::SystemTrayDelegate* tray_delegate = shell->system_tray_delegate(); |
| if (sender == help_) { |
| shell_delegate->RecordUserMetricsAction(ash::UMA_TRAY_HELP); |
| tray_delegate->ShowHelp(); |
| } else if (sender == shutdown_) { |
| shell_delegate->RecordUserMetricsAction(ash::UMA_TRAY_SHUT_DOWN); |
| tray_delegate->ShutDown(); |
| } else if (sender == lock_) { |
| shell_delegate->RecordUserMetricsAction(ash::UMA_TRAY_LOCK_SCREEN); |
| tray_delegate->RequestLockScreen(); |
| } else { |
| NOTREACHED(); |
| } |
| } |
| |
| ash::internal::TrayPopupHeaderButton* help_; |
| ash::internal::TrayPopupHeaderButton* shutdown_; |
| ash::internal::TrayPopupHeaderButton* lock_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DateDefaultView); |
| }; |
| |
| } // namespace |
| |
| namespace ash { |
| namespace internal { |
| |
| 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 static_cast<DateDefaultView*>(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(); |
| } |
| |
| void TrayDate::OnSystemClockTimeUpdated() { |
| if (time_tray_) |
| time_tray_->UpdateTimeFormat(); |
| } |
| |
| void TrayDate::Refresh() { |
| if (time_tray_) |
| time_tray_->UpdateText(); |
| } |
| |
| } // namespace internal |
| } // namespace ash |