1 // Copyright 2013 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_UI_VIEWS_MESSAGE_CENTER_WEB_NOTIFICATION_TRAY_H_ 6 #define CHROME_BROWSER_UI_VIEWS_MESSAGE_CENTER_WEB_NOTIFICATION_TRAY_H_ 7 8 #include "base/memory/weak_ptr.h" 9 #include "chrome/browser/status_icons/status_icon_observer.h" 10 #include "chrome/browser/ui/views/message_center/message_center_widget_delegate.h" 11 #include "content/public/browser/notification_observer.h" 12 #include "content/public/browser/notification_registrar.h" 13 #include "ui/base/models/simple_menu_model.h" 14 #include "ui/gfx/rect.h" 15 #include "ui/message_center/message_center_tray.h" 16 #include "ui/message_center/message_center_tray_delegate.h" 17 #include "ui/views/widget/widget_observer.h" 18 19 class StatusIcon; 20 21 namespace message_center { 22 class MessageCenter; 23 class MessagePopupCollection; 24 } 25 26 namespace views { 27 class Widget; 28 } 29 30 namespace message_center { 31 32 struct PositionInfo; 33 34 class MessageCenterWidgetDelegate; 35 36 // A MessageCenterTrayDelegate implementation that exposes the MessageCenterTray 37 // via a system tray icon. The notification popups will be displayed in the 38 // corner of the screen and the message center will be displayed by the system 39 // tray icon on click. 40 class WebNotificationTray : public message_center::MessageCenterTrayDelegate, 41 public StatusIconObserver, 42 public base::SupportsWeakPtr<WebNotificationTray> { 43 public: 44 WebNotificationTray(); 45 virtual ~WebNotificationTray(); 46 47 message_center::MessageCenter* message_center(); 48 49 // MessageCenterTrayDelegate implementation. 50 virtual bool ShowPopups() OVERRIDE; 51 virtual void HidePopups() OVERRIDE; 52 virtual bool ShowMessageCenter() OVERRIDE; 53 virtual void HideMessageCenter() OVERRIDE; 54 virtual void OnMessageCenterTrayChanged() OVERRIDE; 55 virtual bool ShowNotifierSettings() OVERRIDE; 56 57 // StatusIconObserver implementation. 58 virtual void OnStatusIconClicked() OVERRIDE; 59 #if defined(OS_WIN) 60 virtual void OnBalloonClicked() OVERRIDE; 61 62 // This shows a platform-specific balloon informing the user of the existence 63 // of the message center in the status tray area. 64 void DisplayFirstRunBalloon(); 65 #endif 66 67 // Changes the icon and hovertext based on number of unread notifications. 68 void UpdateStatusIcon(); 69 void SendHideMessageCenter(); 70 void MarkMessageCenterHidden(); 71 72 // Gets the point where the status icon was clicked. 73 gfx::Point mouse_click_point() { return mouse_click_point_; } 74 virtual MessageCenterTray* GetMessageCenterTray() OVERRIDE; 75 76 private: 77 FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, WebNotifications); 78 FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, WebNotificationPopupBubble); 79 FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, 80 ManyMessageCenterNotifications); 81 FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, ManyPopupNotifications); 82 83 // The actual process to show the message center. Set |show_settings| to true 84 // if the message center should be initialized with the settings visible. 85 // Returns true if the center is successfully created. 86 bool ShowMessageCenterInternal(bool show_settings); 87 88 PositionInfo GetPositionInfo(); 89 90 void CreateStatusIcon(const gfx::ImageSkia& image, const string16& tool_tip); 91 void DestroyStatusIcon(); 92 void AddQuietModeMenu(StatusIcon* status_icon); 93 MessageCenterWidgetDelegate* GetMessageCenterWidgetDelegateForTest(); 94 95 MessageCenterWidgetDelegate* message_center_delegate_; 96 scoped_ptr<message_center::MessagePopupCollection> popup_collection_; 97 98 StatusIcon* status_icon_; 99 bool message_center_visible_; 100 scoped_ptr<MessageCenterTray> message_center_tray_; 101 gfx::Point mouse_click_point_; 102 103 bool should_update_tray_content_; 104 105 DISALLOW_COPY_AND_ASSIGN(WebNotificationTray); 106 }; 107 108 } // namespace message_center 109 110 #endif // CHROME_BROWSER_UI_VIEWS_MESSAGE_CENTER_WEB_NOTIFICATION_TRAY_H_ 111