• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ContentsView(MessageCenterBubble * bubble,views::View * contents)36 ContentsView::ContentsView(MessageCenterBubble* bubble, views::View* contents)
37     : bubble_(bubble->AsWeakPtr()) {
38   SetLayoutManager(new views::FillLayout());
39   AddChildView(contents);
40 }
41 
~ContentsView()42 ContentsView::~ContentsView() {
43 }
44 
GetHeightForWidth(int width)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 
ChildPreferredSizeChanged(View * child)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 
MessageCenterBubble(MessageCenter * message_center,MessageCenterTray * tray,bool first_item_has_no_margin)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 
~MessageCenterBubble()69 MessageCenterBubble::~MessageCenterBubble() {
70 }
71 
SetSettingsVisible()72 void MessageCenterBubble::SetSettingsVisible() {
73   if (message_center_view_)
74     message_center_view_->SetSettingsVisible(true);
75   else
76     initially_settings_visible_ = true;
77 }
78 
GetInitParams(views::TrayBubbleView::AnchorAlignment anchor_alignment)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 
InitializeContents(views::TrayBubbleView * new_bubble_view)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 
OnBubbleViewDestroyed()110 void MessageCenterBubble::OnBubbleViewDestroyed() {
111   message_center_view_ = NULL;
112 }
113 
UpdateBubbleView()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 
OnWidgetClosing(views::Widget * widget)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 
OnMouseEnteredView()130 void MessageCenterBubble::OnMouseEnteredView() {
131 }
132 
OnMouseExitedView()133 void MessageCenterBubble::OnMouseExitedView() {
134 }
135 
NumMessageViewsForTest() const136 size_t MessageCenterBubble::NumMessageViewsForTest() const {
137   return message_center_view_->NumMessageViewsForTest();
138 }
139 
140 }  // namespace message_center
141