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_center_view.h" | 5 #include "ui/message_center/views/message_center_view.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <map> | 8 #include <map> |
9 | 9 |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 const int kDefaultAnimationDurationMs = 120; | 54 const int kDefaultAnimationDurationMs = 120; |
55 const int kDefaultFrameRateHz = 60; | 55 const int kDefaultFrameRateHz = 60; |
56 } // namespace | 56 } // namespace |
57 | 57 |
58 class NoNotificationMessageView : public views::View { | 58 class NoNotificationMessageView : public views::View { |
59 public: | 59 public: |
60 NoNotificationMessageView(); | 60 NoNotificationMessageView(); |
61 virtual ~NoNotificationMessageView(); | 61 virtual ~NoNotificationMessageView(); |
62 | 62 |
63 // Overridden from views::View. | 63 // Overridden from views::View. |
64 virtual gfx::Size GetPreferredSize() OVERRIDE; | 64 virtual gfx::Size GetPreferredSize() const OVERRIDE; |
65 virtual int GetHeightForWidth(int width) OVERRIDE; | 65 virtual int GetHeightForWidth(int width) const OVERRIDE; |
66 virtual void Layout() OVERRIDE; | 66 virtual void Layout() OVERRIDE; |
67 | 67 |
68 private: | 68 private: |
69 views::Label* label_; | 69 views::Label* label_; |
70 | 70 |
71 DISALLOW_COPY_AND_ASSIGN(NoNotificationMessageView); | 71 DISALLOW_COPY_AND_ASSIGN(NoNotificationMessageView); |
72 }; | 72 }; |
73 | 73 |
74 NoNotificationMessageView::NoNotificationMessageView() { | 74 NoNotificationMessageView::NoNotificationMessageView() { |
75 label_ = new views::Label(l10n_util::GetStringUTF16( | 75 label_ = new views::Label(l10n_util::GetStringUTF16( |
76 IDS_MESSAGE_CENTER_NO_MESSAGES)); | 76 IDS_MESSAGE_CENTER_NO_MESSAGES)); |
77 label_->SetAutoColorReadabilityEnabled(false); | 77 label_->SetAutoColorReadabilityEnabled(false); |
78 label_->SetEnabledColor(kNoNotificationsTextColor); | 78 label_->SetEnabledColor(kNoNotificationsTextColor); |
79 // Set transparent background to ensure that subpixel rendering | 79 // Set transparent background to ensure that subpixel rendering |
80 // is disabled. See crbug.com/169056 | 80 // is disabled. See crbug.com/169056 |
81 #if defined(OS_LINUX) && defined(OS_CHROMEOS) | 81 #if defined(OS_LINUX) && defined(OS_CHROMEOS) |
82 label_->SetBackgroundColor(kTransparentColor); | 82 label_->SetBackgroundColor(kTransparentColor); |
83 #endif | 83 #endif |
84 AddChildView(label_); | 84 AddChildView(label_); |
85 } | 85 } |
86 | 86 |
87 NoNotificationMessageView::~NoNotificationMessageView() { | 87 NoNotificationMessageView::~NoNotificationMessageView() { |
88 } | 88 } |
89 | 89 |
90 gfx::Size NoNotificationMessageView::GetPreferredSize() { | 90 gfx::Size NoNotificationMessageView::GetPreferredSize() const { |
91 return gfx::Size(kMinScrollViewHeight, label_->GetPreferredSize().width()); | 91 return gfx::Size(kMinScrollViewHeight, label_->GetPreferredSize().width()); |
92 } | 92 } |
93 | 93 |
94 int NoNotificationMessageView::GetHeightForWidth(int width) { | 94 int NoNotificationMessageView::GetHeightForWidth(int width) const { |
95 return kMinScrollViewHeight; | 95 return kMinScrollViewHeight; |
96 } | 96 } |
97 | 97 |
98 void NoNotificationMessageView::Layout() { | 98 void NoNotificationMessageView::Layout() { |
99 int text_height = label_->GetHeightForWidth(width()); | 99 int text_height = label_->GetHeightForWidth(width()); |
100 int margin = (height() - text_height) / 2; | 100 int margin = (height() - text_height) / 2; |
101 label_->SetBounds(0, margin, width(), text_height); | 101 label_->SetBounds(0, margin, width(), text_height); |
102 } | 102 } |
103 | 103 |
104 // Displays a list of messages for rich notifications. Functions as an array of | 104 // Displays a list of messages for rich notifications. Functions as an array of |
105 // MessageViews and animates them on transitions. It also supports | 105 // MessageViews and animates them on transitions. It also supports |
106 // repositioning. | 106 // repositioning. |
107 class MessageListView : public views::View, | 107 class MessageListView : public views::View, |
108 public views::BoundsAnimatorObserver { | 108 public views::BoundsAnimatorObserver { |
109 public: | 109 public: |
110 explicit MessageListView(MessageCenterView* message_center_view, | 110 explicit MessageListView(MessageCenterView* message_center_view, |
111 bool top_down); | 111 bool top_down); |
112 virtual ~MessageListView(); | 112 virtual ~MessageListView(); |
113 | 113 |
114 void AddNotificationAt(MessageView* view, int i); | 114 void AddNotificationAt(MessageView* view, int i); |
115 void RemoveNotification(MessageView* view); | 115 void RemoveNotification(MessageView* view); |
116 void UpdateNotification(MessageView* view, const Notification& notification); | 116 void UpdateNotification(MessageView* view, const Notification& notification); |
117 void SetRepositionTarget(const gfx::Rect& target_rect); | 117 void SetRepositionTarget(const gfx::Rect& target_rect); |
118 void ResetRepositionSession(); | 118 void ResetRepositionSession(); |
119 void ClearAllNotifications(const gfx::Rect& visible_scroll_rect); | 119 void ClearAllNotifications(const gfx::Rect& visible_scroll_rect); |
120 | 120 |
121 protected: | 121 protected: |
122 // Overridden from views::View. | 122 // Overridden from views::View. |
123 virtual void Layout() OVERRIDE; | 123 virtual void Layout() OVERRIDE; |
124 virtual gfx::Size GetPreferredSize() OVERRIDE; | 124 virtual gfx::Size GetPreferredSize() const OVERRIDE; |
125 virtual int GetHeightForWidth(int width) OVERRIDE; | 125 virtual int GetHeightForWidth(int width) const OVERRIDE; |
126 virtual void PaintChildren(gfx::Canvas* canvas, | 126 virtual void PaintChildren(gfx::Canvas* canvas, |
127 const views::CullSet& cull_set) OVERRIDE; | 127 const views::CullSet& cull_set) OVERRIDE; |
128 virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE; | 128 virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE; |
129 | 129 |
130 // Overridden from views::BoundsAnimatorObserver. | 130 // Overridden from views::BoundsAnimatorObserver. |
131 virtual void OnBoundsAnimatorProgressed( | 131 virtual void OnBoundsAnimatorProgressed( |
132 views::BoundsAnimator* animator) OVERRIDE; | 132 views::BoundsAnimator* animator) OVERRIDE; |
133 virtual void OnBoundsAnimatorDone(views::BoundsAnimator* animator) OVERRIDE; | 133 virtual void OnBoundsAnimatorDone(views::BoundsAnimator* animator) OVERRIDE; |
134 | 134 |
135 private: | 135 private: |
136 bool IsValidChild(views::View* child); | 136 bool IsValidChild(const views::View* child) const; |
137 void DoUpdateIfPossible(); | 137 void DoUpdateIfPossible(); |
138 | 138 |
139 // Animates all notifications below target upwards to align with the top of | 139 // Animates all notifications below target upwards to align with the top of |
140 // the last closed notification. | 140 // the last closed notification. |
141 void AnimateNotificationsBelowTarget(); | 141 void AnimateNotificationsBelowTarget(); |
142 // Animates all notifications above target downwards to align with the top of | 142 // Animates all notifications above target downwards to align with the top of |
143 // the last closed notification. | 143 // the last closed notification. |
144 void AnimateNotificationsAboveTarget(); | 144 void AnimateNotificationsAboveTarget(); |
145 | 145 |
146 // Schedules animation for a child to the specified position. Returns false | 146 // Schedules animation for a child to the specified position. Returns false |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 if (animator_.get()) | 269 if (animator_.get()) |
270 animator_->StopAnimatingView(view); | 270 animator_->StopAnimatingView(view); |
271 if (deleting_views_.find(view) != deleting_views_.end()) | 271 if (deleting_views_.find(view) != deleting_views_.end()) |
272 deleting_views_.erase(view); | 272 deleting_views_.erase(view); |
273 if (deleted_when_done_.find(view) != deleted_when_done_.end()) | 273 if (deleted_when_done_.find(view) != deleted_when_done_.end()) |
274 deleted_when_done_.erase(view); | 274 deleted_when_done_.erase(view); |
275 view->UpdateWithNotification(notification); | 275 view->UpdateWithNotification(notification); |
276 DoUpdateIfPossible(); | 276 DoUpdateIfPossible(); |
277 } | 277 } |
278 | 278 |
279 gfx::Size MessageListView::GetPreferredSize() { | 279 gfx::Size MessageListView::GetPreferredSize() const { |
280 int width = 0; | 280 int width = 0; |
281 for (int i = 0; i < child_count(); i++) { | 281 for (int i = 0; i < child_count(); i++) { |
282 views::View* child = child_at(i); | 282 const views::View* child = child_at(i); |
283 if (IsValidChild(child)) | 283 if (IsValidChild(child)) |
284 width = std::max(width, child->GetPreferredSize().width()); | 284 width = std::max(width, child->GetPreferredSize().width()); |
285 } | 285 } |
286 | 286 |
287 return gfx::Size(width + GetInsets().width(), | 287 return gfx::Size(width + GetInsets().width(), |
288 GetHeightForWidth(width + GetInsets().width())); | 288 GetHeightForWidth(width + GetInsets().width())); |
289 } | 289 } |
290 | 290 |
291 int MessageListView::GetHeightForWidth(int width) { | 291 int MessageListView::GetHeightForWidth(int width) const { |
292 if (fixed_height_ > 0) | 292 if (fixed_height_ > 0) |
293 return fixed_height_; | 293 return fixed_height_; |
294 | 294 |
295 width -= GetInsets().width(); | 295 width -= GetInsets().width(); |
296 int height = 0; | 296 int height = 0; |
297 int padding = 0; | 297 int padding = 0; |
298 for (int i = 0; i < child_count(); ++i) { | 298 for (int i = 0; i < child_count(); ++i) { |
299 views::View* child = child_at(i); | 299 const views::View* child = child_at(i); |
300 if (!IsValidChild(child)) | 300 if (!IsValidChild(child)) |
301 continue; | 301 continue; |
302 height += child->GetHeightForWidth(width) + padding; | 302 height += child->GetHeightForWidth(width) + padding; |
303 padding = kMarginBetweenItems - MessageView::GetShadowInsets().bottom(); | 303 padding = kMarginBetweenItems - MessageView::GetShadowInsets().bottom(); |
304 } | 304 } |
305 | 305 |
306 return height + GetInsets().height(); | 306 return height + GetInsets().height(); |
307 } | 307 } |
308 | 308 |
309 void MessageListView::PaintChildren(gfx::Canvas* canvas, | 309 void MessageListView::PaintChildren(gfx::Canvas* canvas, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 | 384 |
385 if (has_deferred_task_) { | 385 if (has_deferred_task_) { |
386 has_deferred_task_ = false; | 386 has_deferred_task_ = false; |
387 DoUpdateIfPossible(); | 387 DoUpdateIfPossible(); |
388 } | 388 } |
389 | 389 |
390 if (GetWidget()) | 390 if (GetWidget()) |
391 GetWidget()->SynthesizeMouseMoveEvent(); | 391 GetWidget()->SynthesizeMouseMoveEvent(); |
392 } | 392 } |
393 | 393 |
394 bool MessageListView::IsValidChild(views::View* child) { | 394 bool MessageListView::IsValidChild(const views::View* child) const { |
395 return child->visible() && | 395 return child->visible() && |
396 deleting_views_.find(child) == deleting_views_.end() && | 396 deleting_views_.find(const_cast<views::View*>(child)) == |
397 deleted_when_done_.find(child) == deleted_when_done_.end(); | 397 deleting_views_.end() && |
| 398 deleted_when_done_.find(const_cast<views::View*>(child)) == |
| 399 deleted_when_done_.end(); |
398 } | 400 } |
399 | 401 |
400 void MessageListView::DoUpdateIfPossible() { | 402 void MessageListView::DoUpdateIfPossible() { |
401 gfx::Rect child_area = GetContentsBounds(); | 403 gfx::Rect child_area = GetContentsBounds(); |
402 if (child_area.IsEmpty()) | 404 if (child_area.IsEmpty()) |
403 return; | 405 return; |
404 | 406 |
405 if (animator_.get() && animator_->IsAnimating()) { | 407 if (animator_.get() && animator_->IsAnimating()) { |
406 has_deferred_task_ = true; | 408 has_deferred_task_ = true; |
407 return; | 409 return; |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 button_bar_->SchedulePaint(); | 756 button_bar_->SchedulePaint(); |
755 } | 757 } |
756 button_bar_->SetBounds(0, | 758 button_bar_->SetBounds(0, |
757 top_down_ ? 0 : height() - button_height, | 759 top_down_ ? 0 : height() - button_height, |
758 width(), | 760 width(), |
759 button_height); | 761 button_height); |
760 if (GetWidget()) | 762 if (GetWidget()) |
761 GetWidget()->GetRootView()->SchedulePaint(); | 763 GetWidget()->GetRootView()->SchedulePaint(); |
762 } | 764 } |
763 | 765 |
764 gfx::Size MessageCenterView::GetPreferredSize() { | 766 gfx::Size MessageCenterView::GetPreferredSize() const { |
765 if (settings_transition_animation_ && | 767 if (settings_transition_animation_ && |
766 settings_transition_animation_->is_animating()) { | 768 settings_transition_animation_->is_animating()) { |
767 int content_width = std::max(source_view_->GetPreferredSize().width(), | 769 int content_width = std::max(source_view_->GetPreferredSize().width(), |
768 target_view_->GetPreferredSize().width()); | 770 target_view_->GetPreferredSize().width()); |
769 int width = std::max(content_width, | 771 int width = std::max(content_width, |
770 button_bar_->GetPreferredSize().width()); | 772 button_bar_->GetPreferredSize().width()); |
771 return gfx::Size(width, GetHeightForWidth(width)); | 773 return gfx::Size(width, GetHeightForWidth(width)); |
772 } | 774 } |
773 | 775 |
774 int width = 0; | 776 int width = 0; |
775 for (int i = 0; i < child_count(); ++i) { | 777 for (int i = 0; i < child_count(); ++i) { |
776 views::View* child = child_at(0); | 778 const views::View* child = child_at(0); |
777 if (child->visible()) | 779 if (child->visible()) |
778 width = std::max(width, child->GetPreferredSize().width()); | 780 width = std::max(width, child->GetPreferredSize().width()); |
779 } | 781 } |
780 return gfx::Size(width, GetHeightForWidth(width)); | 782 return gfx::Size(width, GetHeightForWidth(width)); |
781 } | 783 } |
782 | 784 |
783 int MessageCenterView::GetHeightForWidth(int width) { | 785 int MessageCenterView::GetHeightForWidth(int width) const { |
784 if (settings_transition_animation_ && | 786 if (settings_transition_animation_ && |
785 settings_transition_animation_->is_animating()) { | 787 settings_transition_animation_->is_animating()) { |
786 int content_height = target_height_; | 788 int content_height = target_height_; |
787 if (settings_transition_animation_->current_part_index() == 0) { | 789 if (settings_transition_animation_->current_part_index() == 0) { |
788 content_height = settings_transition_animation_->CurrentValueBetween( | 790 content_height = settings_transition_animation_->CurrentValueBetween( |
789 source_height_, target_height_); | 791 source_height_, target_height_); |
790 } | 792 } |
791 return button_bar_->GetHeightForWidth(width) + content_height; | 793 return button_bar_->GetHeightForWidth(width) + content_height; |
792 } | 794 } |
793 | 795 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 scroller_->InvalidateLayout(); | 996 scroller_->InvalidateLayout(); |
995 PreferredSizeChanged(); | 997 PreferredSizeChanged(); |
996 Layout(); | 998 Layout(); |
997 } | 999 } |
998 | 1000 |
999 void MessageCenterView::SetNotificationViewForTest(MessageView* view) { | 1001 void MessageCenterView::SetNotificationViewForTest(MessageView* view) { |
1000 message_list_view_->AddNotificationAt(view, 0); | 1002 message_list_view_->AddNotificationAt(view, 0); |
1001 } | 1003 } |
1002 | 1004 |
1003 } // namespace message_center | 1005 } // namespace message_center |
OLD | NEW |