Home | History | Annotate | Download | only in date
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ash/system/date/tray_date.h"
      6 
      7 #include "ash/shell.h"
      8 #include "ash/system/date/date_default_view.h"
      9 #include "ash/system/date/date_view.h"
     10 #include "ash/system/tray/system_tray.h"
     11 #include "ash/system/tray/system_tray_notifier.h"
     12 #include "ash/system/tray/tray_item_view.h"
     13 
     14 #if defined(OS_CHROMEOS)
     15 #include "ash/system/chromeos/system_clock_observer.h"
     16 #endif
     17 
     18 namespace ash {
     19 
     20 TrayDate::TrayDate(SystemTray* system_tray)
     21     : SystemTrayItem(system_tray),
     22       time_tray_(NULL),
     23       default_view_(NULL),
     24       login_status_(user::LOGGED_IN_NONE) {
     25 #if defined(OS_CHROMEOS)
     26   system_clock_observer_.reset(new SystemClockObserver());
     27 #endif
     28   Shell::GetInstance()->system_tray_notifier()->AddClockObserver(this);
     29 }
     30 
     31 TrayDate::~TrayDate() {
     32   Shell::GetInstance()->system_tray_notifier()->RemoveClockObserver(this);
     33 }
     34 
     35 views::View* TrayDate::GetHelpButtonView() const {
     36   if (!default_view_)
     37     return NULL;
     38   return default_view_->GetHelpButtonView();
     39 }
     40 
     41 const tray::TimeView* TrayDate::GetTimeTrayForTesting() const {
     42   return time_tray_;
     43 }
     44 
     45 const DateDefaultView* TrayDate::GetDefaultViewForTesting() const {
     46   return default_view_;
     47 }
     48 
     49 views::View* TrayDate::CreateDefaultViewForTesting(user::LoginStatus status) {
     50   return CreateDefaultView(status);
     51 }
     52 
     53 views::View* TrayDate::CreateTrayView(user::LoginStatus status) {
     54   CHECK(time_tray_ == NULL);
     55   ClockLayout clock_layout =
     56       (system_tray()->shelf_alignment() == SHELF_ALIGNMENT_BOTTOM ||
     57        system_tray()->shelf_alignment() == SHELF_ALIGNMENT_TOP) ?
     58           HORIZONTAL_CLOCK : VERTICAL_CLOCK;
     59   time_tray_ = new tray::TimeView(clock_layout);
     60   views::View* view = new TrayItemView(this);
     61   view->AddChildView(time_tray_);
     62   return view;
     63 }
     64 
     65 views::View* TrayDate::CreateDefaultView(user::LoginStatus status) {
     66   default_view_ = new DateDefaultView(status);
     67 
     68 #if defined(OS_CHROMEOS)
     69   // Save the login status we created the view with.
     70   login_status_ = status;
     71 
     72   OnSystemClockCanSetTimeChanged(system_clock_observer_->can_set_time());
     73 #endif
     74   return default_view_;
     75 }
     76 
     77 views::View* TrayDate::CreateDetailedView(user::LoginStatus status) {
     78   return NULL;
     79 }
     80 
     81 void TrayDate::DestroyTrayView() {
     82   time_tray_ = NULL;
     83 }
     84 
     85 void TrayDate::DestroyDefaultView() {
     86   default_view_ = NULL;
     87 }
     88 
     89 void TrayDate::DestroyDetailedView() {
     90 }
     91 
     92 void TrayDate::UpdateAfterLoginStatusChange(user::LoginStatus status) {
     93 }
     94 
     95 void TrayDate::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
     96   if (time_tray_) {
     97     ClockLayout clock_layout = (alignment == SHELF_ALIGNMENT_BOTTOM ||
     98         alignment == SHELF_ALIGNMENT_TOP) ?
     99             HORIZONTAL_CLOCK : VERTICAL_CLOCK;
    100     time_tray_->UpdateClockLayout(clock_layout);
    101   }
    102 }
    103 
    104 void TrayDate::OnDateFormatChanged() {
    105   if (time_tray_)
    106     time_tray_->UpdateTimeFormat();
    107   if (default_view_)
    108     default_view_->GetDateView()->UpdateTimeFormat();
    109 }
    110 
    111 void TrayDate::OnSystemClockTimeUpdated() {
    112   if (time_tray_)
    113     time_tray_->UpdateTimeFormat();
    114   if (default_view_)
    115     default_view_->GetDateView()->UpdateTimeFormat();
    116 }
    117 
    118 void TrayDate::OnSystemClockCanSetTimeChanged(bool can_set_time) {
    119   // Outside of a logged-in session, the date button should launch the set time
    120   // dialog if the time can be set.
    121   if (default_view_ && login_status_ == user::LOGGED_IN_NONE) {
    122     default_view_->GetDateView()->SetAction(
    123         can_set_time ? TrayDate::SET_SYSTEM_TIME : TrayDate::NONE);
    124   }
    125 }
    126 
    127 void TrayDate::Refresh() {
    128   if (time_tray_)
    129     time_tray_->UpdateText();
    130 }
    131 
    132 }  // namespace ash
    133