Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(728)

Side by Side Diff: ui/message_center/message_popup_bubble.cc

Issue 12277024: Notificaitons refactor step 2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more feedback from Steven Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "ui/message_center/message_popup_bubble.h" 5 #include "ui/message_center/message_popup_bubble.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "ui/message_center/message_view.h" 9 #include "ui/message_center/message_view.h"
10 #include "ui/message_center/notification.h" 10 #include "ui/message_center/notification.h"
11 #include "ui/message_center/notification_types.h"
11 #include "ui/message_center/notification_view.h" 12 #include "ui/message_center/notification_view.h"
12 #include "ui/notifications/notification_types.h"
13 #include "ui/views/bubble/tray_bubble_view.h" 13 #include "ui/views/bubble/tray_bubble_view.h"
14 #include "ui/views/layout/box_layout.h" 14 #include "ui/views/layout/box_layout.h"
15 #include "ui/views/view.h" 15 #include "ui/views/view.h"
16 #include "ui/views/widget/widget.h" 16 #include "ui/views/widget/widget.h"
17 17
18 namespace message_center { 18 namespace message_center {
19 namespace { 19 namespace {
20 20
21 const int kAutocloseHighPriorityDelaySeconds = 25; 21 const int kAutocloseHighPriorityDelaySeconds = 25;
22 const int kAutocloseDefaultDelaySeconds = 8; 22 const int kAutocloseDefaultDelaySeconds = 8;
23 23
24 } // namespace 24 } // namespace
25 25
26 // Popup notifications contents. 26 // Popup notifications contents.
27 class PopupBubbleContentsView : public views::View { 27 class PopupBubbleContentsView : public views::View {
28 public: 28 public:
29 explicit PopupBubbleContentsView(NotificationList::Delegate* list_delegate); 29 explicit PopupBubbleContentsView(NotificationList::Delegate* list_delegate);
30 30
31 void Update(const NotificationList::Notifications& popup_notifications); 31 void Update(const NotificationList::PopupNotifications& popup_notifications);
32 32
33 size_t NumMessageViews() const { 33 size_t NumMessageViews() const {
34 return content_->child_count(); 34 return content_->child_count();
35 } 35 }
36 36
37 private: 37 private:
38 NotificationList::Delegate* list_delegate_; 38 NotificationList::Delegate* list_delegate_;
39 views::View* content_; 39 views::View* content_;
40 40
41 DISALLOW_COPY_AND_ASSIGN(PopupBubbleContentsView); 41 DISALLOW_COPY_AND_ASSIGN(PopupBubbleContentsView);
(...skipping 10 matching lines...) Expand all
52 AddChildView(content_); 52 AddChildView(content_);
53 53
54 if (get_use_acceleration_when_possible()) { 54 if (get_use_acceleration_when_possible()) {
55 content_->SetPaintToLayer(true); 55 content_->SetPaintToLayer(true);
56 content_->SetFillsBoundsOpaquely(false); 56 content_->SetFillsBoundsOpaquely(false);
57 content_->layer()->SetMasksToBounds(true); 57 content_->layer()->SetMasksToBounds(true);
58 } 58 }
59 } 59 }
60 60
61 void PopupBubbleContentsView::Update( 61 void PopupBubbleContentsView::Update(
62 const NotificationList::Notifications& popup_notifications) { 62 const NotificationList::PopupNotifications& popup_notifications) {
63 content_->RemoveAllChildViews(true); 63 content_->RemoveAllChildViews(true);
64 for (NotificationList::Notifications::const_iterator iter = 64 for (NotificationList::PopupNotifications::const_iterator iter =
65 popup_notifications.begin(); 65 popup_notifications.begin();
66 iter != popup_notifications.end(); ++iter) { 66 iter != popup_notifications.end(); ++iter) {
67 MessageView* view = 67 content_->AddChildView(
68 NotificationView::ViewForNotification(*iter, list_delegate_); 68 NotificationView::ViewForNotification(*(*iter), list_delegate_));
69 view->SetUpView();
70 content_->AddChildView(view);
71 } 69 }
72 content_->SizeToPreferredSize(); 70 content_->SizeToPreferredSize();
73 content_->InvalidateLayout(); 71 content_->InvalidateLayout();
74 Layout(); 72 Layout();
75 if (GetWidget()) 73 if (GetWidget())
76 GetWidget()->GetRootView()->SchedulePaint(); 74 GetWidget()->GetRootView()->SchedulePaint();
77 } 75 }
78 76
79 // The timer to call OnAutoClose for |notification|. 77 // The timer to call OnAutoClose for |notification|.
80 class MessagePopupBubble::AutocloseTimer { 78 class MessagePopupBubble::AutocloseTimer {
81 public: 79 public:
82 AutocloseTimer(const Notification& notification, MessagePopupBubble* bubble); 80 AutocloseTimer(Notification* notification, MessagePopupBubble* bubble);
83 81
84 void Start(); 82 void Start();
85 83
86 void Suspend(); 84 void Suspend();
87 85
88 private: 86 private:
89 const std::string id_; 87 const std::string id_;
90 base::TimeDelta delay_; 88 base::TimeDelta delay_;
91 base::Time start_time_; 89 base::Time start_time_;
92 MessagePopupBubble* bubble_; 90 MessagePopupBubble* bubble_;
93 base::OneShotTimer<MessagePopupBubble> timer_; 91 base::OneShotTimer<MessagePopupBubble> timer_;
94 92
95 DISALLOW_COPY_AND_ASSIGN(AutocloseTimer); 93 DISALLOW_COPY_AND_ASSIGN(AutocloseTimer);
96 }; 94 };
97 95
98 MessagePopupBubble::AutocloseTimer::AutocloseTimer( 96 MessagePopupBubble::AutocloseTimer::AutocloseTimer(
99 const Notification& notification, 97 Notification* notification,
100 MessagePopupBubble* bubble) 98 MessagePopupBubble* bubble)
101 : id_(notification.id), 99 : id_(notification->id()),
102 bubble_(bubble) { 100 bubble_(bubble) {
103 int seconds = kAutocloseDefaultDelaySeconds; 101 int seconds = kAutocloseDefaultDelaySeconds;
104 if (notification.priority > ui::notifications::DEFAULT_PRIORITY) 102 if (notification->priority() > DEFAULT_PRIORITY)
105 seconds = kAutocloseHighPriorityDelaySeconds; 103 seconds = kAutocloseHighPriorityDelaySeconds;
106 delay_ = base::TimeDelta::FromSeconds(seconds); 104 delay_ = base::TimeDelta::FromSeconds(seconds);
107 } 105 }
108 106
109 void MessagePopupBubble::AutocloseTimer::Start() { 107 void MessagePopupBubble::AutocloseTimer::Start() {
110 start_time_ = base::Time::Now(); 108 start_time_ = base::Time::Now();
111 timer_.Start(FROM_HERE, 109 timer_.Start(FROM_HERE,
112 delay_, 110 delay_,
113 base::Bind(&MessagePopupBubble::OnAutoClose, 111 base::Bind(&MessagePopupBubble::OnAutoClose,
114 base::Unretained(bubble_), id_)); 112 base::Unretained(bubble_), id_));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 contents_view_ = new PopupBubbleContentsView(list_delegate()); 144 contents_view_ = new PopupBubbleContentsView(list_delegate());
147 bubble_view()->AddChildView(contents_view_); 145 bubble_view()->AddChildView(contents_view_);
148 UpdateBubbleView(); 146 UpdateBubbleView();
149 } 147 }
150 148
151 void MessagePopupBubble::OnBubbleViewDestroyed() { 149 void MessagePopupBubble::OnBubbleViewDestroyed() {
152 contents_view_ = NULL; 150 contents_view_ = NULL;
153 } 151 }
154 152
155 void MessagePopupBubble::UpdateBubbleView() { 153 void MessagePopupBubble::UpdateBubbleView() {
156 NotificationList::Notifications popups; 154 NotificationList::PopupNotifications popups =
157 list_delegate()->GetNotificationList()->GetPopupNotifications(&popups); 155 list_delegate()->GetNotificationList()->GetPopupNotifications();
158 156
159 if (popups.size() == 0) { 157 if (popups.size() == 0) {
160 if (bubble_view()) 158 if (bubble_view())
161 bubble_view()->delegate()->HideBubble(bubble_view()); // deletes |this| 159 bubble_view()->delegate()->HideBubble(bubble_view()); // deletes |this|
162 return; 160 return;
163 } 161 }
164 162
165 contents_view_->Update(popups); 163 contents_view_->Update(popups);
166 bubble_view()->Show(); 164 bubble_view()->Show();
167 bubble_view()->UpdateBubble(); 165 bubble_view()->UpdateBubble();
168 166
169 std::set<std::string> old_popup_ids; 167 std::set<std::string> old_popup_ids;
170 old_popup_ids.swap(popup_ids_); 168 old_popup_ids.swap(popup_ids_);
171 169
172 // Start autoclose timers. 170 // Start autoclose timers.
173 for (NotificationList::Notifications::const_iterator iter = popups.begin(); 171 for (NotificationList::PopupNotifications::const_iterator iter =
172 popups.begin();
174 iter != popups.end(); ++iter) { 173 iter != popups.end(); ++iter) {
174 std::string id = (*iter)->id();
175 std::map<std::string, AutocloseTimer*>::const_iterator timer_iter = 175 std::map<std::string, AutocloseTimer*>::const_iterator timer_iter =
176 autoclose_timers_.find(iter->id); 176 autoclose_timers_.find(id);
177 if (timer_iter == autoclose_timers_.end()) { 177 if (timer_iter == autoclose_timers_.end()) {
178 AutocloseTimer *timer = new AutocloseTimer(*iter, this); 178 AutocloseTimer *timer = new AutocloseTimer(*iter, this);
179 autoclose_timers_[iter->id] = timer; 179 autoclose_timers_[id] = timer;
180 timer->Start(); 180 timer->Start();
181 } 181 }
182 popup_ids_.insert(iter->id); 182 popup_ids_.insert(id);
183 old_popup_ids.erase(iter->id); 183 old_popup_ids.erase(id);
184 } 184 }
185 185
186 // Stops timers whose notifications are gone. 186 // Stops timers whose notifications are gone.
187 for (std::set<std::string>::const_iterator iter = old_popup_ids.begin(); 187 for (std::set<std::string>::const_iterator iter = old_popup_ids.begin();
188 iter != old_popup_ids.end(); ++iter) { 188 iter != old_popup_ids.end(); ++iter) {
189 DeleteTimer(*iter); 189 DeleteTimer(*iter);
190 } 190 }
191 } 191 }
192 192
193 void MessagePopupBubble::OnMouseEnteredView() { 193 void MessagePopupBubble::OnMouseEnteredView() {
(...skipping 23 matching lines...) Expand all
217 scoped_ptr<AutocloseTimer> release_timer(iter->second); 217 scoped_ptr<AutocloseTimer> release_timer(iter->second);
218 autoclose_timers_.erase(iter); 218 autoclose_timers_.erase(iter);
219 } 219 }
220 } 220 }
221 221
222 size_t MessagePopupBubble::NumMessageViewsForTest() const { 222 size_t MessagePopupBubble::NumMessageViewsForTest() const {
223 return contents_view_->NumMessageViews(); 223 return contents_view_->NumMessageViews();
224 } 224 }
225 225
226 } // namespace message_center 226 } // namespace message_center
OLDNEW
« no previous file with comments | « ui/message_center/message_center_tray_unittest.cc ('k') | ui/message_center/message_simple_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698