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 3 // found in the LICENSE file. 4 5 #include "ui/message_center/views/message_center_bubble.h" 6 7 #include "ui/message_center/message_center_style.h" 8 #include "ui/message_center/message_center_util.h" 9 #include "ui/message_center/views/message_center_view.h" 10 #include "ui/views/layout/fill_layout.h" 11 #include "ui/views/widget/widget.h" 12 13 namespace message_center { 14 15 // ContentsView //////////////////////////////////////////////////////////////// 16 17 // Handles changes in MessageCenterView sizes. 18 class ContentsView : public views::View { 19 public: 20 explicit ContentsView(MessageCenterBubble* bubble, views::View* contents); 21 virtual ~ContentsView(); 22 23 // Overridden from views::View: 24 virtual int GetHeightForWidth(int width) OVERRIDE; 25 26 protected: 27 // Overridden from views::View: 28 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 29 30 private: 31 base::WeakPtr<MessageCenterBubble> bubble_; 32 33 DISALLOW_COPY_AND_ASSIGN(ContentsView); 34 }; 35 36 ContentsView::ContentsView(MessageCenterBubble* bubble, views::View* contents) 37 : bubble_(bubble->AsWeakPtr()) { 38 SetLayoutManager(new views::FillLayout()); 39 AddChildView(contents); 40 } 41 42 ContentsView::~ContentsView() { 43 } 44 45 int ContentsView::GetHeightForWidth(int width) { 46 DCHECK_EQ(1, child_count()); 47 int contents_width = std::max(width - GetInsets().width(), 0); 48 int contents_height = child_at(0)->GetHeightForWidth(contents_width); 49 return contents_height + GetInsets().height(); 50 } 51 52 void ContentsView::ChildPreferredSizeChanged(View* child) { 53 // TODO(dharcourt): Reduce the amount of updating this requires. 54 if (bubble_.get()) 55 bubble_->bubble_view()->UpdateBubble(); 56 } 57 58 // MessageCenterBubble ///////////////////////////////////////////////////////// 59 60 MessageCenterBubble::MessageCenterBubble(MessageCenter* message_center, 61 MessageCenterTray* tray, 62 bool first_item_has_no_margin) 63 : MessageBubbleBase(message_center, tray), 64 message_center_view_(NULL), 65 initially_settings_visible_(false), 66 first_item_has_no_margin_(first_item_has_no_margin) { 67 } 68 69 MessageCenterBubble::~MessageCenterBubble() { 70 } 71 72 void MessageCenterBubble::SetSettingsVisible() { 73 if (message_center_view_) 74 message_center_view_->SetSettingsVisible(true); 75 else 76 initially_settings_visible_ = true; 77 } 78 79 views::TrayBubbleView::InitParams MessageCenterBubble::GetInitParams( 80 views::TrayBubbleView::AnchorAlignment anchor_alignment) { 81 views::TrayBubbleView::InitParams init_params = 82 GetDefaultInitParams(anchor_alignment); 83 init_params.min_width += kMarginBetweenItems * 2; 84 init_params.max_width += kMarginBetweenItems * 2; 85 init_params.max_height = max_height(); 86 init_params.can_activate = true; 87 init_params.first_item_has_no_margin = first_item_has_no_margin_; 88 return init_params; 89 } 90 91 void MessageCenterBubble::InitializeContents( 92 views::TrayBubbleView* new_bubble_view) { 93 set_bubble_view(new_bubble_view); 94 bubble_view()->GetWidget()->AddObserver(this); 95 message_center_view_ = new MessageCenterView( 96 message_center(), 97 tray(), 98 max_height(), 99 initially_settings_visible_, 100 false /* MessageCenterBubble should be used only on ChromeOS. 101 Message center is never shown top down in ChromeOS. */); 102 bubble_view()->AddChildView(new ContentsView(this, message_center_view_)); 103 // Resize the content of the bubble view to the given bubble size. This is 104 // necessary in case of the bubble border forcing a bigger size then the 105 // |new_bubble_view| actually wants. See crbug.com/169390. 106 bubble_view()->Layout(); 107 UpdateBubbleView(); 108 } 109 110 void MessageCenterBubble::OnBubbleViewDestroyed() { 111 message_center_view_ = NULL; 112 } 113 114 void MessageCenterBubble::UpdateBubbleView() { 115 if (!bubble_view()) 116 return; // Could get called after view is closed 117 const NotificationList::Notifications& notifications = 118 message_center()->GetVisibleNotifications(); 119 message_center_view_->SetNotifications(notifications); 120 bubble_view()->GetWidget()->Show(); 121 bubble_view()->UpdateBubble(); 122 } 123 124 void MessageCenterBubble::OnWidgetClosing(views::Widget* widget) { 125 bubble_view()->GetWidget()->RemoveObserver(this); 126 if (message_center_view_) 127 message_center_view_->SetIsClosing(true); 128 } 129 130 void MessageCenterBubble::OnMouseEnteredView() { 131 } 132 133 void MessageCenterBubble::OnMouseExitedView() { 134 } 135 136 size_t MessageCenterBubble::NumMessageViewsForTest() const { 137 return message_center_view_->NumMessageViewsForTest(); 138 } 139 140 } // namespace message_center 141