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

Side by Side Diff: ui/message_center/views/notification_view.cc

Issue 271773002: Retain popup bubble mouse status even through updates. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 6 years, 7 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/views/notification_view.h" 5 #include "ui/message_center/views/notification_view.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "grit/ui_resources.h" 10 #include "grit/ui_resources.h"
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) 284 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
285 // Don't create shadows for notification toasts on linux wih aura. 285 // Don't create shadows for notification toasts on linux wih aura.
286 if (top_level) 286 if (top_level)
287 return notification_view; 287 return notification_view;
288 #endif 288 #endif
289 289
290 notification_view->CreateShadowBorder(); 290 notification_view->CreateShadowBorder();
291 return notification_view; 291 return notification_view;
292 } 292 }
293 293
294 void NotificationView::CreateOrUpdateViews(const Notification& notification) {
295 CreateOrUpdateTitleView(notification);
296 CreateOrUpdateMessageView(notification);
297 CreateOrUpdateContextMessageView(notification);
298 CreateOrUpdateProgressBarView(notification);
299 CreateOrUpdateListItemViews(notification);
300 CreateOrUpdateIconView(notification);
301 CreateOrUpdateImageView(notification);
302 CreateOrUpdateActionButtonViews(notification);
303 }
304
305 void NotificationView::SetAccessibleName(const Notification& notification) {
306 std::vector<base::string16> accessible_lines;
307 accessible_lines.push_back(notification.title());
308 accessible_lines.push_back(notification.message());
309 accessible_lines.push_back(notification.context_message());
310 std::vector<NotificationItem> items = notification.items();
311 for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) {
312 accessible_lines.push_back(items[i].title + base::ASCIIToUTF16(" ") +
313 items[i].message);
314 }
315 set_accessible_name(JoinString(accessible_lines, '\n'));
316 }
317
294 NotificationView::NotificationView(MessageCenterController* controller, 318 NotificationView::NotificationView(MessageCenterController* controller,
295 const Notification& notification) 319 const Notification& notification)
296 : MessageView(this, 320 : MessageView(this,
297 notification.id(), 321 notification.id(),
298 notification.notifier_id(), 322 notification.notifier_id(),
299 notification.small_image().AsImageSkia(), 323 notification.small_image().AsImageSkia(),
300 notification.display_source()), 324 notification.display_source()),
301 controller_(controller), 325 controller_(controller),
302 clickable_(notification.clickable()) { 326 clickable_(notification.clickable()),
303 std::vector<base::string16> accessible_lines; 327 top_view_(NULL),
328 title_view_(NULL),
329 message_view_(NULL),
330 context_message_view_(NULL),
331 icon_view_(NULL),
332 bottom_view_(NULL),
333 image_view_(NULL),
334 progress_bar_view_(NULL) {
304 // Create the top_view_, which collects into a vertical box all content 335 // Create the top_view_, which collects into a vertical box all content
305 // at the top of the notification (to the right of the icon) except for the 336 // at the top of the notification (to the right of the icon) except for the
306 // close button. 337 // close button.
307 top_view_ = new views::View(); 338 top_view_ = new views::View();
308 top_view_->SetLayoutManager( 339 top_view_->SetLayoutManager(
309 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); 340 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
310 top_view_->SetBorder( 341 top_view_->SetBorder(
311 MakeEmptyBorder(kTextTopPadding - 8, 0, kTextBottomPadding - 5, 0)); 342 MakeEmptyBorder(kTextTopPadding - 8, 0, kTextBottomPadding - 5, 0));
312 343 AddChildView(top_view_);
313 const gfx::FontList default_label_font_list = views::Label().font_list();
314
315 // Create the title view if appropriate.
316 title_view_ = NULL;
317 if (!notification.title().empty()) {
318 const gfx::FontList& font_list =
319 default_label_font_list.DeriveWithSizeDelta(2);
320 int padding = kTitleLineHeight - font_list.GetHeight();
321 int title_character_limit =
322 kNotificationWidth * kMaxTitleLines / kMinPixelsPerTitleCharacter;
323 title_view_ = new BoundedLabel(
324 gfx::TruncateString(notification.title(), title_character_limit),
325 font_list);
326 title_view_->SetLineHeight(kTitleLineHeight);
327 title_view_->SetLineLimit(kMaxTitleLines);
328 title_view_->SetColors(message_center::kRegularTextColor,
329 kRegularTextBackgroundColor);
330 title_view_->SetBorder(MakeTextBorder(padding, 3, 0));
331 top_view_->AddChildView(title_view_);
332 accessible_lines.push_back(notification.title());
333 }
334
335 // Create the message view if appropriate.
336 message_view_ = NULL;
337 if (!notification.message().empty()) {
338 int padding = kMessageLineHeight - default_label_font_list.GetHeight();
339 message_view_ = new BoundedLabel(
340 gfx::TruncateString(notification.message(), kMessageCharacterLimit));
341 message_view_->SetLineHeight(kMessageLineHeight);
342 message_view_->SetVisible(!notification.items().size());
343 message_view_->SetColors(message_center::kRegularTextColor,
344 kDimTextBackgroundColor);
345 message_view_->SetBorder(MakeTextBorder(padding, 4, 0));
346 top_view_->AddChildView(message_view_);
347 accessible_lines.push_back(notification.message());
348 }
349
350 // Create the context message view if appropriate.
351 context_message_view_ = NULL;
352 if (!notification.context_message().empty()) {
353 int padding = kMessageLineHeight - default_label_font_list.GetHeight();
354 context_message_view_ =
355 new BoundedLabel(gfx::TruncateString(notification.context_message(),
356 kContextMessageCharacterLimit),
357 default_label_font_list);
358 context_message_view_->SetLineLimit(
359 message_center::kContextMessageLineLimit);
360 context_message_view_->SetLineHeight(kMessageLineHeight);
361 context_message_view_->SetColors(message_center::kDimTextColor,
362 kContextTextBackgroundColor);
363 context_message_view_->SetBorder(MakeTextBorder(padding, 4, 0));
364 top_view_->AddChildView(context_message_view_);
365 accessible_lines.push_back(notification.context_message());
366 }
367
368 // Create the progress bar view.
369 progress_bar_view_ = NULL;
370 if (notification.type() == NOTIFICATION_TYPE_PROGRESS) {
371 progress_bar_view_ = new NotificationProgressBar();
372 progress_bar_view_->SetBorder(MakeProgressBarBorder(
373 message_center::kProgressBarTopPadding, kProgressBarBottomPadding));
374 progress_bar_view_->SetValue(notification.progress() / 100.0);
375 top_view_->AddChildView(progress_bar_view_);
376 }
377
378 // Create the list item views (up to a maximum).
379 int padding = kMessageLineHeight - default_label_font_list.GetHeight();
380 std::vector<NotificationItem> items = notification.items();
381 for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) {
382 ItemView* item_view = new ItemView(items[i]);
383 item_view->SetBorder(MakeTextBorder(padding, i ? 0 : 4, 0));
384 item_views_.push_back(item_view);
385 top_view_->AddChildView(item_view);
386 accessible_lines.push_back(
387 items[i].title + base::ASCIIToUTF16(" ") + items[i].message);
388 }
389
390 // Create the notification icon view.
391 gfx::ImageSkia icon = notification.icon().AsImageSkia();
392 if (notification.type() == NOTIFICATION_TYPE_SIMPLE &&
393 (icon.width() != kIconSize ||
394 icon.height() != kIconSize ||
395 HasAlpha(icon, GetWidget()))) {
396 views::ImageView* icon_view = new views::ImageView();
397 icon_view->SetImage(icon);
398 icon_view->SetImageSize(gfx::Size(kLegacyIconSize, kLegacyIconSize));
399 icon_view->SetHorizontalAlignment(views::ImageView::CENTER);
400 icon_view->SetVerticalAlignment(views::ImageView::CENTER);
401 icon_view_ = icon_view;
402 } else {
403 icon_view_ =
404 new ProportionalImageView(icon, gfx::Size(kIconSize, kIconSize));
405 }
406
407 icon_view_->set_background(
408 views::Background::CreateSolidBackground(kIconBackgroundColor));
409
410 // Create the bottom_view_, which collects into a vertical box all content 344 // Create the bottom_view_, which collects into a vertical box all content
411 // below the notification icon. 345 // below the notification icon.
412 bottom_view_ = new views::View(); 346 bottom_view_ = new views::View();
413 bottom_view_->SetLayoutManager( 347 bottom_view_->SetLayoutManager(
414 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); 348 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
349 AddChildView(bottom_view_);
415 350
416 // Create the image view if appropriate. 351 CreateOrUpdateViews(notification);
417 image_view_ = NULL;
418 if (!notification.image().IsEmpty()) {
419 gfx::Size image_size(
420 kNotificationPreferredImageWidth, kNotificationPreferredImageHeight);
421 image_view_ = MakeNotificationImage(notification.image(), image_size);
422 bottom_view_->AddChildView(image_view_);
423 }
424
425 // Create action buttons if appropriate.
426 std::vector<ButtonInfo> buttons = notification.buttons();
427 for (size_t i = 0; i < buttons.size(); ++i) {
428 views::View* separator = new views::ImageView();
429 separator->SetBorder(MakeSeparatorBorder(1, 0, kButtonSeparatorColor));
430 bottom_view_->AddChildView(separator);
431 NotificationButton* button = new NotificationButton(this);
432 ButtonInfo button_info = buttons[i];
433 button->SetTitle(button_info.title);
434 button->SetIcon(button_info.icon.AsImageSkia());
435 action_buttons_.push_back(button);
436 bottom_view_->AddChildView(button);
437 }
438 352
439 // Put together the different content and control views. Layering those allows 353 // Put together the different content and control views. Layering those allows
440 // for proper layout logic and it also allows the close button and small 354 // for proper layout logic and it also allows the close button and small
441 // image to overlap the content as needed to provide large enough click and 355 // image to overlap the content as needed to provide large enough click and
442 // touch areas (<http://crbug.com/168822> and <http://crbug.com/168856>). 356 // touch areas (<http://crbug.com/168822> and <http://crbug.com/168856>).
443 AddChildView(top_view_);
444 AddChildView(icon_view_);
445 AddChildView(bottom_view_);
446 AddChildView(small_image()); 357 AddChildView(small_image());
447 AddChildView(close_button()); 358 AddChildView(close_button());
448 set_accessible_name(JoinString(accessible_lines, '\n')); 359 SetAccessibleName(notification);
449 } 360 }
450 361
451 NotificationView::~NotificationView() { 362 NotificationView::~NotificationView() {
452 } 363 }
453 364
454 gfx::Size NotificationView::GetPreferredSize() { 365 gfx::Size NotificationView::GetPreferredSize() {
455 int top_width = top_view_->GetPreferredSize().width(); 366 int top_width = top_view_->GetPreferredSize().width() +
367 icon_view_->GetPreferredSize().width();
456 int bottom_width = bottom_view_->GetPreferredSize().width(); 368 int bottom_width = bottom_view_->GetPreferredSize().width();
457 int preferred_width = std::max(top_width, bottom_width) + GetInsets().width(); 369 int preferred_width = std::max(top_width, bottom_width) + GetInsets().width();
458 return gfx::Size(preferred_width, GetHeightForWidth(preferred_width)); 370 return gfx::Size(preferred_width, GetHeightForWidth(preferred_width));
459 } 371 }
460 372
461 int NotificationView::GetHeightForWidth(int width) { 373 int NotificationView::GetHeightForWidth(int width) {
462 // Get the height assuming no line limit changes. 374 // Get the height assuming no line limit changes.
463 int content_width = width - GetInsets().width(); 375 int content_width = width - GetInsets().width();
464 int top_height = top_view_->GetHeightForWidth(content_width); 376 int top_height = top_view_->GetHeightForWidth(content_width);
465 int bottom_height = bottom_view_->GetHeightForWidth(content_width); 377 int bottom_height = bottom_view_->GetHeightForWidth(content_width);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 return this; 464 return this;
553 } 465 }
554 466
555 gfx::NativeCursor NotificationView::GetCursor(const ui::MouseEvent& event) { 467 gfx::NativeCursor NotificationView::GetCursor(const ui::MouseEvent& event) {
556 if (!clickable_ || !controller_->HasClickedListener(notification_id())) 468 if (!clickable_ || !controller_->HasClickedListener(notification_id()))
557 return views::View::GetCursor(event); 469 return views::View::GetCursor(event);
558 470
559 return ui::kCursorHand; 471 return ui::kCursorHand;
560 } 472 }
561 473
474 void NotificationView::UpdateWithNotification(
475 const Notification& notification) {
476 MessageView::UpdateWithNotification(notification);
477
478 CreateOrUpdateViews(notification);
479 SetAccessibleName(notification);
480 Layout();
481 SchedulePaint();
482 }
483
562 void NotificationView::ButtonPressed(views::Button* sender, 484 void NotificationView::ButtonPressed(views::Button* sender,
563 const ui::Event& event) { 485 const ui::Event& event) {
564 // Certain operations can cause |this| to be destructed, so copy the members 486 // Certain operations can cause |this| to be destructed, so copy the members
565 // we send to other parts of the code. 487 // we send to other parts of the code.
566 // TODO(dewittj): Remove this hack. 488 // TODO(dewittj): Remove this hack.
567 std::string id(notification_id()); 489 std::string id(notification_id());
568 // See if the button pressed was an action button. 490 // See if the button pressed was an action button.
569 for (size_t i = 0; i < action_buttons_.size(); ++i) { 491 for (size_t i = 0; i < action_buttons_.size(); ++i) {
570 if (sender == action_buttons_[i]) { 492 if (sender == action_buttons_[i]) {
571 controller_->ClickOnNotificationButton(id, i); 493 controller_->ClickOnNotificationButton(id, i);
572 return; 494 return;
573 } 495 }
574 } 496 }
575 497
576 // Let the superclass handled anything other than action buttons. 498 // Let the superclass handled anything other than action buttons.
577 // Warning: This may cause the NotificationView itself to be deleted, 499 // Warning: This may cause the NotificationView itself to be deleted,
578 // so don't do anything afterwards. 500 // so don't do anything afterwards.
579 MessageView::ButtonPressed(sender, event); 501 MessageView::ButtonPressed(sender, event);
580 } 502 }
581 503
582 void NotificationView::ClickOnNotification(const std::string& notification_id) { 504 void NotificationView::ClickOnNotification(const std::string& notification_id) {
583 controller_->ClickOnNotification(notification_id); 505 controller_->ClickOnNotification(notification_id);
584 } 506 }
585 507
586 void NotificationView::RemoveNotification(const std::string& notification_id, 508 void NotificationView::RemoveNotification(const std::string& notification_id,
587 bool by_user) { 509 bool by_user) {
588 controller_->RemoveNotification(notification_id, by_user); 510 controller_->RemoveNotification(notification_id, by_user);
589 } 511 }
590 512
513 void NotificationView::CreateOrUpdateTitleView(
514 const Notification& notification) {
515 if (notification.title().empty()) {
516 if (title_view_) {
517 // Deletion will also remove |title_view_| from its parent.
518 delete title_view_;
519 title_view_ = NULL;
520 }
521 return;
522 }
523
524 DCHECK(top_view_ != NULL);
525
526 const gfx::FontList& font_list =
527 views::Label().font_list().DeriveWithSizeDelta(2);
528
529 int title_character_limit =
530 kNotificationWidth * kMaxTitleLines / kMinPixelsPerTitleCharacter;
531
532 if (!title_view_) {
533 int padding = kTitleLineHeight - font_list.GetHeight();
534
535 title_view_ = new BoundedLabel(
536 gfx::TruncateString(notification.title(), title_character_limit),
537 font_list);
538 title_view_->SetLineHeight(kTitleLineHeight);
539 title_view_->SetLineLimit(kMaxTitleLines);
540 title_view_->SetColors(message_center::kRegularTextColor,
541 kRegularTextBackgroundColor);
542 title_view_->SetBorder(MakeTextBorder(padding, 3, 0));
543 top_view_->AddChildView(title_view_);
544 } else {
545 title_view_->SetText(
546 gfx::TruncateString(notification.title(), title_character_limit));
547 }
548 }
549
550 void NotificationView::CreateOrUpdateMessageView(
551 const Notification& notification) {
552 if (notification.message().empty()) {
553 if (message_view_) {
554 // Deletion will also remove |message_view_| from its parent.
555 delete message_view_;
556 message_view_ = NULL;
557 }
558 return;
559 }
560
561 DCHECK(top_view_ != NULL);
562
563 if (!message_view_) {
564 int padding = kMessageLineHeight - views::Label().font_list().GetHeight();
565 message_view_ = new BoundedLabel(
566 gfx::TruncateString(notification.message(), kMessageCharacterLimit));
567 message_view_->SetLineHeight(kMessageLineHeight);
568 message_view_->SetColors(message_center::kRegularTextColor,
569 kDimTextBackgroundColor);
570 message_view_->SetBorder(MakeTextBorder(padding, 4, 0));
571 top_view_->AddChildView(message_view_);
572 } else {
573 message_view_->SetText(
574 gfx::TruncateString(notification.message(), kMessageCharacterLimit));
575 }
576
577 message_view_->SetVisible(!notification.items().size());
578 }
579
580 void NotificationView::CreateOrUpdateContextMessageView(
581 const Notification& notification) {
582 if (notification.context_message().empty()) {
583 if (context_message_view_) {
584 // Deletion will also remove |context_message_view_| from its parent.
585 delete context_message_view_;
586 context_message_view_ = NULL;
587 }
588 return;
589 }
590
591 DCHECK(top_view_ != NULL);
592
593 if (!context_message_view_) {
594 int padding = kMessageLineHeight - views::Label().font_list().GetHeight();
595 context_message_view_ = new BoundedLabel(gfx::TruncateString(
596 notification.context_message(), kContextMessageCharacterLimit));
597 context_message_view_->SetLineLimit(
598 message_center::kContextMessageLineLimit);
599 context_message_view_->SetLineHeight(kMessageLineHeight);
600 context_message_view_->SetColors(message_center::kDimTextColor,
601 kContextTextBackgroundColor);
602 context_message_view_->SetBorder(MakeTextBorder(padding, 4, 0));
603 top_view_->AddChildView(context_message_view_);
604 } else {
605 context_message_view_->SetText(gfx::TruncateString(
606 notification.context_message(), kContextMessageCharacterLimit));
607 }
608 }
609
610 void NotificationView::CreateOrUpdateProgressBarView(
611 const Notification& notification) {
612 if (notification.type() != NOTIFICATION_TYPE_PROGRESS) {
613 if (progress_bar_view_) {
614 // Deletion will also remove |progress_bar_view_| from its parent.
615 delete progress_bar_view_;
616 progress_bar_view_ = NULL;
617 }
618 return;
619 }
620
621 DCHECK(top_view_ != NULL);
622
623 if (!progress_bar_view_) {
624 progress_bar_view_ = new NotificationProgressBar();
625 progress_bar_view_->SetBorder(MakeProgressBarBorder(
626 message_center::kProgressBarTopPadding, kProgressBarBottomPadding));
627 top_view_->AddChildView(progress_bar_view_);
628 }
629
630 progress_bar_view_->SetValue(notification.progress() / 100.0);
631 progress_bar_view_->SetVisible(!notification.items().size());
632 }
633
634 void NotificationView::CreateOrUpdateListItemViews(
635 const Notification& notification) {
636 for (size_t i = 0; i < item_views_.size(); ++i)
637 delete item_views_[i];
638 item_views_.clear();
639
640 int padding = kMessageLineHeight - views::Label().font_list().GetHeight();
641 std::vector<NotificationItem> items = notification.items();
642
643 if (items.size() == 0)
644 return;
645
646 DCHECK(top_view_);
647 for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) {
648 ItemView* item_view = new ItemView(items[i]);
649 item_view->SetBorder(MakeTextBorder(padding, i ? 0 : 4, 0));
650 item_views_.push_back(item_view);
651 top_view_->AddChildView(item_view);
652 }
653 }
654
655 void NotificationView::CreateOrUpdateIconView(
656 const Notification& notification) {
657 if (icon_view_) {
658 delete icon_view_;
659 icon_view_ = NULL;
660 }
661
662 // TODO(dewittj): Detect a compatible update and use the existing icon view.
663 gfx::ImageSkia icon = notification.icon().AsImageSkia();
664 if (notification.type() == NOTIFICATION_TYPE_SIMPLE &&
665 (icon.width() != kIconSize || icon.height() != kIconSize ||
666 HasAlpha(icon, GetWidget()))) {
667 views::ImageView* icon_view = new views::ImageView();
668 icon_view->SetImage(icon);
669 icon_view->SetImageSize(gfx::Size(kLegacyIconSize, kLegacyIconSize));
670 icon_view->SetHorizontalAlignment(views::ImageView::CENTER);
671 icon_view->SetVerticalAlignment(views::ImageView::CENTER);
672 icon_view_ = icon_view;
673 } else {
674 icon_view_ =
675 new ProportionalImageView(icon, gfx::Size(kIconSize, kIconSize));
676 }
677
678 icon_view_->set_background(
679 views::Background::CreateSolidBackground(kIconBackgroundColor));
680
681 AddChildView(icon_view_);
682 }
683
684 void NotificationView::CreateOrUpdateImageView(
685 const Notification& notification) {
686 if (image_view_) {
687 delete image_view_;
688 image_view_ = NULL;
689 }
690
691 DCHECK(bottom_view_);
692 DCHECK_EQ(this, bottom_view_->parent());
693
694 // TODO(dewittj): Detect a compatible update and use the existing image view.
695 if (!notification.image().IsEmpty()) {
696 gfx::Size image_size(kNotificationPreferredImageWidth,
697 kNotificationPreferredImageHeight);
698 image_view_ = MakeNotificationImage(notification.image(), image_size);
699 bottom_view_->AddChildView(image_view_);
700 }
701 }
702
703 void NotificationView::CreateOrUpdateActionButtonViews(
704 const Notification& notification) {
705 for (size_t i = 0; i < separators_.size(); ++i)
706 delete separators_[i];
707 separators_.clear();
708
709 for (size_t i = 0; i < action_buttons_.size(); ++i)
710 delete action_buttons_[i];
711 action_buttons_.clear();
712
713 DCHECK(bottom_view_);
714 DCHECK_EQ(this, bottom_view_->parent());
715
716 std::vector<ButtonInfo> buttons = notification.buttons();
717 for (size_t i = 0; i < buttons.size(); ++i) {
718 views::View* separator = new views::ImageView();
719 separator->SetBorder(MakeSeparatorBorder(1, 0, kButtonSeparatorColor));
720 separators_.push_back(separator);
721 bottom_view_->AddChildView(separator);
722 NotificationButton* button = new NotificationButton(this);
723 ButtonInfo button_info = buttons[i];
724 button->SetTitle(button_info.title);
725 button->SetIcon(button_info.icon.AsImageSkia());
726 action_buttons_.push_back(button);
727 bottom_view_->AddChildView(button);
728 }
729 }
730
591 int NotificationView::GetMessageLineLimit(int title_lines, int width) { 731 int NotificationView::GetMessageLineLimit(int title_lines, int width) {
592 // Image notifications require that the image must be kept flush against 732 // Image notifications require that the image must be kept flush against
593 // their icons, but we can allow more text if no image. 733 // their icons, but we can allow more text if no image.
594 int effective_title_lines = std::max(0, title_lines - 1); 734 int effective_title_lines = std::max(0, title_lines - 1);
595 int line_reduction_from_title = (image_view_ ? 1 : 2) * effective_title_lines; 735 int line_reduction_from_title = (image_view_ ? 1 : 2) * effective_title_lines;
596 if (!image_view_) { 736 if (!image_view_) {
597 // Title lines are counted as twice as big as message lines for the purpose 737 // Title lines are counted as twice as big as message lines for the purpose
598 // of this calculation. 738 // of this calculation.
599 // The effect from the title reduction here should be: 739 // The effect from the title reduction here should be:
600 // * 0 title lines: 5 max lines message. 740 // * 0 title lines: 5 max lines message.
(...skipping 22 matching lines...) Expand all
623 763
624 return message_line_limit; 764 return message_line_limit;
625 } 765 }
626 766
627 int NotificationView::GetMessageHeight(int width, int limit) { 767 int NotificationView::GetMessageHeight(int width, int limit) {
628 return message_view_ ? 768 return message_view_ ?
629 message_view_->GetSizeForWidthAndLines(width, limit).height() : 0; 769 message_view_->GetSizeForWidthAndLines(width, limit).height() : 0;
630 } 770 }
631 771
632 } // namespace message_center 772 } // namespace message_center
OLDNEW
« no previous file with comments | « ui/message_center/views/notification_view.h ('k') | ui/message_center/views/notification_view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698