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

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

Issue 11773004: Revives the new message center design. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_center_bubble.h" 5 #include "ui/message_center/message_center_bubble.h"
6 6
7 #include "base/command_line.h"
7 #include "grit/ui_strings.h" 8 #include "grit/ui_strings.h"
8 #include "ui/base/l10n/l10n_util.h" 9 #include "ui/base/l10n/l10n_util.h"
9 #include "ui/base/resource/resource_bundle.h" 10 #include "ui/base/resource/resource_bundle.h"
10 #include "ui/gfx/size.h" 11 #include "ui/gfx/size.h"
12 #include "ui/message_center/message_center_switches.h"
11 #include "ui/message_center/message_view.h" 13 #include "ui/message_center/message_view.h"
12 #include "ui/message_center/message_view_factory.h" 14 #include "ui/message_center/message_view_factory.h"
15 #include "ui/views/background.h"
16 #include "ui/views/border.h"
13 #include "ui/views/controls/button/text_button.h" 17 #include "ui/views/controls/button/text_button.h"
14 #include "ui/views/controls/label.h" 18 #include "ui/views/controls/label.h"
15 #include "ui/views/controls/scroll_view.h" 19 #include "ui/views/controls/scroll_view.h"
16 #include "ui/views/layout/box_layout.h" 20 #include "ui/views/layout/box_layout.h"
17 #include "ui/views/layout/grid_layout.h" 21 #include "ui/views/layout/grid_layout.h"
18 #include "ui/views/painter.h" 22 #include "ui/views/painter.h"
19 #include "ui/views/view.h" 23 #include "ui/views/view.h"
20 #include "ui/views/widget/widget.h" 24 #include "ui/views/widget/widget.h"
21 25
22 namespace message_center { 26 namespace message_center {
23 27
24 namespace { 28 namespace {
25 29
26 const int kMessageBubbleBaseMinHeight = 80; 30 const int kMessageBubbleBaseMinHeight = 80;
27 const int kMessageBubbleBaseMaxHeight = 400; 31 const int kMessageBubbleBaseMaxHeight = 400;
32 const int kMarginBetweenItems = 10;
33 const int kItemShadowHeight = 4;
34 const SkColor kMessageCenterBackgroundColor = SkColorSetRGB(0xe5, 0xe5, 0xe5);
28 const SkColor kBorderDarkColor = SkColorSetRGB(0xaa, 0xaa, 0xaa); 35 const SkColor kBorderDarkColor = SkColorSetRGB(0xaa, 0xaa, 0xaa);
36 const SkColor kMessageItemShadowColorBase = SkColorSetARGB(0.3 * 255, 0, 0, 0);
37 const SkColor kTransparentColor = SkColorSetARGB(0, 0, 0, 0);
38
39 bool UseNewDesign() {
40 return CommandLine::ForCurrentProcess()->HasSwitch(
41 switches::kEnableNewMessageCenterBubble);
42 }
29 43
30 // The view for the buttons at the bottom of the web notification tray. 44 // The view for the buttons at the bottom of the web notification tray.
31 class WebNotificationButtonView : public views::View, 45 class WebNotificationButtonView : public views::View,
32 public views::ButtonListener { 46 public views::ButtonListener {
33 public: 47 public:
34 explicit WebNotificationButtonView(NotificationList::Delegate* list_delegate) 48 explicit WebNotificationButtonView(NotificationList::Delegate* list_delegate)
35 : list_delegate_(list_delegate), 49 : list_delegate_(list_delegate),
36 close_all_button_(NULL) { 50 close_all_button_(NULL) {
37 set_background(views::Background::CreateBackgroundPainter( 51 set_background(views::Background::CreateBackgroundPainter(
38 true, 52 true,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 96
83 DISALLOW_COPY_AND_ASSIGN(WebNotificationButtonView); 97 DISALLOW_COPY_AND_ASSIGN(WebNotificationButtonView);
84 }; 98 };
85 99
86 // A custom scroll-view that has a specified size. 100 // A custom scroll-view that has a specified size.
87 class FixedSizedScrollView : public views::ScrollView { 101 class FixedSizedScrollView : public views::ScrollView {
88 public: 102 public:
89 FixedSizedScrollView() { 103 FixedSizedScrollView() {
90 set_focusable(true); 104 set_focusable(true);
91 set_notify_enter_exit_on_child(true); 105 set_notify_enter_exit_on_child(true);
106 if (UseNewDesign()) {
107 set_background(views::Background::CreateSolidBackground(
108 kMessageCenterBackgroundColor));
109 }
92 } 110 }
93 111
94 virtual ~FixedSizedScrollView() {} 112 virtual ~FixedSizedScrollView() {}
95 113
96 void SetFixedSize(const gfx::Size& size) { 114 void SetFixedSize(const gfx::Size& size) {
97 if (fixed_size_ == size) 115 if (fixed_size_ == size)
98 return; 116 return;
99 fixed_size_ = size; 117 fixed_size_ = size;
100 PreferredSizeChanged(); 118 PreferredSizeChanged();
101 } 119 }
(...skipping 29 matching lines...) Expand all
131 private: 149 private:
132 gfx::Size fixed_size_; 150 gfx::Size fixed_size_;
133 151
134 DISALLOW_COPY_AND_ASSIGN(FixedSizedScrollView); 152 DISALLOW_COPY_AND_ASSIGN(FixedSizedScrollView);
135 }; 153 };
136 154
137 // Container for the messages. 155 // Container for the messages.
138 class ScrollContentView : public views::View { 156 class ScrollContentView : public views::View {
139 public: 157 public:
140 ScrollContentView() { 158 ScrollContentView() {
141 views::BoxLayout* layout = 159 if (UseNewDesign()) {
142 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1); 160 // Set the margin to 0 for the layout. BoxLayout assumes the same margin
143 layout->set_spread_blank_space(true); 161 // for top and bottom, but the bottom margin here should be smaller
144 SetLayoutManager(layout); 162 // because of the shadow of message view. Use an empty border instead
163 // to provide this margin.
164 SetLayoutManager(
165 new views::BoxLayout(views::BoxLayout::kVertical,
166 0,
167 0,
168 kMarginBetweenItems - kItemShadowHeight));
169 set_background(views::Background::CreateSolidBackground(
170 kMessageCenterBackgroundColor));
171 set_border(views::Border::CreateEmptyBorder(
172 kMarginBetweenItems, /* top */
173 kMarginBetweenItems, /* left */
174 kMarginBetweenItems - kItemShadowHeight, /* bottom */
175 kMarginBetweenItems /* right */ ));
176 } else {
177 views::BoxLayout* layout =
178 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1);
179 layout->set_spread_blank_space(true);
180 SetLayoutManager(layout);
181 }
145 } 182 }
146 183
147 virtual ~ScrollContentView() { 184 virtual ~ScrollContentView() {
148 } 185 }
149 186
150 virtual gfx::Size GetPreferredSize() OVERRIDE { 187 virtual gfx::Size GetPreferredSize() OVERRIDE {
151 if (!preferred_size_.IsEmpty()) 188 if (!preferred_size_.IsEmpty())
152 return preferred_size_; 189 return preferred_size_;
153 return views::View::GetPreferredSize(); 190 return views::View::GetPreferredSize();
154 } 191 }
155 192
156 void set_preferred_size(const gfx::Size& size) { preferred_size_ = size; } 193 void set_preferred_size(const gfx::Size& size) { preferred_size_ = size; }
157 194
158 private: 195 private:
159 gfx::Size preferred_size_; 196 gfx::Size preferred_size_;
160 DISALLOW_COPY_AND_ASSIGN(ScrollContentView); 197 DISALLOW_COPY_AND_ASSIGN(ScrollContentView);
161 }; 198 };
162 199
200 // A view to draw gradient shadow for each MessageView.
201 class MessageViewShadow : public views::View {
202 public:
203 MessageViewShadow()
204 : painter_(views::Painter::CreateVerticalGradient(
205 kMessageItemShadowColorBase, kTransparentColor)) {
206 }
207
208 private:
209 // views::View overrides:
210 virtual gfx::Size GetPreferredSize() OVERRIDE {
211 // The preferred size must not be empty. Thus put an arbitrary non-zero
212 // width here. It will be just ignored by the vertical box layout.
213 return gfx::Size(1, kItemShadowHeight);
214 }
215
216 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
217 painter_->Paint(canvas, bounds().size());
218 }
219
220 scoped_ptr<views::Painter> painter_;
221 DISALLOW_COPY_AND_ASSIGN(MessageViewShadow);
222 };
223
163 } // namespace 224 } // namespace
164 225
165 // Message Center contents. 226 // Message Center contents.
166 class MessageCenterContentsView : public views::View { 227 class MessageCenterContentsView : public views::View {
167 public: 228 public:
168 explicit MessageCenterContentsView(NotificationList::Delegate* list_delegate) 229 explicit MessageCenterContentsView(NotificationList::Delegate* list_delegate)
169 : list_delegate_(list_delegate) { 230 : list_delegate_(list_delegate) {
231 int between_child = UseNewDesign() ? 0 : 1;
170 SetLayoutManager( 232 SetLayoutManager(
171 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1)); 233 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, between_child));
172 234
173 scroll_content_ = new ScrollContentView; 235 scroll_content_ = new ScrollContentView;
174 scroller_ = new FixedSizedScrollView; 236 scroller_ = new FixedSizedScrollView;
175 scroller_->SetContents(scroll_content_); 237 scroller_->SetContents(scroll_content_);
176 AddChildView(scroller_); 238 AddChildView(scroller_);
177 239
178 scroller_->SetPaintToLayer(true); 240 scroller_->SetPaintToLayer(true);
179 scroller_->SetFillsBoundsOpaquely(false); 241 scroller_->SetFillsBoundsOpaquely(false);
180 scroller_->layer()->SetMasksToBounds(true); 242 scroller_->layer()->SetMasksToBounds(true);
181 243
182 button_view_ = new WebNotificationButtonView(list_delegate); 244 button_view_ = new WebNotificationButtonView(list_delegate);
183 AddChildView(button_view_); 245 AddChildView(button_view_);
184 } 246 }
185 247
186 void FocusContents() { 248 void FocusContents() {
187 scroller_->RequestFocus(); 249 scroller_->RequestFocus();
188 } 250 }
189 251
190 void Update(const NotificationList::Notifications& notifications) { 252 void Update(const NotificationList::Notifications& notifications) {
191 scroll_content_->RemoveAllChildViews(true); 253 scroll_content_->RemoveAllChildViews(true);
192 scroll_content_->set_preferred_size(gfx::Size()); 254 scroll_content_->set_preferred_size(gfx::Size());
193 size_t num_children = 0; 255 size_t num_children = 0;
194 for (NotificationList::Notifications::const_iterator iter = 256 for (NotificationList::Notifications::const_iterator iter =
195 notifications.begin(); iter != notifications.end(); ++iter) { 257 notifications.begin(); iter != notifications.end(); ++iter) {
196 MessageView* view = 258 MessageView* view =
197 MessageViewFactory::ViewForNotification(*iter, list_delegate_); 259 MessageViewFactory::ViewForNotification(*iter, list_delegate_);
198 view->set_scroller(scroller_); 260 view->set_scroller(scroller_);
199 view->SetUpView(); 261 view->SetUpView();
200 scroll_content_->AddChildView(view); 262 if (UseNewDesign()) {
263 views::View* container = new views::View();
264 container->SetLayoutManager(
265 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
266 container->AddChildView(view);
267 container->AddChildView(new MessageViewShadow());
268 scroll_content_->AddChildView(container);
269 } else {
270 scroll_content_->AddChildView(view);
271 }
dharcourt 2013/01/07 23:08:16 Couldn't the view and its shadow be two views one
Jun Mukai 2013/01/08 01:33:22 The margin between the |view| and shadow has to be
dharcourt 2013/01/08 01:43:37 You're right :-). Sorry I missed that.
201 if (++num_children >= 272 if (++num_children >=
202 NotificationList::kMaxVisibleMessageCenterNotifications) { 273 NotificationList::kMaxVisibleMessageCenterNotifications) {
203 break; 274 break;
204 } 275 }
205 } 276 }
206 if (num_children == 0) { 277 if (num_children == 0) {
207 views::Label* label = new views::Label(l10n_util::GetStringUTF16( 278 views::Label* label = new views::Label(l10n_util::GetStringUTF16(
208 IDS_MESSAGE_CENTER_NO_MESSAGES)); 279 IDS_MESSAGE_CENTER_NO_MESSAGES));
209 label->SetFont(label->font().DeriveFont(1)); 280 label->SetFont(label->font().DeriveFont(1));
210 label->SetEnabledColor(SK_ColorGRAY); 281 label->SetEnabledColor(SK_ColorGRAY);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 : MessageBubbleBase(delegate), 325 : MessageBubbleBase(delegate),
255 contents_view_(NULL) { 326 contents_view_(NULL) {
256 } 327 }
257 328
258 MessageCenterBubble::~MessageCenterBubble() {} 329 MessageCenterBubble::~MessageCenterBubble() {}
259 330
260 views::TrayBubbleView::InitParams MessageCenterBubble::GetInitParams( 331 views::TrayBubbleView::InitParams MessageCenterBubble::GetInitParams(
261 views::TrayBubbleView::AnchorAlignment anchor_alignment) { 332 views::TrayBubbleView::AnchorAlignment anchor_alignment) {
262 views::TrayBubbleView::InitParams init_params = 333 views::TrayBubbleView::InitParams init_params =
263 GetDefaultInitParams(anchor_alignment); 334 GetDefaultInitParams(anchor_alignment);
335 if (UseNewDesign()) {
336 init_params.min_width += kMarginBetweenItems * 2;
337 init_params.max_width += kMarginBetweenItems * 2;
dharcourt 2013/01/07 23:08:16 Message_view.h's kWebNotificationWidth needs to be
Jun Mukai 2013/01/08 01:33:22 very good catch... I talked with somas, and he sa
338 }
339 // TODO(mukai): The new design bubble should have screen-height at most.
264 init_params.max_height = kMessageBubbleBaseMaxHeight; 340 init_params.max_height = kMessageBubbleBaseMaxHeight;
265 init_params.can_activate = true; 341 init_params.can_activate = true;
266 return init_params; 342 return init_params;
267 } 343 }
268 344
269 void MessageCenterBubble::InitializeContents( 345 void MessageCenterBubble::InitializeContents(
270 views::TrayBubbleView* new_bubble_view) { 346 views::TrayBubbleView* new_bubble_view) {
271 set_bubble_view(new_bubble_view); 347 set_bubble_view(new_bubble_view);
272 contents_view_ = new MessageCenterContentsView(list_delegate()); 348 contents_view_ = new MessageCenterContentsView(list_delegate());
273 bubble_view()->AddChildView(contents_view_); 349 bubble_view()->AddChildView(contents_view_);
(...skipping 19 matching lines...) Expand all
293 } 369 }
294 370
295 void MessageCenterBubble::OnMouseExitedView() { 371 void MessageCenterBubble::OnMouseExitedView() {
296 } 372 }
297 373
298 size_t MessageCenterBubble::NumMessageViewsForTest() const { 374 size_t MessageCenterBubble::NumMessageViewsForTest() const {
299 return contents_view_->NumMessageViews(); 375 return contents_view_->NumMessageViews();
300 } 376 }
301 377
302 } // namespace message_center 378 } // namespace message_center
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698