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#ifndef ASH_SYSTEM_STATUS_AREA_WIDGET_H_
6#define ASH_SYSTEM_STATUS_AREA_WIDGET_H_
7
8#include "ash/ash_export.h"
9#include "ash/shelf/shelf_types.h"
10#include "ash/system/user/login_status.h"
11#include "ui/views/widget/widget.h"
12
13namespace ash {
14class OverviewButtonTray;
15class ShellDelegate;
16class StatusAreaWidgetDelegate;
17class SystemTray;
18class WebNotificationTray;
19#if defined(OS_CHROMEOS)
20class LogoutButtonTray;
21class VirtualKeyboardTray;
22#endif
23
24class ASH_EXPORT StatusAreaWidget : public views::Widget {
25 public:
26  static const char kNativeViewName[];
27
28  explicit StatusAreaWidget(aura::Window* status_container);
29  virtual ~StatusAreaWidget();
30
31  // Creates the SystemTray, WebNotificationTray and LogoutButtonTray.
32  void CreateTrayViews();
33
34  // Destroys the system tray and web notification tray. Called before
35  // tearing down the windows to avoid shutdown ordering issues.
36  void Shutdown();
37
38  // Update the alignment of the widget and tray views.
39  void SetShelfAlignment(ShelfAlignment alignment);
40
41  // Set the visibility of system notifications.
42  void SetHideSystemNotifications(bool hide);
43
44  // Called by the client when the login status changes. Caches login_status
45  // and calls UpdateAfterLoginStatusChange for the system tray and the web
46  // notification tray.
47  void UpdateAfterLoginStatusChange(user::LoginStatus login_status);
48
49  StatusAreaWidgetDelegate* status_area_widget_delegate() {
50    return status_area_widget_delegate_;
51  }
52  SystemTray* system_tray() { return system_tray_; }
53  WebNotificationTray* web_notification_tray() {
54    return web_notification_tray_;
55  }
56  OverviewButtonTray* overview_button_tray() {
57    return overview_button_tray_;
58  }
59
60  user::LoginStatus login_status() const { return login_status_; }
61
62  // Returns true if the shelf should be visible. This is used when the
63  // shelf is configured to auto-hide and test if the shelf should force
64  // the shelf to remain visible.
65  bool ShouldShowShelf() const;
66
67  // True if any message bubble is shown.
68  bool IsMessageBubbleShown() const;
69
70  // Notifies child trays, and the |status_area_widget_delegate_| to schedule a
71  // paint.
72  void SchedulePaint();
73
74  // Overridden from views::Widget:
75  virtual void OnNativeWidgetActivationChanged(bool active) OVERRIDE;
76
77 private:
78  void AddSystemTray();
79  void AddWebNotificationTray();
80#if defined(OS_CHROMEOS)
81  void AddLogoutButtonTray();
82  void AddVirtualKeyboardTray();
83#endif
84  void AddOverviewButtonTray();
85
86  // Weak pointers to View classes that are parented to StatusAreaWidget:
87  StatusAreaWidgetDelegate* status_area_widget_delegate_;
88  OverviewButtonTray* overview_button_tray_;
89  SystemTray* system_tray_;
90  WebNotificationTray* web_notification_tray_;
91#if defined(OS_CHROMEOS)
92  LogoutButtonTray* logout_button_tray_;
93  VirtualKeyboardTray* virtual_keyboard_tray_;
94#endif
95  user::LoginStatus login_status_;
96
97  DISALLOW_COPY_AND_ASSIGN(StatusAreaWidget);
98};
99
100}  // namespace ash
101
102#endif  // ASH_SYSTEM_STATUS_AREA_WIDGET_H_
103