diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 7879d6ffb..11c9bebb5 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -819,42 +819,72 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); } /*! - Size to fit has two behavior, depending on if the receiver is an editable text field or not. + For non-bezeled text fields (typically a label), sizeToFit has two behaviors, depending + on the line break mode of the receiver. - For non-editable text fields (typically, a label), sizeToFit will change the frame of the - receiver to perfectly fit the current text in stringValue in the current font, and respecting - the current theme values for content-inset, min-size, and max-size. + For non-bezeled receivers with a non-wrapping line break mode, sizeToFit will change the frame of the + receiver to perfectly fit the current text in stringValue in the current font, respecting + the current theme value for content-inset. For receivers with a wrapping line break mode, + sizeToFit will wrap the text within the current width (respecting the current content-inset), + so it will ONLY change the HEIGHT. - For editable text fields, sizeToFit will ONLY change the HEIGHT of the text field. It will not - change the width of the text field. You can use setFrameSize: with the current height to set the - width, and you can get the size of a string with [CPString sizeWithFont:]. + For bezeled text fields (typically editable fields), sizeToFit will ONLY change the HEIGHT + of the text field. It will not change the width of the text field. sizeToFit will attempt to + change the height to fit a single line of text, respecting the current theme values for min-size, + max-size and content-inset. The logic behind this decision is that most of the time you do not know what content will be placed - in an editable text field, so you want to just choose a fixed width and leave it at that size. + in a bezeled text field, so you want to just choose a fixed width and leave it at that size. However, since you don't know how tall it needs to be if you change the font, sizeToFit will still be useful for making the textfield an appropriate height. */ - (void)sizeToFit { - var size = [([self stringValue] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]], + [self setFrameSize:[self _minimumFrameSize]]; +} + +- (CGSize)_minimumFrameSize +{ + var frameSize = [self frameSize], contentInset = [self currentValueForThemeAttribute:@"content-inset"], minSize = [self currentValueForThemeAttribute:@"min-size"], - maxSize = [self currentValueForThemeAttribute:@"max-size"]; + maxSize = [self currentValueForThemeAttribute:@"max-size"], + lineBreakMode = [self lineBreakMode], + text = ([self stringValue] || @" "), + textSize = _CGSizeMakeCopy(frameSize), + font = [self currentValueForThemeAttribute:@"font"]; - size.width = MAX(size.width + contentInset.left + contentInset.right, minSize.width); - size.height = MAX(size.height + contentInset.top + contentInset.bottom, minSize.height); + textSize.width -= contentInset.left + contentInset.right; + textSize.height -= contentInset.top + contentInset.bottom; - if (maxSize.width >= 0.0) - size.width = MIN(size.width, maxSize.width); + if (frameSize.width !== 0 && + ![self isBezeled] && + (lineBreakMode === CPLineBreakByWordWrapping || lineBreakMode === CPLineBreakByCharWrapping)) + { + textSize = [text sizeWithFont:font inWidth:textSize.width]; + } + else + textSize = [text sizeWithFont:font]; - if (maxSize.height >= 0.0) - size.height = MIN(size.height, maxSize.height); + frameSize.height = textSize.height + contentInset.top + contentInset.bottom; - if ([self isEditable]) - size.width = CGRectGetWidth([self frame]); + if ([self isBezeled]) + { + frameSize.height = MAX(frameSize.height, minSize.height); - [self setFrameSize:size]; + if (maxSize.width > 0.0) + frameSize.width = MIN(frameSize.width, maxSize.width); + + if (maxSize.height > 0.0) + frameSize.height = MIN(frameSize.height, maxSize.height); + } + else + frameSize.width = textSize.width + contentInset.left + contentInset.right; + + frameSize.width = MAX(frameSize.width, minSize.width); + + return frameSize; } /*! @@ -1235,6 +1265,12 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]]; [self setPlaceholderString:[aCoder decodeObjectForKey:CPTextFieldPlaceholderStringKey]]; + + // Make sure the frame is big enough + var minSize = [self _minimumFrameSize]; + + minSize.width = MAX(CGRectGetWidth([self frame]), minSize.width); + [self setFrameSize:minSize]; } return self; diff --git a/Tests/Manual/CPTextFieldHeightTest/AppController.j b/Tests/Manual/CPTextFieldHeightTest/AppController.j new file mode 100644 index 000000000..c508ae37d --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/AppController.j @@ -0,0 +1,186 @@ +/* + * AppController.j + * CPTextFieldHeightTest + * + * Created by Aparajita Fishman on August 31, 2010. + */ + +@import + +CPLogRegister(CPLogConsole); + + +@implementation AppController : CPObject +{ + CPWindow theWindow; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + [theWindow setFrameOrigin:CGPointMake(30, 20)]; + + var newWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(400, 46, 400, 348) styleMask:CPTitledWindowMask]; + + [newWindow setTitle:@"sizeToFit"]; + + var label = [[OldTextField alloc] initWithFrame:CGRectMake(15, 15, 300, 10)]; + + [label setLineBreakMode:CPLineBreakByWordWrapping]; + [label setStringValue:@"Old sizeToFit, CPLineBreakByWordWrapping:\nIgnores original width, does not wrap onto several lines, as you can see by this text that does not wrap."]; + [label sizeToFit]; + [[newWindow contentView] addSubview:label]; + + label = [[CPTextField alloc] initWithFrame:CGRectMake(15, 60, 300, 10)]; + + [label setLineBreakMode:CPLineBreakByWordWrapping]; + [label setStringValue:@"New sizeToFit, CPLineBreakByWordWrapping:\nWraps onto several lines, keeping the original width, as you can see by this text that has wrapped."]; + [label sizeToFit]; + [[newWindow contentView] addSubview:label]; + + label = [[OldTextField alloc] initWithFrame:CGRectMake(15, 130, 300, 10)]; + + [label setLineBreakMode:CPLineBreakByClipping]; + [label setStringValue:@"Old sizeToFit, CPLineBreakByClipping:\nDoes not wrap, as you can see by this text that does not wrap."]; + [label sizeToFit]; + [[newWindow contentView] addSubview:label]; + + label = [[CPTextField alloc] initWithFrame:CGRectMake(15, 175, 300, 10)]; + + [label setLineBreakMode:CPLineBreakByClipping]; + [label setStringValue:@"New sizeToFit, CPLineBreakByClipping:\nDoes not wrap, as you can see by this text that does not wrap."]; + [label sizeToFit]; + [[newWindow contentView] addSubview:label]; + + label = [[CPTextField alloc] initWithFrame:CGRectMake(15, 235, 300, 10)]; + + [label setLineBreakMode:CPLineBreakByWordWrapping]; + [label setStringValue:@"New sizeToFit, CPLineBreakByWordWrapping:\nWraps onto several lines, keeping the original width, as you can see by this text that has wrapped."]; + [label setBezeled:YES]; + [label setBezelStyle:CPTextFieldSquareBezel]; + [label setBordered:YES]; + [label setEditable:YES]; + [label sizeToFit]; + [[newWindow contentView] addSubview:label]; + + [newWindow orderFront:nil]; +} + +@end + +@implementation OldTextField : CPTextField + +- (void)sizeToFit +{ + var size = [([self stringValue] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]], + contentInset = [self currentValueForThemeAttribute:@"content-inset"], + minSize = [self currentValueForThemeAttribute:@"min-size"], + maxSize = [self currentValueForThemeAttribute:@"max-size"]; + + size.width = MAX(size.width + contentInset.left + contentInset.right, minSize.width); + size.height = MAX(size.height + contentInset.top + contentInset.bottom, minSize.height); + + if (maxSize.width >= 0.0) + size.width = MIN(size.width, maxSize.width); + + if (maxSize.height >= 0.0) + size.height = MIN(size.height, maxSize.height); + + if ([self isEditable]) + size.width = CGRectGetWidth([self frame]); + + [self setFrameSize:size]; +} + +@end + + +var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", + CPTextFieldIsSelectableKey = "CPTextFieldIsSelectableKey", + CPTextFieldIsBorderedKey = "CPTextFieldIsBorderedKey", + CPTextFieldIsBezeledKey = "CPTextFieldIsBezeledKey", + CPTextFieldBezelStyleKey = "CPTextFieldBezelStyleKey", + CPTextFieldDrawsBackgroundKey = "CPTextFieldDrawsBackgroundKey", + CPTextFieldLineBreakModeKey = "CPTextFieldLineBreakModeKey", + CPTextFieldAlignmentKey = "CPTextFieldAlignmentKey", + CPTextFieldBackgroundColorKey = "CPTextFieldBackgroundColorKey", + CPTextFieldPlaceholderStringKey = "CPTextFieldPlaceholderStringKey"; + +@implementation CPTextField (Test) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + [self setEditable:[aCoder decodeBoolForKey:CPTextFieldIsEditableKey]]; + [self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]]; + + [self setDrawsBackground:[aCoder decodeBoolForKey:CPTextFieldDrawsBackgroundKey]]; + + [self setTextFieldBackgroundColor:[aCoder decodeObjectForKey:CPTextFieldBackgroundColorKey]]; + + [self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]]; + [self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]]; + + [self setPlaceholderString:[aCoder decodeObjectForKey:CPTextFieldPlaceholderStringKey]]; + + if ([self tag] === 1) + { + // Make sure the frame is big enough + var minSize = [self _minimumFrameSize]; + + minSize.width = MAX(CGRectGetWidth([self frame]), minSize.width); + [self setFrameSize:minSize]; + } + } + + return self; +} + +- (CGSize)_minimumFrameSize +{ + var frameSize = [self frameSize], + contentInset = [self currentValueForThemeAttribute:@"content-inset"], + minSize = [self currentValueForThemeAttribute:@"min-size"], + maxSize = [self currentValueForThemeAttribute:@"max-size"], + lineBreakMode = [self lineBreakMode], + text = ([self stringValue] || @" "), + textSize = CGSizeMakeCopy(frameSize), + font = [self currentValueForThemeAttribute:@"font"]; + + textSize.width -= contentInset.left + contentInset.right; + textSize.height -= contentInset.top + contentInset.bottom; + + if (frameSize.width !== 0 && + (lineBreakMode === CPLineBreakByWordWrapping || lineBreakMode === CPLineBreakByCharWrapping)) + { + textSize = [text sizeWithFont:font inWidth:textSize.width]; + } + else + textSize = [text sizeWithFont:font]; + + frameSize.height = textSize.height + contentInset.top + contentInset.bottom; + + if ([self isBezeled]) + { + frameSize.height = MAX(frameSize.height, minSize.height); + + if (lineBreakMode !== CPLineBreakByWordWrapping && lineBreakMode !== CPLineBreakByCharWrapping) + { + if (maxSize.width > 0.0) + frameSize.width = MIN(frameSize.width, maxSize.width); + + if (maxSize.height > 0.0) + frameSize.height = MIN(frameSize.height, maxSize.height); + } + } + else + frameSize.width = textSize.width + contentInset.left + contentInset.right; + + frameSize.width = MAX(frameSize.width, minSize.width); + + return frameSize; +} + +@end diff --git a/Tests/Manual/CPTextFieldHeightTest/Info.plist b/Tests/Manual/CPTextFieldHeightTest/Info.plist new file mode 100644 index 000000000..59bc9d186 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/Info.plist @@ -0,0 +1,12 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPTextFieldHeightTest + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib new file mode 100644 index 000000000..56faffecb --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;16E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;60E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;61E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;62E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;63E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;64E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;30E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;66E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;67E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;69E;K;6;$afontD;K;6;CP$UIDd;2;71E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;72E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;74E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;76E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;78E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;72E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;80E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;81E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;72E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;83E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;84E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;72E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;86E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;69E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;72E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;88E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;76E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;78E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;72E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;89E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;69E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;72E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;90E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;76E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;78E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;72E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;91E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;92E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;79E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;93E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;84E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;79E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;94E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;95E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;96E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;84E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;73E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;97E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;98E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;100E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;67E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;69E;K;6;$afontD;K;6;CP$UIDd;2;71E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;72E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;76E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;76E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;78E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;72E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;92E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;79E;K;11;$aalignmentD;K;6;CP$UIDd;2;73E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;103E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;75E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;84E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;84E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;79E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;73E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;S;54;Text Field Cell (New code: "g" (bottom pixel visible))S;47;Text Field Cell (New code: height sized to fit)S;32;Window (CPTextField Height Test)S;83;Text Field Cell (Old code with a multi-line label that has "g" on the second line.)S;83;Text Field Cell (New code with a multi-line label that has "g" on the second line.)S;21;Text Field (New code)S;50;Static Text (Old code: "g" (bottom pixel cut off))S;14;App ControllerS;46;Text Field (Old code: height not sized to fit)S;42;Text Field (New code: height sized to fit)S;26;Text Field Cell (Old code)S;79;Static Text (Old code with a multi-line label that has "g" on the second line.)S;51;Text Field Cell (Old code: height not sized to fit)S;50;Static Text (New code: "g" (bottom pixel visible))S;12;File's OwnerS;26;Text Field Cell (New code)S;54;Text Field Cell (Old code: "g" (bottom pixel cut off))S;12;Content ViewS;21;Text Field (Old code)S;79;Static Text (New code with a multi-line label that has "g" on the second line.)S;11;ApplicationD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;24E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;104E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;24E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;105E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;23;{{408, 63}, {330, 348}}d;1;7S;23;CPTextField Height Testd;1;1S;22;{{33, 300}, {259, 32}}S;19;{{0, 0}, {259, 32}}d;2;36S;7;bezeledD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;70E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;106E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;107E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;84E;E;d;1;2d;1;4S;8;New coded;4;3072T;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;77E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;108E;E;d;1;0S;21;{{34, 20}, {225, 17}}S;19;{{0, 0}, {225, 17}}S;6;normalS;36;Old code: "g" (bottom pixel cut off)F;S;13;AppControllerS;22;{{33, 201}, {259, 30}}S;19;{{0, 0}, {259, 30}}S;33;Old code: height not sized to fitS;22;{{33, 233}, {259, 30}}S;29;New code: height sized to fitS;21;{{34, 50}, {225, 34}}S;19;{{0, 0}, {225, 34}}S;65;Old code with a multi-line label that has "g" on the second line.S;22;{{34, 116}, {229, 17}}S;19;{{0, 0}, {229, 17}}S;36;New code: "g" (bottom pixel visible)S;20;{{0, 0}, {330, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;22E;E;E;d;2;18S;22;{{33, 268}, {259, 32}}S;8;Old codeS;22;{{34, 146}, {225, 34}}S;65;New code with a multi-line label that has "g" on the second line.S;8;delegateS;9;theWindowS;5;Ariald;2;16D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;65E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.xib b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.xib new file mode 100644 index 000000000..408002cf4 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.xib @@ -0,0 +1,514 @@ + + + + 1060 + 10F569 + 788 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 788 + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + 7 + 2 + {{408, 617}, {330, 348}} + 1946157056 + CPTextField Height Test + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 274 + + + + 268 + {{34, 311}, {225, 17}} + + YES + + 68288064 + 272630784 + Old code: "g" (bottom pixel cut off) + + LucidaGrande + 13 + 1044 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{34, 215}, {229, 17}} + + 1 + YES + + 67239488 + 272631808 + New code: "g" (bottom pixel visible) + + + + + + + + + 268 + {{34, 264}, {225, 34}} + + YES + + 67239424 + 272629760 + Old code with a multi-line label that has "g" on the second line. + + LucidaGrande + 13 + 16 + + + + + + + + + 268 + {{34, 168}, {225, 34}} + + 1 + YES + + 67239424 + 272629760 + New code with a multi-line label that has "g" on the second line. + + + + + + + + + 268 + {{37, 121}, {251, 22}} + + YES + + -1804468671 + 272630784 + Old code: height not sized to fit + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 268 + {{37, 89}, {251, 22}} + + 1 + YES + + -1804468671 + 272630784 + New code: height sized to fit + + + YES + + + + + + + 268 + {{37, 52}, {251, 24}} + + YES + + -1804468671 + 272630784 + Old code + + LucidaGrande + 16 + 16 + + + YES + + + + + + + 268 + {{37, 20}, {251, 24}} + + 1 + YES + + -1804468671 + 272630784 + New code + + + YES + + + + + + {330, 348} + + + {{0, 0}, {1680, 1028}} + {1.79769e+308, 1.79769e+308} + + + AppController + + + + + + + delegate + + + + 451 + + + + theWindow + + + + 1090 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 371 + + + + + + + + 372 + + + + + + + + + + + + + + + 450 + + + + + 1148 + + + + + + + + 1149 + + + + + 1183 + + + + + + + + 1184 + + + + + 1187 + + + + + + + + 1188 + + + + + 1189 + + + + + + + + 1190 + + + + + 1191 + + + + + + + + 1192 + + + + + 1193 + + + + + + + + 1194 + + + + + 1199 + + + + + + + + 1200 + + + + + + + + 1201 + + + + + 1202 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{878, 505}, {330, 348}} + com.apple.InterfaceBuilder.CocoaPlugin + {{878, 505}, {330, 348}} + + {{33, 99}, {480, 360}} + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 1202 + + + + + AppController + NSObject + + setImagePosition: + id + + + setImagePosition: + + setImagePosition: + id + + + + NSButton + NSButton + NSButton + NSButton + NSPopUpButton + id + id + NSWindow + + + + button + NSButton + + + checkbox + NSButton + + + imageButton + NSButton + + + multiCheckbox + NSButton + + + positionMenu + NSPopUpButton + + + radio1 + id + + + radio2 + id + + + theWindow + NSWindow + + + + IBUserSource + + + + + + 0 + IBCocoaFramework + YES + ../registration.xcodeproj + 3 + + diff --git a/Tests/Manual/CPTextFieldHeightTest/Resources/spinner.gif b/Tests/Manual/CPTextFieldHeightTest/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/CPTextFieldHeightTest/Resources/spinner.gif differ diff --git a/Tests/Manual/CPTextFieldHeightTest/index-debug.html b/Tests/Manual/CPTextFieldHeightTest/index-debug.html new file mode 100644 index 000000000..3dbe60d0f --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/index-debug.html @@ -0,0 +1,68 @@ + + + + + + + + CPTextField Height Test + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPTextFieldHeightTest/index.html b/Tests/Manual/CPTextFieldHeightTest/index.html new file mode 100644 index 000000000..211be1ca5 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/index.html @@ -0,0 +1,67 @@ + + + + + + + + CPTextField Height Test + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPTextFieldHeightTest/main.j b/Tests/Manual/CPTextFieldHeightTest/main.j new file mode 100755 index 000000000..ce8dce48d --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/main.j @@ -0,0 +1,17 @@ +/* + * AppController.j + * CPTextFieldHeightTest + * + * Created by Aparajita Fishman on August 31, 2010. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +}