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_TRAY_SYSTEM_TRAY_H_ 6 #define ASH_SYSTEM_TRAY_SYSTEM_TRAY_H_ 7 8 #include "ash/ash_export.h" 9 #include "ash/system/tray/system_tray_bubble.h" 10 #include "ash/system/tray/tray_background_view.h" 11 #include "ash/system/user/login_status.h" 12 #include "base/basictypes.h" 13 #include "base/compiler_specific.h" 14 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_vector.h" 16 #include "ui/views/bubble/tray_bubble_view.h" 17 #include "ui/views/view.h" 18 19 #include <map> 20 #include <vector> 21 22 namespace ash { 23 class SystemBubbleWrapper; 24 class SystemTrayDelegate; 25 class SystemTrayItem; 26 class TrayAccessibility; 27 class TrayDate; 28 class TrayUser; 29 30 // There are different methods for creating bubble views. 31 enum BubbleCreationType { 32 BUBBLE_CREATE_NEW, // Closes any existing bubble and creates a new one. 33 BUBBLE_USE_EXISTING, // Uses any existing bubble, or creates a new one. 34 }; 35 36 class ASH_EXPORT SystemTray : public TrayBackgroundView, 37 public views::TrayBubbleView::Delegate { 38 public: 39 explicit SystemTray(StatusAreaWidget* status_area_widget); 40 virtual ~SystemTray(); 41 42 // Calls TrayBackgroundView::Initialize(), creates the tray items, and 43 // adds them to SystemTrayNotifier. 44 void InitializeTrayItems(SystemTrayDelegate* delegate); 45 46 // Adds a new item in the tray. 47 void AddTrayItem(SystemTrayItem* item); 48 49 // Removes an existing tray item. 50 void RemoveTrayItem(SystemTrayItem* item); 51 52 // Returns all tray items that has been added to system tray. 53 const std::vector<SystemTrayItem*>& GetTrayItems() const; 54 55 // Shows the default view of all items. 56 void ShowDefaultView(BubbleCreationType creation_type); 57 58 // Shows default view that ingnores outside clicks and activation loss. 59 void ShowPersistentDefaultView(); 60 61 // Shows details of a particular item. If |close_delay_in_seconds| is 62 // non-zero, then the view is automatically closed after the specified time. 63 void ShowDetailedView(SystemTrayItem* item, 64 int close_delay_in_seconds, 65 bool activate, 66 BubbleCreationType creation_type); 67 68 // Continue showing the existing detailed view, if any, for |close_delay| 69 // seconds. 70 void SetDetailedViewCloseDelay(int close_delay); 71 72 // Hides the detailed view for |item|. 73 void HideDetailedView(SystemTrayItem* item); 74 75 // Shows the notification view for |item|. 76 void ShowNotificationView(SystemTrayItem* item); 77 78 // Hides the notification view for |item|. 79 void HideNotificationView(SystemTrayItem* item); 80 81 // Updates the items when the login status of the system changes. 82 void UpdateAfterLoginStatusChange(user::LoginStatus login_status); 83 84 // Updates the items when the shelf alignment changes. 85 void UpdateAfterShelfAlignmentChange(ShelfAlignment alignment); 86 87 // Temporarily hides/unhides the notification bubble. 88 void SetHideNotifications(bool hidden); 89 90 // Returns true if the shelf should be forced visible when auto-hidden. 91 bool ShouldShowShelf() const; 92 93 // Returns true if there is a system bubble (already visible or in the process 94 // of being created). 95 bool HasSystemBubble() const; 96 97 // Returns true if there is a notification bubble. 98 bool HasNotificationBubble() const; 99 100 // Returns true if the system_bubble_ exists and is of type |type|. 101 bool HasSystemBubbleType(SystemTrayBubble::BubbleType type); 102 103 // Returns a pointer to the system bubble or NULL if none. 104 SystemTrayBubble* GetSystemBubble(); 105 106 // Returns true if any bubble is visible. 107 bool IsAnyBubbleVisible() const; 108 109 // Returns true if the mouse is inside the notification bubble. 110 bool IsMouseInNotificationBubble() const; 111 112 // Closes system bubble and returns true if it did exist. 113 bool CloseSystemBubble() const; 114 115 // Returns view for help button if default view is shown. Returns NULL 116 // otherwise. 117 views::View* GetHelpButtonView() const; 118 119 // Accessors for testing. 120 121 // Returns true if the bubble exists. 122 bool CloseNotificationBubbleForTest() const; 123 124 // Overridden from TrayBackgroundView. 125 virtual void SetShelfAlignment(ShelfAlignment alignment) OVERRIDE; 126 virtual void AnchorUpdated() OVERRIDE; 127 virtual base::string16 GetAccessibleNameForTray() OVERRIDE; 128 virtual void BubbleResized(const views::TrayBubbleView* bubble_view) OVERRIDE; 129 virtual void HideBubbleWithView( 130 const views::TrayBubbleView* bubble_view) OVERRIDE; 131 virtual bool ClickedOutsideBubble() OVERRIDE; 132 133 // Overridden from message_center::TrayBubbleView::Delegate. 134 virtual void BubbleViewDestroyed() OVERRIDE; 135 virtual void OnMouseEnteredView() OVERRIDE; 136 virtual void OnMouseExitedView() OVERRIDE; 137 virtual base::string16 GetAccessibleNameForBubble() OVERRIDE; 138 virtual gfx::Rect GetAnchorRect( 139 views::Widget* anchor_widget, 140 AnchorType anchor_type, 141 AnchorAlignment anchor_alignment) const OVERRIDE; 142 virtual void HideBubble(const views::TrayBubbleView* bubble_view) OVERRIDE; 143 GetTrayAccessibilityForTest()144 TrayAccessibility* GetTrayAccessibilityForTest() { 145 return tray_accessibility_; 146 } 147 148 // Get the tray item view (or NULL) for a given |tray_item| in a unit test. 149 views::View* GetTrayItemViewForTest(SystemTrayItem* tray_item); 150 151 // Gets tray_date_ for browser tests. 152 TrayDate* GetTrayDateForTesting() const; 153 154 private: 155 // Creates the default set of items for the sytem tray. 156 void CreateItems(SystemTrayDelegate* delegate); 157 158 // Resets |system_bubble_| and clears any related state. 159 void DestroySystemBubble(); 160 161 // Resets |notification_bubble_| and clears any related state. 162 void DestroyNotificationBubble(); 163 164 // Calculates the x-offset for the item in the tray. Returns -1 if its tray 165 // item view is not visible. 166 int GetTrayXOffset(SystemTrayItem* item) const; 167 168 // Shows the default view and its arrow position is shifted by |x_offset|. 169 void ShowDefaultViewWithOffset(BubbleCreationType creation_type, 170 int x_offset, 171 bool persistent); 172 173 // Constructs or re-constructs |system_bubble_| and populates it with |items|. 174 // Specify |change_tray_status| to true if want to change the tray background 175 // status. 176 void ShowItems(const std::vector<SystemTrayItem*>& items, 177 bool details, 178 bool activate, 179 BubbleCreationType creation_type, 180 int x_offset, 181 bool persistent); 182 183 // Constructs or re-constructs |notification_bubble_| and populates it with 184 // |notification_items_|, or destroys it if there are no notification items. 185 void UpdateNotificationBubble(); 186 187 // Checks the current status of the system tray and updates the web 188 // notification tray according to the current status. 189 void UpdateWebNotifications(); 190 191 // Deactivate the system tray in the shelf if it was active before. 192 void CloseSystemBubbleAndDeactivateSystemTray(); 193 items()194 const ScopedVector<SystemTrayItem>& items() const { return items_; } 195 196 // Overridden from ActionableView. 197 virtual bool PerformAction(const ui::Event& event) OVERRIDE; 198 199 // Owned items. 200 ScopedVector<SystemTrayItem> items_; 201 202 // Pointers to members of |items_|. 203 SystemTrayItem* detailed_item_; 204 std::vector<SystemTrayItem*> notification_items_; 205 206 // Mappings of system tray item and it's view in the tray. 207 std::map<SystemTrayItem*, views::View*> tray_item_map_; 208 209 // Bubble for default and detailed views. 210 scoped_ptr<SystemBubbleWrapper> system_bubble_; 211 212 // Bubble for notifications. 213 scoped_ptr<SystemBubbleWrapper> notification_bubble_; 214 215 // Keep track of the default view height so that when we create detailed 216 // views directly (e.g. from a notification) we know what height to use. 217 int default_bubble_height_; 218 219 // Set to true when system notifications should be hidden (e.g. web 220 // notification bubble is visible). 221 bool hide_notifications_; 222 223 // This is true when the displayed system tray menu is a full tray menu, 224 // otherwise a single line item menu like the volume slider is shown. 225 // Note that the value is only valid when |system_bubble_| is true. 226 bool full_system_tray_menu_; 227 228 TrayAccessibility* tray_accessibility_; // not owned 229 TrayDate* tray_date_; 230 231 DISALLOW_COPY_AND_ASSIGN(SystemTray); 232 }; 233 234 } // namespace ash 235 236 #endif // ASH_SYSTEM_TRAY_SYSTEM_TRAY_H_ 237