From b6491f7bb89382aec5a05ba4a1e8128f15343a88 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Wed, 6 Oct 2010 08:43:21 -0400 Subject: [PATCH 1/5] CPTextField -initWithCoder was not ensuring the frame size was high enough. The default label height in IB is 17px, which unmodified was cutting off the bottom pixel of labels in Cappuccino. --- AppKit/CPTextField.j | 12 +- .../CPTextFieldHeightTest/AppController.j | 64 ++++ Tests/Manual/CPTextFieldHeightTest/Info.plist | 12 + .../Resources/MainMenu.cib | 1 + .../Resources/MainMenu.xib | 294 ++++++++++++++++++ .../Resources/spinner.gif | Bin 0 -> 1849 bytes .../CPTextFieldHeightTest/index-debug.html | 69 ++++ Tests/Manual/CPTextFieldHeightTest/index.html | 68 ++++ Tests/Manual/CPTextFieldHeightTest/main.j | 18 ++ 9 files changed, 537 insertions(+), 1 deletion(-) create mode 100644 Tests/Manual/CPTextFieldHeightTest/AppController.j create mode 100644 Tests/Manual/CPTextFieldHeightTest/Info.plist create mode 100644 Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib create mode 100644 Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.xib create mode 100644 Tests/Manual/CPTextFieldHeightTest/Resources/spinner.gif create mode 100644 Tests/Manual/CPTextFieldHeightTest/index-debug.html create mode 100644 Tests/Manual/CPTextFieldHeightTest/index.html create mode 100755 Tests/Manual/CPTextFieldHeightTest/main.j diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 7879d6ffb..3066f31e5 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -836,6 +836,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); */ - (void)sizeToFit +{ + [self setFrameSize:[self _minimumFrameSize]]; +} + +- (CGSize)_minimumFrameSize { var size = [([self stringValue] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]], contentInset = [self currentValueForThemeAttribute:@"content-inset"], @@ -854,7 +859,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if ([self isEditable]) size.width = CGRectGetWidth([self frame]); - [self setFrameSize:size]; + return size; } /*! @@ -1235,6 +1240,11 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]]; [self setPlaceholderString:[aCoder decodeObjectForKey:CPTextFieldPlaceholderStringKey]]; + + // Make sure the frame height is big enough + var minSize = [self _minimumFrameSize]; + + [self setFrameSize:_CGSizeMake(_CGRectGetWidth([self bounds]), minSize.height)]; } return self; diff --git a/Tests/Manual/CPTextFieldHeightTest/AppController.j b/Tests/Manual/CPTextFieldHeightTest/AppController.j new file mode 100644 index 000000000..bb4d80d33 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/AppController.j @@ -0,0 +1,64 @@ +/* + * AppController.j + * CPTextFieldHeightTest + * + * Created by Aparajita Fishman on August 31, 2010. + */ + +@import + +CPLogRegister(CPLogConsole); + + +@implementation AppController : CPObject +{ + CPWindow theWindow; +} + +@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 height is big enough + var minSize = [self _minimumFrameSize]; + + [self setFrameSize:CGSizeMake(CGRectGetWidth([self bounds]), minSize.height)]; + } + } + + return self; +} + +@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..f616f2ac4 --- /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;2;16E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;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;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;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;29E;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;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;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;38E;D;K;6;CP$UIDd;2;39E;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;2;27E;D;K;6;CP$UIDd;2;20E;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;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;21E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;25E;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;40E;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;41E;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;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;42E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;43E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;44E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;46E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;47E;K;11;$aalignmentD;K;6;CP$UIDd;2;48E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;49E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;50E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;51E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;47E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;48E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;46E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;47E;K;11;$aalignmentD;K;6;CP$UIDd;2;48E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;55E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;50E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;51E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;47E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;48E;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;40E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;56E;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;24E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;57E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;57E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;59E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;25E;E;S;12;File's OwnerS;50;Static Text (New code: "g" (bottom pixel visible))S;50;Static Text (Old code: "g" (bottom pixel cut off))S;54;Text Field Cell (New code: "g" (bottom pixel visible))S;11;ApplicationS;14;App ControllerS;54;Text Field Cell (Old code: "g" (bottom pixel cut off))S;12;Content ViewS;32;Window (CPTextField Height Test)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;23E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;23E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;27E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;66E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;E;E;d;1;1S;22;{{75, 119}, {229, 17}}S;19;{{0, 0}, {229, 17}}d;2;36S;6;normald;1;2d;1;4S;36;New code: "g" (bottom pixel visible)d;4;3072F;d;1;0S;21;{{75, 80}, {225, 17}}S;19;{{0, 0}, {225, 17}}S;36;Old code: "g" (bottom pixel cut off)S;13;AppControllerS;20;{{0, 0}, {380, 253}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;20E;E;E;d;2;18S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;23;{{408, 63}, {380, 253}}d;1;7S;23;CPTextField Height TestS;8;delegateS;9;theWindowE;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..f355a6a63 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.xib @@ -0,0 +1,294 @@ + + + + 1060 + 10F569 + 788 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 788 + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + 7 + 2 + {{408, 712}, {380, 253}} + 1946157056 + CPTextField Height Test + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 274 + + + + 268 + {{75, 156}, {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 + {{75, 117}, {229, 17}} + + 1 + YES + + 68288064 + 272630784 + New code: "g" (bottom pixel visible) + + + + + + + + {380, 253} + + + {{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 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{902, 462}, {380, 253}} + com.apple.InterfaceBuilder.CocoaPlugin + {{902, 462}, {380, 253}} + + {{33, 99}, {480, 360}} + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 1184 + + + + + 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 0000000000000000000000000000000000000000..06dbc2bc21dddcf0e09b566d5b211aee89570f52 GIT binary patch literal 1849 zcma*odr(tX9tZHtz31lM+(&Y`A`Ou`NeG&R#DrIfV%?hng21vs6v>ooRQQFbk7E_K!V( z{?5!fpZWgIZ%*d6t%i*j24bL}AZUJm9)h6R*;%L4IWse3G#VWaN1#$zSSXcBhlYlH zJ|D}n{r&w2f+Qp)SS*&n?*G4}{}!h?td_mjU6Kad-rW*QwWYCUk7d^e+sjpZAn6kT z5rM;`{~_}-wm+L@%+E;JphLm}C3WzQAQD0wBoY|rOTQX{(@pp-WAA8Iw0HKl|15j) zhGh(SFWu#5zUCw^T!}C~eC}~?{xG-r7ugQC>taC+|L^xr&a%{#cgUOZXIM&v?)k^2 z1i5%0!U00wq)r4vlAwXBA_m5J5WNeuBm-XJQ5pG4GD%vc|K){+TJ{AkHqN@SJKczX zU}QRd9n*_bf^h94)6Ctv{CUfz_;qs#RDuQ$DR%y1&5G-a6rhf*4Y zl+UOD1*GE{GQ7vv;c-tTIMkz0ovO>9j%b5hpa@a*CBJ#W!0@ndSwF|%hMkdFtXiU) z`BEp+yhkt8ZY>tg&uyH@%^%K4jDrbA;et&vnnzZ3z22@e6<27z2Vk13kb7OtISyxv z(XoO-LNQCZe3lfzc%*pNqU<9T+p~teThOEB+~e&U0mC|zS{Q)dJZ)!^1f7L(zg*L> z*vSW%?dR~@@0(}x6-V^A`~ImD;)NaBUnP8;RH=bS2@pk`wp>>8r&jGjmGPy%1BW}v zoPo}ca$~bze@efc3kapuEVW1!%teOZT3j2Tw5=hjiAf02d}7dL0oFC%@=RXp5Ow#% z@a>+AM|YWt$n&e`>sB-32gBcuTi>R>*|8@lp`y6thc7ydyqDsuUn~YzZf|{-R@-3y zL#wx{Ii}xxL_csiW*LBn0-A$>zp4WOmkf6=ilrjlW?-l9+bCd7|i?*b5NTmy<<6NZ0T8$SN@mwdC2f z6jqK=N@bS@!=YSj%>h0}*4p+%0HbTIrE$w7UMT6+AZZ&DAo*qZAAi(OtNbIfl#Dw^ zJWeiCp~zi#&t6x}m9)O^eR4HiLV3QA<<0>HZ8%$^lrSE94Wb}=+MM^!b>n#5&-JQR zkr-CEu9C;_F*7DqDisulV6Pmg$nFL0TPn%~*m^-`Z3^BgU(sNpnx%nW(!eV9A&FvI zHL3X3lw8Wji^6=8KbQDE-e%b?svdFxxdh$8r97@7$ojeI`6AL8Ob6QC$qh&>ZWVDX1F{0vJnT%%mE;GveKWR%C} zM&4d;Jf3s9|HAA)yVUPo`Aq;0do#)uHSXi5*QF*)x@MVVHr+cN)uMZ__F|&Ta#p8d z53TOKtce!PJUuie8UWol-S(`c2nH?UGqJP{!4RR4u$LCfn)q-hj0^f=h(VYy)T6eN zhRO!ja-aDBTcgeyP(8Ua4IdiOog^*CQa?R(cP#9AgL9`j>EX-6Yf1lzX(!~``M1XC zNmM<4<6d~wWZ$Xrk0K}UteTrq@LBBk#MsjkK;pbuVhe)NI7(7Pf(l?lxC7=1Z7Pzl zMbS;nV4NI5_N{1$P)&XC)huOGQ+h^zpYUZfb*1n6>!`#*b3y52LGmi+<4sY5jyD#- zw&$d}DTguLAfnRtjrM*JfqtHqUu6rQoU=g%1E9xk%;)TDm^2<8n-0IhTsQFaek)MY}>PK4;nBk=ow4pF>vzkO& gna%Org-kgQCf=+BeMi^RbuY;YE~rTjend;_cdi8t>i_@% literal 0 HcmV?d00001 diff --git a/Tests/Manual/CPTextFieldHeightTest/index-debug.html b/Tests/Manual/CPTextFieldHeightTest/index-debug.html new file mode 100644 index 000000000..ad6aaf804 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/index-debug.html @@ -0,0 +1,69 @@ + + + + + + + + CPTextField Height Test + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPTextFieldHeightTest/index.html b/Tests/Manual/CPTextFieldHeightTest/index.html new file mode 100644 index 000000000..b8c6f6c83 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/index.html @@ -0,0 +1,68 @@ + + + + + + + + CPTextField Height Test + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/Tests/Manual/CPTextFieldHeightTest/main.j b/Tests/Manual/CPTextFieldHeightTest/main.j new file mode 100755 index 000000000..af6279da3 --- /dev/null +++ b/Tests/Manual/CPTextFieldHeightTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * TableCibTest + * + * Created by Francisco Tolmasky on July 5, 2009. + * Copyright 2009, 280 North, Inc. All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} From b8ae14d3a837557e364ddade6a167c1c36ac718e Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Fri, 8 Oct 2010 10:17:12 -0400 Subject: [PATCH 2/5] Fixes and more tests: - Fixed _minimumFrameSize to take into account bezel and line break mode. - Added test to show how sizeToFit was broken for multi-line labels in the old code. - Added test to verify that behavior is correct for single-line labels. --- AppKit/CPTextField.j | 48 +++- .../CPTextFieldHeightTest/AppController.j | 71 +++++- .../Resources/MainMenu.cib | 2 +- .../Resources/MainMenu.xib | 240 +++++++++++++++++- 4 files changed, 335 insertions(+), 26 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 3066f31e5..80c1511f1 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -842,24 +842,45 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (CGSize)_minimumFrameSize { - var size = [([self stringValue] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]], + 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); - return 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; } /*! @@ -1241,10 +1262,11 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self setPlaceholderString:[aCoder decodeObjectForKey:CPTextFieldPlaceholderStringKey]]; - // Make sure the frame height is big enough + // Make sure the frame is big enough var minSize = [self _minimumFrameSize]; - [self setFrameSize:_CGSizeMake(_CGRectGetWidth([self bounds]), minSize.height)]; + 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 index bb4d80d33..8581f1181 100644 --- a/Tests/Manual/CPTextFieldHeightTest/AppController.j +++ b/Tests/Manual/CPTextFieldHeightTest/AppController.j @@ -15,6 +15,72 @@ CPLogRegister(CPLogConsole); CPWindow theWindow; } +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + [theWindow setFrameOrigin:CGPointMake(30, 20)]; + + var newWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(400, 40, 400, 400) styleMask:CPTitledWindowMask]; + + [newWindow setTitle:@"sizeToFit"]; + + var label = [[OldTextField alloc] initWithFrame:CGRectMake(15, 15, 200, 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, 70, 200, 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, 180, 200, 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, 225, 200, 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]; + + [newWindow orderFront:nil]; +} + +@end + +@implementation OldTextField : CPTextField + +- (void)sizeToFit +{ + console.log("old"); + 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 @@ -51,10 +117,11 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", if ([self tag] === 1) { - // Make sure the frame height is big enough + // Make sure the frame is big enough var minSize = [self _minimumFrameSize]; - [self setFrameSize:CGSizeMake(CGRectGetWidth([self bounds]), minSize.height)]; + minSize.width = MAX(CGRectGetWidth([self frame]), minSize.width); + [self setFrameSize:minSize]; } } diff --git a/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib index f616f2ac4..56faffecb 100644 --- a/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.cib @@ -1 +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;2;16E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;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;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;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;29E;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;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;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;38E;D;K;6;CP$UIDd;2;39E;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;2;27E;D;K;6;CP$UIDd;2;20E;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;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;21E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;25E;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;40E;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;41E;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;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;42E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;43E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;44E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;46E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;47E;K;11;$aalignmentD;K;6;CP$UIDd;2;48E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;49E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;50E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;51E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;47E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;48E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;53E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;54E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;46E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;47E;K;11;$aalignmentD;K;6;CP$UIDd;2;48E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;55E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;50E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;51E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;51E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;47E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;48E;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;40E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;56E;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;24E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;52E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;57E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;57E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;58E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;59E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;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;25E;E;S;12;File's OwnerS;50;Static Text (New code: "g" (bottom pixel visible))S;50;Static Text (Old code: "g" (bottom pixel cut off))S;54;Text Field Cell (New code: "g" (bottom pixel visible))S;11;ApplicationS;14;App ControllerS;54;Text Field Cell (Old code: "g" (bottom pixel cut off))S;12;Content ViewS;32;Window (CPTextField Height Test)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;23E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;23E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;27E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;66E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;E;E;d;1;1S;22;{{75, 119}, {229, 17}}S;19;{{0, 0}, {229, 17}}d;2;36S;6;normald;1;2d;1;4S;36;New code: "g" (bottom pixel visible)d;4;3072F;d;1;0S;21;{{75, 80}, {225, 17}}S;19;{{0, 0}, {225, 17}}S;36;Old code: "g" (bottom pixel cut off)S;13;AppControllerS;20;{{0, 0}, {380, 253}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;20E;E;E;d;2;18S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;23;{{408, 63}, {380, 253}}d;1;7S;23;CPTextField Height TestS;8;delegateS;9;theWindowE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +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 index f355a6a63..408002cf4 100644 --- a/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.xib +++ b/Tests/Manual/CPTextFieldHeightTest/Resources/MainMenu.xib @@ -30,7 +30,7 @@ 7 2 - {{408, 712}, {380, 253}} + {{408, 617}, {330, 348}} 1946157056 CPTextField Height Test NSWindow @@ -43,7 +43,7 @@ 268 - {{75, 156}, {225, 17}} + {{34, 311}, {225, 17}} YES @@ -69,7 +69,7 @@ 6 System controlTextColor - + 3 MAA @@ -79,13 +79,13 @@ 268 - {{75, 117}, {229, 17}} + {{34, 215}, {229, 17}} 1 YES - 68288064 - 272630784 + 67239488 + 272631808 New code: "g" (bottom pixel visible) @@ -93,8 +93,132 @@ + + + 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 + + + + - {380, 253} + {330, 348} {{0, 0}, {1680, 1028}} @@ -163,6 +287,12 @@ + + + + + + @@ -197,6 +327,84 @@ + + 1187 + + + + + + + + 1188 + + + + + 1189 + + + + + + + + 1190 + + + + + 1191 + + + + + + + + 1192 + + + + + 1193 + + + + + + + + 1194 + + + + + 1199 + + + + + + + + 1200 + + + + + + + + 1201 + + + + + 1202 + + + @@ -205,9 +413,21 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{902, 462}, {380, 253}} + 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 - {{902, 462}, {380, 253}} + {{878, 505}, {330, 348}} {{33, 99}, {480, 360}} com.apple.InterfaceBuilder.CocoaPlugin @@ -216,7 +436,7 @@ - 1184 + 1202 From ab430b3574c11ac739f49152d2aa0f457c6fce2e Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Fri, 8 Oct 2010 10:18:38 -0400 Subject: [PATCH 3/5] Forgot to update sizeToFit documentation. --- AppKit/CPTextField.j | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 80c1511f1..11c9bebb5 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -819,18 +819,22 @@ 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. */ From 87c9f9ef038b6983770b5e268bc8a994d16b2fff Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Fri, 8 Oct 2010 17:52:47 -0400 Subject: [PATCH 4/5] Added bezeled multi-line field with wrapping --- .../CPTextFieldHeightTest/AppController.j | 67 +++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/Tests/Manual/CPTextFieldHeightTest/AppController.j b/Tests/Manual/CPTextFieldHeightTest/AppController.j index 8581f1181..c508ae37d 100644 --- a/Tests/Manual/CPTextFieldHeightTest/AppController.j +++ b/Tests/Manual/CPTextFieldHeightTest/AppController.j @@ -19,38 +19,49 @@ CPLogRegister(CPLogConsole); { [theWindow setFrameOrigin:CGPointMake(30, 20)]; - var newWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(400, 40, 400, 400) styleMask:CPTitledWindowMask]; + var newWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(400, 46, 400, 348) styleMask:CPTitledWindowMask]; [newWindow setTitle:@"sizeToFit"]; - var label = [[OldTextField alloc] initWithFrame:CGRectMake(15, 15, 200, 10)]; + 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, 70, 200, 10)]; + 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, 180, 200, 10)]; + 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, 225, 200, 10)]; + 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]; } @@ -60,7 +71,6 @@ CPLogRegister(CPLogConsole); - (void)sizeToFit { - console.log("old"); var size = [([self stringValue] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]], contentInset = [self currentValueForThemeAttribute:@"content-inset"], minSize = [self currentValueForThemeAttribute:@"min-size"], @@ -128,4 +138,49 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", 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 From c8639cc8cd7440abd9103dc916480c9bdde62d4a Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Fri, 8 Oct 2010 23:18:48 -0400 Subject: [PATCH 5/5] Fixed the attribution --- Tests/Manual/CPTextFieldHeightTest/index-debug.html | 5 ++--- Tests/Manual/CPTextFieldHeightTest/index.html | 5 ++--- Tests/Manual/CPTextFieldHeightTest/main.j | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Tests/Manual/CPTextFieldHeightTest/index-debug.html b/Tests/Manual/CPTextFieldHeightTest/index-debug.html index ad6aaf804..3dbe60d0f 100644 --- a/Tests/Manual/CPTextFieldHeightTest/index-debug.html +++ b/Tests/Manual/CPTextFieldHeightTest/index-debug.html @@ -5,10 +5,9 @@ diff --git a/Tests/Manual/CPTextFieldHeightTest/index.html b/Tests/Manual/CPTextFieldHeightTest/index.html index b8c6f6c83..211be1ca5 100644 --- a/Tests/Manual/CPTextFieldHeightTest/index.html +++ b/Tests/Manual/CPTextFieldHeightTest/index.html @@ -5,10 +5,9 @@ diff --git a/Tests/Manual/CPTextFieldHeightTest/main.j b/Tests/Manual/CPTextFieldHeightTest/main.j index af6279da3..ce8dce48d 100755 --- a/Tests/Manual/CPTextFieldHeightTest/main.j +++ b/Tests/Manual/CPTextFieldHeightTest/main.j @@ -1,9 +1,8 @@ /* * AppController.j - * TableCibTest + * CPTextFieldHeightTest * - * Created by Francisco Tolmasky on July 5, 2009. - * Copyright 2009, 280 North, Inc. All rights reserved. + * Created by Aparajita Fishman on August 31, 2010. */ @import