Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 #import "ui/message_center/cocoa/notification_controller.h" | 5 #import "ui/message_center/cocoa/notification_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/mac/foundation_util.h" | 9 #include "base/mac/foundation_util.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 11 #include "base/strings/sys_string_conversions.h" | 11 #include "base/strings/sys_string_conversions.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "components/url_formatter/elide_url.h" | |
| 13 #include "skia/ext/skia_utils_mac.h" | 14 #include "skia/ext/skia_utils_mac.h" |
| 14 #import "ui/base/cocoa/hover_image_button.h" | 15 #import "ui/base/cocoa/hover_image_button.h" |
| 15 #include "ui/base/l10n/l10n_util_mac.h" | 16 #include "ui/base/l10n/l10n_util_mac.h" |
| 16 #include "ui/base/resource/resource_bundle.h" | 17 #include "ui/base/resource/resource_bundle.h" |
| 17 #include "ui/gfx/font_list.h" | 18 #include "ui/gfx/font_list.h" |
| 18 #include "ui/gfx/text_elider.h" | 19 #include "ui/gfx/text_elider.h" |
| 19 #include "ui/gfx/text_utils.h" | 20 #include "ui/gfx/text_utils.h" |
| 20 #include "ui/message_center/message_center.h" | 21 #include "ui/message_center/message_center.h" |
| 21 #include "ui/message_center/message_center_style.h" | 22 #include "ui/message_center/message_center_style.h" |
| 22 #include "ui/message_center/notification.h" | 23 #include "ui/message_center/notification.h" |
| 23 #include "ui/resources/grit/ui_resources.h" | 24 #include "ui/resources/grit/ui_resources.h" |
| 24 #include "ui/strings/grit/ui_strings.h" | 25 #include "ui/strings/grit/ui_strings.h" |
| 25 | 26 #include "url/gurl.h" |
| 26 | 27 |
| 27 @interface MCNotificationProgressBar : NSProgressIndicator | 28 @interface MCNotificationProgressBar : NSProgressIndicator |
| 28 @end | 29 @end |
| 29 | 30 |
| 30 @implementation MCNotificationProgressBar | 31 @implementation MCNotificationProgressBar |
| 31 - (void)drawRect:(NSRect)dirtyRect { | 32 - (void)drawRect:(NSRect)dirtyRect { |
| 32 NSRect sliceRect, remainderRect; | 33 NSRect sliceRect, remainderRect; |
| 33 double progressFraction = ([self doubleValue] - [self minValue]) / | 34 double progressFraction = ([self doubleValue] - [self minValue]) / |
| 34 ([self maxValue] - [self minValue]); | 35 ([self maxValue] - [self minValue]); |
| 35 NSDivideRect(dirtyRect, &sliceRect, &remainderRect, | 36 NSDivideRect(dirtyRect, &sliceRect, &remainderRect, |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 373 CGFloat messagePadding = | 374 CGFloat messagePadding = |
| 374 message_center::kTextTopPadding - titleBottomGap - messageTopGap; | 375 message_center::kTextTopPadding - titleBottomGap - messageTopGap; |
| 375 | 376 |
| 376 CGFloat contextMessageTopGap = roundf( | 377 CGFloat contextMessageTopGap = roundf( |
| 377 [[contextMessage_ font] ascender] - [[contextMessage_ font] capHeight]); | 378 [[contextMessage_ font] ascender] - [[contextMessage_ font] capHeight]); |
| 378 CGFloat contextMessagePadding = | 379 CGFloat contextMessagePadding = |
| 379 message_center::kTextTopPadding - messageBottomGap - contextMessageTopGap; | 380 message_center::kTextTopPadding - messageBottomGap - contextMessageTopGap; |
| 380 | 381 |
| 381 // Set the title and recalculate the frame. | 382 // Set the title and recalculate the frame. |
| 382 size_t actualTitleLines = 0; | 383 size_t actualTitleLines = 0; |
| 383 [title_ setString:base::SysUTF16ToNSString( | 384 [title_ setString:base::SysUTF16ToNSString([self |
| 384 [self wrapText:notification_->title() | 385 wrapText:notification_->title() |
| 385 forFont:[title_ font] | 386 forFont:[title_ font] |
| 386 maxNumberOfLines:message_center::kMaxTitleLines | 387 maxNumberOfLines:message_center::kMaxTitleLines |
| 387 actualLines:&actualTitleLines])]; | 388 actualLines:&actualTitleLines])]; |
|
Nico
2015/08/19 17:58:12
Huh, is this what clang-format does? The formattin
Miguel Garcia
2015/08/19 19:52:46
Acknowledged.
| |
| 388 [title_ sizeToFit]; | 389 [title_ sizeToFit]; |
| 389 NSRect titleFrame = [title_ frame]; | 390 NSRect titleFrame = [title_ frame]; |
| 390 titleFrame.origin.y = NSMaxY(rootFrame) - titlePadding - NSHeight(titleFrame); | 391 titleFrame.origin.y = NSMaxY(rootFrame) - titlePadding - NSHeight(titleFrame); |
| 391 | 392 |
| 392 // The number of message lines depends on the number of context message lines | 393 // The number of message lines depends on the number of context message lines |
| 393 // and the lines within the title, and whether an image exists. | 394 // and the lines within the title, and whether an image exists. |
| 394 int messageLineLimit = message_center::kMessageExpandedLineLimit; | 395 int messageLineLimit = message_center::kMessageExpandedLineLimit; |
| 395 if (actualTitleLines > 1) | 396 if (actualTitleLines > 1) |
| 396 messageLineLimit -= (actualTitleLines - 1) * 2; | 397 messageLineLimit -= (actualTitleLines - 1) * 2; |
| 397 if (!notification_->image().IsEmpty()) { | 398 if (!notification_->image().IsEmpty()) { |
| 398 messageLineLimit /= 2; | 399 messageLineLimit /= 2; |
| 399 if (!notification_->context_message().empty()) | 400 |
| 401 if (!notification_->context_message().empty() && | |
| 402 ![self useOriginAsContextMessage:notification]) | |
| 400 messageLineLimit -= message_center::kContextMessageLineLimit; | 403 messageLineLimit -= message_center::kContextMessageLineLimit; |
| 401 } | 404 } |
| 402 if (messageLineLimit < 0) | 405 if (messageLineLimit < 0) |
| 403 messageLineLimit = 0; | 406 messageLineLimit = 0; |
| 404 | 407 |
| 405 // Set the message and recalculate the frame. | 408 // Set the message and recalculate the frame. |
| 406 [message_ setString:base::SysUTF16ToNSString( | 409 [message_ setString:base::SysUTF16ToNSString( |
| 407 [self wrapText:notification_->message() | 410 [self wrapText:notification_->message() |
| 408 forFont:[message_ font] | 411 forFont:[message_ font] |
| 409 maxNumberOfLines:messageLineLimit])]; | 412 maxNumberOfLines:messageLineLimit])]; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 421 messageFrame.origin.y = titleFrame.origin.y; | 424 messageFrame.origin.y = titleFrame.origin.y; |
| 422 messageFrame.size.height = 0; | 425 messageFrame.size.height = 0; |
| 423 } else { | 426 } else { |
| 424 [message_ setHidden:NO]; | 427 [message_ setHidden:NO]; |
| 425 messageFrame.origin.y = | 428 messageFrame.origin.y = |
| 426 NSMinY(titleFrame) - messagePadding - NSHeight(messageFrame); | 429 NSMinY(titleFrame) - messagePadding - NSHeight(messageFrame); |
| 427 messageFrame.size.height = NSHeight([message_ frame]); | 430 messageFrame.size.height = NSHeight([message_ frame]); |
| 428 } | 431 } |
| 429 | 432 |
| 430 // Set the context message and recalculate the frame. | 433 // Set the context message and recalculate the frame. |
| 431 [contextMessage_ setString:base::SysUTF16ToNSString( | 434 base::string16 message; |
| 432 [self wrapText:notification_->context_message() | 435 if ([self useOriginAsContextMessage:notification]) { |
| 433 forFont:[contextMessage_ font] | 436 gfx::FontList font_list((gfx::Font([message_ font]))); |
| 434 maxNumberOfLines:message_center::kContextMessageLineLimit])]; | 437 message = |
| 438 url_formatter::ElideHost(notification->origin_url(), font_list, | |
| 439 message_center::kContextMessageViewWidth); | |
| 440 } else { | |
| 441 message = notification_->context_message(); | |
| 442 } | |
| 443 | |
| 444 [contextMessage_ | |
| 445 setString: | |
| 446 base::SysUTF16ToNSString([self | |
| 447 wrapText:message | |
| 448 forFont:[contextMessage_ font] | |
| 449 maxNumberOfLines:message_center::kContextMessageLineLimit])]; | |
|
Nico
2015/08/19 17:58:11
This might look a bit less awkward with a temp var
Miguel Garcia
2015/08/19 19:52:46
Done.
| |
| 435 [contextMessage_ sizeToFit]; | 450 [contextMessage_ sizeToFit]; |
| 436 NSRect contextMessageFrame = [contextMessage_ frame]; | 451 NSRect contextMessageFrame = [contextMessage_ frame]; |
| 437 | 452 |
| 438 if (notification_->context_message().empty()) { | 453 if (notification_->context_message().empty() && |
| 454 ![self useOriginAsContextMessage:notification]) { | |
| 439 [contextMessage_ setHidden:YES]; | 455 [contextMessage_ setHidden:YES]; |
| 440 contextMessageFrame.origin.y = messageFrame.origin.y; | 456 contextMessageFrame.origin.y = messageFrame.origin.y; |
| 441 contextMessageFrame.size.height = 0; | 457 contextMessageFrame.size.height = 0; |
| 442 } else { | 458 } else { |
| 443 [contextMessage_ setHidden:NO]; | 459 [contextMessage_ setHidden:NO]; |
| 444 contextMessageFrame.origin.y = | 460 contextMessageFrame.origin.y = |
| 445 NSMinY(messageFrame) - | 461 NSMinY(messageFrame) - |
| 446 contextMessagePadding - | 462 contextMessagePadding - |
| 447 NSHeight(contextMessageFrame); | 463 NSHeight(contextMessageFrame); |
| 448 contextMessageFrame.size.height = NSHeight([contextMessage_ frame]); | 464 contextMessageFrame.size.height = NSHeight([contextMessage_ frame]); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 635 [[self view] setFrame:rootFrame]; | 651 [[self view] setFrame:rootFrame]; |
| 636 [title_ setFrame:titleFrame]; | 652 [title_ setFrame:titleFrame]; |
| 637 [message_ setFrame:messageFrame]; | 653 [message_ setFrame:messageFrame]; |
| 638 [contextMessage_ setFrame:contextMessageFrame]; | 654 [contextMessage_ setFrame:contextMessageFrame]; |
| 639 [listView_ setFrame:listFrame]; | 655 [listView_ setFrame:listFrame]; |
| 640 [progressBarView_ setFrame:progressBarFrame]; | 656 [progressBarView_ setFrame:progressBarFrame]; |
| 641 | 657 |
| 642 return rootFrame; | 658 return rootFrame; |
| 643 } | 659 } |
| 644 | 660 |
| 661 - (bool)useOriginAsContextMessage: | |
| 662 (const message_center::Notification*)notification { | |
| 663 return (notification->context_message().empty() && | |
| 664 notification->origin_url().is_valid() && | |
| 665 notification->origin_url().SchemeIsHTTPOrHTTPS()); | |
|
Nico
2015/08/19 17:58:12
This kind of looks like model code; why isn't this
Jun Mukai
2015/08/19 18:06:02
+1 (to be clear, I objected the idea to introduce
Miguel Garcia
2015/08/19 19:52:46
Done
On 2015/08/19 18:06:02, Jun Mukai wrote:
| |
| 666 } | |
| 667 | |
| 645 - (void)close:(id)sender { | 668 - (void)close:(id)sender { |
| 646 [closeButton_ setTarget:nil]; | 669 [closeButton_ setTarget:nil]; |
| 647 messageCenter_->RemoveNotification([self notificationID], /*by_user=*/true); | 670 messageCenter_->RemoveNotification([self notificationID], /*by_user=*/true); |
| 648 } | 671 } |
| 649 | 672 |
| 650 - (void)buttonClicked:(id)button { | 673 - (void)buttonClicked:(id)button { |
| 651 messageCenter_->ClickOnNotificationButton([self notificationID], | 674 messageCenter_->ClickOnNotificationButton([self notificationID], |
| 652 [button tag]); | 675 [button tag]); |
| 653 } | 676 } |
| 654 | 677 |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 891 forFont:(NSFont*)nsfont | 914 forFont:(NSFont*)nsfont |
| 892 maxNumberOfLines:(size_t)lines { | 915 maxNumberOfLines:(size_t)lines { |
| 893 size_t unused; | 916 size_t unused; |
| 894 return [self wrapText:text | 917 return [self wrapText:text |
| 895 forFont:nsfont | 918 forFont:nsfont |
| 896 maxNumberOfLines:lines | 919 maxNumberOfLines:lines |
| 897 actualLines:&unused]; | 920 actualLines:&unused]; |
| 898 } | 921 } |
| 899 | 922 |
| 900 @end | 923 @end |
| OLD | NEW |