Index: Source/core/platform/mac/ThemeMac.mm |
diff --git a/Source/core/platform/mac/ThemeMac.mm b/Source/core/platform/mac/ThemeMac.mm |
deleted file mode 100644 |
index e24ee65a2ae6e35c9779584d588434de7877dde6..0000000000000000000000000000000000000000 |
--- a/Source/core/platform/mac/ThemeMac.mm |
+++ /dev/null |
@@ -1,728 +0,0 @@ |
-/* |
- * Copyright (C) 2008, 2010, 2011, 2012 Apple Inc. All Rights Reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#import "config.h" |
-#import "core/platform/mac/ThemeMac.h" |
- |
-#import <Carbon/Carbon.h> |
-#import "platform/graphics/GraphicsContextStateSaver.h" |
-#import "platform/mac/BlockExceptions.h" |
-#import "platform/mac/LocalCurrentGraphicsContext.h" |
-#import "platform/mac/WebCoreNSCellExtras.h" |
-#import "platform/scroll/ScrollView.h" |
-#include "wtf/StdLibExtras.h" |
- |
-using namespace std; |
- |
-NSRect focusRingClipRect; |
- |
-// This is a view whose sole purpose is to tell AppKit that it's flipped. |
-@interface WebCoreFlippedView : NSControl |
-@end |
- |
-@implementation WebCoreFlippedView |
- |
-- (BOOL)isFlipped |
-{ |
- return YES; |
-} |
- |
-- (NSText *)currentEditor |
-{ |
- return nil; |
-} |
- |
-- (BOOL)_automaticFocusRingDisabled |
-{ |
- return YES; |
-} |
- |
-- (NSRect)_focusRingVisibleRect |
-{ |
- if (NSIsEmptyRect(focusRingClipRect)) |
- return [self visibleRect]; |
- |
- NSRect rect = focusRingClipRect; |
- rect.origin.y = [self bounds].size.height - NSMaxY(rect); |
- |
- return rect; |
-} |
- |
-- (NSView *)_focusRingClipAncestor |
-{ |
- return self; |
-} |
- |
-@end |
- |
-@implementation NSFont (WebCoreTheme) |
- |
-- (NSString*)webCoreFamilyName |
-{ |
- if ([[self familyName] hasPrefix:@"."]) |
- return [self fontName]; |
- |
- return [self familyName]; |
-} |
- |
-@end |
- |
-namespace WebCore { |
- |
-enum { |
- topMargin, |
- rightMargin, |
- bottomMargin, |
- leftMargin |
-}; |
- |
-Theme* platformTheme() |
-{ |
- DEFINE_STATIC_LOCAL(ThemeMac, themeMac, ()); |
- return &themeMac; |
-} |
- |
-// Helper functions used by a bunch of different control parts. |
- |
-static NSControlSize controlSizeForFont(const FontDescription& fontDescription) |
-{ |
- int fontSize = fontDescription.computedPixelSize(); |
- if (fontSize >= 16) |
- return NSRegularControlSize; |
- if (fontSize >= 11) |
- return NSSmallControlSize; |
- return NSMiniControlSize; |
-} |
- |
-static LengthSize sizeFromNSControlSize(NSControlSize nsControlSize, const LengthSize& zoomedSize, float zoomFactor, const IntSize* sizes) |
-{ |
- IntSize controlSize = sizes[nsControlSize]; |
- if (zoomFactor != 1.0f) |
- controlSize = IntSize(controlSize.width() * zoomFactor, controlSize.height() * zoomFactor); |
- LengthSize result = zoomedSize; |
- if (zoomedSize.width().isIntrinsicOrAuto() && controlSize.width() > 0) |
- result.setWidth(Length(controlSize.width(), Fixed)); |
- if (zoomedSize.height().isIntrinsicOrAuto() && controlSize.height() > 0) |
- result.setHeight(Length(controlSize.height(), Fixed)); |
- return result; |
-} |
- |
-static LengthSize sizeFromFont(const FontDescription& fontDescription, const LengthSize& zoomedSize, float zoomFactor, const IntSize* sizes) |
-{ |
- return sizeFromNSControlSize(controlSizeForFont(fontDescription), zoomedSize, zoomFactor, sizes); |
-} |
- |
-static ControlSize controlSizeFromPixelSize(const IntSize* sizes, const IntSize& minZoomedSize, float zoomFactor) |
-{ |
- if (minZoomedSize.width() >= static_cast<int>(sizes[NSRegularControlSize].width() * zoomFactor) && |
- minZoomedSize.height() >= static_cast<int>(sizes[NSRegularControlSize].height() * zoomFactor)) |
- return NSRegularControlSize; |
- if (minZoomedSize.width() >= static_cast<int>(sizes[NSSmallControlSize].width() * zoomFactor) && |
- minZoomedSize.height() >= static_cast<int>(sizes[NSSmallControlSize].height() * zoomFactor)) |
- return NSSmallControlSize; |
- return NSMiniControlSize; |
-} |
- |
-static void setControlSize(NSCell* cell, const IntSize* sizes, const IntSize& minZoomedSize, float zoomFactor) |
-{ |
- ControlSize size = controlSizeFromPixelSize(sizes, minZoomedSize, zoomFactor); |
- if (size != [cell controlSize]) // Only update if we have to, since AppKit does work even if the size is the same. |
- [cell setControlSize:(NSControlSize)size]; |
-} |
- |
-static void updateStates(NSCell* cell, ControlStates states) |
-{ |
- // Hover state is not supported by Aqua. |
- |
- // Pressed state |
- bool oldPressed = [cell isHighlighted]; |
- bool pressed = states & PressedState; |
- if (pressed != oldPressed) |
- [cell setHighlighted:pressed]; |
- |
- // Enabled state |
- bool oldEnabled = [cell isEnabled]; |
- bool enabled = states & EnabledState; |
- if (enabled != oldEnabled) |
- [cell setEnabled:enabled]; |
- |
-#if BUTTON_CELL_DRAW_WITH_FRAME_DRAWS_FOCUS_RING |
- // Focused state |
- bool oldFocused = [cell showsFirstResponder]; |
- bool focused = states & FocusState; |
- if (focused != oldFocused) |
- [cell setShowsFirstResponder:focused]; |
-#endif |
- |
- // Checked and Indeterminate |
- bool oldIndeterminate = [cell state] == NSMixedState; |
- bool indeterminate = (states & IndeterminateState); |
- bool checked = states & CheckedState; |
- bool oldChecked = [cell state] == NSOnState; |
- if (oldIndeterminate != indeterminate || checked != oldChecked) |
- [cell setState:indeterminate ? NSMixedState : (checked ? NSOnState : NSOffState)]; |
- |
- // Window inactive state does not need to be checked explicitly, since we paint parented to |
- // a view in a window whose key state can be detected. |
-} |
- |
-static ThemeDrawState convertControlStatesToThemeDrawState(ThemeButtonKind kind, ControlStates states) |
-{ |
- if (states & ReadOnlyState) |
- return kThemeStateUnavailableInactive; |
- if (!(states & EnabledState)) |
- return kThemeStateUnavailableInactive; |
- |
- // Do not process PressedState if !EnabledState or ReadOnlyState. |
- if (states & PressedState) { |
- if (kind == kThemeIncDecButton || kind == kThemeIncDecButtonSmall || kind == kThemeIncDecButtonMini) |
- return states & SpinUpState ? kThemeStatePressedUp : kThemeStatePressedDown; |
- return kThemeStatePressed; |
- } |
- return kThemeStateActive; |
-} |
- |
-static IntRect inflateRect(const IntRect& zoomedRect, const IntSize& zoomedSize, const int* margins, float zoomFactor) |
-{ |
- // Only do the inflation if the available width/height are too small. Otherwise try to |
- // fit the glow/check space into the available box's width/height. |
- int widthDelta = zoomedRect.width() - (zoomedSize.width() + margins[leftMargin] * zoomFactor + margins[rightMargin] * zoomFactor); |
- int heightDelta = zoomedRect.height() - (zoomedSize.height() + margins[topMargin] * zoomFactor + margins[bottomMargin] * zoomFactor); |
- IntRect result(zoomedRect); |
- if (widthDelta < 0) { |
- result.setX(result.x() - margins[leftMargin] * zoomFactor); |
- result.setWidth(result.width() - widthDelta); |
- } |
- if (heightDelta < 0) { |
- result.setY(result.y() - margins[topMargin] * zoomFactor); |
- result.setHeight(result.height() - heightDelta); |
- } |
- return result; |
-} |
- |
-// Checkboxes |
- |
-static const IntSize* checkboxSizes() |
-{ |
- static const IntSize sizes[3] = { IntSize(14, 14), IntSize(12, 12), IntSize(10, 10) }; |
- return sizes; |
-} |
- |
-static const int* checkboxMargins(NSControlSize controlSize) |
-{ |
- static const int margins[3][4] = |
- { |
- { 3, 4, 4, 2 }, |
- { 4, 3, 3, 3 }, |
- { 4, 3, 3, 3 }, |
- }; |
- return margins[controlSize]; |
-} |
- |
-static LengthSize checkboxSize(const FontDescription& fontDescription, const LengthSize& zoomedSize, float zoomFactor) |
-{ |
- // If the width and height are both specified, then we have nothing to do. |
- if (!zoomedSize.width().isIntrinsicOrAuto() && !zoomedSize.height().isIntrinsicOrAuto()) |
- return zoomedSize; |
- |
- // Use the font size to determine the intrinsic width of the control. |
- return sizeFromFont(fontDescription, zoomedSize, zoomFactor, checkboxSizes()); |
-} |
- |
-static NSButtonCell *checkbox(ControlStates states, const IntRect& zoomedRect, float zoomFactor) |
-{ |
- static NSButtonCell *checkboxCell; |
- if (!checkboxCell) { |
- checkboxCell = [[NSButtonCell alloc] init]; |
- [checkboxCell setButtonType:NSSwitchButton]; |
- [checkboxCell setTitle:nil]; |
- [checkboxCell setAllowsMixedState:YES]; |
- [checkboxCell setFocusRingType:NSFocusRingTypeExterior]; |
- } |
- |
- // Set the control size based off the rectangle we're painting into. |
- setControlSize(checkboxCell, checkboxSizes(), zoomedRect.size(), zoomFactor); |
- |
- // Update the various states we respond to. |
- updateStates(checkboxCell, states); |
- |
- return checkboxCell; |
-} |
- |
-// FIXME: Share more code with radio buttons. |
-static void paintCheckbox(ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) |
-{ |
- BEGIN_BLOCK_OBJC_EXCEPTIONS |
- |
- // Determine the width and height needed for the control and prepare the cell for painting. |
- NSButtonCell *checkboxCell = checkbox(states, zoomedRect, zoomFactor); |
- GraphicsContextStateSaver stateSaver(*context); |
- |
- NSControlSize controlSize = [checkboxCell controlSize]; |
- IntSize zoomedSize = checkboxSizes()[controlSize]; |
- zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
- zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
- IntRect inflatedRect = inflateRect(zoomedRect, zoomedSize, checkboxMargins(controlSize), zoomFactor); |
- |
- if (zoomFactor != 1.0f) { |
- inflatedRect.setWidth(inflatedRect.width() / zoomFactor); |
- inflatedRect.setHeight(inflatedRect.height() / zoomFactor); |
- context->translate(inflatedRect.x(), inflatedRect.y()); |
- context->scale(FloatSize(zoomFactor, zoomFactor)); |
- context->translate(-inflatedRect.x(), -inflatedRect.y()); |
- } |
- |
- LocalCurrentGraphicsContext localContext(context); |
- NSView *view = ThemeMac::ensuredView(scrollView); |
- [checkboxCell drawWithFrame:NSRect(inflatedRect) inView:view]; |
-#if !BUTTON_CELL_DRAW_WITH_FRAME_DRAWS_FOCUS_RING |
- if (states & FocusState) |
- [checkboxCell _web_drawFocusRingWithFrame:NSRect(inflatedRect) inView:view]; |
-#endif |
- [checkboxCell setControlView:nil]; |
- |
- END_BLOCK_OBJC_EXCEPTIONS |
-} |
- |
-// Radio Buttons |
- |
-static const IntSize* radioSizes() |
-{ |
- static const IntSize sizes[3] = { IntSize(14, 15), IntSize(12, 13), IntSize(10, 10) }; |
- return sizes; |
-} |
- |
-static const int* radioMargins(NSControlSize controlSize) |
-{ |
- static const int margins[3][4] = |
- { |
- { 2, 2, 4, 2 }, |
- { 3, 2, 3, 2 }, |
- { 1, 0, 2, 0 }, |
- }; |
- return margins[controlSize]; |
-} |
- |
-static LengthSize radioSize(const FontDescription& fontDescription, const LengthSize& zoomedSize, float zoomFactor) |
-{ |
- // If the width and height are both specified, then we have nothing to do. |
- if (!zoomedSize.width().isIntrinsicOrAuto() && !zoomedSize.height().isIntrinsicOrAuto()) |
- return zoomedSize; |
- |
- // Use the font size to determine the intrinsic width of the control. |
- return sizeFromFont(fontDescription, zoomedSize, zoomFactor, radioSizes()); |
-} |
- |
-static NSButtonCell *radio(ControlStates states, const IntRect& zoomedRect, float zoomFactor) |
-{ |
- static NSButtonCell *radioCell; |
- if (!radioCell) { |
- radioCell = [[NSButtonCell alloc] init]; |
- [radioCell setButtonType:NSRadioButton]; |
- [radioCell setTitle:nil]; |
- [radioCell setFocusRingType:NSFocusRingTypeExterior]; |
- } |
- |
- // Set the control size based off the rectangle we're painting into. |
- setControlSize(radioCell, radioSizes(), zoomedRect.size(), zoomFactor); |
- |
- // Update the various states we respond to. |
- updateStates(radioCell, states); |
- |
- return radioCell; |
-} |
- |
-static void paintRadio(ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) |
-{ |
- // Determine the width and height needed for the control and prepare the cell for painting. |
- NSButtonCell *radioCell = radio(states, zoomedRect, zoomFactor); |
- GraphicsContextStateSaver stateSaver(*context); |
- |
- NSControlSize controlSize = [radioCell controlSize]; |
- IntSize zoomedSize = radioSizes()[controlSize]; |
- zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
- zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
- IntRect inflatedRect = inflateRect(zoomedRect, zoomedSize, radioMargins(controlSize), zoomFactor); |
- |
- if (zoomFactor != 1.0f) { |
- inflatedRect.setWidth(inflatedRect.width() / zoomFactor); |
- inflatedRect.setHeight(inflatedRect.height() / zoomFactor); |
- context->translate(inflatedRect.x(), inflatedRect.y()); |
- context->scale(FloatSize(zoomFactor, zoomFactor)); |
- context->translate(-inflatedRect.x(), -inflatedRect.y()); |
- } |
- |
- LocalCurrentGraphicsContext localContext(context); |
- BEGIN_BLOCK_OBJC_EXCEPTIONS |
- NSView *view = ThemeMac::ensuredView(scrollView); |
- [radioCell drawWithFrame:NSRect(inflatedRect) inView:view]; |
-#if !BUTTON_CELL_DRAW_WITH_FRAME_DRAWS_FOCUS_RING |
- if (states & FocusState) |
- [radioCell _web_drawFocusRingWithFrame:NSRect(inflatedRect) inView:view]; |
-#endif |
- [radioCell setControlView:nil]; |
- END_BLOCK_OBJC_EXCEPTIONS |
-} |
- |
-// Buttons |
- |
-// Buttons really only constrain height. They respect width. |
-static const IntSize* buttonSizes() |
-{ |
- static const IntSize sizes[3] = { IntSize(0, 21), IntSize(0, 18), IntSize(0, 15) }; |
- return sizes; |
-} |
- |
-static const int* buttonMargins(NSControlSize controlSize) |
-{ |
- static const int margins[3][4] = |
- { |
- { 4, 6, 7, 6 }, |
- { 4, 5, 6, 5 }, |
- { 0, 1, 1, 1 }, |
- }; |
- return margins[controlSize]; |
-} |
- |
-static void setUpButtonCell(NSButtonCell *cell, ControlPart part, ControlStates states, const IntRect& zoomedRect, float zoomFactor) |
-{ |
- // Set the control size based off the rectangle we're painting into. |
- const IntSize* sizes = buttonSizes(); |
- if (part == SquareButtonPart || zoomedRect.height() > buttonSizes()[NSRegularControlSize].height() * zoomFactor) { |
- // Use the square button |
- if ([cell bezelStyle] != NSShadowlessSquareBezelStyle) |
- [cell setBezelStyle:NSShadowlessSquareBezelStyle]; |
- } else if ([cell bezelStyle] != NSRoundedBezelStyle) |
- [cell setBezelStyle:NSRoundedBezelStyle]; |
- |
- setControlSize(cell, sizes, zoomedRect.size(), zoomFactor); |
- |
- // Update the various states we respond to. |
- updateStates(cell, states); |
-} |
- |
-static NSButtonCell *button(ControlPart part, ControlStates states, const IntRect& zoomedRect, float zoomFactor) |
-{ |
- static NSButtonCell *cell = nil; |
- if (!cell) { |
- cell = [[NSButtonCell alloc] init]; |
- [cell setTitle:nil]; |
- [cell setButtonType:NSMomentaryPushInButton]; |
- } |
- setUpButtonCell(cell, part, states, zoomedRect, zoomFactor); |
- return cell; |
-} |
- |
-static void paintButton(ControlPart part, ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) |
-{ |
- BEGIN_BLOCK_OBJC_EXCEPTIONS |
- |
- // Determine the width and height needed for the control and prepare the cell for painting. |
- NSButtonCell *buttonCell = button(part, states, zoomedRect, zoomFactor); |
- GraphicsContextStateSaver stateSaver(*context); |
- |
- NSControlSize controlSize = [buttonCell controlSize]; |
- IntSize zoomedSize = buttonSizes()[controlSize]; |
- zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever constrain width, so the zoomed width can just be honored. |
- zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
- IntRect inflatedRect = zoomedRect; |
- if ([buttonCell bezelStyle] == NSRoundedBezelStyle) { |
- // Center the button within the available space. |
- if (inflatedRect.height() > zoomedSize.height()) { |
- inflatedRect.setY(inflatedRect.y() + (inflatedRect.height() - zoomedSize.height()) / 2); |
- inflatedRect.setHeight(zoomedSize.height()); |
- } |
- |
- // Now inflate it to account for the shadow. |
- inflatedRect = inflateRect(inflatedRect, zoomedSize, buttonMargins(controlSize), zoomFactor); |
- |
- if (zoomFactor != 1.0f) { |
- inflatedRect.setWidth(inflatedRect.width() / zoomFactor); |
- inflatedRect.setHeight(inflatedRect.height() / zoomFactor); |
- context->translate(inflatedRect.x(), inflatedRect.y()); |
- context->scale(FloatSize(zoomFactor, zoomFactor)); |
- context->translate(-inflatedRect.x(), -inflatedRect.y()); |
- } |
- } |
- |
- LocalCurrentGraphicsContext localContext(context); |
- NSView *view = ThemeMac::ensuredView(scrollView); |
- |
- [buttonCell drawWithFrame:NSRect(inflatedRect) inView:view]; |
-#if !BUTTON_CELL_DRAW_WITH_FRAME_DRAWS_FOCUS_RING |
- if (states & FocusState) |
- [buttonCell _web_drawFocusRingWithFrame:NSRect(inflatedRect) inView:view]; |
-#endif |
- [buttonCell setControlView:nil]; |
- |
- END_BLOCK_OBJC_EXCEPTIONS |
-} |
- |
-// Stepper |
- |
-static const IntSize* stepperSizes() |
-{ |
- static const IntSize sizes[3] = { IntSize(19, 27), IntSize(15, 22), IntSize(13, 15) }; |
- return sizes; |
-} |
- |
-// We don't use controlSizeForFont() for steppers because the stepper height |
-// should be equal to or less than the corresponding text field height, |
-static NSControlSize stepperControlSizeForFont(const FontDescription& fontDescription) |
-{ |
- int fontSize = fontDescription.computedPixelSize(); |
- if (fontSize >= 18) |
- return NSRegularControlSize; |
- if (fontSize >= 13) |
- return NSSmallControlSize; |
- return NSMiniControlSize; |
-} |
- |
-static void paintStepper(ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView*) |
-{ |
- // We don't use NSStepperCell because there are no ways to draw an |
- // NSStepperCell with the up button highlighted. |
- |
- HIThemeButtonDrawInfo drawInfo; |
- drawInfo.version = 0; |
- drawInfo.state = convertControlStatesToThemeDrawState(kThemeIncDecButton, states); |
- drawInfo.adornment = kThemeAdornmentDefault; |
- ControlSize controlSize = controlSizeFromPixelSize(stepperSizes(), zoomedRect.size(), zoomFactor); |
- if (controlSize == NSSmallControlSize) |
- drawInfo.kind = kThemeIncDecButtonSmall; |
- else if (controlSize == NSMiniControlSize) |
- drawInfo.kind = kThemeIncDecButtonMini; |
- else |
- drawInfo.kind = kThemeIncDecButton; |
- |
- IntRect rect(zoomedRect); |
- GraphicsContextStateSaver stateSaver(*context); |
- if (zoomFactor != 1.0f) { |
- rect.setWidth(rect.width() / zoomFactor); |
- rect.setHeight(rect.height() / zoomFactor); |
- context->translate(rect.x(), rect.y()); |
- context->scale(FloatSize(zoomFactor, zoomFactor)); |
- context->translate(-rect.x(), -rect.y()); |
- } |
- CGRect bounds(rect); |
- CGRect backgroundBounds; |
- HIThemeGetButtonBackgroundBounds(&bounds, &drawInfo, &backgroundBounds); |
- // Center the stepper rectangle in the specified area. |
- backgroundBounds.origin.x = bounds.origin.x + (bounds.size.width - backgroundBounds.size.width) / 2; |
- if (backgroundBounds.size.height < bounds.size.height) { |
- int heightDiff = clampToInteger(bounds.size.height - backgroundBounds.size.height); |
- backgroundBounds.origin.y = bounds.origin.y + (heightDiff / 2) + 1; |
- } |
- |
- LocalCurrentGraphicsContext localContext(context); |
- HIThemeDrawButton(&backgroundBounds, &drawInfo, localContext.cgContext(), kHIThemeOrientationNormal, 0); |
-} |
- |
-// This will ensure that we always return a valid NSView, even if ScrollView doesn't have an associated document NSView. |
-// If the ScrollView doesn't have an NSView, we will return a fake NSView whose sole purpose is to tell AppKit that it's flipped. |
-NSView *ThemeMac::ensuredView(ScrollView* scrollView) |
-{ |
- |
- // Use a fake flipped view. |
- static NSView *flippedView = [[WebCoreFlippedView alloc] init]; |
- [flippedView setFrameSize:NSSizeFromCGSize(scrollView->contentsSize())]; |
- |
- return flippedView; |
-} |
- |
-void ThemeMac::setFocusRingClipRect(const FloatRect& rect) |
-{ |
- focusRingClipRect = rect; |
-} |
- |
-// Theme overrides |
- |
-int ThemeMac::baselinePositionAdjustment(ControlPart part) const |
-{ |
- if (part == CheckboxPart || part == RadioPart) |
- return -2; |
- return Theme::baselinePositionAdjustment(part); |
-} |
- |
-FontDescription ThemeMac::controlFont(ControlPart part, const FontDescription& fontDescription, float zoomFactor) const |
-{ |
- switch (part) { |
- case PushButtonPart: { |
- FontDescription result; |
- result.setIsAbsoluteSize(true); |
- result.setGenericFamily(FontDescription::SerifFamily); |
- |
- NSFont* nsFont = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:controlSizeForFont(fontDescription)]]; |
- result.firstFamily().setFamily([nsFont webCoreFamilyName]); |
- result.setComputedSize([nsFont pointSize] * zoomFactor); |
- result.setSpecifiedSize([nsFont pointSize] * zoomFactor); |
- return result; |
- } |
- default: |
- return Theme::controlFont(part, fontDescription, zoomFactor); |
- } |
-} |
- |
-LengthSize ThemeMac::controlSize(ControlPart part, const FontDescription& fontDescription, const LengthSize& zoomedSize, float zoomFactor) const |
-{ |
- switch (part) { |
- case CheckboxPart: |
- return checkboxSize(fontDescription, zoomedSize, zoomFactor); |
- case RadioPart: |
- return radioSize(fontDescription, zoomedSize, zoomFactor); |
- case PushButtonPart: |
- // Height is reset to auto so that specified heights can be ignored. |
- return sizeFromFont(fontDescription, LengthSize(zoomedSize.width(), Length()), zoomFactor, buttonSizes()); |
- case InnerSpinButtonPart: |
- if (!zoomedSize.width().isIntrinsicOrAuto() && !zoomedSize.height().isIntrinsicOrAuto()) |
- return zoomedSize; |
- return sizeFromNSControlSize(stepperControlSizeForFont(fontDescription), zoomedSize, zoomFactor, stepperSizes()); |
- default: |
- return zoomedSize; |
- } |
-} |
- |
-LengthSize ThemeMac::minimumControlSize(ControlPart part, const FontDescription& fontDescription, float zoomFactor) const |
-{ |
- switch (part) { |
- case SquareButtonPart: |
- case ButtonPart: |
- return LengthSize(Length(0, Fixed), Length(static_cast<int>(15 * zoomFactor), Fixed)); |
- case InnerSpinButtonPart:{ |
- IntSize base = stepperSizes()[NSMiniControlSize]; |
- return LengthSize(Length(static_cast<int>(base.width() * zoomFactor), Fixed), |
- Length(static_cast<int>(base.height() * zoomFactor), Fixed)); |
- } |
- default: |
- return Theme::minimumControlSize(part, fontDescription, zoomFactor); |
- } |
-} |
- |
-LengthBox ThemeMac::controlBorder(ControlPart part, const FontDescription& fontDescription, const LengthBox& zoomedBox, float zoomFactor) const |
-{ |
- switch (part) { |
- case SquareButtonPart: |
- case ButtonPart: |
- return LengthBox(0, zoomedBox.right().value(), 0, zoomedBox.left().value()); |
- default: |
- return Theme::controlBorder(part, fontDescription, zoomedBox, zoomFactor); |
- } |
-} |
- |
-LengthBox ThemeMac::controlPadding(ControlPart part, const FontDescription& fontDescription, const LengthBox& zoomedBox, float zoomFactor) const |
-{ |
- switch (part) { |
- case PushButtonPart: { |
- // Just use 8px. AppKit wants to use 11px for mini buttons, but that padding is just too large |
- // for real-world Web sites (creating a huge necessary minimum width for buttons whose space is |
- // by definition constrained, since we select mini only for small cramped environments. |
- // This also guarantees the HTML <button> will match our rendering by default, since we're using a consistent |
- // padding. |
- const int padding = 8 * zoomFactor; |
- return LengthBox(0, padding, 0, padding); |
- } |
- default: |
- return Theme::controlPadding(part, fontDescription, zoomedBox, zoomFactor); |
- } |
-} |
- |
-void ThemeMac::inflateControlPaintRect(ControlPart part, ControlStates states, IntRect& zoomedRect, float zoomFactor) const |
-{ |
- BEGIN_BLOCK_OBJC_EXCEPTIONS |
- switch (part) { |
- case CheckboxPart: { |
- // We inflate the rect as needed to account for padding included in the cell to accommodate the checkbox |
- // shadow" and the check. We don't consider this part of the bounds of the control in WebKit. |
- NSCell *cell = checkbox(states, zoomedRect, zoomFactor); |
- NSControlSize controlSize = [cell controlSize]; |
- IntSize zoomedSize = checkboxSizes()[controlSize]; |
- zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
- zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
- zoomedRect = inflateRect(zoomedRect, zoomedSize, checkboxMargins(controlSize), zoomFactor); |
- break; |
- } |
- case RadioPart: { |
- // We inflate the rect as needed to account for padding included in the cell to accommodate the radio button |
- // shadow". We don't consider this part of the bounds of the control in WebKit. |
- NSCell *cell = radio(states, zoomedRect, zoomFactor); |
- NSControlSize controlSize = [cell controlSize]; |
- IntSize zoomedSize = radioSizes()[controlSize]; |
- zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
- zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
- zoomedRect = inflateRect(zoomedRect, zoomedSize, radioMargins(controlSize), zoomFactor); |
- break; |
- } |
- case PushButtonPart: |
- case ButtonPart: { |
- NSButtonCell *cell = button(part, states, zoomedRect, zoomFactor); |
- NSControlSize controlSize = [cell controlSize]; |
- |
- // We inflate the rect as needed to account for the Aqua button's shadow. |
- if ([cell bezelStyle] == NSRoundedBezelStyle) { |
- IntSize zoomedSize = buttonSizes()[controlSize]; |
- zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
- zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever constrain width, so the zoomed width can just be honored. |
- zoomedRect = inflateRect(zoomedRect, zoomedSize, buttonMargins(controlSize), zoomFactor); |
- } |
- break; |
- } |
- case InnerSpinButtonPart: { |
- static const int stepperMargin[4] = { 0, 0, 0, 0 }; |
- ControlSize controlSize = controlSizeFromPixelSize(stepperSizes(), zoomedRect.size(), zoomFactor); |
- IntSize zoomedSize = stepperSizes()[controlSize]; |
- zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
- zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
- zoomedRect = inflateRect(zoomedRect, zoomedSize, stepperMargin, zoomFactor); |
- break; |
- } |
- default: |
- break; |
- } |
- END_BLOCK_OBJC_EXCEPTIONS |
-} |
- |
-void ThemeMac::paint(ControlPart part, ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) const |
-{ |
- switch (part) { |
- case CheckboxPart: |
- paintCheckbox(states, context, zoomedRect, zoomFactor, scrollView); |
- break; |
- case RadioPart: |
- paintRadio(states, context, zoomedRect, zoomFactor, scrollView); |
- break; |
- case PushButtonPart: |
- case ButtonPart: |
- case SquareButtonPart: |
- paintButton(part, states, context, zoomedRect, zoomFactor, scrollView); |
- break; |
- case InnerSpinButtonPart: |
- paintStepper(states, context, zoomedRect, zoomFactor, scrollView); |
- break; |
- default: |
- break; |
- } |
-} |
- |
-} |