| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008, 2010, 2011, 2012 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008, 2010, 2011, 2012 Apple Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #import "config.h" | 26 #import "config.h" |
| 27 #import "ThemeMac.h" | 27 #import "ThemeMac.h" |
| 28 | 28 |
| 29 #import <Carbon/Carbon.h> | 29 #import <Carbon/Carbon.h> |
| 30 #import "BlockExceptions.h" | 30 #import "BlockExceptions.h" |
| 31 #import "LocalCurrentGraphicsContext.h" | 31 #import "LocalCurrentGraphicsContext.h" |
| 32 #import "WebCoreNSCellExtras.h" | 32 #import "WebCoreNSCellExtras.h" |
| 33 #import "WebCoreSystemInterface.h" | |
| 34 #import "core/platform/ScrollView.h" | 33 #import "core/platform/ScrollView.h" |
| 35 #import "core/platform/graphics/GraphicsContext.h" | 34 #import "core/platform/graphics/GraphicsContext.h" |
| 36 #include <wtf/StdLibExtras.h> | 35 #include <wtf/StdLibExtras.h> |
| 37 | 36 |
| 38 using namespace std; | 37 using namespace std; |
| 39 | 38 |
| 40 NSRect focusRingClipRect; | 39 NSRect focusRingClipRect; |
| 41 | 40 |
| 42 // This is a view whose sole purpose is to tell AppKit that it's flipped. | 41 // This is a view whose sole purpose is to tell AppKit that it's flipped. |
| 43 @interface WebCoreFlippedView : NSControl | 42 @interface WebCoreFlippedView : NSControl |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 - (NSString*)webCoreFamilyName | 82 - (NSString*)webCoreFamilyName |
| 84 { | 83 { |
| 85 if ([[self familyName] hasPrefix:@"."]) | 84 if ([[self familyName] hasPrefix:@"."]) |
| 86 return [self fontName]; | 85 return [self fontName]; |
| 87 | 86 |
| 88 return [self familyName]; | 87 return [self familyName]; |
| 89 } | 88 } |
| 90 | 89 |
| 91 @end | 90 @end |
| 92 | 91 |
| 93 // FIXME: Default buttons really should be more like push buttons and not like b
uttons. | |
| 94 | |
| 95 namespace WebCore { | 92 namespace WebCore { |
| 96 | 93 |
| 97 enum { | 94 enum { |
| 98 topMargin, | 95 topMargin, |
| 99 rightMargin, | 96 rightMargin, |
| 100 bottomMargin, | 97 bottomMargin, |
| 101 leftMargin | 98 leftMargin |
| 102 }; | 99 }; |
| 103 | 100 |
| 104 Theme* platformTheme() | 101 Theme* platformTheme() |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 { | 399 { |
| 403 static const int margins[3][4] = | 400 static const int margins[3][4] = |
| 404 { | 401 { |
| 405 { 4, 6, 7, 6 }, | 402 { 4, 6, 7, 6 }, |
| 406 { 4, 5, 6, 5 }, | 403 { 4, 5, 6, 5 }, |
| 407 { 0, 1, 1, 1 }, | 404 { 0, 1, 1, 1 }, |
| 408 }; | 405 }; |
| 409 return margins[controlSize]; | 406 return margins[controlSize]; |
| 410 } | 407 } |
| 411 | 408 |
| 412 enum ButtonCellType { NormalButtonCell, DefaultButtonCell }; | |
| 413 | |
| 414 static NSButtonCell *leakButtonCell(ButtonCellType type) | |
| 415 { | |
| 416 NSButtonCell *cell = [[NSButtonCell alloc] init]; | |
| 417 [cell setTitle:nil]; | |
| 418 [cell setButtonType:NSMomentaryPushInButton]; | |
| 419 if (type == DefaultButtonCell) | |
| 420 [cell setKeyEquivalent:@"\r"]; | |
| 421 return cell; | |
| 422 } | |
| 423 | |
| 424 static void setUpButtonCell(NSButtonCell *cell, ControlPart part, ControlStates
states, const IntRect& zoomedRect, float zoomFactor) | 409 static void setUpButtonCell(NSButtonCell *cell, ControlPart part, ControlStates
states, const IntRect& zoomedRect, float zoomFactor) |
| 425 { | 410 { |
| 426 // Set the control size based off the rectangle we're painting into. | 411 // Set the control size based off the rectangle we're painting into. |
| 427 const IntSize* sizes = buttonSizes(); | 412 const IntSize* sizes = buttonSizes(); |
| 428 if (part == SquareButtonPart || zoomedRect.height() > buttonSizes()[NSRegula
rControlSize].height() * zoomFactor) { | 413 if (part == SquareButtonPart || zoomedRect.height() > buttonSizes()[NSRegula
rControlSize].height() * zoomFactor) { |
| 429 // Use the square button | 414 // Use the square button |
| 430 if ([cell bezelStyle] != NSShadowlessSquareBezelStyle) | 415 if ([cell bezelStyle] != NSShadowlessSquareBezelStyle) |
| 431 [cell setBezelStyle:NSShadowlessSquareBezelStyle]; | 416 [cell setBezelStyle:NSShadowlessSquareBezelStyle]; |
| 432 } else if ([cell bezelStyle] != NSRoundedBezelStyle) | 417 } else if ([cell bezelStyle] != NSRoundedBezelStyle) |
| 433 [cell setBezelStyle:NSRoundedBezelStyle]; | 418 [cell setBezelStyle:NSRoundedBezelStyle]; |
| 434 | 419 |
| 435 setControlSize(cell, sizes, zoomedRect.size(), zoomFactor); | 420 setControlSize(cell, sizes, zoomedRect.size(), zoomFactor); |
| 436 | 421 |
| 437 // Update the various states we respond to. | 422 // Update the various states we respond to. |
| 438 updateStates(cell, states); | 423 updateStates(cell, states); |
| 439 } | 424 } |
| 440 | 425 |
| 441 static NSButtonCell *button(ControlPart part, ControlStates states, const IntRec
t& zoomedRect, float zoomFactor) | 426 static NSButtonCell *button(ControlPart part, ControlStates states, const IntRec
t& zoomedRect, float zoomFactor) |
| 442 { | 427 { |
| 443 NSButtonCell *cell; | 428 static NSButtonCell *cell = nil; |
| 444 if (states & DefaultState) { | 429 if (!cell) { |
| 445 static NSButtonCell *defaultCell = leakButtonCell(DefaultButtonCell); | 430 cell = [[NSButtonCell alloc] init]; |
| 446 cell = defaultCell; | 431 [cell setTitle:nil]; |
| 447 } else { | 432 [cell setButtonType:NSMomentaryPushInButton]; |
| 448 static NSButtonCell *normalCell = leakButtonCell(NormalButtonCell); | |
| 449 cell = normalCell; | |
| 450 } | 433 } |
| 451 setUpButtonCell(cell, part, states, zoomedRect, zoomFactor); | 434 setUpButtonCell(cell, part, states, zoomedRect, zoomFactor); |
| 452 return cell; | 435 return cell; |
| 453 } | 436 } |
| 454 | 437 |
| 455 static void paintButton(ControlPart part, ControlStates states, GraphicsContext*
context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) | 438 static void paintButton(ControlPart part, ControlStates states, GraphicsContext*
context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) |
| 456 { | 439 { |
| 457 BEGIN_BLOCK_OBJC_EXCEPTIONS | 440 BEGIN_BLOCK_OBJC_EXCEPTIONS |
| 458 | 441 |
| 459 // Determine the width and height needed for the control and prepare the cel
l for painting. | 442 // Determine the width and height needed for the control and prepare the cel
l for painting. |
| 460 NSButtonCell *buttonCell = button(part, states, zoomedRect, zoomFactor); | 443 NSButtonCell *buttonCell = button(part, states, zoomedRect, zoomFactor); |
| 461 GraphicsContextStateSaver stateSaver(*context); | 444 GraphicsContextStateSaver stateSaver(*context); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 480 inflatedRect.setHeight(inflatedRect.height() / zoomFactor); | 463 inflatedRect.setHeight(inflatedRect.height() / zoomFactor); |
| 481 context->translate(inflatedRect.x(), inflatedRect.y()); | 464 context->translate(inflatedRect.x(), inflatedRect.y()); |
| 482 context->scale(FloatSize(zoomFactor, zoomFactor)); | 465 context->scale(FloatSize(zoomFactor, zoomFactor)); |
| 483 context->translate(-inflatedRect.x(), -inflatedRect.y()); | 466 context->translate(-inflatedRect.x(), -inflatedRect.y()); |
| 484 } | 467 } |
| 485 } | 468 } |
| 486 | 469 |
| 487 LocalCurrentGraphicsContext localContext(context); | 470 LocalCurrentGraphicsContext localContext(context); |
| 488 NSView *view = ThemeMac::ensuredView(scrollView); | 471 NSView *view = ThemeMac::ensuredView(scrollView); |
| 489 NSWindow *window = [view window]; | 472 NSWindow *window = [view window]; |
| 490 NSButtonCell *previousDefaultButtonCell = [window defaultButtonCell]; | |
| 491 | |
| 492 if (states & DefaultState) { | |
| 493 [window setDefaultButtonCell:buttonCell]; | |
| 494 WKAdvanceDefaultButtonPulseAnimation(buttonCell); | |
| 495 } else if ([previousDefaultButtonCell isEqual:buttonCell]) | |
| 496 [window setDefaultButtonCell:nil]; | |
| 497 | 473 |
| 498 [buttonCell drawWithFrame:NSRect(inflatedRect) inView:view]; | 474 [buttonCell drawWithFrame:NSRect(inflatedRect) inView:view]; |
| 499 #if !BUTTON_CELL_DRAW_WITH_FRAME_DRAWS_FOCUS_RING | 475 #if !BUTTON_CELL_DRAW_WITH_FRAME_DRAWS_FOCUS_RING |
| 500 if (states & FocusState) | 476 if (states & FocusState) |
| 501 [buttonCell _web_drawFocusRingWithFrame:NSRect(inflatedRect) inView:view
]; | 477 [buttonCell _web_drawFocusRingWithFrame:NSRect(inflatedRect) inView:view
]; |
| 502 #endif | 478 #endif |
| 503 [buttonCell setControlView:nil]; | 479 [buttonCell setControlView:nil]; |
| 504 | 480 |
| 505 if (![previousDefaultButtonCell isEqual:buttonCell]) | |
| 506 [window setDefaultButtonCell:previousDefaultButtonCell]; | |
| 507 | |
| 508 END_BLOCK_OBJC_EXCEPTIONS | 481 END_BLOCK_OBJC_EXCEPTIONS |
| 509 } | 482 } |
| 510 | 483 |
| 511 // Stepper | 484 // Stepper |
| 512 | 485 |
| 513 static const IntSize* stepperSizes() | 486 static const IntSize* stepperSizes() |
| 514 { | 487 { |
| 515 static const IntSize sizes[3] = { IntSize(19, 27), IntSize(15, 22), IntSize(
13, 15) }; | 488 static const IntSize sizes[3] = { IntSize(19, 27), IntSize(15, 22), IntSize(
13, 15) }; |
| 516 return sizes; | 489 return sizes; |
| 517 } | 490 } |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 return sizeFromNSControlSize(stepperControlSizeForFont(font), zoomed
Size, zoomFactor, stepperSizes()); | 602 return sizeFromNSControlSize(stepperControlSizeForFont(font), zoomed
Size, zoomFactor, stepperSizes()); |
| 630 default: | 603 default: |
| 631 return zoomedSize; | 604 return zoomedSize; |
| 632 } | 605 } |
| 633 } | 606 } |
| 634 | 607 |
| 635 LengthSize ThemeMac::minimumControlSize(ControlPart part, const Font& font, floa
t zoomFactor) const | 608 LengthSize ThemeMac::minimumControlSize(ControlPart part, const Font& font, floa
t zoomFactor) const |
| 636 { | 609 { |
| 637 switch (part) { | 610 switch (part) { |
| 638 case SquareButtonPart: | 611 case SquareButtonPart: |
| 639 case DefaultButtonPart: | |
| 640 case ButtonPart: | 612 case ButtonPart: |
| 641 return LengthSize(Length(0, Fixed), Length(static_cast<int>(15 * zoo
mFactor), Fixed)); | 613 return LengthSize(Length(0, Fixed), Length(static_cast<int>(15 * zoo
mFactor), Fixed)); |
| 642 case InnerSpinButtonPart:{ | 614 case InnerSpinButtonPart:{ |
| 643 IntSize base = stepperSizes()[NSMiniControlSize]; | 615 IntSize base = stepperSizes()[NSMiniControlSize]; |
| 644 return LengthSize(Length(static_cast<int>(base.width() * zoomFactor)
, Fixed), | 616 return LengthSize(Length(static_cast<int>(base.width() * zoomFactor)
, Fixed), |
| 645 Length(static_cast<int>(base.height() * zoomFactor
), Fixed)); | 617 Length(static_cast<int>(base.height() * zoomFactor
), Fixed)); |
| 646 } | 618 } |
| 647 default: | 619 default: |
| 648 return Theme::minimumControlSize(part, font, zoomFactor); | 620 return Theme::minimumControlSize(part, font, zoomFactor); |
| 649 } | 621 } |
| 650 } | 622 } |
| 651 | 623 |
| 652 LengthBox ThemeMac::controlBorder(ControlPart part, const Font& font, const Leng
thBox& zoomedBox, float zoomFactor) const | 624 LengthBox ThemeMac::controlBorder(ControlPart part, const Font& font, const Leng
thBox& zoomedBox, float zoomFactor) const |
| 653 { | 625 { |
| 654 switch (part) { | 626 switch (part) { |
| 655 case SquareButtonPart: | 627 case SquareButtonPart: |
| 656 case DefaultButtonPart: | |
| 657 case ButtonPart: | 628 case ButtonPart: |
| 658 return LengthBox(0, zoomedBox.right().value(), 0, zoomedBox.left().v
alue()); | 629 return LengthBox(0, zoomedBox.right().value(), 0, zoomedBox.left().v
alue()); |
| 659 default: | 630 default: |
| 660 return Theme::controlBorder(part, font, zoomedBox, zoomFactor); | 631 return Theme::controlBorder(part, font, zoomedBox, zoomFactor); |
| 661 } | 632 } |
| 662 } | 633 } |
| 663 | 634 |
| 664 LengthBox ThemeMac::controlPadding(ControlPart part, const Font& font, const Len
gthBox& zoomedBox, float zoomFactor) const | 635 LengthBox ThemeMac::controlPadding(ControlPart part, const Font& font, const Len
gthBox& zoomedBox, float zoomFactor) const |
| 665 { | 636 { |
| 666 switch (part) { | 637 switch (part) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 // shadow". We don't consider this part of the bounds of the contro
l in WebKit. | 669 // shadow". We don't consider this part of the bounds of the contro
l in WebKit. |
| 699 NSCell *cell = radio(states, zoomedRect, zoomFactor); | 670 NSCell *cell = radio(states, zoomedRect, zoomFactor); |
| 700 NSControlSize controlSize = [cell controlSize]; | 671 NSControlSize controlSize = [cell controlSize]; |
| 701 IntSize zoomedSize = radioSizes()[controlSize]; | 672 IntSize zoomedSize = radioSizes()[controlSize]; |
| 702 zoomedSize.setHeight(zoomedSize.height() * zoomFactor); | 673 zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
| 703 zoomedSize.setWidth(zoomedSize.width() * zoomFactor); | 674 zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
| 704 zoomedRect = inflateRect(zoomedRect, zoomedSize, radioMargins(contro
lSize), zoomFactor); | 675 zoomedRect = inflateRect(zoomedRect, zoomedSize, radioMargins(contro
lSize), zoomFactor); |
| 705 break; | 676 break; |
| 706 } | 677 } |
| 707 case PushButtonPart: | 678 case PushButtonPart: |
| 708 case DefaultButtonPart: | |
| 709 case ButtonPart: { | 679 case ButtonPart: { |
| 710 NSButtonCell *cell = button(part, states, zoomedRect, zoomFactor); | 680 NSButtonCell *cell = button(part, states, zoomedRect, zoomFactor); |
| 711 NSControlSize controlSize = [cell controlSize]; | 681 NSControlSize controlSize = [cell controlSize]; |
| 712 | 682 |
| 713 // We inflate the rect as needed to account for the Aqua button's sh
adow. | 683 // We inflate the rect as needed to account for the Aqua button's sh
adow. |
| 714 if ([cell bezelStyle] == NSRoundedBezelStyle) { | 684 if ([cell bezelStyle] == NSRoundedBezelStyle) { |
| 715 IntSize zoomedSize = buttonSizes()[controlSize]; | 685 IntSize zoomedSize = buttonSizes()[controlSize]; |
| 716 zoomedSize.setHeight(zoomedSize.height() * zoomFactor); | 686 zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
| 717 zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever c
onstrain width, so the zoomed width can just be honored. | 687 zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever c
onstrain width, so the zoomed width can just be honored. |
| 718 zoomedRect = inflateRect(zoomedRect, zoomedSize, buttonMargins(c
ontrolSize), zoomFactor); | 688 zoomedRect = inflateRect(zoomedRect, zoomedSize, buttonMargins(c
ontrolSize), zoomFactor); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 737 void ThemeMac::paint(ControlPart part, ControlStates states, GraphicsContext* co
ntext, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) cons
t | 707 void ThemeMac::paint(ControlPart part, ControlStates states, GraphicsContext* co
ntext, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) cons
t |
| 738 { | 708 { |
| 739 switch (part) { | 709 switch (part) { |
| 740 case CheckboxPart: | 710 case CheckboxPart: |
| 741 paintCheckbox(states, context, zoomedRect, zoomFactor, scrollView); | 711 paintCheckbox(states, context, zoomedRect, zoomFactor, scrollView); |
| 742 break; | 712 break; |
| 743 case RadioPart: | 713 case RadioPart: |
| 744 paintRadio(states, context, zoomedRect, zoomFactor, scrollView); | 714 paintRadio(states, context, zoomedRect, zoomFactor, scrollView); |
| 745 break; | 715 break; |
| 746 case PushButtonPart: | 716 case PushButtonPart: |
| 747 case DefaultButtonPart: | |
| 748 case ButtonPart: | 717 case ButtonPart: |
| 749 case SquareButtonPart: | 718 case SquareButtonPart: |
| 750 paintButton(part, states, context, zoomedRect, zoomFactor, scrollVie
w); | 719 paintButton(part, states, context, zoomedRect, zoomFactor, scrollVie
w); |
| 751 break; | 720 break; |
| 752 case InnerSpinButtonPart: | 721 case InnerSpinButtonPart: |
| 753 paintStepper(states, context, zoomedRect, zoomFactor, scrollView); | 722 paintStepper(states, context, zoomedRect, zoomFactor, scrollView); |
| 754 break; | 723 break; |
| 755 default: | 724 default: |
| 756 break; | 725 break; |
| 757 } | 726 } |
| 758 } | 727 } |
| 759 | 728 |
| 760 } | 729 } |
| OLD | NEW |