• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_CHROMEOS_STATUS_CLOCK_MENU_BUTTON_H_
6 #define CHROME_BROWSER_CHROMEOS_STATUS_CLOCK_MENU_BUTTON_H_
7 #pragma once
8 
9 #include "base/memory/scoped_ptr.h"
10 #include "base/timer.h"
11 #include "chrome/browser/chromeos/cros/power_library.h"
12 #include "chrome/browser/chromeos/status/status_area_button.h"
13 #include "chrome/browser/prefs/pref_change_registrar.h"
14 #include "chrome/browser/prefs/pref_member.h"
15 #include "content/common/notification_observer.h"
16 #include "content/common/notification_type.h"
17 #include "chrome/browser/chromeos/system_access.h"
18 #include "unicode/calendar.h"
19 #include "views/controls/button/menu_button.h"
20 #include "views/controls/menu/menu_2.h"
21 #include "views/controls/menu/view_menu_delegate.h"
22 
23 namespace chromeos {
24 
25 class StatusAreaHost;
26 
27 // The clock menu button in the status area.
28 // This button shows the current time.
29 class ClockMenuButton : public StatusAreaButton,
30                         public views::ViewMenuDelegate,
31                         public ui::MenuModel,
32                         public NotificationObserver,
33                         public PowerLibrary::Observer,
34                         public SystemAccess::Observer {
35  public:
36   explicit ClockMenuButton(StatusAreaHost* host);
37   virtual ~ClockMenuButton();
38 
39   // ui::MenuModel implementation.
HasIcons()40   virtual bool HasIcons() const  { return false; }
41   virtual int GetItemCount() const;
42   virtual ui::MenuModel::ItemType GetTypeAt(int index) const;
GetCommandIdAt(int index)43   virtual int GetCommandIdAt(int index) const { return index; }
44   virtual string16 GetLabelAt(int index) const;
IsItemDynamicAt(int index)45   virtual bool IsItemDynamicAt(int index) const { return true; }
GetAcceleratorAt(int index,ui::Accelerator * accelerator)46   virtual bool GetAcceleratorAt(int index,
47       ui::Accelerator* accelerator) const { return false; }
IsItemCheckedAt(int index)48   virtual bool IsItemCheckedAt(int index) const { return false; }
GetGroupIdAt(int index)49   virtual int GetGroupIdAt(int index) const { return 0; }
GetIconAt(int index,SkBitmap * icon)50   virtual bool GetIconAt(int index, SkBitmap* icon) { return false; }
GetButtonMenuItemAt(int index)51   virtual ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const {
52     return NULL;
53   }
54   virtual bool IsEnabledAt(int index) const;
GetSubmenuModelAt(int index)55   virtual ui::MenuModel* GetSubmenuModelAt(int index) const { return NULL; }
HighlightChangedTo(int index)56   virtual void HighlightChangedTo(int index) {}
57   virtual void ActivatedAt(int index);
MenuWillShow()58   virtual void MenuWillShow() {}
SetMenuModelDelegate(ui::MenuModelDelegate * delegate)59   virtual void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) {}
60 
61   // Overridden from ResumeLibrary::Observer:
PowerChanged(PowerLibrary * obj)62   virtual void PowerChanged(PowerLibrary* obj) {}
63   virtual void SystemResumed();
64 
65   // Overridden from SystemAccess::Observer:
66   virtual void TimezoneChanged(const icu::TimeZone& timezone);
67 
68   // views::View
69   virtual void OnLocaleChanged() OVERRIDE;
70 
71   // Updates the time on the menu button. Can be called by host if timezone
72   // changes.
73   void UpdateText();
74 
75   // NotificationObserver implementation.
76   virtual void Observe(NotificationType type,
77                        const NotificationSource& source,
78                        const NotificationDetails& details);
79 
80  protected:
horizontal_padding()81   virtual int horizontal_padding() { return 3; }
82 
83  private:
84   // views::ViewMenuDelegate implementation.
85   virtual void RunMenu(views::View* source, const gfx::Point& pt);
86 
87   // Updates text and schedules the timer to fire at the next minute interval.
88   void UpdateTextAndSetNextTimer();
89 
90   base::OneShotTimer<ClockMenuButton> timer_;
91 
92   // The clock menu.
93   // NOTE: we use a scoped_ptr here as menu calls into 'this' from the
94   // constructor.
95   scoped_ptr<views::Menu2> clock_menu_;
96 
97   PrefChangeRegistrar registrar_;
98 
99   DISALLOW_COPY_AND_ASSIGN(ClockMenuButton);
100 };
101 
102 }  // namespace chromeos
103 
104 #endif  // CHROME_BROWSER_CHROMEOS_STATUS_CLOCK_MENU_BUTTON_H_
105