| OLD | NEW |
| 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/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "grit/ui_resources.h" | 9 #include "grit/ui_resources.h" |
| 10 #include "ui/base/accessibility/accessible_view_state.h" | 10 #include "ui/base/accessibility/accessible_view_state.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "ui/views/controls/label.h" | 25 #include "ui/views/controls/label.h" |
| 26 #include "ui/views/layout/box_layout.h" | 26 #include "ui/views/layout/box_layout.h" |
| 27 #include "ui/views/layout/fill_layout.h" | 27 #include "ui/views/layout/fill_layout.h" |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 // Dimensions. | 31 // Dimensions. |
| 32 const int kIconColumnWidth = message_center::kNotificationIconSize; | 32 const int kIconColumnWidth = message_center::kNotificationIconSize; |
| 33 const int kLegacyIconSize = 40; | 33 const int kLegacyIconSize = 40; |
| 34 const int kTextLeftPadding = kIconColumnWidth + | 34 const int kTextLeftPadding = kIconColumnWidth + |
| 35 message_center::kIconToTextPadding; | 35 message_center::kIconToTextPadding; |
| 36 const int kTextBottomPadding = 6; | 36 const int kTextBottomPadding = 12; |
| 37 const int kTextRightPadding = 23; | 37 const int kTextRightPadding = 23; |
| 38 const int kItemTitleToMessagePadding = 3; | 38 const int kItemTitleToMessagePadding = 3; |
| 39 const int kButtonHeight = 38; | 39 const int kButtonHeight = 38; |
| 40 const int kButtonHorizontalPadding = 16; | 40 const int kButtonHorizontalPadding = 16; |
| 41 const int kButtonVecticalPadding = 0; | 41 const int kButtonVecticalPadding = 0; |
| 42 const int kButtonIconTopPadding = 11; | 42 const int kButtonIconTopPadding = 11; |
| 43 const int kButtonIconToTitlePadding = 16; | 43 const int kButtonIconToTitlePadding = 16; |
| 44 const int kButtonTitleTopPadding = 0; | 44 const int kButtonTitleTopPadding = 0; |
| 45 | 45 |
| 46 const size_t kTitleCharacterLimit = 100; | 46 const size_t kTitleCharacterLimit = 100; |
| 47 const size_t kMessageCharacterLimit = 200; | 47 const size_t kMessageCharacterLimit = 200; |
| 48 | 48 |
| 49 // Notification colors. The text background colors below are used only to keep | 49 // Notification colors. The text background colors below are used only to keep |
| 50 // view::Label from modifying the text color and will not actually be drawn. | 50 // view::Label from modifying the text color and will not actually be drawn. |
| 51 // See view::Label's SetEnabledColor() and SetBackgroundColor() for details. | 51 // See view::Label's SetEnabledColor() and SetBackgroundColor() for details. |
| 52 const SkColor kRegularTextBackgroundColor = SK_ColorWHITE; | 52 const SkColor kRegularTextBackgroundColor = SK_ColorWHITE; |
| 53 const SkColor kDimTextColor = SkColorSetRGB(136, 136, 136); | 53 const SkColor kDimTextColor = SkColorSetRGB(136, 136, 136); |
| 54 const SkColor kDimTextBackgroundColor = SK_ColorBLACK; | 54 const SkColor kDimTextBackgroundColor = SK_ColorBLACK; |
| 55 const SkColor kButtonSeparatorColor = SkColorSetRGB(234, 234, 234); | 55 const SkColor kButtonSeparatorColor = SkColorSetRGB(234, 234, 234); |
| 56 const SkColor kHoveredButtonBackgroundColor = SkColorSetRGB(243, 243, 243); | 56 const SkColor kHoveredButtonBackgroundColor = SkColorSetRGB(243, 243, 243); |
| 57 | 57 |
| 58 // Static. | 58 // static |
| 59 views::Background* MakeBackground( | 59 views::Background* MakeBackground( |
| 60 SkColor color = message_center::kNotificationBackgroundColor) { | 60 SkColor color = message_center::kNotificationBackgroundColor) { |
| 61 return views::Background::CreateSolidBackground(color); | 61 return views::Background::CreateSolidBackground(color); |
| 62 } | 62 } |
| 63 | 63 |
| 64 // Static. | 64 // static |
| 65 views::Border* MakeBorder(int top, | 65 views::Border* MakeEmptyBorder(int top, int left, int bottom, int right) { |
| 66 int bottom, | 66 return views::Border::CreateEmptyBorder(top, left, bottom, right); |
| 67 int left = kTextLeftPadding, | 67 } |
| 68 int right = kTextRightPadding, | 68 |
| 69 SkColor color = 0x00000000) { | 69 // static |
| 70 return (color == 0x00000000) ? | 70 views::Border* MakeTextBorder(int top, int bottom) { |
| 71 views::Border::CreateEmptyBorder(top, left, bottom, right) : | 71 return MakeEmptyBorder(top, kTextLeftPadding, bottom, kTextRightPadding); |
| 72 views::Border::CreateSolidSidedBorder(top, left, bottom, right, color); | 72 } |
| 73 |
| 74 // static |
| 75 views::Border* MakeSeparatorBorder(int top, int left, SkColor color) { |
| 76 return views::Border::CreateSolidSidedBorder(top, left, 0, 0, color); |
| 73 } | 77 } |
| 74 | 78 |
| 75 // ContainerView /////////////////////////////////////////////////////////////// | 79 // ContainerView /////////////////////////////////////////////////////////////// |
| 76 | 80 |
| 77 // ContainerViews are vertical BoxLayout views that propagates their childrens' | 81 // ContainerViews are vertical BoxLayout views that propagates their childrens' |
| 78 // ChildPreferredSizeChanged() and ChildVisibilityChanged() calls. | 82 // ChildPreferredSizeChanged() and ChildVisibilityChanged() calls. |
| 79 class ContainerView : public views::View { | 83 class ContainerView : public views::View { |
| 80 public: | 84 public: |
| 81 ContainerView(); | 85 ContainerView(); |
| 82 virtual ~ContainerView(); | 86 virtual ~ContainerView(); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 delete icon_; // This removes the icon from this view's children. | 274 delete icon_; // This removes the icon from this view's children. |
| 271 if (image.isNull()) { | 275 if (image.isNull()) { |
| 272 icon_ = NULL; | 276 icon_ = NULL; |
| 273 } else { | 277 } else { |
| 274 icon_ = new views::ImageView(); | 278 icon_ = new views::ImageView(); |
| 275 icon_->SetImageSize(gfx::Size(message_center::kNotificationButtonIconSize, | 279 icon_->SetImageSize(gfx::Size(message_center::kNotificationButtonIconSize, |
| 276 message_center::kNotificationButtonIconSize)); | 280 message_center::kNotificationButtonIconSize)); |
| 277 icon_->SetImage(image); | 281 icon_->SetImage(image); |
| 278 icon_->SetHorizontalAlignment(views::ImageView::LEADING); | 282 icon_->SetHorizontalAlignment(views::ImageView::LEADING); |
| 279 icon_->SetVerticalAlignment(views::ImageView::LEADING); | 283 icon_->SetVerticalAlignment(views::ImageView::LEADING); |
| 280 icon_->set_border(MakeBorder(kButtonIconTopPadding, 0, 0, 0)); | 284 icon_->set_border(MakeEmptyBorder(kButtonIconTopPadding, 0, 0, 0)); |
| 281 AddChildViewAt(icon_, 0); | 285 AddChildViewAt(icon_, 0); |
| 282 } | 286 } |
| 283 } | 287 } |
| 284 | 288 |
| 285 void NotificationButton::SetTitle(const string16& title) { | 289 void NotificationButton::SetTitle(const string16& title) { |
| 286 if (title_ != NULL) | 290 if (title_ != NULL) |
| 287 delete title_; // This removes the title from this view's children. | 291 delete title_; // This removes the title from this view's children. |
| 288 if (title.empty()) { | 292 if (title.empty()) { |
| 289 title_ = NULL; | 293 title_ = NULL; |
| 290 } else { | 294 } else { |
| 291 title_ = new views::Label(title); | 295 title_ = new views::Label(title); |
| 292 title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 296 title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 293 title_->SetElideBehavior(views::Label::ELIDE_AT_END); | 297 title_->SetElideBehavior(views::Label::ELIDE_AT_END); |
| 294 title_->SetEnabledColor(message_center::kRegularTextColor); | 298 title_->SetEnabledColor(message_center::kRegularTextColor); |
| 295 title_->SetBackgroundColor(kRegularTextBackgroundColor); | 299 title_->SetBackgroundColor(kRegularTextBackgroundColor); |
| 296 title_->set_border(MakeBorder(kButtonTitleTopPadding, 0, 0, 0)); | 300 title_->set_border(MakeEmptyBorder(kButtonTitleTopPadding, 0, 0, 0)); |
| 297 AddChildView(title_); | 301 AddChildView(title_); |
| 298 } | 302 } |
| 299 } | 303 } |
| 300 | 304 |
| 301 gfx::Size NotificationButton::GetPreferredSize() { | 305 gfx::Size NotificationButton::GetPreferredSize() { |
| 302 return gfx::Size(message_center::kNotificationWidth, kButtonHeight); | 306 return gfx::Size(message_center::kNotificationWidth, kButtonHeight); |
| 303 } | 307 } |
| 304 | 308 |
| 305 int NotificationButton::GetHeightForWidth(int width) { | 309 int NotificationButton::GetHeightForWidth(int width) { |
| 306 return kButtonHeight; | 310 return kButtonHeight; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 bool expanded) | 360 bool expanded) |
| 357 : MessageView(notification, observer, expanded) { | 361 : MessageView(notification, observer, expanded) { |
| 358 // Create the opaque background that's above the view's shadow. | 362 // Create the opaque background that's above the view's shadow. |
| 359 background_view_ = new views::View(); | 363 background_view_ = new views::View(); |
| 360 background_view_->set_background(MakeBackground()); | 364 background_view_->set_background(MakeBackground()); |
| 361 | 365 |
| 362 // Create the top_view_, which collects into a vertical box all content | 366 // Create the top_view_, which collects into a vertical box all content |
| 363 // at the top of the notification (to the right of the icon) except for the | 367 // at the top of the notification (to the right of the icon) except for the |
| 364 // close button. | 368 // close button. |
| 365 top_view_ = new ContainerView(); | 369 top_view_ = new ContainerView(); |
| 370 top_view_->set_border(MakeEmptyBorder(kTextTopPadding - 8, 0, |
| 371 kTextBottomPadding - 5, 0)); |
| 366 | 372 |
| 367 // Create the title view if appropriate. | 373 // Create the title view if appropriate. |
| 368 title_view_ = NULL; | 374 title_view_ = NULL; |
| 369 if (!notification.title().empty()) { | 375 if (!notification.title().empty()) { |
| 370 title_view_ = new views::Label( | 376 title_view_ = new views::Label( |
| 371 MaybeTruncateText( notification.title(), kTitleCharacterLimit)); | 377 MaybeTruncateText( notification.title(), kTitleCharacterLimit)); |
| 372 title_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 378 title_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 373 if (is_expanded()) | 379 if (is_expanded()) |
| 374 title_view_->SetMultiLine(true); | 380 title_view_->SetMultiLine(true); |
| 375 else | 381 else |
| 376 title_view_->SetElideBehavior(views::Label::ELIDE_AT_END); | 382 title_view_->SetElideBehavior(views::Label::ELIDE_AT_END); |
| 377 title_view_->SetFont(title_view_->font().DeriveFont(2)); | 383 title_view_->SetFont(title_view_->font().DeriveFont(2)); |
| 378 title_view_->SetEnabledColor(message_center::kRegularTextColor); | 384 title_view_->SetEnabledColor(message_center::kRegularTextColor); |
| 379 title_view_->SetBackgroundColor(kRegularTextBackgroundColor); | 385 title_view_->SetBackgroundColor(kRegularTextBackgroundColor); |
| 380 title_view_->set_border(MakeBorder(kTextTopPadding, 3)); | 386 title_view_->set_border(MakeTextBorder(3, 0)); |
| 381 top_view_->AddChildView(title_view_); | 387 top_view_->AddChildView(title_view_); |
| 382 } | 388 } |
| 383 | 389 |
| 384 // Create the message view if appropriate. | 390 // Create the message view if appropriate. |
| 385 message_view_ = NULL; | 391 message_view_ = NULL; |
| 386 if (!notification.message().empty()) { | 392 if (!notification.message().empty()) { |
| 387 message_view_ = new views::Label( | 393 message_view_ = new views::Label( |
| 388 MaybeTruncateText(notification.message(), kMessageCharacterLimit)); | 394 MaybeTruncateText(notification.message(), kMessageCharacterLimit)); |
| 389 message_view_->SetVisible(!is_expanded() || !notification.items().size()); | 395 message_view_->SetVisible(!is_expanded() || !notification.items().size()); |
| 390 message_view_->set_collapse_when_hidden(true); | 396 message_view_->set_collapse_when_hidden(true); |
| 391 message_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 397 message_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 392 if (is_expanded()) | 398 if (is_expanded()) |
| 393 message_view_->SetMultiLine(true); | 399 message_view_->SetMultiLine(true); |
| 394 else | 400 else |
| 395 message_view_->SetElideBehavior(views::Label::ELIDE_AT_END); | 401 message_view_->SetElideBehavior(views::Label::ELIDE_AT_END); |
| 396 message_view_->SetEnabledColor(message_center::kRegularTextColor); | 402 message_view_->SetEnabledColor(message_center::kRegularTextColor); |
| 397 message_view_->SetBackgroundColor(kRegularTextBackgroundColor); | 403 message_view_->SetBackgroundColor(kRegularTextBackgroundColor); |
| 398 message_view_->set_border(MakeBorder(0, 3)); | 404 message_view_->set_border(MakeTextBorder(4, 1)); |
| 399 top_view_->AddChildView(message_view_); | 405 top_view_->AddChildView(message_view_); |
| 400 } | 406 } |
| 401 | 407 |
| 402 // Create the list item views (up to a maximum). | 408 // Create the list item views (up to a maximum). |
| 403 std::vector<NotificationItem> items = notification.items(); | 409 std::vector<NotificationItem> items = notification.items(); |
| 404 for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) { | 410 for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) { |
| 405 ItemView* item_view = new ItemView(items[i]); | 411 ItemView* item_view = new ItemView(items[i]); |
| 406 item_view->SetVisible(is_expanded()); | 412 item_view->SetVisible(is_expanded()); |
| 407 item_view->set_border(MakeBorder(0, 4)); | 413 item_view->set_border(MakeTextBorder(i > 0 ? 0 : 4, 1)); |
| 408 item_views_.push_back(item_view); | 414 item_views_.push_back(item_view); |
| 409 top_view_->AddChildView(item_view); | 415 top_view_->AddChildView(item_view); |
| 410 } | 416 } |
| 411 | 417 |
| 412 // Create the notification icon view. | 418 // Create the notification icon view. |
| 413 if (notification.type() == NOTIFICATION_TYPE_SIMPLE) { | 419 if (notification.type() == NOTIFICATION_TYPE_SIMPLE) { |
| 414 views::ImageView* icon_view = new views::ImageView(); | 420 views::ImageView* icon_view = new views::ImageView(); |
| 415 icon_view->SetImage(notification.icon().AsImageSkia()); | 421 icon_view->SetImage(notification.icon().AsImageSkia()); |
| 416 icon_view->SetImageSize(gfx::Size(kLegacyIconSize, kLegacyIconSize)); | 422 icon_view->SetImageSize(gfx::Size(kLegacyIconSize, kLegacyIconSize)); |
| 417 icon_view->SetHorizontalAlignment(views::ImageView::CENTER); | 423 icon_view->SetHorizontalAlignment(views::ImageView::CENTER); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 431 if (!notification.image().IsEmpty()) { | 437 if (!notification.image().IsEmpty()) { |
| 432 image_view_ = new ProportionalImageView(notification.image().AsImageSkia()); | 438 image_view_ = new ProportionalImageView(notification.image().AsImageSkia()); |
| 433 image_view_->SetVisible(is_expanded()); | 439 image_view_->SetVisible(is_expanded()); |
| 434 bottom_view_->AddChildView(image_view_); | 440 bottom_view_->AddChildView(image_view_); |
| 435 } | 441 } |
| 436 | 442 |
| 437 // Create action buttons if appropriate. | 443 // Create action buttons if appropriate. |
| 438 std::vector<ButtonInfo> buttons = notification.buttons(); | 444 std::vector<ButtonInfo> buttons = notification.buttons(); |
| 439 for (size_t i = 0; i < buttons.size(); ++i) { | 445 for (size_t i = 0; i < buttons.size(); ++i) { |
| 440 views::View* separator = new views::ImageView(); | 446 views::View* separator = new views::ImageView(); |
| 441 separator->set_border(MakeBorder(1, 0, 0, 0, kButtonSeparatorColor)); | 447 separator->set_border(MakeSeparatorBorder(1, 0, kButtonSeparatorColor)); |
| 442 bottom_view_->AddChildView(separator); | 448 bottom_view_->AddChildView(separator); |
| 443 NotificationButton* button = new NotificationButton(this); | 449 NotificationButton* button = new NotificationButton(this); |
| 444 ButtonInfo button_info = buttons[i]; | 450 ButtonInfo button_info = buttons[i]; |
| 445 button->SetTitle(button_info.title); | 451 button->SetTitle(button_info.title); |
| 446 button->SetIcon(button_info.icon.AsImageSkia()); | 452 button->SetIcon(button_info.icon.AsImageSkia()); |
| 447 action_buttons_.push_back(button); | 453 action_buttons_.push_back(button); |
| 448 bottom_view_->AddChildView(button); | 454 bottom_view_->AddChildView(button); |
| 449 } | 455 } |
| 450 | 456 |
| 451 // Hide the expand button if appropriate. | 457 // Hide the expand button if appropriate. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 size_t limit) { | 548 size_t limit) { |
| 543 // Currently just truncate the text by the total number of characters. | 549 // Currently just truncate the text by the total number of characters. |
| 544 // TODO(mukai): add better assumption like number of lines. | 550 // TODO(mukai): add better assumption like number of lines. |
| 545 if (!is_expanded()) | 551 if (!is_expanded()) |
| 546 return text; | 552 return text; |
| 547 | 553 |
| 548 return ui::TruncateString(text, limit); | 554 return ui::TruncateString(text, limit); |
| 549 } | 555 } |
| 550 | 556 |
| 551 } // namespace message_center | 557 } // namespace message_center |
| OLD | NEW |