OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "ui/message_center/views/message_popup_collection.h" | 5 #include "ui/message_center/views/message_popup_collection.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/timer.h" | 10 #include "base/timer.h" |
11 #include "ui/gfx/screen.h" | 11 #include "ui/gfx/screen.h" |
| 12 #include "ui/message_center/message_center.h" |
12 #include "ui/message_center/message_center_constants.h" | 13 #include "ui/message_center/message_center_constants.h" |
13 #include "ui/message_center/notification.h" | 14 #include "ui/message_center/notification.h" |
14 #include "ui/message_center/notification_list.h" | 15 #include "ui/message_center/notification_list.h" |
15 #include "ui/message_center/views/message_view.h" | 16 #include "ui/message_center/views/message_view.h" |
16 #include "ui/message_center/views/notification_view.h" | 17 #include "ui/message_center/views/notification_view.h" |
17 #include "ui/views/background.h" | 18 #include "ui/views/background.h" |
18 #include "ui/views/layout/fill_layout.h" | 19 #include "ui/views/layout/fill_layout.h" |
19 #include "ui/views/view.h" | 20 #include "ui/views/view.h" |
20 #include "ui/views/widget/widget.h" | 21 #include "ui/views/widget/widget.h" |
| 22 #include "ui/views/widget/widget_delegate.h" |
21 | 23 |
22 namespace message_center { | 24 namespace message_center { |
23 | 25 |
24 class ToastContentsView : public views::WidgetDelegateView { | 26 class ToastContentsView : public views::WidgetDelegateView { |
25 public: | 27 public: |
26 ToastContentsView(const Notification* notification, | 28 ToastContentsView(const Notification* notification, |
27 MessagePopupCollection* collection) | 29 MessagePopupCollection* collection) |
28 : collection_(collection) { | 30 : collection_(collection) { |
29 DCHECK(collection_); | 31 DCHECK(collection_); |
30 | 32 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } | 80 } |
79 | 81 |
80 void StartTimer() { | 82 void StartTimer() { |
81 start_time_ = base::Time::Now(); | 83 start_time_ = base::Time::Now(); |
82 timer_.Start(FROM_HERE, | 84 timer_.Start(FROM_HERE, |
83 delay_, | 85 delay_, |
84 base::Bind(&views::Widget::Close, | 86 base::Bind(&views::Widget::Close, |
85 base::Unretained(GetWidget()))); | 87 base::Unretained(GetWidget()))); |
86 } | 88 } |
87 | 89 |
88 // views::WidgetDelegate overrides: | 90 // Overridden from views::WidgetDelegate: |
89 virtual views::View* GetContentsView() OVERRIDE { | 91 virtual views::View* GetContentsView() OVERRIDE { |
90 return this; | 92 return this; |
91 } | 93 } |
92 | 94 |
93 virtual void WindowClosing() OVERRIDE { | 95 virtual void WindowClosing() OVERRIDE { |
94 if (timer_.IsRunning()) | 96 if (timer_.IsRunning()) |
95 SuspendTimer(); | 97 SuspendTimer(); |
96 } | 98 } |
97 | 99 |
98 virtual bool CanActivate() const OVERRIDE { | 100 virtual bool CanActivate() const OVERRIDE { |
99 return false; | 101 return false; |
100 } | 102 } |
101 | 103 |
102 // views::View overrides: | 104 // Overridden from views::View: |
103 virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE { | 105 virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE { |
104 collection_->OnMouseEntered(); | 106 collection_->OnMouseEntered(); |
105 } | 107 } |
106 | 108 |
107 virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE { | 109 virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE { |
108 collection_->OnMouseExited(); | 110 collection_->OnMouseExited(); |
109 } | 111 } |
110 | 112 |
111 private: | 113 private: |
112 base::TimeDelta delay_; | 114 base::TimeDelta delay_; |
113 base::Time start_time_; | 115 base::Time start_time_; |
114 base::OneShotTimer<views::Widget> timer_; | 116 base::OneShotTimer<views::Widget> timer_; |
115 MessagePopupCollection* collection_; | 117 MessagePopupCollection* collection_; |
116 | 118 |
117 DISALLOW_COPY_AND_ASSIGN(ToastContentsView); | 119 DISALLOW_COPY_AND_ASSIGN(ToastContentsView); |
118 }; | 120 }; |
119 | 121 |
120 MessagePopupCollection::MessagePopupCollection( | 122 MessagePopupCollection::MessagePopupCollection(gfx::NativeView context, |
121 gfx::NativeView context, | 123 MessageCenter* message_center) |
122 NotificationList::Delegate* list_delegate) | |
123 : context_(context), | 124 : context_(context), |
124 list_delegate_(list_delegate) { | 125 message_center_(message_center) { |
125 DCHECK(list_delegate_); | 126 DCHECK(message_center_); |
126 } | 127 } |
127 | 128 |
128 MessagePopupCollection::~MessagePopupCollection() { | 129 MessagePopupCollection::~MessagePopupCollection() { |
129 CloseAllWidgets(); | 130 CloseAllWidgets(); |
130 } | 131 } |
131 | 132 |
132 void MessagePopupCollection::UpdatePopups() { | 133 void MessagePopupCollection::UpdatePopups() { |
133 NotificationList::PopupNotifications popups = | 134 NotificationList::PopupNotifications popups = |
134 list_delegate_->GetNotificationList()->GetPopupNotifications(); | 135 message_center_->notification_list()->GetPopupNotifications(); |
135 | 136 |
136 if (popups.empty()) { | 137 if (popups.empty()) { |
137 CloseAllWidgets(); | 138 CloseAllWidgets(); |
138 return; | 139 return; |
139 } | 140 } |
140 | 141 |
141 gfx::Screen* screen = gfx::Screen::GetScreenFor(context_); | 142 gfx::Screen* screen = gfx::Screen::GetScreenFor(context_); |
142 gfx::Rect work_area = screen->GetDisplayNearestWindow(context_).work_area(); | 143 gfx::Rect work_area = screen->GetDisplayNearestWindow(context_).work_area(); |
143 | 144 |
144 std::set<std::string> old_toast_ids; | 145 std::set<std::string> old_toast_ids; |
145 for (ToastContainer::iterator iter = toasts_.begin(); iter != toasts_.end(); | 146 for (ToastContainer::iterator iter = toasts_.begin(); iter != toasts_.end(); |
146 ++iter) { | 147 ++iter) { |
147 old_toast_ids.insert(iter->first); | 148 old_toast_ids.insert(iter->first); |
148 } | 149 } |
149 | 150 |
150 int total_height = 0; | 151 int total_height = 0; |
151 std::vector<views::Widget*> widgets; | 152 std::vector<views::Widget*> widgets; |
152 for (NotificationList::PopupNotifications::const_iterator iter = | 153 for (NotificationList::PopupNotifications::const_iterator iter = |
153 popups.begin(); iter != popups.end(); ++iter) { | 154 popups.begin(); iter != popups.end(); ++iter) { |
154 ToastContainer::iterator toast_iter = toasts_.find((*iter)->id()); | 155 ToastContainer::iterator toast_iter = toasts_.find((*iter)->id()); |
155 views::Widget* widget = NULL; | 156 views::Widget* widget = NULL; |
156 MessageView* view = NotificationView::Create(*(*iter), list_delegate_); | 157 // NotificationViews are expanded by default here because |
| 158 // MessagePopupCollection hasn't been tested yet with changing subview |
| 159 // sizes, and such changes could come if those subviews were initially |
| 160 // collapsed and allowed to be expanded by users. TODO(dharcourt): Fix. |
| 161 MessageView* view = NotificationView::Create(*(*iter), message_center_, |
| 162 true); |
157 if (toast_iter != toasts_.end()) { | 163 if (toast_iter != toasts_.end()) { |
158 widget = toast_iter->second->GetWidget(); | 164 widget = toast_iter->second->GetWidget(); |
159 old_toast_ids.erase((*iter)->id()); | 165 old_toast_ids.erase((*iter)->id()); |
160 // Need to replace the contents because |view| can be updated, like | 166 // Need to replace the contents because |view| can be updated, like |
161 // image loads. | 167 // image loads. |
162 toast_iter->second->SetContents(view); | 168 toast_iter->second->SetContents(view); |
163 } else { | 169 } else { |
164 ToastContentsView* toast = new ToastContentsView(*iter, this); | 170 ToastContentsView* toast = new ToastContentsView(*iter, this); |
165 toast->SetContents(view); | 171 toast->SetContents(view); |
166 widget = toast->CreateWidget(context_); | 172 widget = toast->CreateWidget(context_); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 widget->Close(); | 239 widget->Close(); |
234 } | 240 } |
235 toasts_.clear(); | 241 toasts_.clear(); |
236 } | 242 } |
237 | 243 |
238 void MessagePopupCollection::OnWidgetDestroying(views::Widget* widget) { | 244 void MessagePopupCollection::OnWidgetDestroying(views::Widget* widget) { |
239 widget->RemoveObserver(this); | 245 widget->RemoveObserver(this); |
240 for (ToastContainer::iterator iter = toasts_.begin(); | 246 for (ToastContainer::iterator iter = toasts_.begin(); |
241 iter != toasts_.end(); ++iter) { | 247 iter != toasts_.end(); ++iter) { |
242 if (iter->second->GetWidget() == widget) { | 248 if (iter->second->GetWidget() == widget) { |
243 list_delegate_->GetNotificationList()->MarkSinglePopupAsShown( | 249 message_center_->notification_list()->MarkSinglePopupAsShown( |
244 iter->first, false); | 250 iter->first, false); |
245 toasts_.erase(iter); | 251 toasts_.erase(iter); |
246 break; | 252 break; |
247 } | 253 } |
248 } | 254 } |
249 UpdatePopups(); | 255 UpdatePopups(); |
250 } | 256 } |
251 | 257 |
252 } // namespace message_center | 258 } // namespace message_center |
OLD | NEW |