OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/system/web_notification/web_notification_tray.h" | 5 #include "ash/system/web_notification/web_notification_tray.h" |
6 | 6 |
7 #include "ash/system/status_area_widget.h" | 7 #include "ash/system/status_area_widget.h" |
8 #include "ash/system/tray/system_tray.h" | 8 #include "ash/system/tray/system_tray.h" |
9 #include "ash/system/tray/tray_bubble_view.h" | 9 #include "ash/system/tray/tray_bubble_view.h" |
10 #include "ash/system/tray/tray_constants.h" | 10 #include "ash/system/tray/tray_constants.h" |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
155 if (iter == notifications_.end()) | 155 if (iter == notifications_.end()) |
156 return false; | 156 return false; |
157 EraseNotification(iter); | 157 EraseNotification(iter); |
158 return true; | 158 return true; |
159 } | 159 } |
160 | 160 |
161 void RemoveAllNotifications() { | 161 void RemoveAllNotifications() { |
162 notifications_.clear(); | 162 notifications_.clear(); |
163 } | 163 } |
164 | 164 |
165 void RemoveNotificationsBySource(const std::string& id) { | 165 void SendRemoveNotificationsBySource(WebNotificationTray* tray, |
166 const std::string& id) { | |
166 Notifications::iterator source_iter = GetNotification(id); | 167 Notifications::iterator source_iter = GetNotification(id); |
167 if (source_iter == notifications_.end()) | 168 if (source_iter == notifications_.end()) |
168 return; | 169 return; |
169 string16 display_source = source_iter->display_source; | 170 string16 display_source = source_iter->display_source; |
170 for (Notifications::iterator loopiter = notifications_.begin(); | 171 for (Notifications::iterator loopiter = notifications_.begin(); |
171 loopiter != notifications_.end(); ) { | 172 loopiter != notifications_.end(); ) { |
172 Notifications::iterator curiter = loopiter++; | 173 Notifications::iterator curiter = loopiter++; |
173 if (curiter->display_source == display_source) | 174 if (curiter->display_source == display_source) |
174 EraseNotification(curiter); | 175 tray->SendRemoveNotification(curiter->id); |
175 } | 176 } |
176 } | 177 } |
177 | 178 |
178 void RemoveNotificationsByExtension(const std::string& id) { | 179 void SendRemoveNotificationsByExtension(WebNotificationTray* tray, |
180 const std::string& id) { | |
179 Notifications::iterator source_iter = GetNotification(id); | 181 Notifications::iterator source_iter = GetNotification(id); |
180 if (source_iter == notifications_.end()) | 182 if (source_iter == notifications_.end()) |
181 return; | 183 return; |
182 std::string extension_id = source_iter->extension_id; | 184 std::string extension_id = source_iter->extension_id; |
183 for (Notifications::iterator loopiter = notifications_.begin(); | 185 for (Notifications::iterator loopiter = notifications_.begin(); |
184 loopiter != notifications_.end(); ) { | 186 loopiter != notifications_.end(); ) { |
185 Notifications::iterator curiter = loopiter++; | 187 Notifications::iterator curiter = loopiter++; |
186 if (curiter->extension_id == extension_id) | 188 if (curiter->extension_id == extension_id) |
187 EraseNotification(curiter); | 189 tray->SendRemoveNotification(curiter->id); |
188 } | 190 } |
189 } | 191 } |
190 | 192 |
191 bool SetNotificationImage(const std::string& id, | 193 bool SetNotificationImage(const std::string& id, |
192 const gfx::ImageSkia& image) { | 194 const gfx::ImageSkia& image) { |
193 Notifications::iterator iter = GetNotification(id); | 195 Notifications::iterator iter = GetNotification(id); |
194 if (iter == notifications_.end()) | 196 if (iter == notifications_.end()) |
195 return false; | 197 return false; |
196 iter->image = image; | 198 iter->image = image; |
197 return true; | 199 return true; |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
448 const ui::Event& event) OVERRIDE { | 450 const ui::Event& event) OVERRIDE { |
449 if (sender == close_button_) | 451 if (sender == close_button_) |
450 tray_->SendRemoveNotification(notification_.id); | 452 tray_->SendRemoveNotification(notification_.id); |
451 } | 453 } |
452 | 454 |
453 // Overridden from MenuButtonListener. | 455 // Overridden from MenuButtonListener. |
454 virtual void OnMenuButtonClicked( | 456 virtual void OnMenuButtonClicked( |
455 View* source, const gfx::Point& point) OVERRIDE { | 457 View* source, const gfx::Point& point) OVERRIDE { |
456 if (source != menu_button_) | 458 if (source != menu_button_) |
457 return; | 459 return; |
460 tray_->set_menu_open(true); | |
sadrul
2012/08/13 22:09:08
This feels like a hack. The app-list controller do
stevenjb
2012/08/14 00:48:37
Sure. I'm not a huge fan of using globals, but at
| |
458 WebNotificationMenuModel menu_model(tray_, notification_); | 461 WebNotificationMenuModel menu_model(tray_, notification_); |
459 views::MenuModelAdapter menu_model_adapter(&menu_model); | 462 views::MenuModelAdapter menu_model_adapter(&menu_model); |
460 views::MenuRunner menu_runner(menu_model_adapter.CreateMenu()); | 463 views::MenuRunner menu_runner(menu_model_adapter.CreateMenu()); |
461 | 464 |
462 gfx::Point screen_location; | 465 gfx::Point screen_location; |
463 views::View::ConvertPointToScreen(menu_button_, &screen_location); | 466 views::View::ConvertPointToScreen(menu_button_, &screen_location); |
464 ignore_result(menu_runner.RunMenuAt( | 467 ignore_result(menu_runner.RunMenuAt( |
465 source->GetWidget()->GetTopLevelWidget(), | 468 source->GetWidget()->GetTopLevelWidget(), |
466 menu_button_, | 469 menu_button_, |
467 gfx::Rect(screen_location, menu_button_->size()), | 470 gfx::Rect(screen_location, menu_button_->size()), |
468 views::MenuItemView::TOPRIGHT, | 471 views::MenuItemView::TOPRIGHT, |
469 views::MenuRunner::HAS_MNEMONICS)); | 472 views::MenuRunner::HAS_MNEMONICS)); |
473 tray_->set_menu_open(false); | |
470 } | 474 } |
471 | 475 |
472 private: | 476 private: |
473 WebNotificationTray* tray_; | 477 WebNotificationTray* tray_; |
474 WebNotification notification_; | 478 WebNotification notification_; |
475 views::ImageView* icon_; | 479 views::ImageView* icon_; |
476 views::MenuButton* menu_button_; | 480 views::MenuButton* menu_button_; |
477 views::ImageButton* close_button_; | 481 views::ImageButton* close_button_; |
478 | 482 |
479 DISALLOW_COPY_AND_ASSIGN(WebNotificationView); | 483 DISALLOW_COPY_AND_ASSIGN(WebNotificationView); |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
769 virtual void OnMouseEnteredView() OVERRIDE { | 773 virtual void OnMouseEnteredView() OVERRIDE { |
770 StopAutoCloseTimer(); | 774 StopAutoCloseTimer(); |
771 } | 775 } |
772 | 776 |
773 virtual void OnMouseExitedView() OVERRIDE { | 777 virtual void OnMouseExitedView() OVERRIDE { |
774 StartAutoCloseTimer(); | 778 StartAutoCloseTimer(); |
775 } | 779 } |
776 | 780 |
777 virtual void OnClickedOutsideView() OVERRIDE { | 781 virtual void OnClickedOutsideView() OVERRIDE { |
778 // May delete |this|. | 782 // May delete |this|. |
779 tray_->HideMessageCenterBubble(); | 783 if (!tray_->menu_open()) |
784 tray_->HideMessageCenterBubble(); | |
780 } | 785 } |
781 | 786 |
782 // Overridden from views::WidgetObserver: | 787 // Overridden from views::WidgetObserver: |
783 virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE { | 788 virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE { |
784 CHECK_EQ(bubble_widget_, widget); | 789 CHECK_EQ(bubble_widget_, widget); |
785 bubble_widget_ = NULL; | 790 bubble_widget_ = NULL; |
786 tray_->HideBubble(this); // Will destroy |this|. | 791 tray_->HideBubble(this); // Will destroy |this|. |
787 } | 792 } |
788 | 793 |
789 private: | 794 private: |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
821 | 826 |
822 DISALLOW_COPY_AND_ASSIGN(Bubble); | 827 DISALLOW_COPY_AND_ASSIGN(Bubble); |
823 }; | 828 }; |
824 | 829 |
825 WebNotificationTray::WebNotificationTray( | 830 WebNotificationTray::WebNotificationTray( |
826 internal::StatusAreaWidget* status_area_widget) | 831 internal::StatusAreaWidget* status_area_widget) |
827 : internal::TrayBackgroundView(status_area_widget), | 832 : internal::TrayBackgroundView(status_area_widget), |
828 notification_list_(new WebNotificationList()), | 833 notification_list_(new WebNotificationList()), |
829 count_label_(NULL), | 834 count_label_(NULL), |
830 delegate_(NULL), | 835 delegate_(NULL), |
831 show_message_center_on_unlock_(false) { | 836 show_message_center_on_unlock_(false), |
837 menu_open_(false) { | |
832 count_label_ = new views::Label(UTF8ToUTF16("0")); | 838 count_label_ = new views::Label(UTF8ToUTF16("0")); |
833 internal::SetupLabelForTray(count_label_); | 839 internal::SetupLabelForTray(count_label_); |
834 gfx::Font font = count_label_->font(); | 840 gfx::Font font = count_label_->font(); |
835 count_label_->SetFont(font.DeriveFont(0, font.GetStyle() & ~gfx::Font::BOLD)); | 841 count_label_->SetFont(font.DeriveFont(0, font.GetStyle() & ~gfx::Font::BOLD)); |
836 count_label_->SetHorizontalAlignment(views::Label::ALIGN_CENTER); | 842 count_label_->SetHorizontalAlignment(views::Label::ALIGN_CENTER); |
837 count_label_->SetEnabledColor(kMessageCountDimmedColor); | 843 count_label_->SetEnabledColor(kMessageCountDimmedColor); |
838 | 844 |
839 tray_container()->set_size(gfx::Size(kTrayWidth, kTrayHeight)); | 845 tray_container()->set_size(gfx::Size(kTrayWidth, kTrayHeight)); |
840 tray_container()->AddChildView(count_label_); | 846 tray_container()->AddChildView(count_label_); |
841 | 847 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
987 std::string notification_id = curiter->id; | 993 std::string notification_id = curiter->id; |
988 // May call RemoveNotification and erase curiter. | 994 // May call RemoveNotification and erase curiter. |
989 delegate_->NotificationRemoved(notification_id); | 995 delegate_->NotificationRemoved(notification_id); |
990 } | 996 } |
991 } | 997 } |
992 } | 998 } |
993 | 999 |
994 // When we disable notifications, we remove any existing matching | 1000 // When we disable notifications, we remove any existing matching |
995 // notifications to avoid adding complicated UI to re-enable the source. | 1001 // notifications to avoid adding complicated UI to re-enable the source. |
996 void WebNotificationTray::DisableByExtension(const std::string& id) { | 1002 void WebNotificationTray::DisableByExtension(const std::string& id) { |
997 // Will call SendRemoveNotification for each matching notification. | |
998 notification_list_->RemoveNotificationsByExtension(id); | |
999 if (delegate_) | 1003 if (delegate_) |
1000 delegate_->DisableExtension(id); | 1004 delegate_->DisableExtension(id); |
1005 // Will call SendRemoveNotification for each matching notification. | |
1006 notification_list_->SendRemoveNotificationsByExtension(this, id); | |
1001 } | 1007 } |
1002 | 1008 |
1003 void WebNotificationTray::DisableByUrl(const std::string& id) { | 1009 void WebNotificationTray::DisableByUrl(const std::string& id) { |
1004 // Will call SendRemoveNotification for each matching notification. | |
1005 notification_list_->RemoveNotificationsBySource(id); | |
1006 if (delegate_) | 1010 if (delegate_) |
1007 delegate_->DisableNotificationsFromSource(id); | 1011 delegate_->DisableNotificationsFromSource(id); |
1012 // Will call SendRemoveNotification for each matching notification. | |
1013 notification_list_->SendRemoveNotificationsBySource(this, id); | |
1008 } | 1014 } |
1009 | 1015 |
1010 bool WebNotificationTray::PerformAction(const ui::Event& event) { | 1016 bool WebNotificationTray::PerformAction(const ui::Event& event) { |
1011 if (message_center_bubble()) | 1017 if (message_center_bubble()) |
1012 HideMessageCenterBubble(); | 1018 HideMessageCenterBubble(); |
1013 else | 1019 else |
1014 ShowMessageCenterBubble(); | 1020 ShowMessageCenterBubble(); |
1015 return true; | 1021 return true; |
1016 } | 1022 } |
1017 | 1023 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1063 } else if (bubble == notification_bubble()) { | 1069 } else if (bubble == notification_bubble()) { |
1064 HideNotificationBubble(); | 1070 HideNotificationBubble(); |
1065 } | 1071 } |
1066 } | 1072 } |
1067 | 1073 |
1068 bool WebNotificationTray::HasNotificationForTest(const std::string& id) const { | 1074 bool WebNotificationTray::HasNotificationForTest(const std::string& id) const { |
1069 return notification_list_->HasNotification(id); | 1075 return notification_list_->HasNotification(id); |
1070 } | 1076 } |
1071 | 1077 |
1072 } // namespace ash | 1078 } // namespace ash |
OLD | NEW |