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