15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ASH_SYSTEM_DATE_DATE_VIEW_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASH_SYSTEM_DATE_DATE_VIEW_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/ash_export.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/date/tray_date.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/actionable_view.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/time_formatting.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Label;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abstract base class containing common updating and layout code for the
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// DateView popup and the TimeView tray icon. Exported for tests.
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ASH_EXPORT BaseDateTimeView : public ActionableView {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BaseDateTimeView();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the displayed text for the current time and calls SetTimer().
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateText();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BaseDateTimeView();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts |timer_| to schedule the next update.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTimer(const base::Time& now);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates labels to display the current time.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateTextInternal(const base::Time& now) = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLocaleChanged() OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invokes UpdateText() when the displayed time should change.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::OneShotTimer<BaseDateTimeView> timer_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BaseDateTimeView);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Popup view used to display the date and day of week.
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ASH_EXPORT DateView : public BaseDateTimeView {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DateView();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DateView();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Sets the action the view should take. An actionable date view gives visual
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // feedback on hover, can be focused by keyboard, and clicking/pressing space
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // or enter on the view executes the action.
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void SetAction(TrayDate::DateAction action);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Updates the format of the displayed time.
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void UpdateTimeFormat();
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::HourClockType GetHourTypeForTesting() const;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from BaseDateTimeView.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateTextInternal(const base::Time& now) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ActionableView.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PerformAction(const ui::Event& event) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* date_label_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Time format (12/24hr) used for accessibility string.
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::HourClockType hour_type_;
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TrayDate::DateAction action_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DateView);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tray view used to display the current time.
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Exported for tests.
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ASH_EXPORT TimeView : public BaseDateTimeView {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  explicit TimeView(TrayDate::ClockLayout clock_layout);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TimeView();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the format of the displayed time.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateTimeFormat();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates clock layout.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateClockLayout(TrayDate::ClockLayout clock_layout);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::HourClockType GetHourTypeForTesting() const;
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  friend class TimeViewTest;
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from BaseDateTimeView.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateTextInternal(const base::Time& now) OVERRIDE;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ActionableView.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PerformAction(const ui::Event& event) OVERRIDE;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetBorderFromLayout(TrayDate::ClockLayout clock_layout);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupLabels();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupLabel(views::Label* label);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Label text used for the normal horizontal shelf.
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<views::Label> horizontal_label_;
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // The time label is split into two lines for the vertical shelf.
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<views::Label> vertical_label_hours_;
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<views::Label> vertical_label_minutes_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::HourClockType hour_type_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TimeView);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // ASH_SYSTEM_DATE_DATE_VIEW_H_
136