From bf4724d401a6769504b9cb089da67ad086409dc2 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Sat, 15 Jan 2011 23:15:55 -0500 Subject: [PATCH] Fix for textfield jumping when textfield wasn't the right size or the vertical alignment was something other than center. --- AppKit/CPTextField.j | 34 +++++++++++++++++++++---- AppKit/Themes/Aristo/ThemeDescriptors.j | 1 + 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 91cae055a..ab9a6ed9d 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -486,11 +486,15 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); #if PLATFORM(DOM) var string = [self stringValue], - element = [self _inputElement]; + element = [self _inputElement], + font = [self currentValueForThemeAttribute:@"font"]; + + // generate the font metric + [font _getMetrics]; element.value = string; element.style.color = [[self currentValueForThemeAttribute:@"text-color"] cssString]; - element.style.font = [[self currentValueForThemeAttribute:@"font"] cssString]; + element.style.font = [font cssString]; element.style.zIndex = 1000; switch ([self alignment]) @@ -502,12 +506,32 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); default: element.style.textAlign = "left"; } - var contentRect = [self contentRectForBounds:[self bounds]]; + var contentRect = [self contentRectForBounds:[self bounds]], + verticalAlign = [self currentValueForThemeAttribute:"vertical-alignment"]; - element.style.top = _CGRectGetMinY(contentRect) + "px"; + switch(verticalAlign) + { + case CPTopVerticalTextAlignment: + var topPoint = (_CGRectGetMinY(contentRect) + 1) + "px"; // for the same reason we have a -1 for the left, we also have a + 1 here + break; + + case CPCenterVerticalTextAlignment: + var topPoint = (_CGRectGetMidY(contentRect) - (font._lineHeight / 2) + 1) + "px"; + break; + + case CPBottomVerticalTextAlignment: + var topPoint = (_CGRectGetMaxY(contentRect) - font._lineHeight) + "px"; + break; + + default: + var topPoint = (_CGRectGetMinY(contentRect) + 1) + "px"; + break; + } + + element.style.top = topPoint; element.style.left = (_CGRectGetMinX(contentRect) - 1) + "px"; // why -1? element.style.width = _CGRectGetWidth(contentRect) + "px"; - element.style.height = _CGRectGetHeight(contentRect) + "px"; + element.style.height = font._lineHeight + "px"; // private ivar for the line height of the DOM text at this particaulr size _DOMElement.appendChild(element); diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 838d32a78..dddf67ef8 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -804,6 +804,7 @@ var themedButtonValues = nil, // Global for reuse by CPTokenField. themedTextFieldValues = [ + [@"vertical-alignment", CPTopVerticalTextAlignment, CPThemeStateBezeled], [@"bezel-color", bezelColor, CPThemeStateBezeled], [@"bezel-color", bezelFocusedColor, CPThemeStateBezeled | CPThemeStateEditing], [@"bezel-color", bezelDisabledColor, CPThemeStateBezeled | CPThemeStateDisabled],