From d686a0dadf678c2eac8fdf4e4bcc12a68531e178 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Wed, 30 Jul 2014 21:09:41 +0200 Subject: [PATCH 001/106] reverseSetValuesFor: handle multiple selection --- AppKit/CPTextField.j | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 899c460b9..0b85ef76c 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -1957,6 +1957,23 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [_source setObjectValue:aValue]; } +- (void)reverseSetValueFor:(CPString)aBinding +{ + var destination = [_info objectForKey:CPObservedObjectKey], + keyPath = [_info objectForKey:CPObservedKeyPathKey], + options = [_info objectForKey:CPOptionsKey], + newValue = [self valueForBinding:aBinding], + value = [destination valueForKeyPath:keyPath]; + + if (CPIsControllerMarker(value) && newValue == nil) return; + + newValue = [self reverseTransformValue:newValue withOptions:options]; + + [self suppressSpecificNotificationFromObject:destination keyPath:keyPath]; + [destination setValue:newValue forKeyPath:keyPath]; + [self unsuppressSpecificNotificationFromObject:destination keyPath:keyPath]; +} + @end @implementation _CPTextFieldPatternValueBinder : CPValueWithPatternBinding From 1767cf8ad4e5419fba40453eb1565b77ce91ca58 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Thu, 14 Aug 2014 22:41:59 +0200 Subject: [PATCH 002/106] formatting+nil equality --- AppKit/CPTextField.j | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 0b85ef76c..43f83d8ea 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -1960,12 +1960,12 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", - (void)reverseSetValueFor:(CPString)aBinding { var destination = [_info objectForKey:CPObservedObjectKey], - keyPath = [_info objectForKey:CPObservedKeyPathKey], - options = [_info objectForKey:CPOptionsKey], - newValue = [self valueForBinding:aBinding], - value = [destination valueForKeyPath:keyPath]; + keyPath = [_info objectForKey:CPObservedKeyPathKey], + options = [_info objectForKey:CPOptionsKey], + newValue = [self valueForBinding:aBinding], + value = [destination valueForKeyPath:keyPath]; - if (CPIsControllerMarker(value) && newValue == nil) return; + if (CPIsControllerMarker(value) && newValue === nil) return; newValue = [self reverseTransformValue:newValue withOptions:options]; From 6d3f430b24f53f386d833b2275801cea16178b5b Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 22 Oct 2014 17:27:46 -0700 Subject: [PATCH 003/106] Fixed: constructor of CPDate can take string param Previously, when making a CPDate with some constructors, we could pass a string or nil to create a date. For example it was allowed to do var date = [CPDate dateWithTimeIntervalSince1970:"10"]; Now this is not possible anymore and it works like in Cocoa, only number are authorized. --- Foundation/CPDate.j | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index 736ca9ff2..62eebc25c 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -74,24 +74,36 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeIntervalSinceNow:(CPTimeInterval)seconds { + if (!_isNumberType(seconds)) + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceNow: has to be an integer"]; + self = new Date((new Date()).getTime() + seconds * 1000); return self; } - (id)initWithTimeIntervalSince1970:(CPTimeInterval)seconds { + if (!_isNumberType(seconds)) + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSince1970: has to be an integer"]; + self = new Date(seconds * 1000); return self; } - (id)initWithTimeIntervalSinceReferenceDate:(CPTimeInterval)seconds { + if (!_isNumberType(seconds)) + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceReferenceDate: has to be an integer"]; + self = [self initWithTimeInterval:seconds sinceDate:CPDateReferenceDate]; return self; } - (id)initWithTimeInterval:(CPTimeInterval)seconds sinceDate:(CPDate)refDate { + if (!_isNumberType(seconds)) + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeInterval:sinceDate: has to be an integer"]; + self = new Date(refDate.getTime() + seconds * 1000); return self; } @@ -275,3 +287,11 @@ Date.parseISO8601 = function (date) }; Date.prototype.isa = CPDate; + +function _isNumberType(value) +{ + if (typeof value === 'number') + return YES; + else + return NO; +} \ No newline at end of file From d5e811f9f1ecef6d000ad664e96160a30ee5a9d8 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Sun, 26 Oct 2014 21:27:10 -0700 Subject: [PATCH 004/106] Fixed: exception descriptions in CPDate did not countain all of the needed informations --- Foundation/CPDate.j | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index 62eebc25c..47abdfe7d 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -75,7 +75,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeIntervalSinceNow:(CPTimeInterval)seconds { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceNow: has to be an integer"]; + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceNow: has to be an integer or a float"]; self = new Date((new Date()).getTime() + seconds * 1000); return self; @@ -84,7 +84,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeIntervalSince1970:(CPTimeInterval)seconds { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSince1970: has to be an integer"]; + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSince1970: has to be an integer or a float"]; self = new Date(seconds * 1000); return self; @@ -93,7 +93,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeIntervalSinceReferenceDate:(CPTimeInterval)seconds { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceReferenceDate: has to be an integer"]; + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceReferenceDate: has to be an integer or a float"]; self = [self initWithTimeInterval:seconds sinceDate:CPDateReferenceDate]; return self; @@ -102,7 +102,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeInterval:(CPTimeInterval)seconds sinceDate:(CPDate)refDate { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeInterval:sinceDate: has to be an integer"]; + [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeInterval:sinceDate: has to be an integer or a float"]; self = new Date(refDate.getTime() + seconds * 1000); return self; From ba20936c17eec7e6f6ee87f4ebb2b176234cb7f2 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 29 Oct 2014 15:04:55 -0700 Subject: [PATCH 005/106] Fixed: unable to chain sheet in a window Previously when chaining sheet on the same window, Cappuccino crashed. Now chaining a sheet in the delegate method of the method endSheet: will open the next sheet. Now when opening a sheet, we check if another sheet is currently closing. If yes, we wait till we get the notification of the closing of the previous sheet. And then we open the next sheet. Fixed #2159 Test app in Tests/Manual/AttachedSheet2/SheetWindowController.j --- AppKit/CPApplication.j | 4 +- AppKit/CPWindow/CPWindow.j | 49 +++++++++++++++---- .../AttachedSheet2/SheetWindowController.j | 11 +++-- 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index f3783c75a..90d87c5c3 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -986,7 +986,9 @@ var CPMainCibFile = @"CPMainCibFile", return; } - [aSheet._windowView _enableSheet:YES inWindow:aWindow]; + if (![aWindow attachedSheet]) + [aSheet._windowView _enableSheet:YES inWindow:aWindow]; + [aWindow _attachSheet:aSheet modalDelegate:aModalDelegate didEndSelector:didEndSelector contextInfo:contextInfo]; } diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index f770fc642..baafd32a4 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -2679,6 +2679,23 @@ CPTexturedBackgroundWindowMask [attachedSheet setFrame:sheetFrame display:YES animate:NO]; } +- (void)_previousSheetIsClosedNotification:(CPNotification)aNotification +{ + [[CPNotificationCenter defaultCenter] removeObserver:self name:CPWindowDidEndSheetNotification object:self]; + + var sheet = _sheetContext[@"nextSheet"], + modalDelegate =_sheetContext[@"nextModalDelegate"], + endSelector = _sheetContext[@"nextEndSelector"], + contextInfo = _sheetContext[@"nextContextInfo"]; + + // Needed, becauwe when the notification CPWindowDidEndSheetNotification is sent, the sheetContext is not up to date... + setTimeout(function() + { + [sheet._windowView _enableSheet:YES inWindow:self]; + [self _attachSheet:sheet modalDelegate:modalDelegate didEndSelector:endSelector contextInfo:contextInfo]; + }, 0) +} + /* Starting point for sheet session, called from CPApplication beginSheet: */ @@ -2687,9 +2704,24 @@ CPTexturedBackgroundWindowMask { if (_sheetContext) { - [CPException raise:CPInternalInconsistencyException - reason:@"The target window of beginSheet: already has a sheet, did you forget orderOut: ?"]; - return; + // Here we wait till the current sheet is closed + if (_sheetContext[@"isClosing"]) + { + // Here we save the next sheet to open + _sheetContext[@"nextSheet"] = aSheet; + _sheetContext[@"nextModalDelegate"] = aModalDelegate; + _sheetContext[@"nextEndSelector"] = didEndSelector; + _sheetContext[@"nextContextInfo"] = contextInfo; + + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_previousSheetIsClosedNotification:) name:CPWindowDidEndSheetNotification object:self]; + return; + } + else + { + [CPException raise:CPInternalInconsistencyException + reason:@"The target window of beginSheet: already has a sheet, did you forget orderOut: ?"]; + return; + } } _sheetContext = { @@ -2741,7 +2773,12 @@ CPTexturedBackgroundWindowMask */ - (void)_detachSheetWindow { + if (_sheetContext["isClosing"]) + return; + _sheetContext["isAttached"] = NO; + _sheetContext["isClosing"] = YES; + _sheetContext["opened"] = NO; // A timer seems to be necessary for the animation to work correctly. // It would be ideal to block here and spin the event loop, until attach is complete. @@ -2874,12 +2911,6 @@ CPTexturedBackgroundWindowMask return; } - if (_sheetContext["isClosing"]) - return; - - _sheetContext["opened"] = NO; - _sheetContext["isClosing"] = YES; - // The parent window can be orderedOut to disable the sheet animate out, as in Cocoa if ([self isVisible]) { diff --git a/Tests/Manual/AttachedSheet2/SheetWindowController.j b/Tests/Manual/AttachedSheet2/SheetWindowController.j index 096beec68..41866b38f 100644 --- a/Tests/Manual/AttachedSheet2/SheetWindowController.j +++ b/Tests/Manual/AttachedSheet2/SheetWindowController.j @@ -399,9 +399,6 @@ _returnCode = 77; [CPApp endSheet:[self window] returnCode:_returnCode]; - - if (orderOutAfter) - [[self window] orderOut:nil]; } // @@ -519,7 +516,15 @@ // test sheet chaining. it should be possible to start another sheet from didEndSheet, // but only if we orderOut: the sheet before we called endSheet: This is how cocoa works too. if (returnCode == 77) + { + var orderOutAfter = [_orderOutAfterCheckbox state]; + + if (orderOutAfter) + [[self window] orderOut:self]; + [self runSheetForWindow:parentWindow]; + } + //[self runAlertSheet:parentWindow]; } From bfd0ceac53896ae933782de941f2ea6648a9766b Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 29 Oct 2014 21:50:46 -0700 Subject: [PATCH 006/106] Typo: becauwe instead of because --- AppKit/CPWindow/CPWindow.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index baafd32a4..7a9c20217 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -2688,7 +2688,7 @@ CPTexturedBackgroundWindowMask endSelector = _sheetContext[@"nextEndSelector"], contextInfo = _sheetContext[@"nextContextInfo"]; - // Needed, becauwe when the notification CPWindowDidEndSheetNotification is sent, the sheetContext is not up to date... + // Needed, because when the notification CPWindowDidEndSheetNotification is sent, the sheetContext is not up to date... setTimeout(function() { [sheet._windowView _enableSheet:YES inWindow:self]; From 82c32d7dee65ef7321311e74fa2c38836fa56733 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Fri, 31 Oct 2014 17:14:55 -0400 Subject: [PATCH 007/106] New: Implementation of the CoreFoundation CFError This commit adds an implementation of the CoreFoundation CFError classes and functions. --- Objective-J/CFError.js | 158 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 Objective-J/CFError.js diff --git a/Objective-J/CFError.js b/Objective-J/CFError.js new file mode 100644 index 000000000..5169de5c6 --- /dev/null +++ b/Objective-J/CFError.js @@ -0,0 +1,158 @@ +/* + * CFError.js + * Objective-J + * + * Created by Andrew Hankinson. + * Copyright 2014, Andrew Hankinson. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +GLOBAL(kCFErrorLocalizedDescriptionKey) = "CPLocalizedDescription"; +GLOBAL(kCFErrorLocalizedFailureReasonKey) = "CPLocalizedFailureReason"; +GLOBAL(kCFErrorLocalizedRecoverySuggestionKey) = "CPLocalizedRecoverySuggestion"; +GLOBAL(kCFErrorDescriptionKey) = "CPDescription"; +GLOBAL(kCFErrorUnderlyingErrorKey) = "CPUnderlyingError"; + +GLOBAL(kCFErrorURLKey) = "_kCFErrorURLKey"; +GLOBAL(kCFErrorFilePathKey) = "_kCFErrorFilePathKey"; + +// GLOBAL(kCFErrorDomainPOSIX) = ""; +// GLOBAL(kCFErrorDomainOSStatus) = ""; +// GLOBAL(kCFErrorDomainMach) = ""; +GLOBAL(kCFErrorDomainCappuccino) = "CPErrorDomainCappuccino"; +GLOBAL(kCFErrorDomainCocoa) = kCFErrorDomainCappuccino; + + +GLOBAL(CFError) = function(/* CFString */ domain, /* int */ code, /* CFDictionary */ userInfo) +{ + this._domain = domain || NULL; + this._code = code || NULL; + this._userInfo = userInfo || new CFDictionary(); + this._UID = objj_generateObjectUID(); +} + +CFError.prototype.domain = function () +{ + return this._domain; +} +DISPLAY_NAME(CFError.prototype.domain) + +CFError.prototype.code = function () +{ + return this._code; +} +DISPLAY_NAME(CFError.prototype.code) + +/* + This follows the same logic to generate a description as the "real" CFError. +*/ +CFError.prototype.description = function () +{ + var localizedDesc = this._userInfo.valueForKey(kCFErrorLocalizedDescriptionKey); + if (localizedDesc) + return localizedDesc; + + var reason = this._userInfo.valueForKey(kCFErrorLocalizedFailureReasonKey); + if (reason) + { + var operationFailedStr = "The operation couldn\u2019t be completed. " + reason; + return operationFailedStr; + } + + // @TODO Add the bundle localized domain handler. + var result = "", + desc = this._userInfo.valueForKey(kCFErrorDescriptionKey); + if (desc) + { + // we have a description key. + var result = "The operation couldn\u2019t be completed. (error " + this._code + "- " + desc + ")"; + } + else + { + // just use error and code; + var result = "The operation couldn\u2019t be completed. (error " + this._code + ")"; + } + + return result; +} +DISPLAY_NAME(CFError.prototype.description) + +CFError.prototype.failureReason = function () +{ + return this._userInfo.valueForKey(kCFErrorLocalizedFailureReasonKey); +} +DISPLAY_NAME(CFError.prototype.failureReason) + +CFError.prototype.recoverySuggestion = function () +{ + return this._userInfo.valueForKey(kCFErrorLocalizedRecoverySuggestionKey); +} +DISPLAY_NAME(CFError.prototype.recoverySuggestion) + +CFError.prototype.userInfo = function () +{ + return this._userInfo; +} +DISPLAY_NAME(CFError.prototype.userInfo) + +/* + CFError Bridge Functions + The "Create" and "Copy" in the function names do not have any meaning + in Cappuccino; they are bridged here for compatibility reasons only. +*/ +GLOBAL(CFErrorCreate) = function(/* String */ domain, /*int */ code, /* CFDictionary */ userInfo) +{ + return new CFError(domain, code, userInfo); +} + +GLOBAL(CFErrorCreateWithUserInfoKeysAndValues) = function(/* String */ domain, /* int */ code, /* array */ userInfoKeys, /* array */ userInfoValues, /* int */ numUserInfoValues) +{ + var userInfo = new CFDictionary(); + while(numUserInfoValues--) + userInfo.setValueForKey(userInfoKeys[numUserInfoValues], userInfoValues[numUserInfoValues]); + + return new CFError(domain, code, userInfo); +} + +GLOBAL(CFErrorGetCode) = function(/* CFError */ err) +{ + return err.code; +} + +GLOBAL(CFErrorGetDomain) = function(/* CFError */ err) +{ + return err.domain; +} + +GLOBAL(CFErrorCopyDescription) = function(/* CFError */ err) +{ + return err.description; +} + +GLOBAL(CFErrorCopyUserInfo) = function(/* CFError */ err) +{ + return err.userInfo; +} + +GLOBAL(CFErrorCopyFailureReason) = function(/* CFError */ err) +{ + return err.failureReason; +} + +GLOBAL(CFErrorCopyRecoverySuggestion) = function(/* CFError */err) +{ + return err.recoverySuggestion; +} From 49cb446f8b36f0e141111f258334b0bda5b7dfd0 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Fri, 31 Oct 2014 17:15:52 -0400 Subject: [PATCH 008/106] New: Initial commit of CFNetworkErrors file This commit adds constants for CFURL Errors to enable cross-compatibility with the Cocoa CF and CPURL error reporting functions --- Objective-J/CFNetworkErrors.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Objective-J/CFNetworkErrors.js diff --git a/Objective-J/CFNetworkErrors.js b/Objective-J/CFNetworkErrors.js new file mode 100644 index 000000000..9473579b9 --- /dev/null +++ b/Objective-J/CFNetworkErrors.js @@ -0,0 +1,25 @@ +GLOBAL(kCFURLErrorUnknown) = -998; +GLOBAL(kCFURLErrorCancelled) = -999; +GLOBAL(kCFURLErrorBadURL) = -1000; +GLOBAL(kCFURLErrorTimedOut) = -1001; +GLOBAL(kCFURLErrorUnsupportedURL) = -1002; +GLOBAL(kCFURLErrorCannotFindHost) = -1003; +GLOBAL(kCFURLErrorCannotConnectToHost) = -1004; +GLOBAL(kCFURLErrorNetworkConnectionLost) = -1005; +GLOBAL(kCFURLErrorDNSLookupFailed) = -1006; +GLOBAL(kCFURLErrorHTTPTooManyRedirects) = -1007; +GLOBAL(kCFURLErrorResourceUnavailable) = -1008; +GLOBAL(kCFURLErrorNotConnectedToInternet) = -1009; +GLOBAL(kCFURLErrorRedirectToNonExistentLocation) = -1010; +GLOBAL(kCFURLErrorBadServerResponse) = -1011; +GLOBAL(kCFURLErrorUserCancelledAuthentication) = -1012; +GLOBAL(kCFURLErrorUserAuthenticationRequired) = -1013; +GLOBAL(kCFURLErrorZeroByteResource) = -1014; +GLOBAL(kCFURLErrorCannotDecodeRawData) = -1015; +GLOBAL(kCFURLErrorCannotDecodeContentData) = -1016; +GLOBAL(kCFURLErrorCannotParseResponse) = -1017; +GLOBAL(kCFURLErrorRequestBodyStreamExhausted) = -1021; +GLOBAL(kCFURLErrorFileDoesNotExist) = -1100; +GLOBAL(kCFURLErrorFileIsDirectory) = -1101; +GLOBAL(kCFURLErrorNoPermissionsToReadFile) = -1102; +GLOBAL(kCFURLErrorDataLengthExceedsMaximum) = -1103; \ No newline at end of file From 0399b3daeda48760471a36d0cbfec578b2b2679a Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 07:41:51 -0400 Subject: [PATCH 009/106] Fixed: Renamed CPCoder method to match language Previously CPCoder had a method named "encodeValueOfObjCType" which is a misnomer. This commit renames the method to "encodeValueOfObjJType." --- Foundation/CPCoder.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Foundation/CPCoder.j b/Foundation/CPCoder.j index d02d918e0..0bdc7b89a 100644 --- a/Foundation/CPCoder.j +++ b/Foundation/CPCoder.j @@ -53,7 +53,7 @@ @param aType the structure or object type @param anObject the object to be encoded */ -- (void)encodeValueOfObjCType:(CPString)aType at:(id)anObject +- (void)encodeValueOfObjJType:(CPString)aType at:(id)anObject { _CPRaiseInvalidAbstractInvocation(self, _cmd); } From a34e8fbc9aa5c5cdc4a3ec8d2e4ebab5fbbc42ac Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 08:59:10 -0400 Subject: [PATCH 010/106] Fixed method calls for global CFError methods --- Objective-J/CFError.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Objective-J/CFError.js b/Objective-J/CFError.js index 5169de5c6..545c7eef5 100644 --- a/Objective-J/CFError.js +++ b/Objective-J/CFError.js @@ -26,20 +26,20 @@ GLOBAL(kCFErrorLocalizedRecoverySuggestionKey) = "CPLocalizedRecoverySuggestion" GLOBAL(kCFErrorDescriptionKey) = "CPDescription"; GLOBAL(kCFErrorUnderlyingErrorKey) = "CPUnderlyingError"; -GLOBAL(kCFErrorURLKey) = "_kCFErrorURLKey"; -GLOBAL(kCFErrorFilePathKey) = "_kCFErrorFilePathKey"; +GLOBAL(kCFErrorURLKey) = "CPURL"; +GLOBAL(kCFErrorFilePathKey) = "CPFilePath"; // GLOBAL(kCFErrorDomainPOSIX) = ""; // GLOBAL(kCFErrorDomainOSStatus) = ""; // GLOBAL(kCFErrorDomainMach) = ""; -GLOBAL(kCFErrorDomainCappuccino) = "CPErrorDomainCappuccino"; +GLOBAL(kCFErrorDomainCappuccino) = "CPCappuccinoErrorDomain"; GLOBAL(kCFErrorDomainCocoa) = kCFErrorDomainCappuccino; GLOBAL(CFError) = function(/* CFString */ domain, /* int */ code, /* CFDictionary */ userInfo) { this._domain = domain || NULL; - this._code = code || NULL; + this._code = code || 0; this._userInfo = userInfo || new CFDictionary(); this._UID = objj_generateObjectUID(); } @@ -78,7 +78,7 @@ CFError.prototype.description = function () if (desc) { // we have a description key. - var result = "The operation couldn\u2019t be completed. (error " + this._code + "- " + desc + ")"; + var result = "The operation couldn\u2019t be completed. (error " + this._code + " - " + desc + ")"; } else { @@ -120,7 +120,7 @@ GLOBAL(CFErrorCreate) = function(/* String */ domain, /*int */ code, /* CFDictio GLOBAL(CFErrorCreateWithUserInfoKeysAndValues) = function(/* String */ domain, /* int */ code, /* array */ userInfoKeys, /* array */ userInfoValues, /* int */ numUserInfoValues) { - var userInfo = new CFDictionary(); + var userInfo = new CFMutableDictionary(); while(numUserInfoValues--) userInfo.setValueForKey(userInfoKeys[numUserInfoValues], userInfoValues[numUserInfoValues]); @@ -129,30 +129,30 @@ GLOBAL(CFErrorCreateWithUserInfoKeysAndValues) = function(/* String */ domain, / GLOBAL(CFErrorGetCode) = function(/* CFError */ err) { - return err.code; + return err.code(); } GLOBAL(CFErrorGetDomain) = function(/* CFError */ err) { - return err.domain; + return err.domain(); } GLOBAL(CFErrorCopyDescription) = function(/* CFError */ err) { - return err.description; + return err.description(); } GLOBAL(CFErrorCopyUserInfo) = function(/* CFError */ err) { - return err.userInfo; + return err.userInfo(); } GLOBAL(CFErrorCopyFailureReason) = function(/* CFError */ err) { - return err.failureReason; + return err.failureReason(); } GLOBAL(CFErrorCopyRecoverySuggestion) = function(/* CFError */err) { - return err.recoverySuggestion; + return err.recoverySuggestion(); } From 0038eab6ab951750f9ee296ae3fbf59318ba7dea Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 08:59:35 -0400 Subject: [PATCH 011/106] Add CFError and CFNetworkErrors to the Includes list --- Objective-J/Includes.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Objective-J/Includes.js b/Objective-J/Includes.js index a4373e3a0..43adc2de2 100644 --- a/Objective-J/Includes.js +++ b/Objective-J/Includes.js @@ -38,6 +38,8 @@ #include "CFHTTPRequest.js" #include "CFPropertyList.js" #include "CFDictionary.js" +#include "CFError.js" +#include "CFNetworkErrors.js" #include "CFData.js" #include "CFURL.js" #include "MarkedStream.js" From 96135c9875d5256fba37073ebd3b2dfe35c174a7 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 09:01:42 -0400 Subject: [PATCH 012/106] New: Toll-free bridged CPError with CFError This commit changes CPError to use a toll-free bridge with CFError, matching Cocoa's implementation of this class. --- Foundation/CPError.j | 152 +++++++++++++++++++++++++++++++------------ 1 file changed, 109 insertions(+), 43 deletions(-) diff --git a/Foundation/CPError.j b/Foundation/CPError.j index 4acafe2ce..7062bd08f 100644 --- a/Foundation/CPError.j +++ b/Foundation/CPError.j @@ -24,31 +24,52 @@ @import "CPObject.j" @import "CPString.j" -CPCappuccinoErrorDomain = CPCocoaErrorDomain = @"CPCappuccinoErrorDomain"; -// CPPOSIXErrorDomain = @"CPPOSIXErrorDomain"; -// CPOSStatusErrorDomain = @"CPOSStatusErrorDomain"; +CPCappuccinoErrorDomain = kCFErrorDomainCappuccino; +CPCocoaErrorDomain = kCFErrorDomainCappuccino; // compat -CPUnderlyingErrorKey = @"CPUnderlyingErrorKey"; +CPUnderlyingErrorKey = kCFErrorUnderlyingErrorKey; -CPLocalizedDescriptionKey = @"CPLocalizedDescriptionKey"; -CPLocalizedFailureReasonErrorKey = @"CPLocalizedFailureReasonErrorKey"; -CPLocalizedRecoverySuggestionErrorKey = @"CPLocalizedRecoverySuggestionErrorKey"; +CPLocalizedDescriptionKey = kCFErrorLocalizedDescriptionKey; +CPLocalizedFailureReasonErrorKey = kCFErrorLocalizedFailureReasonKey; +CPLocalizedRecoverySuggestionErrorKey = kCFErrorLocalizedRecoverySuggestionKey; CPLocalizedRecoveryOptionsErrorKey = @"CPLocalizedRecoveryOptionsErrorKey"; CPRecoveryAttempterErrorKey = @"CPRecoveryAttempterErrorKey"; CPHelpAnchorErrorKey = @"CPHelpAnchorErrorKey"; CPStringEncodingErrorKey = @"CPStringEncodingErrorKey"; -CPURLErrorKey = @"CPURLErrorKey"; -CPFilePathErrorKey = @"CPFilePathErrorKey"; +CPURLErrorKey = kCFErrorURLKey; +CPFilePathErrorKey = kCFErrorFilePathKey; +/*! + @class CPError + @ingroup foundation + @brief Used for encapsulating, presenting, and recovery from errors. + CPError is toll-free bridged with CFError() methods. + + An example of initializing a CPError: +
+
+var userInfo = @{CPLocalizedDescriptionKey: @"A localized error description",
+                 CPLocalizedFailureReasonErrorKey: @"A localized failure reason",
+                 CPUnderlyingErrorKey: @"An underlying error message"},
+
+    err = [CPError errorWithDomain:CPCappuccinoErrorDomain code:-10 userInfo:userInfo];
+
+ */ @implementation CPError : CPObject { - CPInteger _code @accessors(property=code, readonly); - CPString _domain @accessors(property=domain, readonly); - CPDictionary _userInfo @accessors(property=userInfo, readonly); } ++ (id)alloc +{ + var obj = new CFError(); + obj.isa = [self class]; + + return obj; +} + + + (id)errorWithDomain:(CPString)aDomain code:(CPInteger)aCode userInfo:(CPDictionary)aDict { return [[CPError alloc] initWithDomain:aDomain code:aCode userInfo:aDict]; @@ -56,44 +77,89 @@ CPFilePathErrorKey = @"CPFilePathErrorKey"; - (id)initWithDomain:(CPString)aDomain code:(CPInteger)aCode userInfo:(CPDictionary)aDict { - if (self = [super init]) - { - _domain = aDomain; - _code = aCode; - _userInfo = aDict; - } - - return self; + var result = new CFError(aDomain, aCode, aDict); + result.isa = [self class]; + return result; } -- (CPString)localizedDescription +- (CPInteger)code { - return [_userInfo objectForKey:CPLocalizedDescriptionKey]; -} - -- (CPString)localizedFailureReason -{ - return [_userInfo objectForKey:CPLocalizedFailureReasonErrorKey]; -} - -- (CPArray)localizedRecoveryOptions -{ - return [_userInfo objectForKey:CPLocalizedRecoveryOptionsErrorKey]; -} - -- (CPString)localizedRecoverySuggestion -{ - return [_userInfo objectForKey:CPLocalizedRecoverySuggestionErrorKey]; -} - -- (id)recoveryAttempter -{ - return [_userInfo objectForKey:CPRecoveryAttempterErrorKey]; + return self.code(); } - (CPString)description { - return [CPString stringWithFormat:@"Error Domain=%@ Code=%d UserInfo=%p %@", _domain, _code, _userInfo, [self localizedDescription]]; + return self.description(); +} + +- (CPString)domain +{ + return self.domain(); +} + +- (CPString)localizedDescription +{ + return self.description(); +} + +- (CPString)localizedFailureReason +{ + return self.failureReason(); +} + +- (CPArray)localizedRecoveryOptions +{ + var userInfo = self.userInfo(), + recoveryOptions = userInfo.valueForKey(CPLocalizedRecoveryOptionsErrorKey); + + return recoveryOptions; +} + +- (CPString)localizedRecoverySuggestion +{ + return self.recoverySuggestion(); +} + +- (id)recoveryAttempter +{ + var userInfo = self.userInfo(), + recoveryAttempter = userInfo.valueForKey(CPRecoveryAttempterErrorKey); + + return recoveryAttempter; +} + +- (CPString)description +{ + return [CPString stringWithFormat:@"Error Domain=%@ Code=%d \"%@\" UserInfo=%@", self.domain(), self.code(), self.description(), self.userInfo()]; } @end + +var CPErrorCodeKey = @"CPErrorCodeKey", + CPErrorDomainKey = @"CPErrorDomainKey", + CPErrorUserInfoKey = @"CPErrorUserInfoKey"; + +@implementation CPError (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + var code = [aCoder decodeIntForKey:CPErrorCodeKey], + domain = [aCoder decodeObjectForKey:CPErrorDomainKey], + userInfo = [aCoder decodeObjectForKey:CPErrorUserInfoKey]; + + return [self initWithDomain:domain + code:code + userInfo:userInfo]; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:self.domain() forKey:CPErrorDomainKey]; + [aCoder encodeObject:self.code() forKey:CPErrorCodeKey]; + [aCoder encodeObject:self.userInfo() forKey:CPErrorUserInfoKey]; +} + +@end + +CFError.prototype.isa = CPError; + From 7811521c0895bbd334cad59674ff5453239be667 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 09:02:56 -0400 Subject: [PATCH 013/106] New: CPURLError definitions This commit adds support for the CPURLError codes, with underlying support provided by Foundation's CFURL Errors. --- Foundation/CPURLError.j | 26 ++++++++++++++++++++++++++ Foundation/Foundation.j | 1 + 2 files changed, 27 insertions(+) create mode 100644 Foundation/CPURLError.j diff --git a/Foundation/CPURLError.j b/Foundation/CPURLError.j new file mode 100644 index 000000000..a54ebdaaf --- /dev/null +++ b/Foundation/CPURLError.j @@ -0,0 +1,26 @@ + +CPURLErrorDomain = @"CPURLErrorDomain"; +CPURLErrorUnknown = -1; +CPURLErrorCancelled = kCFURLErrorCancelled; +CPURLErrorBadURL = kCFURLErrorBadURL; +CPURLErrorTimedOut = kCFURLErrorTimedOut; +CPURLErrorUnsupportedURL = kCFURLErrorUnsupportedURL; +CPURLErrorCannotFindHost = kCFURLErrorCannotFindHost; +CPURLErrorCannotConnectToHost = kCFURLErrorCannotConnectToHost; +CPURLErrorNetworkConnectionLost = kCFURLErrorNetworkConnectionLost; +CPURLErrorDNSLookupFailed = kCFURLErrorDNSLookupFailed; +CPURLErrorHTTPTooManyRedirects = kCFURLErrorHTTPTooManyRedirects; +CPURLErrorResourceUnavailable = kCFURLErrorResourceUnavailable; +CPURLErrorNotConnectedToInternet = kCFURLErrorNotConnectedToInternet; +CPURLErrorRedirectToNonExistentLocation = kCFURLErrorRedirectToNonExistentLocation; +CPURLErrorBadServerResponse = kCFURLErrorBadServerResponse; +CPURLErrorUserCancelledAuthentication = kCFURLErrorUserCancelledAuthentication; +CPURLErrorUserAuthenticationRequired = kCFURLErrorUserAuthenticationRequired; +CPURLErrorZeroByteResource = kCFURLErrorZeroByteResource; +CPURLErrorCannotDecodeRawData = kCFURLErrorCannotDecodeRawData; +CPURLErrorCannotDecodeContentData = kCFURLErrorCannotDecodeContentData; +CPURLErrorCannotParseResponse = kCFURLErrorCannotParseResponse; +CPURLErrorFileDoesNotExist = kCFURLErrorFileDoesNotExist; +CPURLErrorFileIsDirectory = kCFURLErrorFileIsDirectory; +CPURLErrorNoPermissionsToReadFile = kCFURLErrorNoPermissionsToReadFile; +CPURLErrorDataLengthExceedsMaximum = kCFURLErrorDataLengthExceedsMaximum; \ No newline at end of file diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index ab9d5fdb2..3fa485412 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -73,6 +73,7 @@ @import "CPUndoManager.j" @import "CPURL.j" @import "CPURLConnection.j" +@import "CPURLError.j" @import "CPURLRequest.j" @import "CPURLResponse.j" @import "CPUserDefaults.j" From 6fe30547388aa3925641b7786fe503988bfd7115 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 09:04:57 -0400 Subject: [PATCH 014/106] New: Unit tests for CFError methods --- Tests/Objective-J/CFErrorTest.j | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Tests/Objective-J/CFErrorTest.j diff --git a/Tests/Objective-J/CFErrorTest.j b/Tests/Objective-J/CFErrorTest.j new file mode 100644 index 000000000..b839ff723 --- /dev/null +++ b/Tests/Objective-J/CFErrorTest.j @@ -0,0 +1,60 @@ +@import + + +@implementation CFErrorTest : OJTestCase + +- (void)testCreate +{ + var err = new CFError(); + [self assertNotNull:err]; +} + +- (void)testCreateWithParams +{ + var err = new CFError(kCFErrorDomainCappuccino, -1000, nil); + [self assertNotNull:err]; + [self assert:-1000 equals:err.code()]; +} + +- (void)testCreateGlobal +{ + var err = CFErrorCreate(kCFErrorDomainCappuccino, -1000, nil); + [self assertNotNull:err]; + + [self assert:kCFErrorDomainCappuccino equals:err.domain()]; + [self assert:-1000 equals:err.code()]; + [self assert:@"CPErrorDomainCappuccino" equals:CFErrorGetDomain(err)]; +} + +- (void)testCreateWithUserInfoKeysAndValues +{ + var err = CFErrorCreateWithUserInfoKeysAndValues(kCFErrorDomainCappuccino, -1000, [kCFErrorLocalizedDescriptionKey, kCFErrorDescriptionKey], [@"A localized description", @"An error description"], 2); + [self assertNotNull:err]; + + var info = err.userInfo(); + [self assert:2 equals:info.count()]; +} + +- (void)testDescriptionCaseOne +{ + // Description case 1: Localized Key set + var err = CFErrorCreateWithUserInfoKeysAndValues(kCFErrorDomainCappuccino, -1000, [kCFErrorLocalizedDescriptionKey], [@"A localized Description Key"], 1); + [self assert:@"A localized Description Key" equals:err.description()]; + [self assert:@"A localized Description Key" equals:CFErrorCopyDescription(err)]; +} + +- (void)testDescriptionCaseTwo +{ + // Case 2: Reason set; description generated + var err = CFErrorCreateWithUserInfoKeysAndValues(kCFErrorDomainCappuccino, -1000, [kCFErrorLocalizedFailureReasonKey], [@"A localized reason"], 1); + [self assert:@"The operation couldn\u2019t be completed. A localized reason" equals:err.description()]; +} + +- (void)testDescriptionCaseThree +{ + // Case 3: Final fall-back. + var err = CFErrorCreateWithUserInfoKeysAndValues(kCFErrorDomainCappuccino, -1000, [kCFErrorDescriptionKey], [@"A description key"], 1); + [self assert:@"The operation couldn\u2019t be completed. (error -1000 - A description key)" equals:err.description()]; +} + +@end \ No newline at end of file From 2cc67f23ab93a095ba68ab7be5a94e2c39c3bc2e Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 09:12:35 -0400 Subject: [PATCH 015/106] New: CPError unit test --- Tests/Foundation/CPErrorTest.j | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Tests/Foundation/CPErrorTest.j diff --git a/Tests/Foundation/CPErrorTest.j b/Tests/Foundation/CPErrorTest.j new file mode 100644 index 000000000..4705f558a --- /dev/null +++ b/Tests/Foundation/CPErrorTest.j @@ -0,0 +1,24 @@ +@import +@import + +@implementation CPErrorTest : OJTestCase +{ +} + +- (void)testInstanceInstantiation +{ + var err = [[CPError alloc] initWithDomain:CPCappuccinoErrorDomain + code:-10 + userInfo:nil]; + [self assertNotNull:err]; +} + +- (void)testClassInstantiation +{ + var err = [CPError errorWithDomain:CPCappuccinoErrorDomain + code:-10 + userInfo:nil]; + [self assertNotNull:err]; +} + +@end \ No newline at end of file From 660d36e001dc928c7f18d0f744ea0d4ae9e38550 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 09:26:37 -0400 Subject: [PATCH 016/106] Updating CPError tests --- Tests/Foundation/CPErrorTest.j | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Tests/Foundation/CPErrorTest.j b/Tests/Foundation/CPErrorTest.j index 4705f558a..7e482a3a2 100644 --- a/Tests/Foundation/CPErrorTest.j +++ b/Tests/Foundation/CPErrorTest.j @@ -21,4 +21,23 @@ [self assertNotNull:err]; } +- (void)testUserInfoDict +{ + var userInfo = @{ + CPLocalizedDescriptionKey: @"A localized error description", + CPUnderlyingErrorKey: @"An underlying error", + CPLocalizedFailureReasonErrorKey: @"A localized error reason", + CPLocalizedRecoverySuggestionErrorKey: @"The world is about to explode. You can choose to ignore this.", + CPLocalizedRecoveryOptionsErrorKey: ["Cry", "Ignore"] + }, + err = [CPError errorWithDomain:CPCappuccinoErrorDomain + code:-10 + userInfo:userInfo]; + + [self assertNotNull:[err userInfo]]; + [self assert:[err localizedDescription] equals:@"A localized error description"]; + [self assert:[err localizedRecoveryOptions] equals:["Cry", "Ignore"]]; + [self assertNull:[err recoveryAttempter]]; +} + @end \ No newline at end of file From ef5d1d6e58cd6556021818d8c4a34650df4d4622 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 09:27:12 -0400 Subject: [PATCH 017/106] Fixed: Wrong method included on CPError --- Foundation/CPError.j | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Foundation/CPError.j b/Foundation/CPError.j index 7062bd08f..4ac772d61 100644 --- a/Foundation/CPError.j +++ b/Foundation/CPError.j @@ -87,9 +87,9 @@ var userInfo = @{CPLocalizedDescriptionKey: @"A localized error description", return self.code(); } -- (CPString)description +- (CPString)userInfo { - return self.description(); + return self.userInfo(); } - (CPString)domain @@ -97,6 +97,11 @@ var userInfo = @{CPLocalizedDescriptionKey: @"A localized error description", return self.domain(); } +/*! + By default this method returns the object in the user info dictionary for the key + NSLocalizedDescriptionKey. If the user info dictionary doesn’t contain a value for + NSLocalizedDescriptionKey, a default string is constructed from the domain and code. + */ - (CPString)localizedDescription { return self.description(); From 32c252393ab663e8a49d6c4e0800ecbd41638dd0 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 10:01:56 -0400 Subject: [PATCH 018/106] Fixed: Broken unit test --- Tests/Objective-J/CFErrorTest.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Objective-J/CFErrorTest.j b/Tests/Objective-J/CFErrorTest.j index b839ff723..cea9ba69a 100644 --- a/Tests/Objective-J/CFErrorTest.j +++ b/Tests/Objective-J/CFErrorTest.j @@ -23,7 +23,7 @@ [self assert:kCFErrorDomainCappuccino equals:err.domain()]; [self assert:-1000 equals:err.code()]; - [self assert:@"CPErrorDomainCappuccino" equals:CFErrorGetDomain(err)]; + [self assert:@"CPCappuccinoErrorDomain" equals:CFErrorGetDomain(err)]; } - (void)testCreateWithUserInfoKeysAndValues From 9621d76faa68c52b8c323c92ca8ef8779f1be652 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 12:10:23 -0400 Subject: [PATCH 019/106] Fixed: NativeHost is no longer built by default This commit removes NativeHost from the 'Tools' Jakefile, ensuring that it does not get built by default. Fixes #2239 --- Tools/Jakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/Jakefile b/Tools/Jakefile index d57ab7c6c..b0f0b52a8 100644 --- a/Tools/Jakefile +++ b/Tools/Jakefile @@ -2,6 +2,6 @@ require("../common.jake"); // nib2cib uses fontinfo and imagesize and capp uses nib2cib -subtasks(["fontinfo", "imagesize", "nib2cib", "capp", "capp_lint", "dump_theme", "NativeHost", "XcodeCapp"], ["build"/*, "clean", "clobber"*/]); +subtasks(["fontinfo", "imagesize", "nib2cib", "capp", "capp_lint", "dump_theme", "XcodeCapp"], ["build", /*"clean", "clobber"*/]); subtasks(["fontinfo", "imagesize"], ["clean", "clobber"]); From c37f0cfaa9bae48269f06fbc3889613964893f75 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Sat, 1 Nov 2014 12:20:03 -0400 Subject: [PATCH 020/106] Fixed: Removed old CI scripts from the Tools directory The Tools directory contained some old scripts for a previous continuous integration system. Since we're using Travis now, these are no longer needed. --- Tools/Scripts/ci-extra-nightlies.sh | 10 -------- Tools/Scripts/ci.sh | 36 ----------------------------- Tools/Scripts/cruise_config.rb | 6 ----- Tools/Scripts/githooks/pre-commit | 3 --- 4 files changed, 55 deletions(-) delete mode 100644 Tools/Scripts/ci-extra-nightlies.sh delete mode 100755 Tools/Scripts/ci.sh delete mode 100644 Tools/Scripts/cruise_config.rb delete mode 100755 Tools/Scripts/githooks/pre-commit diff --git a/Tools/Scripts/ci-extra-nightlies.sh b/Tools/Scripts/ci-extra-nightlies.sh deleted file mode 100644 index b0726ab50..000000000 --- a/Tools/Scripts/ci-extra-nightlies.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -PACKAGE_BRANCH="nightly" jake push-packages -code=$? -if [ $code -ne 0 ]; then - echo "NIGHTLY BUILD PUSH FAILED ($code)" - exit $code -else - echo "NIGHTLY BUILD PUSH SUCCEEDED" -fi diff --git a/Tools/Scripts/ci.sh b/Tools/Scripts/ci.sh deleted file mode 100755 index 4cce6225e..000000000 --- a/Tools/Scripts/ci.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -project_home="$(dirname "$PWD")" -extras="$project_home/ci-extra.sh" - -export PATH="$HOME/narwhal/bin:$PATH" -export CAPP_AUTO_UPGRADE="yes" - -export CAPP_BUILD="$project_home/build_incremental" -time jake CommonJS test-only -code=$? -if [ $code -ne 0 ]; then - echo "INCREMENTAL BUILD FAILED ($code)" - exit $code -else - echo "INCREMENTAL BUILD SUCCEEDED" -fi - -export CAPP_BUILD="$project_home/build_clean" -rm -rf "$CAPP_BUILD" - -time jake CommonJS test-only -code=$? -if [ $code -ne 0 ]; then - echo "CLEAN BUILD FAILED ($code)" - exit $code -else - echo "CLEAN BUILD SUCCEEDED" -fi - -# run any additional ci commands not common to all branches (like nightly builds) -if [ -f "$extras" ]; then - source "$extras" -fi - -exit 0 diff --git a/Tools/Scripts/cruise_config.rb b/Tools/Scripts/cruise_config.rb deleted file mode 100644 index 17c14a20d..000000000 --- a/Tools/Scripts/cruise_config.rb +++ /dev/null @@ -1,6 +0,0 @@ -Project.configure do |project| - - project.email_notifier.emails = ['objjbuild@googlegroups.com'] - project.build_command = 'Tools/Scripts/ci.sh' - -end diff --git a/Tools/Scripts/githooks/pre-commit b/Tools/Scripts/githooks/pre-commit deleted file mode 100755 index e5f2f4587..000000000 --- a/Tools/Scripts/githooks/pre-commit +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -jake test-only From 491b5dcd6f0b598d432bb6b35bbf1c62568cc2c7 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 5 Nov 2014 14:13:08 -0800 Subject: [PATCH 021/106] Fixed: text cursor for CPTextField class doesn't take content-inset in account Previously, the text cursor of the CPTextField didn't take in account the content-inset. This raised issue with class as the CPComboBox, when the mouse was over the popUpButton, there was still the text cursor instead of the default one. Now it works as in Cocoa. --- AppKit/CPTextField.j | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 5f11f1d6e..fc3d833d9 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -350,8 +350,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); _sendActionOn = CPKeyUpMask | CPKeyDownMask; [self setValue:CPLeftTextAlignment forThemeAttribute:@"alignment"]; - - [self _updateCursor]; } return self; @@ -373,8 +371,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if (shouldBeEditable) _isSelectable = YES; - [self _updateCursor]; - if (_isEditable) [self setThemeState:CPThemeStateEditable]; else @@ -405,7 +401,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)setEnabled:(BOOL)shouldBeEnabled { [super setEnabled:shouldBeEnabled]; - [self _updateCursor]; // We only allow first responder status if the field is enabled. if (!shouldBeEnabled && [[self window] firstResponder] === self) @@ -419,8 +414,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)setSelectable:(BOOL)aFlag { _isSelectable = aFlag; - - [self _updateCursor]; } /*! @@ -930,6 +923,12 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]]; } +- (void)mouseMoved:(CPEvent)anEvent +{ + [super mouseMoved:anEvent]; + [self _updateCursorForEvent:anEvent]; +} + - (void)mouseDown:(CPEvent)anEvent { // Don't track! (ever?) @@ -1140,9 +1139,14 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [super textDidChange:note]; } -- (void)_updateCursor +- (void)_updateCursorForEvent:(CPEvent)anEvent { - if ([self isEnabled] && ([self isSelectable] || [self isEditable])) + var frame = CGRectMakeCopy([self frame]), + contentInset = [self currentValueForThemeAttribute:@"content-inset"]; + + frame = [[self superview] convertRectToBase:CGRectInsetByInset(frame, contentInset)]; + + if ([self isEnabled] && ([self isSelectable] || [self isEditable]) && CGRectContainsPoint(frame, [anEvent locationInWindow])) { #if PLATFORM(DOM) self._DOMElement.style.cursor = "text"; @@ -1966,8 +1970,6 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]]; [self setPlaceholderString:[aCoder decodeObjectForKey:CPTextFieldPlaceholderStringKey]]; - - [self _updateCursor]; } return self; From fc43ec818596c5410f0bc5ee362f5dc2bb027afa Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 5 Nov 2014 14:26:34 -0800 Subject: [PATCH 022/106] Fixed: wrong content-inset for CPComboBox Previously, the content-inset of a CPComboBox was wrong, the text of the controller was over the popUPButton. --- AppKit/Themes/Aristo/ThemeDescriptors.j | 4 ++-- AppKit/Themes/Aristo2/ThemeDescriptors.j | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 3cc69832c..efbbb1c23 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -1820,8 +1820,8 @@ var themedButtonValues = nil, // The right border inset has to make room for the focus ring and popup button [@"content-inset", CGInsetMake(8.0, 27.0, 7.0, 8.0), [CPThemeStateBezeled, CPComboBoxStateButtonBordered]], - [@"content-inset", CGInsetMake(8.0, 24.0, 7.0, 8.0), CPThemeStateBezeled], - [@"content-inset", CGInsetMake(8.0, 24.0, 7.0, 8.0), [CPThemeStateBezeled, CPThemeStateEditing]], + [@"content-inset", CGInsetMake(8.0, 27.0, 7.0, 8.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(8.0, 27.0, 7.0, 8.0), [CPThemeStateBezeled, CPThemeStateEditing]], [@"popup-button-size", CGSizeMake(21.0, 23.0), [CPThemeStateBezeled, CPComboBoxStateButtonBordered]], [@"popup-button-size", CGSizeMake(17.0, 23.0), CPThemeStateBezeled], diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index c669539b5..f5f11c7f5 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -1312,9 +1312,9 @@ var themedButtonValues = nil, [@"bezel-inset", CGInsetMake(3.0, 5.0, 3.0, 4.0), [CPThemeStateBezeled, CPThemeStateDisabled]], // The right border inset has to make room for the focus ring and popup button - [@"content-inset", CGInsetMake(9.0, 26.0, 7.0, 10.0), [CPThemeStateBezeled, CPComboBoxStateButtonBordered]], - [@"content-inset", CGInsetMake(9.0, 26.0, 7.0, 10.0), CPThemeStateBezeled], - [@"content-inset", CGInsetMake(9.0, 24.0, 7.0, 10.0), [CPThemeStateBezeled, CPThemeStateEditing]], + [@"content-inset", CGInsetMake(9.0, 30.0, 7.0, 10.0), [CPThemeStateBezeled, CPComboBoxStateButtonBordered]], + [@"content-inset", CGInsetMake(9.0, 30.0, 7.0, 10.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(9.0, 28.0, 7.0, 10.0), [CPThemeStateBezeled, CPThemeStateEditing]], [@"popup-button-size", CGSizeMake(21.0, 23.0), [CPThemeStateBezeled, CPComboBoxStateButtonBordered]], [@"popup-button-size", CGSizeMake(17.0, 23.0), CPThemeStateBezeled], From ea0c5e291fa8469ecd6e1a8dae6fce12c990032f Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 6 Nov 2014 09:38:30 -0800 Subject: [PATCH 023/106] Fixed: notification xib converted wasn't displayed anymore Previously, the notification xib converted didn't show up. Now it does again. This PR fixes another issue. Now when checking the the compilation issues, we only pass objj file to the command objj. --- .../XcodeCapp/ProcessSourceOperation.m | 10 +++----- Tools/XcodeCapp/XcodeCapp/XcodeCapp.m | 25 +++++++++++++++---- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.m b/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.m index 2c4858f2b..f41ffbddf 100644 --- a/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.m +++ b/Tools/XcodeCapp/XcodeCapp/ProcessSourceOperation.m @@ -158,20 +158,16 @@ } else if (!self.xcc.isLoadingProject) { - BOOL showFinalNotification = NO; + BOOL showFinalNotification = YES; // At this point, we should only detect warnings - if ([self.xcc shouldProcessWithObjjWarnings]) + if ([self.xcc shouldProcessWithObjjWarnings] && ![self.xcc isXibFile:self.sourcePath]) { showFinalNotification = [self.xcc checkObjjWarningsForPath:[NSArray arrayWithObject:self.sourcePath]]; [self.xcc showObjjWarnings]; } - else - { - showFinalNotification = YES; - } - if ([self.xcc shouldProcessWithCappLint]) + if ([self.xcc shouldProcessWithCappLint] && ![self.xcc isXibFile:self.sourcePath]) { showFinalNotification = [self.xcc checkCappLintForPath:[NSArray arrayWithObject:self.sourcePath]] && showFinalNotification; [self.xcc showCappLintWarnings]; diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m index 52f3920f6..f3998a0a3 100644 --- a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m @@ -1852,15 +1852,26 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, DDLogVerbose(@"Checking path %@ with objj", paths); NSUInteger numberOfFiles = [paths count]; + NSUInteger i = 0; + NSMutableArray *objjPaths = [NSMutableArray array]; - if (!numberOfFiles) + // We only want the objj files + for (i = 0; i < numberOfFiles; i++) + { + NSString *path = [paths objectAtIndex:i]; + + if ([self isObjjFile:path]) + [objjPaths addObject:path]; + } + + if (![objjPaths count]) return YES; [[NSNotificationCenter defaultCenter] postNotificationName:XCCBatchDidStartNotification object:self]; [[NSNotificationCenter defaultCenter] postNotificationName:XCCObjjDidStartNotification object:self]; NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"-I", [self _getObjjIncludePaths], @"-m", nil]; - [arguments addObjectsFromArray:paths]; + [arguments addObjectsFromArray:objjPaths]; NSDictionary *taskResult = [self runTaskWithLaunchPath:self.executablePaths[@"objj"] arguments:arguments @@ -1879,7 +1890,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, NSMutableArray *errors = [NSMutableArray arrayWithArray:[response componentsSeparatedByString:@"\n\n"]]; NSInteger numberOfErrors = [errors count]; - NSInteger i = 0; + i = 0; NSMutableArray *dicts = [NSMutableArray array]; // When checking of the entire project, we have to be ready to find errors @@ -1906,8 +1917,12 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, if (![matches count]) { - DDLogVerbose(@"Error %@ has been ignored by xCodeCapp, the error doesn't respect any pattern", error); - continue; + // This shouldn't happen + DDLogVerbose(@"Error %@ doesn't respect any pattern", error); + + path = @""; + line = 0; + messageError = [NSString stringWithFormat:@"Compiling issue at line %@ of file %@:\n%@", line, path.lastPathComponent, error]; } for (NSTextCheckingResult *match in matches) From 26223bb38344f8751b43ffa7aa1f9db14ad08184 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 6 Nov 2014 09:52:40 -0800 Subject: [PATCH 024/106] Fixed: include path doesn't take the absolute path --- Tools/XcodeCapp/XcodeCapp/XcodeCapp.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m index f3998a0a3..f326c2654 100644 --- a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m @@ -1842,9 +1842,9 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, NSArray *matches = [regulareExpressionFramework matchesInString:response options:0 range:NSMakeRange(0, [response length])]; for (NSTextCheckingResult *match in matches) - return [response substringWithRange:[match rangeAtIndex:1]]; + return [NSString stringWithFormat:@"%@/%@", self.projectPath, [response substringWithRange:[match rangeAtIndex:1]]]; - return @"Frameworks/"; + return [NSString stringWithFormat:@"%@/%@", self.projectPath ,@"Frameworks/"]; } - (BOOL)checkObjjWarningsForPath:(NSArray*)paths From 8ee443a43c6e04391a0b04f1f315251658b03a30 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 6 Nov 2014 10:10:05 -0800 Subject: [PATCH 025/106] NEW: @typedef and ivar type warning Previously, ObjJ was ignoring unknow ivar type. This patch adds some check to ensure the type is either a known class, the current class itself, a global, a basic JS type or a declared custom type. In order to declare custom types, this patch introduces the @typedef keyword. For instance, this will throw a warning: ```objj @import @implementation MyClass: CPObject { NUSuppaType mode; } @end ``` This will not: ```objj @import @typedef NUSuppaType @implementation NUMyClass: CPObject { NUSuppaType mode; } @end ``` Declared types are shared accross all application, one type can only be declared once. --- Objective-J/ObjJAcornCompiler.js | 82 ++++++++++++++++++++++++++++++-- Objective-J/Runtime.js | 33 +++++++++++++ Objective-J/acorn.js | 78 +++++++++++++++++++----------- Objective-J/acornwalk.js | 2 + 4 files changed, 161 insertions(+), 34 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 08b231ebe..fd6f020d3 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -353,6 +353,11 @@ ProtocolDef.prototype.getClassMethod = function(name) { return null; } +var TypeDef = function(name) +{ + this.name = name; +} + // methodDef = {"types": types, "name": selector} var MethodDef = function(name, types) { @@ -369,7 +374,7 @@ var wordPrefixOperators = exports.acorn.makePredicate("delete in instanceof new var isLogicalBinary = exports.acorn.makePredicate("LogicalExpression BinaryExpression"); var isInInstanceof = exports.acorn.makePredicate("in instanceof"); -var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, /*unsigned*/ pass, /* Dictionary */ classDefs, /* Dictionary */ protocolDefs) +var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, /*unsigned*/ pass, /* Dictionary */ classDefs, /* Dictionary */ protocolDefs, /* Dictionary */ typeDefs) { this.source = aString; this.URL = new CFURL(aURL); @@ -399,6 +404,7 @@ var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned* this.flags = flags | ObjJAcornCompiler.Flags.IncludeDebugSymbols; this.classDefs = classDefs ? classDefs : Object.create(null); this.protocolDefs = protocolDefs ? protocolDefs : Object.create(null); + this.typeDefs = typeDefs ? typeDefs : Object.create(null); this.lastPos = 0; if (currentCompilerFlags & ObjJAcornCompiler.Flags.Generate) this.generate = true; @@ -415,9 +421,9 @@ exports.ObjJAcornCompiler.compileToExecutable = function(/*String*/ aString, /*C return new ObjJAcornCompiler(aString, aURL, flags, 2).executable(); } -exports.ObjJAcornCompiler.compileToIMBuffer = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, classDefs, protocolDefs) +exports.ObjJAcornCompiler.compileToIMBuffer = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags, classDefs, protocolDefs, typeDefs) { - return new ObjJAcornCompiler(aString, aURL, flags, 2, classDefs, protocolDefs).IMBuffer(); + return new ObjJAcornCompiler(aString, aURL, flags, 2, classDefs, protocolDefs, typeDefs).IMBuffer(); } exports.ObjJAcornCompiler.compileFileDependencies = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned*/ flags) @@ -581,6 +587,31 @@ ObjJAcornCompiler.prototype.getProtocolDef = function(/* String */ aProtocolName // protocolDef = {"name": protocolName, "protocols": Object.create(null), "required": Object.create(null), "optional": Object.create(null)}; } +ObjJAcornCompiler.prototype.getTypeDef = function(/* String */ aTypeDefName) +{ + if (!aTypeDefName) + return null; + + var t = this.typeDefs[aTypeDefName]; + + if (t) + return t; + + if (typeof objj_getTypeDef === 'function') + { + var aTypeDef = objj_getTypeDef(aTypeDefName); + if (aTypeDef) + { + var typeDefName = typeDef_getName(aTypeDef) + t = new TypeDef(typeDefName); + this.typeDefs[typeDefName] = t; + return t; + } + } + + return null; +} + ObjJAcornCompiler.methodDefsFromMethodList = function(/* Array */ methodList) { var methodSize = methodList.length, @@ -1715,12 +1746,19 @@ ClassDeclarationStatement: function(node, st, c) { { var ivarDecl = node.ivardeclarations[i], ivarType = ivarDecl.ivartype ? ivarDecl.ivartype.name : null, + ivarTypeIsClass = ivarDecl.ivartype ? ivarDecl.ivartype.typeisclass : false, ivarName = ivarDecl.id.name, ivar = {"type": ivarType, "name": ivarName}, accessors = ivarDecl.accessors; if (ivars[ivarName]) - throw compiler.error_message("Instance variable '" + ivarName + "'is already declared for class " + className, ivarDecl.id); + throw compiler.error_message("Instance variable '" + ivarName + "' is already declared for class " + className, ivarDecl.id); + + var isTypeDefined = !ivarTypeIsClass || typeof global[ivarType] !== "undefined" || typeof window[ivarType] !== "undefined" + || compiler.getClassDef(ivarType) || compiler.getTypeDef(ivarType) || ivarType == classDef.name; + + if (!isTypeDefined) + compiler.addWarning(createMessage("Unknown type '" + ivarType + "' for ivar '" + ivarName + "'", ivarDecl.id, compiler.source)); if (firstIvarDeclaration) { @@ -1824,7 +1862,7 @@ ClassDeclarationStatement: function(node, st, c) { // Remove all @accessors or we will get a recursive loop in infinity var b = getterSetterBuffer.toString().replace(/@accessors(\(.*\))?/g, ""); - var imBuffer = ObjJAcornCompiler.compileToIMBuffer(b, "Accessors", compiler.flags, compiler.classDefs, compiler.protocolDefs); + var imBuffer = ObjJAcornCompiler.compileToIMBuffer(b, "Accessors", compiler.flags, compiler.classDefs, compiler.protocolDefs, compiler.typeDefs); // Add the accessors methods first to instance method buffer. // This will allow manually added set and get methods to override the compiler generated @@ -2393,5 +2431,39 @@ PreprocessStatement: function(node, st, c) { compiler.lastPos = node.start; compiler.jsBuffer.concat("//"); } +}, +TypeDefStatement: function(node, st, c) { + + var compiler = st.compiler, + generate = compiler.generate, + buffer = compiler.jsBuffer, + typeDefName = node.typedefname.name, + typeDef = compiler.getTypeDef(typeDefName), + typeDefScope = new Scope(st); + + if (typeDef) + throw compiler.error_message("Duplicate type definition " + typeDefName, node.typedefname); + + compiler.imBuffer = new StringBuffer(); + compiler.cmBuffer = new StringBuffer(); + + if (!generate) + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + + buffer.concat("{var the_typedef = objj_allocateTypeDef(\"" + typeDefName + "\");"); + + typeDef = new TypeDef(typeDefName); + compiler.typeDefs[typeDefName] = typeDef; + typeDefScope.typeDef = typeDef; + + buffer.concat("\nobjj_registerTypeDef(the_typedef);\n"); + + buffer.concat("}"); + + compiler.jsBuffer = buffer; + + // Skip the "@end" + if (!generate) + compiler.lastPos = node.end; } }); diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js index 75a43bf78..e352cf3e1 100644 --- a/Objective-J/Runtime.js +++ b/Objective-J/Runtime.js @@ -100,6 +100,11 @@ GLOBAL(objj_object) = function() this._UID = -1; } +GLOBAL(objj_typeDef) = function(/*String*/ aName) +{ + this.name = aName; +} + // Working with Classes GLOBAL(class_getName) = function(/*Class*/ aClass) @@ -440,6 +445,26 @@ GLOBAL(protocol_addProtocol) = function(/*Protocol*/ proto, /*Protocol*/ additio (proto.protocol_list || (proto.protocol_list = [])).push(addition); } + +var REGISTERED_TYPEDEFS = Object.create(null); + +GLOBAL(objj_allocateTypeDef) = function(/*String*/ aName) +{ + var typeDef = new objj_typeDef(aName); + + return typeDef; +} + +GLOBAL(objj_registerTypeDef) = function(/*TypeDef*/ typeDef) +{ + REGISTERED_TYPEDEFS[typeDef.name] = typeDef; +} + +GLOBAL(typeDef_getName) = function(/*TypeDef*/ typeDef) +{ + return typeDef.name; +} + var _class_initialize = function(/*Class*/ aClass) { var meta = GETMETA(aClass); @@ -619,6 +644,7 @@ GLOBAL(objj_resetRegisterClasses) = function() REGISTERED_CLASSES = Object.create(null); REGISTERED_PROTOCOLS = Object.create(null); + REGISTERED_TYPEDEFS = Object.create(null); resetBundle(); } @@ -751,6 +777,13 @@ GLOBAL(objj_getProtocol) = function(/*String*/ aName) return REGISTERED_PROTOCOLS[aName]; } +// Working with typeDef + +GLOBAL(objj_getTypeDef) = function(/*String*/ aName) +{ + return REGISTERED_TYPEDEFS[aName]; +} + // Working with Instance Variables GLOBAL(ivar_getName) = function(anIvar) diff --git a/Objective-J/acorn.js b/Objective-J/acorn.js index f12994057..594111ee0 100644 --- a/Objective-J/acorn.js +++ b/Objective-J/acorn.js @@ -375,12 +375,15 @@ if (typeof exports != "undefined" && !exports.acorn) { var _ref = {keyword: "ref"}, _deref = {keyword: "deref"}; var _protocol = {keyword: "protocol"}, _optional = {keyword: "optional"}, _required = {keyword: "required"}; var _interface = {keyword: "interface"}; + var _typedef = {keyword: "typedef"}; // Objective-J keywords var _filename = {keyword: "filename"}, _unsigned = {keyword: "unsigned", okAsIdent: true}, _signed = {keyword: "signed", okAsIdent: true}; var _byte = {keyword: "byte", okAsIdent: true}, _char = {keyword: "char", okAsIdent: true}, _short = {keyword: "short", okAsIdent: true}; var _int = {keyword: "int", okAsIdent: true}, _long = {keyword: "long", okAsIdent: true}, _id = {keyword: "id", okAsIdent: true}; + var _boolean = {keyword: "BOOL", okAsIdent: true}, _SEL = {keyword: "SEL", okAsIdent: true}, _float = {keyword: "float", okAsIdent: true}; + var _double = {keyword: "double", okAsIdent: true}; var _preprocess = {keyword: "#"}; // Preprocessor keywords @@ -415,14 +418,15 @@ if (typeof exports != "undefined" && !exports.acorn) { // Map Objective-J keyword names to token types. var keywordTypesObjJ = {"IBAction": _action, "IBOutlet": _outlet, "unsigned": _unsigned, "signed": _signed, "byte": _byte, "char": _char, - "short": _short, "int": _int, "long": _long, "id": _id }; + "short": _short, "int": _int, "long": _long, "id": _id, "float": _float, "BOOL": _boolean, "SEL": _SEL, + "double": _double}; // Map Objective-J "@" keyword names to token types. var objJAtKeywordTypes = {"implementation": _implementation, "outlet": _outlet, "accessors": _accessors, "end": _end, "import": _import, "action": _action, "selector": _selector, "class": _class, "global": _global, "ref": _ref, "deref": _deref, "protocol": _protocol, "optional": _optional, "required": _required, - "interface": _interface}; + "interface": _interface, "typedef": _typedef}; // Map Preprocessor keyword names to token types. @@ -547,7 +551,7 @@ if (typeof exports != "undefined" && !exports.acorn) { // The Objective-J keywords. - var isKeywordObjJ = makePredicate("IBAction IBOutlet byte char short int long unsigned signed id"); + var isKeywordObjJ = makePredicate("IBAction IBOutlet byte char short int long float unsigned signed id BOOL SEL double"); // The preprocessor keywords. @@ -662,6 +666,7 @@ var preprocessTokens = [_preIf, _preIfdef, _preIfndef, _preElse, _preElseIf, _pr } } } + tokVal = val; lastTokCommentsAfter = tokCommentsAfter; lastTokSpacesAfter = tokSpacesAfter; @@ -2277,6 +2282,15 @@ var preIfLevel = 0; } break; + // This is a Objective-J statement + case _typedef: + if (options.objj) { + next(); + node.typedefname = parseIdent(true); + return finishNode(node, "TypeDefStatement"); + } + break; + } // The indentation is one step to the right here to make sure it @@ -2317,6 +2331,7 @@ var preIfLevel = 0; if (outlet) decl.outlet = outlet; decl.ivartype = type; + // print("keyword: " + type.name + " is class " + type.typeisclass) decl.id = parseIdent(); if (strict && isStrictBadIdWord(decl.id.name)) raise(decl.id.start, "Binding " + decl.id.name + " in strict mode"); @@ -3021,6 +3036,7 @@ var preIfLevel = 0; node.typeisclass = true; next(); } else { + node.typeisclass = false; node.name = tokType.keyword; // Do nothing more if it is 'void' if (!eat(_void)) { @@ -3043,32 +3059,36 @@ var preIfLevel = 0; } else { // Now check if it is some basic type or an approved combination of basic types var nextKeyWord; - if (eat(_signed) || eat(_unsigned)) - nextKeyWord = tokType.keyword || true; - if (eat(_char) || eat(_byte) || eat(_short)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; - } else { - if (eat(_int)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; - } - if (eat(_long)) { - if (nextKeyWord) - node.name += " " + nextKeyWord; - nextKeyWord = tokType.keyword || true; - if (eat(_long)) { - node.name += " " + nextKeyWord; - } - } - } - if (!nextKeyWord) { - // It must be a class name if it was not a basic type. // FIXME: This is not true - node.name = (!options.forbidReserved && tokType.keyword) || unexpected(); - node.typeisclass = true; - next(); + if (eat(_float) || eat(_boolean) || eat(_SEL) || eat(_double)) + nextKeyWord = tokType.keyword; + else { + if (eat(_signed) || eat(_unsigned)) + nextKeyWord = tokType.keyword || true; + if (eat(_char) || eat(_byte) || eat(_short)) { + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + } else { + if (eat(_int)) { + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + } + if (eat(_long)) { + if (nextKeyWord) + node.name += " " + nextKeyWord; + nextKeyWord = tokType.keyword || true; + if (eat(_long)) { + node.name += " " + nextKeyWord; + } + } + } + if (!nextKeyWord) { + // It must be a class name if it was not a basic type. // FIXME: This is not true + node.name = (!options.forbidReserved && tokType.keyword) || unexpected(); + node.typeisclass = true; + next(); + } } } } diff --git a/Objective-J/acornwalk.js b/Objective-J/acornwalk.js index 87753e3f4..8d5666529 100644 --- a/Objective-J/acornwalk.js +++ b/Objective-J/acornwalk.js @@ -221,6 +221,8 @@ if (!exports.acorn) { } } + exports.TypeDefStatement = ignore; + exports.MethodDeclarationStatement = function(node, st, c) { var body = node.body; if (body) From f9275a70afe88236fb6cbe8c90c749ccdf8bb02b Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 6 Nov 2014 10:17:05 -0800 Subject: [PATCH 026/106] FIXED: New warnings reveleaded by ivar type checking This patch fixes all new warnings --- AppKit/CPAlert.j | 97 +++--- AppKit/CPAnimation.j | 17 +- AppKit/CPApplication.j | 2 + AppKit/CPArrayController.j | 2 +- AppKit/CPBox.j | 3 + AppKit/CPButton.j | 4 +- AppKit/CPCollectionView.j | 1 + AppKit/CPColorPanel.j | 3 + AppKit/CPColorPicker.j | 2 + AppKit/CPComboBox.j | 2 +- AppKit/CPControl.j | 6 + AppKit/CPDatePicker/_CPDatePickerCalendar.j | 2 + AppKit/CPDatePicker/_CPDatePickerTextField.j | 6 +- AppKit/CPDragServer_Constants.j | 1 + AppKit/CPEvent.j | 5 + AppKit/CPImageView.j | 1 + AppKit/CPKeyValueBinding.j | 1 + AppKit/CPLevelIndicator.j | 2 + AppKit/CPMenu/_CPMenuBarWindow.j | 1 + AppKit/CPMenu/_CPMenuWindow.j | 2 + AppKit/CPMenuItem/_CPMenuItemMenuBarView.j | 1 + AppKit/CPMenuItem/_CPMenuItemStandardView.j | 3 + AppKit/CPMenuItem/_CPMenuItemView.j | 1 + AppKit/CPPasteboard.j | 3 +- AppKit/CPProgressIndicator.j | 1 + AppKit/CPRadio.j | 2 + AppKit/CPResponder.j | 1 + AppKit/CPRuleEditor/CPRuleEditor_Constants.j | 2 + AppKit/CPRuleEditor/_CPPredicateEditorTree.j | 2 + AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j | 2 + .../CPRuleEditor/_CPRuleEditorViewSliceRow.j | 2 + AppKit/CPScroller.j | 2 + AppKit/CPSegmentedControl.j | 1 + AppKit/CPShadowView.j | 2 +- AppKit/CPTabView.j | 1 + AppKit/CPTabViewItem.j | 2 +- AppKit/CPTableColumn.j | 1 + AppKit/CPTableView.j | 3 +- AppKit/CPTextField.j | 1 + AppKit/CPTheme.j | 1 + AppKit/CPTokenField.j | 3 + AppKit/CPToolbar.j | 4 +- AppKit/CPView.j | 3 + AppKit/CPWebView.j | 2 +- AppKit/CPWindow/CPWindow.j | 6 + AppKit/CPWindow/CPWindow_Constants.j | 2 + AppKit/CoreGraphics/CGAffineTransform.j | 2 + AppKit/CoreGraphics/CGColorSpace.j | 2 + AppKit/CoreGraphics/CGContext.j | 1 + AppKit/CoreGraphics/CGGradient.j | 1 + AppKit/CoreGraphics/CGPath.j | 3 +- AppKit/Platform/CPPlatformWindow.j | 3 + AppKit/_CPImageAndTextView.j | 2 +- AppKit/_CPPopUpList.j | 214 ++++++------- AppKit/_CPToolbarItem.j | 1 + Foundation/CPDateFormatter.j | 2 + Foundation/CPDecimal.j | 3 + Foundation/CPDictionary.j | 66 ++-- Foundation/CPGeometry.j | 1 + Foundation/CPJSONPConnection.j | 1 + Foundation/CPNotificationCenter.j | 291 +++++++++--------- Foundation/CPNumberFormatter.j | 3 +- Foundation/CPObject.j | 4 +- .../CPPredicate/CPComparisonPredicate.j | 4 +- Foundation/CPPredicate/CPCompoundPredicate.j | 2 +- Foundation/CPRange.j | 2 + Foundation/CPURLConnection.j | 2 + Foundation/CPUndoManager.j | 2 +- Foundation/CPUserSessionManager.j | 1 + Foundation/_CGGeometry.j | 6 + Foundation/_CPTypeDefinitions.j | 30 ++ 71 files changed, 496 insertions(+), 367 deletions(-) create mode 100644 Foundation/_CPTypeDefinitions.j diff --git a/AppKit/CPAlert.j b/AppKit/CPAlert.j index cbd40cfe6..2dec01211 100644 --- a/AppKit/CPAlert.j +++ b/AppKit/CPAlert.j @@ -44,6 +44,7 @@ var CPAlertDelegate_alertShowHelp_ = 1 << 0, CPAlertDelegate_alertDidEnd_returnCode_ = 1 << 1; +@typedef CPAlertStyle /* @global @group CPAlertStyle @@ -70,6 +71,54 @@ var bottomHeight = 71; @end + +@implementation _CPAlertThemeView : CPView + ++ (CPString)defaultThemeClass +{ + return @"alert"; +} + ++ (CPDictionary)themeAttributes +{ + return @{ + @"size": CGSizeMake(400.0, 110.0), + @"content-inset": CGInsetMake(15, 15, 15, 50), + @"informative-offset": 6, + @"button-offset": 10, + @"message-text-alignment": CPJustifiedTextAlignment, + @"message-text-color": [CPColor blackColor], + @"message-text-font": [CPFont boldSystemFontOfSize:13.0], + @"message-text-shadow-color": [CPNull null], + @"message-text-shadow-offset": CGSizeMakeZero(), + @"informative-text-alignment": CPJustifiedTextAlignment, + @"informative-text-color": [CPColor blackColor], + @"informative-text-font": [CPFont systemFontOfSize:12.0], + @"informative-text-shadow-color": [CPNull null], + @"informative-text-shadow-offset": CGSizeMakeZero(), + @"image-offset": CGPointMake(15, 12), + @"information-image": [CPNull null], + @"warning-image": [CPNull null], + @"error-image": [CPNull null], + @"help-image": [CPNull null], + @"help-image-left-offset": 15, + @"help-image-pressed": [CPNull null], + @"suppression-button-y-offset": 0.0, + @"suppression-button-x-offset": 0.0, + @"default-elements-margin": 3.0, + @"suppression-button-text-color": [CPColor blackColor], + @"suppression-button-text-font": [CPFont systemFontOfSize:12.0], + @"suppression-button-text-shadow-color": [CPNull null], + @"suppression-button-text-shadow-offset": 0.0, + @"modal-window-button-margin-y": 0.0, + @"modal-window-button-margin-x": 0.0, + @"standard-window-button-margin-y": 0.0, + @"standard-window-button-margin-x": 0.0, + }; +} + +@end + /*! @ingroup appkit @@ -813,51 +862,3 @@ var bottomHeight = 71; } @end - - -@implementation _CPAlertThemeView : CPView - -+ (CPString)defaultThemeClass -{ - return @"alert"; -} - -+ (CPDictionary)themeAttributes -{ - return @{ - @"size": CGSizeMake(400.0, 110.0), - @"content-inset": CGInsetMake(15, 15, 15, 50), - @"informative-offset": 6, - @"button-offset": 10, - @"message-text-alignment": CPJustifiedTextAlignment, - @"message-text-color": [CPColor blackColor], - @"message-text-font": [CPFont boldSystemFontOfSize:13.0], - @"message-text-shadow-color": [CPNull null], - @"message-text-shadow-offset": CGSizeMakeZero(), - @"informative-text-alignment": CPJustifiedTextAlignment, - @"informative-text-color": [CPColor blackColor], - @"informative-text-font": [CPFont systemFontOfSize:12.0], - @"informative-text-shadow-color": [CPNull null], - @"informative-text-shadow-offset": CGSizeMakeZero(), - @"image-offset": CGPointMake(15, 12), - @"information-image": [CPNull null], - @"warning-image": [CPNull null], - @"error-image": [CPNull null], - @"help-image": [CPNull null], - @"help-image-left-offset": 15, - @"help-image-pressed": [CPNull null], - @"suppression-button-y-offset": 0.0, - @"suppression-button-x-offset": 0.0, - @"default-elements-margin": 3.0, - @"suppression-button-text-color": [CPColor blackColor], - @"suppression-button-text-font": [CPFont systemFontOfSize:12.0], - @"suppression-button-text-shadow-color": [CPNull null], - @"suppression-button-text-shadow-offset": 0.0, - @"modal-window-button-margin-y": 0.0, - @"modal-window-button-margin-x": 0.0, - @"standard-window-button-margin-y": 0.0, - @"standard-window-button-margin-x": 0.0, - }; -} - -@end diff --git a/AppKit/CPAnimation.j b/AppKit/CPAnimation.j index 903cf3c2e..bef308b74 100644 --- a/AppKit/CPAnimation.j +++ b/AppKit/CPAnimation.j @@ -42,25 +42,10 @@ var CPAnimationDelegate_animationShouldStart_ = 1 << 1, CPAnimationDelegate_animationDidEnd_ = 1 << 3, CPAnimationDelegate_animationDidStop_ = 1 << 4; -/* - @global - @group CPAnimationCurve -*/ +@typedef CPAnimationCurve CPAnimationEaseInOut = 0; -/* - @global - @group CPAnimationCurve -*/ CPAnimationEaseIn = 1; -/* - @global - @group CPAnimationCurve -*/ CPAnimationEaseOut = 2; -/* - @global - @group CPAnimationCurve -*/ CPAnimationLinear = 3; ACTUAL_FRAME_RATE = 0; diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index f3783c75a..85e57a84f 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -37,6 +37,8 @@ @import "CPWindowController.j" @import "_CPPopoverWindow.j" +@typedef CPModalSession + var CPMainCibFile = @"CPMainCibFile", CPMainCibFileHumanFriendly = @"Main cib file base name", CPEventModifierFlags = 0; diff --git a/AppKit/CPArrayController.j b/AppKit/CPArrayController.j index 0b25334d9..67e2f681e 100644 --- a/AppKit/CPArrayController.j +++ b/AppKit/CPArrayController.j @@ -23,7 +23,7 @@ */ @import - +@import @import "CPObjectController.j" @import "CPKeyValueBinding.j" diff --git a/AppKit/CPBox.j b/AppKit/CPBox.j index dc10564ff..29d0b3a08 100644 --- a/AppKit/CPBox.j +++ b/AppKit/CPBox.j @@ -24,6 +24,7 @@ @import "CPView.j" // CPBoxType +@typedef CPBoxType CPBoxPrimary = 0; CPBoxSecondary = 1; CPBoxSeparator = 2; @@ -31,12 +32,14 @@ CPBoxOldStyle = 3; CPBoxCustom = 4; // CPBorderType +@typedef CPBorderType CPNoBorder = 0; CPLineBorder = 1; CPBezelBorder = 2; CPGrooveBorder = 3; // CPTitlePosition +@typedef CPTitlePosition CPNoTitle = 0; CPAboveTop = 1; CPAtTop = 2; diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index 8365d76c7..26c17edaa 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -29,8 +29,7 @@ @import "CPWindow_Constants.j" /* @group CPBezelStyle */ - - // IB style +@typedef CPBezelStyle CPRoundedBezelStyle = 1; // Push CPRegularSquareBezelStyle = 2; // Bevel CPThickSquareBezelStyle = 3; @@ -49,6 +48,7 @@ CPHUDBezelStyle = -1; /* @group CPButtonType */ +@typedef CPButtonType CPMomentaryLightButton = 0; CPPushOnPushOffButton = 1; CPToggleButton = 2; diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index 2da7f07d9..943c05a30 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -32,6 +32,7 @@ @import "CPPasteboard.j" @import "CPView.j" +@class _CPCollectionViewDropIndicator var CPCollectionViewDelegate_collectionView_acceptDrop_index_dropOperation_ = 1 << 0, CPCollectionViewDelegate_collectionView_canDragItemsAtIndexes_withEvent_ = 1 << 1, diff --git a/AppKit/CPColorPanel.j b/AppKit/CPColorPanel.j index af6bf3e1d..7d847a30f 100644 --- a/AppKit/CPColorPanel.j +++ b/AppKit/CPColorPanel.j @@ -27,6 +27,9 @@ @import "CPView.j" @class CPSlider +@class _CPColorPanelToolbar +@class _CPColorPanelSwatches +@class _CPColorPanelPreview @global CPApp diff --git a/AppKit/CPColorPicker.j b/AppKit/CPColorPicker.j index 14aed7793..ea3afcd88 100644 --- a/AppKit/CPColorPicker.j +++ b/AppKit/CPColorPicker.j @@ -25,6 +25,8 @@ @import "CPView.j" @class CPSlider +@class CPColorPanel +@class __CPColorWheel @global CPColorPickerViewWidth @global CPColorPickerViewHeight diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index b8a4481b8..01d424664 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -63,7 +63,7 @@ var CPComboBoxTextSubview = @"text", { CPArray _items; _CPPopUpList _listDelegate; - CPComboBoxDataSource _dataSource; + id _dataSource; BOOL _usesDataSource; BOOL _completes; BOOL _canComplete; diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index c2b1083ce..c6b96ef73 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -42,16 +42,19 @@ @end +@typedef CPTextAlignment CPLeftTextAlignment = 0; CPRightTextAlignment = 1; CPCenterTextAlignment = 2; CPJustifiedTextAlignment = 3; CPNaturalTextAlignment = 4; +@typedef CPControlSize CPRegularControlSize = 0; CPSmallControlSize = 1; CPMiniControlSize = 2; +@typedef CPLineBreakMode CPLineBreakByWordWrapping = 0; CPLineBreakByCharWrapping = 1; CPLineBreakByClipping = 2; @@ -59,11 +62,13 @@ CPLineBreakByTruncatingHead = 3; CPLineBreakByTruncatingTail = 4; CPLineBreakByTruncatingMiddle = 5; +@typedef CPVerticalTextAlignment CPTopVerticalTextAlignment = 1; CPCenterVerticalTextAlignment = 2; CPBottomVerticalTextAlignment = 3; // Deprecated for use with images, use the CPImageScale constants +@typedef CPImageScaling CPScaleProportionally = 0; CPScaleToFit = 1; CPScaleNone = 2; @@ -73,6 +78,7 @@ CPImageScaleAxesIndependently = 1; CPImageScaleNone = 2; CPImageScaleProportionallyUpOrDown = 3; +@typedef CPCellImagePosition CPNoImage = 0; CPImageOnly = 1; CPImageLeft = 2; diff --git a/AppKit/CPDatePicker/_CPDatePickerCalendar.j b/AppKit/CPDatePicker/_CPDatePickerCalendar.j index 8ebd1ee8c..481bc6ba7 100644 --- a/AppKit/CPDatePicker/_CPDatePickerCalendar.j +++ b/AppKit/CPDatePicker/_CPDatePickerCalendar.j @@ -29,6 +29,8 @@ @import @class CPDatePicker +@class _CPDatePickerMonthView +@class _CPDatePickerHeaderView @global CPApp @global CPSingleDateMode diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index 39935b536..8fa09afce 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -31,6 +31,10 @@ @import @class CPDatePicker +@class _CPDatePickerElementTextField +@class _CPDatePickerElementView +@class _CPDatePickerMonthView +@class _CPDatePickerHeaderView @global CPSingleDateMode @global CPRangeDateMode @@ -1847,4 +1851,4 @@ var CPMonthDateType = 0, return CGRectMakeCopy(bounds); } -@end \ No newline at end of file +@end diff --git a/AppKit/CPDragServer_Constants.j b/AppKit/CPDragServer_Constants.j index 38ade5c31..7a347d3d4 100644 --- a/AppKit/CPDragServer_Constants.j +++ b/AppKit/CPDragServer_Constants.j @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +@typedef CPDragOperation CPDragOperationNone = 0; CPDragOperationCopy = 1 << 1; CPDragOperationLink = 1 << 1; diff --git a/AppKit/CPEvent.j b/AppKit/CPEvent.j index 8dbd7b720..d0ab4e128 100644 --- a/AppKit/CPEvent.j +++ b/AppKit/CPEvent.j @@ -31,9 +31,14 @@ @import "CPText.j" @class CPTextField +@class CPWindow @global CPApp +@typedef DOMEvent +@typedef CPEventType + + var _CPEventPeriodicEventPeriod = 0, _CPEventPeriodicEventTimer = nil, _CPEventUpperCaseRegex = new RegExp("[A-Z]"), diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j index 1c4ef8dbc..6c041fdea 100644 --- a/AppKit/CPImageView.j +++ b/AppKit/CPImageView.j @@ -29,6 +29,7 @@ @global CPImagesPboardType @global appkit_tag_dom_elements +@typedef CPImageAlignment CPImageAlignCenter = 0; CPImageAlignTop = 1; CPImageAlignTopLeft = 2; diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index 1913a4436..662280d16 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -35,6 +35,7 @@ var exposedBindingsMap = @{}, bindingsMap = @{}; +@typedef CPBindingOperationKind var CPBindingOperationAnd = 0, CPBindingOperationOr = 1; diff --git a/AppKit/CPLevelIndicator.j b/AppKit/CPLevelIndicator.j index 07ce720c3..c4e6422ee 100644 --- a/AppKit/CPLevelIndicator.j +++ b/AppKit/CPLevelIndicator.j @@ -25,11 +25,13 @@ @global CPApp +@typedef CPTickMarkPosition CPTickMarkBelow = 0; CPTickMarkAbove = 1; CPTickMarkLeft = CPTickMarkAbove; CPTickMarkRight = CPTickMarkBelow; +@typedef CPLevelIndicatorStyle CPRelevancyLevelIndicatorStyle = 0; CPContinuousCapacityLevelIndicatorStyle = 1; CPDiscreteCapacityLevelIndicatorStyle = 2; diff --git a/AppKit/CPMenu/_CPMenuBarWindow.j b/AppKit/CPMenu/_CPMenuBarWindow.j index 2c6c2bcaa..db9077b06 100644 --- a/AppKit/CPMenu/_CPMenuBarWindow.j +++ b/AppKit/CPMenu/_CPMenuBarWindow.j @@ -24,6 +24,7 @@ @import "_CPMenuManager.j" @class _CPMenuView +@class CPMenu @global CPMenuDidAddItemNotification @global CPMenuDidChangeItemNotification diff --git a/AppKit/CPMenu/_CPMenuWindow.j b/AppKit/CPMenu/_CPMenuWindow.j index ddf53a7dd..b11522d99 100644 --- a/AppKit/CPMenu/_CPMenuWindow.j +++ b/AppKit/CPMenu/_CPMenuWindow.j @@ -25,6 +25,8 @@ @import "CPWindow.j" @import "_CPMenuManager.j" +@class _CPMenuView + var _CPMenuWindowPool = [], _CPMenuWindowPoolCapacity = 5, diff --git a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j index 265b78867..e6b209f7b 100644 --- a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j +++ b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j @@ -25,6 +25,7 @@ @class _CPMenuBarWindow @class _CPMenuView +@class CPMenuItem @implementation _CPMenuItemMenuBarView : CPView { diff --git a/AppKit/CPMenuItem/_CPMenuItemStandardView.j b/AppKit/CPMenuItem/_CPMenuItemStandardView.j index 2fc534b24..f7112befb 100644 --- a/AppKit/CPMenuItem/_CPMenuItemStandardView.j +++ b/AppKit/CPMenuItem/_CPMenuItemStandardView.j @@ -24,6 +24,9 @@ @import "CPImageView.j" @import "_CPImageAndTextView.j" +@class CPMenuItem + + @implementation _CPMenuItemStandardView : CPView { CPMenuItem _menuItem @accessors(property=menuItem); diff --git a/AppKit/CPMenuItem/_CPMenuItemView.j b/AppKit/CPMenuItem/_CPMenuItemView.j index 7156db2ed..8d6b8b2cf 100644 --- a/AppKit/CPMenuItem/_CPMenuItemView.j +++ b/AppKit/CPMenuItem/_CPMenuItemView.j @@ -26,6 +26,7 @@ @import "_CPMenuItemStandardView.j" @import "_CPMenuItemMenuBarView.j" +@class CPMenuItem @global CPApp /* diff --git a/AppKit/CPPasteboard.j b/AppKit/CPPasteboard.j index e93d1ddfa..8f5c4f754 100644 --- a/AppKit/CPPasteboard.j +++ b/AppKit/CPPasteboard.j @@ -26,6 +26,7 @@ @import @import +@typedef CPWebScriptObject CPGeneralPboard = @"CPGeneralPboard"; CPFontPboard = @"CPFontPboard"; @@ -66,7 +67,7 @@ var CPPasteboards = nil, unsigned _changeCount; CPString _stateUID; - WebScriptObject _nativePasteboard; + CPWebScriptObject _nativePasteboard; } /* diff --git a/AppKit/CPProgressIndicator.j b/AppKit/CPProgressIndicator.j index e0ea06ab4..3732c229b 100644 --- a/AppKit/CPProgressIndicator.j +++ b/AppKit/CPProgressIndicator.j @@ -26,6 +26,7 @@ @import "CPWindow_Constants.j" +@typedef CPProgressIndicatorStyle /* @global @group CPProgressIndicatorStyle diff --git a/AppKit/CPRadio.j b/AppKit/CPRadio.j index 8cf37cc3d..bb845aef3 100644 --- a/AppKit/CPRadio.j +++ b/AppKit/CPRadio.j @@ -25,6 +25,8 @@ @import "CPButton.j" +@class CPRadioGroup + @global CPApp diff --git a/AppKit/CPResponder.j b/AppKit/CPResponder.j index 08e3db3ac..eddf8b628 100644 --- a/AppKit/CPResponder.j +++ b/AppKit/CPResponder.j @@ -26,6 +26,7 @@ @import "CPEvent.j" @class CPKeyBinding +@class CPMenu CPDeleteKeyCode = 8; CPTabKeyCode = 9; diff --git a/AppKit/CPRuleEditor/CPRuleEditor_Constants.j b/AppKit/CPRuleEditor/CPRuleEditor_Constants.j index d68b6f48a..0870aedeb 100644 --- a/AppKit/CPRuleEditor/CPRuleEditor_Constants.j +++ b/AppKit/CPRuleEditor/CPRuleEditor_Constants.j @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + CPRuleEditorPredicateLeftExpression = "CPRuleEditorPredicateLeftExpression"; CPRuleEditorPredicateRightExpression = "CPRuleEditorPredicateRightExpression"; CPRuleEditorPredicateComparisonModifier = "CPRuleEditorPredicateComparisonModifier"; @@ -36,5 +37,6 @@ CPRuleEditorNestingModeList = 1; // Allows a single list, with no nes CPRuleEditorNestingModeCompound = 2; // Unlimited nesting and compound rows; this is the default CPRuleEditorNestingModeSimple = 3; // One compound row at the top with subrows beneath it, and no further nesting allowed +@typedef CPRuleEditorRowType CPRuleEditorRowTypeSimple = 0; CPRuleEditorRowTypeCompound = 1; diff --git a/AppKit/CPRuleEditor/_CPPredicateEditorTree.j b/AppKit/CPRuleEditor/_CPPredicateEditorTree.j index f0d47086f..8cb807a84 100644 --- a/AppKit/CPRuleEditor/_CPPredicateEditorTree.j +++ b/AppKit/CPRuleEditor/_CPPredicateEditorTree.j @@ -20,6 +20,8 @@ @import @import +@class CPPredicateEditorRowTemplate + @implementation _CPPredicateEditorTree : CPObject { CPPredicateEditorRowTemplate template @accessors; diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j index 39a6a1d47..2cec0efae 100644 --- a/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j +++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSlice.j @@ -19,6 +19,8 @@ @import "CPView.j" +@class CPRuleEditor + @implementation _CPRuleEditorViewSlice : CPView { CPRuleEditor _ruleEditor; diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j index 30470d5c6..d11eceb64 100644 --- a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j +++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j @@ -24,6 +24,8 @@ @import "CPDatePicker.j" @import "CPPopUpButton.j" +@class CPRuleEditorRowType + @global CPApp @global CPMiniControlSize @global CPSmallControlSize diff --git a/AppKit/CPScroller.j b/AppKit/CPScroller.j index efb3f5b2e..f293b34dd 100644 --- a/AppKit/CPScroller.j +++ b/AppKit/CPScroller.j @@ -33,6 +33,7 @@ @global CPApp // CPScroller Constants +@typedef CPScrollerPart CPScrollerNoPart = 0; CPScrollerDecrementPage = 1; CPScrollerKnob = 2; @@ -44,6 +45,7 @@ CPScrollerKnobSlot = 6; CPScrollerIncrementArrow = 0; CPScrollerDecrementArrow = 1; +@typedef CPUsableScrollerParts CPNoScrollerParts = 0; CPOnlyScrollerArrows = 1; CPAllScrollerParts = 2; diff --git a/AppKit/CPSegmentedControl.j b/AppKit/CPSegmentedControl.j index e95993152..e58d97ef1 100644 --- a/AppKit/CPSegmentedControl.j +++ b/AppKit/CPSegmentedControl.j @@ -28,6 +28,7 @@ @global CPApp +@typedef CPSegmentSwitchTracking CPSegmentSwitchTrackingSelectOne = 0; CPSegmentSwitchTrackingSelectAny = 1; CPSegmentSwitchTrackingMomentary = 2; diff --git a/AppKit/CPShadowView.j b/AppKit/CPShadowView.j index 5fcc5c26c..c6c223705 100644 --- a/AppKit/CPShadowView.j +++ b/AppKit/CPShadowView.j @@ -26,7 +26,7 @@ @import "CPImage.j" @import "CPView.j" - +@typedef CPShadowWeight CPLightShadow = 0; CPHeavyShadow = 1; diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 75f1d1ad5..ec145d802 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -25,6 +25,7 @@ @import "CPTabViewItem.j" @import "CPView.j" +@typedef CPTabViewType CPTopTabsBezelBorder = 0; //CPLeftTabsBezelBorder = 1; CPBottomTabsBezelBorder = 2; diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index 6c073b1d0..671d5bc78 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -23,7 +23,7 @@ @import @import "CPView.j" - +@class CPTabView /* The tab is currently selected. diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 951cf45e4..e0f944a8e 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -31,6 +31,7 @@ @global CPTableViewColumnDidResizeNotification @class _CPTableColumnHeaderView +@class CPTableView CPTableColumnNoResizing = 0; CPTableColumnAutoresizingMask = 1 << 0; diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 48157b537..e0961f6fa 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -42,6 +42,7 @@ @class CPTableHeaderView @class CPClipView @class CPButton +@class _CPDropOperationDrawingView @global CPApp @@ -170,7 +171,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; @implementation _CPTableDrawView : CPView { - CPTableView _tableView; + id _tableView; } - (id)initWithTableView:(CPTableView)aTableView diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 5f11f1d6e..28420db70 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -41,6 +41,7 @@ var CPTextFieldDelegate_control_didFailToFormatString_errorDescription_ = 1 << 1; +@typedef CPTextFieldBezelStyle CPTextFieldSquareBezel = 0; /*! A textfield bezel with squared corners. */ CPTextFieldRoundedBezel = 1; /*! A textfield bezel with rounded corners. */ diff --git a/AppKit/CPTheme.j b/AppKit/CPTheme.j index f87c3a2a2..426c462ca 100644 --- a/AppKit/CPTheme.j +++ b/AppKit/CPTheme.j @@ -26,6 +26,7 @@ @import @class CPView +@class _CPThemeAttribute var CPThemesByName = { }, CPThemeDefaultTheme = nil, diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index cc4b96765..705435aae 100644 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -33,6 +33,9 @@ @import "CPTextField.j" @import "CPWindow_Constants.j" +@class _CPTokenFieldTokenCloseButton +@class _CPTokenFieldTokenDisclosureButton + @global CPApp @global CPTextFieldDidFocusNotification @global CPTextFieldDidBlurNotification diff --git a/AppKit/CPToolbar.j b/AppKit/CPToolbar.j index 3cc711518..49c78924e 100644 --- a/AppKit/CPToolbar.j +++ b/AppKit/CPToolbar.j @@ -37,6 +37,8 @@ var CPToolbarDelegate_toolbar_itemForItemIdentifier_willBeInsertedIntoToolbar_ CPToolbarDelegate_toolbarSelectableItemIdentifiers_ = 1 << 4, CPToolbarDelegate_toolbarWillAddItem_ = 1 << 5; + +@typedef CPToolbarDisplayMode /* @global @group CPToolbarDisplayMode @@ -58,7 +60,7 @@ CPToolbarDisplayModeIconOnly = 2; */ CPToolbarDisplayModeLabelOnly = 3; - +@typedef CPToolbarSizeMode CPToolbarSizeModeDefault = 0; CPToolbarSizeModeRegular = 1; CPToolbarSizeModeSmall = 2; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 1a600667c..70068d668 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -40,9 +40,12 @@ @class CPMenu @class CPClipView @class CPScrollView +@class CALayer @global appkit_tag_dom_elements +@typedef _CPViewFullScreenModeState + #if PLATFORM(DOM) if (typeof(appkit_tag_dom_elements) !== "undefined" && appkit_tag_dom_elements) diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j index 98cc59caa..3f2ca713e 100644 --- a/AppKit/CPWebView.j +++ b/AppKit/CPWebView.j @@ -93,7 +93,7 @@ CPWebViewAppKitScrollMaxPollCount = 3; CPScrollView _scrollView; CPView _frameView; - IFrame _iframe; + DOMElement _iframe; CPString _mainFrameURL; CPArray _backwardStack; CPArray _forwardStack; diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index f770fc642..21a1b3f2d 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -50,9 +50,15 @@ @class CPMenu @class CPProgressIndicator +@class CPToolbar +@class CPWindowController +@class _CPWindowFrameAnimation @global CPApp +@typedef _CPWindowFullPlatformWindowSession + + @protocol CPWindowDelegate @optional diff --git a/AppKit/CPWindow/CPWindow_Constants.j b/AppKit/CPWindow/CPWindow_Constants.j index a9a2c3327..0caf4de78 100644 --- a/AppKit/CPWindow/CPWindow_Constants.j +++ b/AppKit/CPWindow/CPWindow_Constants.j @@ -81,6 +81,7 @@ CPWindowMinYMargin = 8; CPWindowHeightSizable = 16; CPWindowMaxYMargin = 32; +@typedef CPWindowLevel CPBackgroundWindowLevel = -1; /* Default level for windows @@ -143,6 +144,7 @@ CPDraggingWindowLevel = 500; */ CPScreenSaverWindowLevel = 1000; +@typedef CPWindowOrderingMode /* The receiver is placed directly in front of the window specified. @global diff --git a/AppKit/CoreGraphics/CGAffineTransform.j b/AppKit/CoreGraphics/CGAffineTransform.j index b73f26f07..0cfb36bcf 100644 --- a/AppKit/CoreGraphics/CGAffineTransform.j +++ b/AppKit/CoreGraphics/CGAffineTransform.j @@ -22,6 +22,8 @@ @import "CGGeometry.j" +@typedef CGAffineTransform + function CGAffineTransformMake(a, b, c, d, tx, ty) { diff --git a/AppKit/CoreGraphics/CGColorSpace.j b/AppKit/CoreGraphics/CGColorSpace.j index 9502a0703..e5d7673e8 100644 --- a/AppKit/CoreGraphics/CGColorSpace.j +++ b/AppKit/CoreGraphics/CGColorSpace.j @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +@typedef CGColorSpace + kCGColorSpaceModelUnknown = -1; kCGColorSpaceModelMonochrome = 0; kCGColorSpaceModelRGB = 1; diff --git a/AppKit/CoreGraphics/CGContext.j b/AppKit/CoreGraphics/CGContext.j index c0b43eabd..a00199586 100644 --- a/AppKit/CoreGraphics/CGContext.j +++ b/AppKit/CoreGraphics/CGContext.j @@ -25,6 +25,7 @@ @import "CGGeometry.j" @import "CGPath.j" +@typedef CGContext kCGLineCapButt = 0; kCGLineCapRound = 1; diff --git a/AppKit/CoreGraphics/CGGradient.j b/AppKit/CoreGraphics/CGGradient.j index 3681c086e..aea212219 100644 --- a/AppKit/CoreGraphics/CGGradient.j +++ b/AppKit/CoreGraphics/CGGradient.j @@ -23,6 +23,7 @@ @import "CGColor.j" @import "CGColorSpace.j" +@typedef CGGradient kCGGradientDrawsBeforeStartLocation = 1 << 0; kCGGradientDrawsAfterEndLocation = 1 << 1; diff --git a/AppKit/CoreGraphics/CGPath.j b/AppKit/CoreGraphics/CGPath.j index 45c5d9062..b7cea5164 100644 --- a/AppKit/CoreGraphics/CGPath.j +++ b/AppKit/CoreGraphics/CGPath.j @@ -23,6 +23,7 @@ @import "CGAffineTransform.j" @import "CGGeometry.j" +@typedef CGPath kCGPathElementMoveToPoint = 0; kCGPathElementAddLineToPoint = 1; @@ -629,4 +630,4 @@ function CGPathContainsPoint(aPath, aTransform, point, eoFill) /*! @} -*/ \ No newline at end of file +*/ diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index 628293117..3e2ff2817 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -27,9 +27,12 @@ @class CPMenu @class CPPlatformPasteboard +@class CPWindow @global CPApp +@typedef DOMWindow + var PrimaryPlatformWindow = NULL; @implementation CPPlatformWindow : CPObject diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index 63b9d60b6..1a02755f5 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -71,7 +71,7 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, #if PLATFORM(DOM) DOMElement _DOMImageElement; - DOMELement _DOMTextElement; + DOMElement _DOMTextElement; DOMElement _DOMTextShadowElement; #endif } diff --git a/AppKit/_CPPopUpList.j b/AppKit/_CPPopUpList.j index 2604f3652..3dd357132 100644 --- a/AppKit/_CPPopUpList.j +++ b/AppKit/_CPPopUpList.j @@ -65,6 +65,113 @@ var ListMinimumItems = 3; var ListColumnIdentifier = @"1"; +@implementation _CPPopUpPanel : CPPanel + +- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned)aStyleMask +{ + if (self = [super initWithContentRect:aContentRect styleMask:aStyleMask]) + _constrainsToUsableScreen = NO; + + [self _trapNextMouseDown]; + + return self; +} + +/*! + Returns \c YES if the receiver is able to receive input events + even when a modal session is active. +*/ +- (BOOL)worksWhenModal +{ + return YES; +} + +- (void)sendEvent:(CPEvent)anEvent +{ + var type = [anEvent type]; + + if (type === CPLeftMouseDown || type === CPRightMouseDown) + [[self delegate] setListWasClicked:YES]; + + return [super sendEvent:anEvent]; +} + +- (void)orderFront:(id)sender +{ + [self _trapNextMouseDown]; + [super orderFront:sender]; +} + +- (void)_mouseWasClicked:(CPEvent)anEvent +{ + var mouseWindow = [anEvent window], + rect = [[[self delegate] dataSource] bounds], + point = [[[self delegate] dataSource] convertPoint:[anEvent locationInWindow] fromView:nil]; + + if (mouseWindow != self && !CGRectContainsPoint(rect, point)) + [[self delegate] close]; + else + [self _trapNextMouseDown]; +} + +- (void)_trapNextMouseDown +{ + // Don't dequeue the event so clicks in controls will work + [CPApp setTarget:self selector:@selector(_mouseWasClicked:) forNextEventMatchingMask:CPLeftMouseDownMask untilDate:nil inMode:CPDefaultRunLoopMode dequeue:NO]; +} + +@end + +@implementation _CPPopUpTableView : CPTableView +{ + BOOL _acceptFirstResponder; +} + +- (id)initWithFrame:(CGRect)aFrame +{ + if (self = [super initWithFrame:aFrame]) + { + // We want the autocomplete to remain first responder until we are clicked. + _acceptFirstResponder = NO; + } + + return self; +} + +- (void)trackMouse:(CPEvent)anEvent +{ + if (![self isEnabled]) + return; + + [[self delegate] setItemWasClicked:YES]; + + // CPTableView will not track the click if it is not first responder + _acceptFirstResponder = YES; + [[self window] makeFirstResponder:self]; + [super trackMouse:anEvent]; +} + +- (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp +{ + _acceptFirstResponder = NO; + [super stopTracking:lastPoint at:aPoint mouseIsUp:mouseIsUp]; +} + +- (BOOL)acceptsFirstResponder +{ + return _acceptFirstResponder; +} + +/*! + Return the column used for the list. +*/ +- (CPTableColumn)listColumn +{ + return _tableColumns[0]; +} + +@end + /*! This class is a controller for a panel that can pop up and display a scrollable list of items in a CPTableView. It is used by CPComboBox to display the list of choices. @@ -800,110 +907,3 @@ var _CPPopUpListDataSourceKey = @"_CPPopUpListDataSourceKey", } @end - -@implementation _CPPopUpTableView : CPTableView -{ - BOOL _acceptFirstResponder; -} - -- (id)initWithFrame:(CGRect)aFrame -{ - if (self = [super initWithFrame:aFrame]) - { - // We want the autocomplete to remain first responder until we are clicked. - _acceptFirstResponder = NO; - } - - return self; -} - -- (void)trackMouse:(CPEvent)anEvent -{ - if (![self isEnabled]) - return; - - [[self delegate] setItemWasClicked:YES]; - - // CPTableView will not track the click if it is not first responder - _acceptFirstResponder = YES; - [[self window] makeFirstResponder:self]; - [super trackMouse:anEvent]; -} - -- (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp -{ - _acceptFirstResponder = NO; - [super stopTracking:lastPoint at:aPoint mouseIsUp:mouseIsUp]; -} - -- (BOOL)acceptsFirstResponder -{ - return _acceptFirstResponder; -} - -/*! - Return the column used for the list. -*/ -- (CPTableColumn)listColumn -{ - return _tableColumns[0]; -} - -@end - -@implementation _CPPopUpPanel : CPPanel - -- (id)initWithContentRect:(CGRect)aContentRect styleMask:(unsigned)aStyleMask -{ - if (self = [super initWithContentRect:aContentRect styleMask:aStyleMask]) - _constrainsToUsableScreen = NO; - - [self _trapNextMouseDown]; - - return self; -} - -/*! - Returns \c YES if the receiver is able to receive input events - even when a modal session is active. -*/ -- (BOOL)worksWhenModal -{ - return YES; -} - -- (void)sendEvent:(CPEvent)anEvent -{ - var type = [anEvent type]; - - if (type === CPLeftMouseDown || type === CPRightMouseDown) - [[self delegate] setListWasClicked:YES]; - - return [super sendEvent:anEvent]; -} - -- (void)orderFront:(id)sender -{ - [self _trapNextMouseDown]; - [super orderFront:sender]; -} - -- (void)_mouseWasClicked:(CPEvent)anEvent -{ - var mouseWindow = [anEvent window], - rect = [[[self delegate] dataSource] bounds], - point = [[[self delegate] dataSource] convertPoint:[anEvent locationInWindow] fromView:nil]; - - if (mouseWindow != self && !CGRectContainsPoint(rect, point)) - [[self delegate] close]; - else - [self _trapNextMouseDown]; -} - -- (void)_trapNextMouseDown -{ - // Don't dequeue the event so clicks in controls will work - [CPApp setTarget:self selector:@selector(_mouseWasClicked:) forNextEventMatchingMask:CPLeftMouseDownMask untilDate:nil inMode:CPDefaultRunLoopMode dequeue:NO]; -} - -@end diff --git a/AppKit/_CPToolbarItem.j b/AppKit/_CPToolbarItem.j index 5d5600b47..387805535 100644 --- a/AppKit/_CPToolbarItem.j +++ b/AppKit/_CPToolbarItem.j @@ -26,6 +26,7 @@ @import "CPImage.j" @import "CPView.j" +@class CPToolbar @global CPApp CPToolbarItemVisibilityPriorityStandard = 0; diff --git a/Foundation/CPDateFormatter.j b/Foundation/CPDateFormatter.j index 9f1badc65..b7c74cbf1 100644 --- a/Foundation/CPDateFormatter.j +++ b/Foundation/CPDateFormatter.j @@ -32,12 +32,14 @@ @global CPLocaleLanguageCode @global CPLocaleCountryCode +@typedef CPDateFormatterStyle CPDateFormatterNoStyle = 0; CPDateFormatterShortStyle = 1; CPDateFormatterMediumStyle = 2; CPDateFormatterLongStyle = 3; CPDateFormatterFullStyle = 4; +@typedef CPDateFormatterBehavior CPDateFormatterBehaviorDefault = 0; CPDateFormatterBehavior10_0 = 1000; CPDateFormatterBehavior10_4 = 1040; diff --git a/Foundation/CPDecimal.j b/Foundation/CPDecimal.j index 15d2f817d..72fbe89cc 100644 --- a/Foundation/CPDecimal.j +++ b/Foundation/CPDecimal.j @@ -52,6 +52,8 @@ @import "CPArray.j" @import "CPNumber.j" +@typedef CPDecimal + // Decimal size limits CPDecimalMaxDigits = 38; CPDecimalMaxExponent = 127; @@ -68,6 +70,7 @@ CPCalculationUnderflow = 3; CPCalculationDivideByZero = 4; //CPRoundingMode Enum +@typedef CPRoundingMode CPRoundPlain = 1; CPRoundDown = 2; CPRoundUp = 3; diff --git a/Foundation/CPDictionary.j b/Foundation/CPDictionary.j index b95792f78..9c673be0c 100755 --- a/Foundation/CPDictionary.j +++ b/Foundation/CPDictionary.j @@ -31,38 +31,6 @@ var CPDictionaryShowNilDeprecationMessage = YES, CPDictionaryMaxDescriptionRecursion = 10; -/* @ignore */ -@implementation _CPDictionaryValueEnumerator : CPEnumerator -{ - CPEnumerator _keyEnumerator; - CPDictionary _dictionary; -} - -- (id)initWithDictionary:(CPDictionary)aDictionary -{ - self = [super init]; - - if (self) - { - _keyEnumerator = [aDictionary keyEnumerator]; - _dictionary = aDictionary; - } - - return self; -} - -- (id)nextObject -{ - var key = [_keyEnumerator nextObject]; - - if (key === nil) - return nil; - - return [_dictionary objectForKey:key]; -} - -@end - /*! @class CPDictionary @ingroup foundation @@ -801,6 +769,40 @@ var CPDictionaryShowNilDeprecationMessage = YES, @end + +/* @ignore */ +@implementation _CPDictionaryValueEnumerator : CPEnumerator +{ + CPEnumerator _keyEnumerator; + CPDictionary _dictionary; +} + +- (id)initWithDictionary:(CPDictionary)aDictionary +{ + self = [super init]; + + if (self) + { + _keyEnumerator = [aDictionary keyEnumerator]; + _dictionary = aDictionary; + } + + return self; +} + +- (id)nextObject +{ + var key = [_keyEnumerator nextObject]; + + if (key === nil) + return nil; + + return [_dictionary objectForKey:key]; +} + +@end + + /*! @class CPMutableDictionary @ingroup compatibility diff --git a/Foundation/CPGeometry.j b/Foundation/CPGeometry.j index 93a3a2b05..f8ef04a4c 100644 --- a/Foundation/CPGeometry.j +++ b/Foundation/CPGeometry.j @@ -22,6 +22,7 @@ @import "_CGGeometry.j" +@typedef CPRectEdge CPMinXEdge = 0; CPMinYEdge = 1; CPMaxXEdge = 2; diff --git a/Foundation/CPJSONPConnection.j b/Foundation/CPJSONPConnection.j index 0330cb223..374395784 100644 --- a/Foundation/CPJSONPConnection.j +++ b/Foundation/CPJSONPConnection.j @@ -23,6 +23,7 @@ @import "CPException.j" @import "CPObject.j" @import "CPRunLoop.j" +@import "CPURLRequest.j" CPJSONPConnectionCallbacks = {}; diff --git a/Foundation/CPNotificationCenter.j b/Foundation/CPNotificationCenter.j index 99ab18183..d8744fe11 100644 --- a/Foundation/CPNotificationCenter.j +++ b/Foundation/CPNotificationCenter.j @@ -29,151 +29,6 @@ var CPNotificationDefaultCenter = nil; -/*! - @class CPNotificationCenter - @ingroup foundation - @brief Sends messages (CPNotification) between objects. - - Cappuccino provides a framework for sending messages between objects within - a process called notifications. Objects register with an - CPNotificationCenter to be informed whenever other objects post - CPNotifications to it matching certain criteria. The notification center - processes notifications synchronously -- that is, control is only returned - to the notification poster once every recipient of the notification has - received it and processed it. -*/ -@implementation CPNotificationCenter : CPObject -{ - CPMutableDictionary _namedRegistries; - _CPNotificationRegistry _unnamedRegistry; -} - -/*! - Returns the application's notification center -*/ -+ (CPNotificationCenter)defaultCenter -{ - if (!CPNotificationDefaultCenter) - CPNotificationDefaultCenter = [[CPNotificationCenter alloc] init]; - - return CPNotificationDefaultCenter; -} - -- (id)init -{ - self = [super init]; - - if (self) - { - _namedRegistries = @{}; - _unnamedRegistry = [[_CPNotificationRegistry alloc] init]; - } - return self; -} - -/*! - Adds an object as an observer. The observer will receive notifications with the specified name - and/or containing the specified object (depending on if they are \c nil. - @param anObserver the observing object - @param aSelector the message sent to the observer when a notification occurs - @param aNotificationName the name of the notification the observer wants to watch - @param anObject the object in the notification the observer wants to watch -*/ -- (void)addObserver:(id)anObserver selector:(SEL)aSelector name:(CPString)aNotificationName object:(id)anObject -{ - var registry, - observer = [[_CPNotificationObserver alloc] initWithObserver:anObserver selector:aSelector]; - - if (aNotificationName == nil) - registry = _unnamedRegistry; - else if (!(registry = [_namedRegistries objectForKey:aNotificationName])) - { - registry = [[_CPNotificationRegistry alloc] init]; - [_namedRegistries setObject:registry forKey:aNotificationName]; - } - - [registry addObserver:observer object:anObject]; -} - -/*! - Unregisters the specified observer from all notifications. - @param anObserver the observer to unregister -*/ -- (void)removeObserver:(id)anObserver -{ - var name = nil, - names = [_namedRegistries keyEnumerator]; - - while ((name = [names nextObject]) !== nil) - [[_namedRegistries objectForKey:name] removeObserver:anObserver object:nil]; - - [_unnamedRegistry removeObserver:anObserver object:nil]; -} - -/*! - Unregisters the specified observer from notifications matching the specified name and/or object. - @param anObserver the observer to remove - @param aNotificationName the name of notifications to no longer watch - @param anObject notifications containing this object will no longer be watched -*/ -- (void)removeObserver:(id)anObserver name:(CPString)aNotificationName object:(id)anObject -{ - if (aNotificationName == nil) - { - var name = nil, - names = [_namedRegistries keyEnumerator]; - - while ((name = [names nextObject]) !== nil) - [[_namedRegistries objectForKey:name] removeObserver:anObserver object:anObject]; - - [_unnamedRegistry removeObserver:anObserver object:anObject]; - } - else - [[_namedRegistries objectForKey:aNotificationName] removeObserver:anObserver object:anObject]; -} - -/*! - Posts a notification to all observers that match the specified notification's name and object. - @param aNotification the notification being posted - @throws CPInvalidArgumentException if aNotification is nil -*/ -- (void)postNotification:(CPNotification)aNotification -{ - if (!aNotification) - [CPException raise:CPInvalidArgumentException reason:"postNotification: does not except 'nil' notifications"]; - - _CPNotificationCenterPostNotification(self, aNotification); -} - -/*! - Posts a new notification with the specified name, object, and dictionary. - @param aNotificationName the name of the notification name - @param anObject the associated object - @param aUserInfo the associated dictionary -*/ -- (void)postNotificationName:(CPString)aNotificationName object:(id)anObject userInfo:(CPDictionary)aUserInfo -{ - _CPNotificationCenterPostNotification(self, [[CPNotification alloc] initWithName:aNotificationName object:anObject userInfo:aUserInfo]); -} - -/*! - Posts a new notification with the specified name and object. - @param aNotificationName the name of the notification - @param anObject the associated object -*/ -- (void)postNotificationName:(CPString)aNotificationName object:(id)anObject -{ - _CPNotificationCenterPostNotification(self, [[CPNotification alloc] initWithName:aNotificationName object:anObject userInfo:nil]); -} - -@end - -var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ self, /* CPNotification */ aNotification) -{ - [self._unnamedRegistry postNotification:aNotification]; - [[self._namedRegistries objectForKey:[aNotification name]] postNotification:aNotification]; -}; - /* Mapping of Notification Name to listening object/selector. @ignore @@ -338,3 +193,149 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ } @end + + +/*! + @class CPNotificationCenter + @ingroup foundation + @brief Sends messages (CPNotification) between objects. + + Cappuccino provides a framework for sending messages between objects within + a process called notifications. Objects register with an + CPNotificationCenter to be informed whenever other objects post + CPNotifications to it matching certain criteria. The notification center + processes notifications synchronously -- that is, control is only returned + to the notification poster once every recipient of the notification has + received it and processed it. +*/ +@implementation CPNotificationCenter : CPObject +{ + CPMutableDictionary _namedRegistries; + _CPNotificationRegistry _unnamedRegistry; +} + +/*! + Returns the application's notification center +*/ ++ (CPNotificationCenter)defaultCenter +{ + if (!CPNotificationDefaultCenter) + CPNotificationDefaultCenter = [[CPNotificationCenter alloc] init]; + + return CPNotificationDefaultCenter; +} + +- (id)init +{ + self = [super init]; + + if (self) + { + _namedRegistries = @{}; + _unnamedRegistry = [[_CPNotificationRegistry alloc] init]; + } + return self; +} + +/*! + Adds an object as an observer. The observer will receive notifications with the specified name + and/or containing the specified object (depending on if they are \c nil. + @param anObserver the observing object + @param aSelector the message sent to the observer when a notification occurs + @param aNotificationName the name of the notification the observer wants to watch + @param anObject the object in the notification the observer wants to watch +*/ +- (void)addObserver:(id)anObserver selector:(SEL)aSelector name:(CPString)aNotificationName object:(id)anObject +{ + var registry, + observer = [[_CPNotificationObserver alloc] initWithObserver:anObserver selector:aSelector]; + + if (aNotificationName == nil) + registry = _unnamedRegistry; + else if (!(registry = [_namedRegistries objectForKey:aNotificationName])) + { + registry = [[_CPNotificationRegistry alloc] init]; + [_namedRegistries setObject:registry forKey:aNotificationName]; + } + + [registry addObserver:observer object:anObject]; +} + +/*! + Unregisters the specified observer from all notifications. + @param anObserver the observer to unregister +*/ +- (void)removeObserver:(id)anObserver +{ + var name = nil, + names = [_namedRegistries keyEnumerator]; + + while ((name = [names nextObject]) !== nil) + [[_namedRegistries objectForKey:name] removeObserver:anObserver object:nil]; + + [_unnamedRegistry removeObserver:anObserver object:nil]; +} + +/*! + Unregisters the specified observer from notifications matching the specified name and/or object. + @param anObserver the observer to remove + @param aNotificationName the name of notifications to no longer watch + @param anObject notifications containing this object will no longer be watched +*/ +- (void)removeObserver:(id)anObserver name:(CPString)aNotificationName object:(id)anObject +{ + if (aNotificationName == nil) + { + var name = nil, + names = [_namedRegistries keyEnumerator]; + + while ((name = [names nextObject]) !== nil) + [[_namedRegistries objectForKey:name] removeObserver:anObserver object:anObject]; + + [_unnamedRegistry removeObserver:anObserver object:anObject]; + } + else + [[_namedRegistries objectForKey:aNotificationName] removeObserver:anObserver object:anObject]; +} + +/*! + Posts a notification to all observers that match the specified notification's name and object. + @param aNotification the notification being posted + @throws CPInvalidArgumentException if aNotification is nil +*/ +- (void)postNotification:(CPNotification)aNotification +{ + if (!aNotification) + [CPException raise:CPInvalidArgumentException reason:"postNotification: does not except 'nil' notifications"]; + + _CPNotificationCenterPostNotification(self, aNotification); +} + +/*! + Posts a new notification with the specified name, object, and dictionary. + @param aNotificationName the name of the notification name + @param anObject the associated object + @param aUserInfo the associated dictionary +*/ +- (void)postNotificationName:(CPString)aNotificationName object:(id)anObject userInfo:(CPDictionary)aUserInfo +{ + _CPNotificationCenterPostNotification(self, [[CPNotification alloc] initWithName:aNotificationName object:anObject userInfo:aUserInfo]); +} + +/*! + Posts a new notification with the specified name and object. + @param aNotificationName the name of the notification + @param anObject the associated object +*/ +- (void)postNotificationName:(CPString)aNotificationName object:(id)anObject +{ + _CPNotificationCenterPostNotification(self, [[CPNotification alloc] initWithName:aNotificationName object:anObject userInfo:nil]); +} + +@end + +var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ self, /* CPNotification */ aNotification) +{ + [self._unnamedRegistry postNotification:aNotification]; + [[self._namedRegistries objectForKey:[aNotification name]] postNotification:aNotification]; +}; diff --git a/Foundation/CPNumberFormatter.j b/Foundation/CPNumberFormatter.j index f59dca490..52737fc1c 100644 --- a/Foundation/CPNumberFormatter.j +++ b/Foundation/CPNumberFormatter.j @@ -24,7 +24,7 @@ @import "CPFormatter.j" @import "CPDecimalNumber.j" - +@typedef CPNumberFormatterStyle CPNumberFormatterNoStyle = 0; CPNumberFormatterDecimalStyle = 1; CPNumberFormatterCurrencyStyle = 2; @@ -32,6 +32,7 @@ CPNumberFormatterPercentStyle = 3; CPNumberFormatterScientificStyle = 4; CPNumberFormatterSpellOutStyle = 5; +@typedef CPNumberFormatterRoundingMode CPNumberFormatterRoundCeiling = CPRoundUp; CPNumberFormatterRoundFloor = CPRoundDown; CPNumberFormatterRoundDown = CPRoundDown; diff --git a/Foundation/CPObject.j b/Foundation/CPObject.j index 912aafa09..f5aea7aa6 100644 --- a/Foundation/CPObject.j +++ b/Foundation/CPObject.j @@ -62,6 +62,8 @@ CPLog(@"Got some class: %@", inst); @todo document KVC usage. */ +@import "_CPTypeDefinitions.j" + @class CPString @class CPException @@ -104,7 +106,7 @@ CPLog(@"Got some class: %@", inst); @implementation CPObject { - Class isa; + id isa; } + (void)load diff --git a/Foundation/CPPredicate/CPComparisonPredicate.j b/Foundation/CPPredicate/CPComparisonPredicate.j index f2cfb3172..338a4e7f3 100644 --- a/Foundation/CPPredicate/CPComparisonPredicate.j +++ b/Foundation/CPPredicate/CPComparisonPredicate.j @@ -32,8 +32,8 @@ @import "_CPPredicate.j" -var CPComparisonPredicateModifier, - CPPredicateOperatorType; +@typedef CPComparisonPredicateModifier +@typedef CPPredicateOperatorType /*! @ingroup foundation diff --git a/Foundation/CPPredicate/CPCompoundPredicate.j b/Foundation/CPPredicate/CPCompoundPredicate.j index e36ceb0d0..a38f3b065 100644 --- a/Foundation/CPPredicate/CPCompoundPredicate.j +++ b/Foundation/CPPredicate/CPCompoundPredicate.j @@ -26,7 +26,7 @@ @import "CPArray.j" @import "_CPPredicate.j" -var CPCompoundPredicateType; +@typedef CPCompoundPredicateType /*! @class CPCompoundPredicate diff --git a/Foundation/CPRange.j b/Foundation/CPRange.j index c9f9c7c2a..58dd550bc 100755 --- a/Foundation/CPRange.j +++ b/Foundation/CPRange.j @@ -25,6 +25,8 @@ @{ */ +@typedef CPRange + /*! Makes a CPRange. @param location the location for new range diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index 420ce8402..88a1afbf8 100644 --- a/Foundation/CPURLConnection.j +++ b/Foundation/CPURLConnection.j @@ -26,6 +26,8 @@ @import "CPURLRequest.j" @import "CPURLResponse.j" +@typedef HTTPRequest + var CPURLConnectionDelegate = nil; /*! diff --git a/Foundation/CPUndoManager.j b/Foundation/CPUndoManager.j index af2111170..d4ad4914e 100644 --- a/Foundation/CPUndoManager.j +++ b/Foundation/CPUndoManager.j @@ -50,7 +50,7 @@ var _CPUndoGroupingPool = [], /* @ignore */ @implementation _CPUndoGrouping : CPObject { - _CPUndoGrouping _parent; + id _parent; CPMutableArray _invocations; CPString _actionName; } diff --git a/Foundation/CPUserSessionManager.j b/Foundation/CPUserSessionManager.j index b1cbd23cb..523a65e19 100644 --- a/Foundation/CPUserSessionManager.j +++ b/Foundation/CPUserSessionManager.j @@ -24,6 +24,7 @@ @import "CPObject.j" @import "CPString.j" +@typedef CPUserSessionStatus CPUserSessionUndeterminedStatus = 0; CPUserSessionLoggedInStatus = 1; CPUserSessionLoggedOutStatus = 2; diff --git a/Foundation/_CGGeometry.j b/Foundation/_CGGeometry.j index 4861ce8fd..d0482aa71 100644 --- a/Foundation/_CGGeometry.j +++ b/Foundation/_CGGeometry.j @@ -26,6 +26,12 @@ CGGeometry is not a part of Foundation. The reason _CGGeometry.j exists, and is */ +@typedef CGPoint +@typedef CGSize +@typedef CGRect +@typedef CGInset + + function CGPointMake(x, y) { return { x:x, y:y }; diff --git a/Foundation/_CPTypeDefinitions.j b/Foundation/_CPTypeDefinitions.j new file mode 100644 index 000000000..7aa874fe1 --- /dev/null +++ b/Foundation/_CPTypeDefinitions.j @@ -0,0 +1,30 @@ +/* + * _CPTypeDefintions.j + * Foundation + * + * Created by Antoine Mercadal. + * Copyright 2014, Antoine Mercadal. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@typedef Class +@typedef CPInteger +@typedef CPUInteger +@typedef DOMElement +@typedef JSObject +@typedef CPMethodSignature +@typedef CPPropertyListFormat +@typedef CPTimeInterval From 9a5afb70b51e7fca2b2c5000095f72c5e1583bd9 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Thu, 6 Nov 2014 13:40:47 -0500 Subject: [PATCH 027/106] Fixed: Environment configuration in Jakefile templates Previously the Jakefile template for the capp utility would emit a template where the "configuration" build environment parameter could have multiple values. At the head of the file, the configuration parameter could be an environment variable composed of ENV['CONFIG'], ENV['CONFIGURATION'] or ENV['c']. It would default to "Debug". However, other locations in this file did not use the detected configuration, and only looked at ENV['CONFIGURATION'] for the environment variable. This commit fixes this by using the detected configuration environment variable as the build environment. --- Tools/capp/Resources/Templates/Application/Jakefile | 12 ++++++------ .../capp/Resources/Templates/NibApplication/Jakefile | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Tools/capp/Resources/Templates/Application/Jakefile b/Tools/capp/Resources/Templates/Application/Jakefile index 6207c9b34..08a8c0c8b 100644 --- a/Tools/capp/Resources/Templates/Application/Jakefile +++ b/Tools/capp/Resources/Templates/Application/Jakefile @@ -55,13 +55,13 @@ task ("build", ["default"], function() task ("debug", function() { - ENV["CONFIGURATION"] = "Debug"; + configuration = ENV["CONFIGURATION"] = "Debug"; JAKE.subjake(["."], "build", ENV); }); task ("release", function() { - ENV["CONFIGURATION"] = "Release"; + configuration = ENV["CONFIGURATION"] = "Release"; JAKE.subjake(["."], "build", ENV); }); @@ -105,7 +105,7 @@ function updateApplicationSize() { print("Calculating application file sizes..."); - var contents = FILE.read(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), { charset:"UTF-8" }), + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), format = CFPropertyList.sniffedFormatOfString(contents), plist = CFPropertyList.propertyListFromString(contents), totalBytes = {executable:0, data:0, mhtml:0}; @@ -113,7 +113,7 @@ function updateApplicationSize() // Get the size of all framework executables and sprite data var frameworksDir = "Frameworks"; - if (ENV["CONFIGURATION"] === "Debug") + if (configuration === "Debug") frameworksDir = FILE.join(frameworksDir, "Debug"); var frameworks = FILE.list(frameworksDir); @@ -137,7 +137,7 @@ function updateApplicationSize() addBundleFileSizes(themePath, totalBytes); // Add sizes for the app - addBundleFileSizes(FILE.join("Build", ENV["CONFIGURATION"], projectName), totalBytes); + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); @@ -149,7 +149,7 @@ function updateApplicationSize() plist.setValueForKey("CPApplicationSize", dict); - FILE.write(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); } function addBundleFileSizes(bundlePath, totalBytes) diff --git a/Tools/capp/Resources/Templates/NibApplication/Jakefile b/Tools/capp/Resources/Templates/NibApplication/Jakefile index 6207c9b34..08a8c0c8b 100644 --- a/Tools/capp/Resources/Templates/NibApplication/Jakefile +++ b/Tools/capp/Resources/Templates/NibApplication/Jakefile @@ -55,13 +55,13 @@ task ("build", ["default"], function() task ("debug", function() { - ENV["CONFIGURATION"] = "Debug"; + configuration = ENV["CONFIGURATION"] = "Debug"; JAKE.subjake(["."], "build", ENV); }); task ("release", function() { - ENV["CONFIGURATION"] = "Release"; + configuration = ENV["CONFIGURATION"] = "Release"; JAKE.subjake(["."], "build", ENV); }); @@ -105,7 +105,7 @@ function updateApplicationSize() { print("Calculating application file sizes..."); - var contents = FILE.read(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), { charset:"UTF-8" }), + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), format = CFPropertyList.sniffedFormatOfString(contents), plist = CFPropertyList.propertyListFromString(contents), totalBytes = {executable:0, data:0, mhtml:0}; @@ -113,7 +113,7 @@ function updateApplicationSize() // Get the size of all framework executables and sprite data var frameworksDir = "Frameworks"; - if (ENV["CONFIGURATION"] === "Debug") + if (configuration === "Debug") frameworksDir = FILE.join(frameworksDir, "Debug"); var frameworks = FILE.list(frameworksDir); @@ -137,7 +137,7 @@ function updateApplicationSize() addBundleFileSizes(themePath, totalBytes); // Add sizes for the app - addBundleFileSizes(FILE.join("Build", ENV["CONFIGURATION"], projectName), totalBytes); + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); @@ -149,7 +149,7 @@ function updateApplicationSize() plist.setValueForKey("CPApplicationSize", dict); - FILE.write(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); } function addBundleFileSizes(bundlePath, totalBytes) From 45248bcb6553ecc797af910d261c3ea25c791393 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 6 Nov 2014 12:17:58 -0800 Subject: [PATCH 028/106] FIXED: ivars warning fixes --- Foundation/CPDateFormatter.j | 1 + Foundation/CPTimeZone.j | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Foundation/CPDateFormatter.j b/Foundation/CPDateFormatter.j index b7c74cbf1..59a48019d 100644 --- a/Foundation/CPDateFormatter.j +++ b/Foundation/CPDateFormatter.j @@ -28,6 +28,7 @@ @import "CPLocale.j" @class CPNull +@class CPDictionary @global CPLocaleLanguageCode @global CPLocaleCountryCode diff --git a/Foundation/CPTimeZone.j b/Foundation/CPTimeZone.j index 3d294c25f..4b4ba6c1b 100644 --- a/Foundation/CPTimeZone.j +++ b/Foundation/CPTimeZone.j @@ -24,6 +24,8 @@ @import "CPDate.j" @import "CPLocale.j" +@class CPData + CPTimeZoneNameStyleStandard = 0; CPTimeZoneNameStyleShortStandard = 1; CPTimeZoneNameStyleDaylightSaving = 2; From 0f791be1956666ed131652a521b7c3ba3a16aec9 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 6 Nov 2014 12:20:56 -0800 Subject: [PATCH 029/106] FIXED: config warning issues --- Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj index dce859d69..3449e0637 100644 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj +++ b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj @@ -19,7 +19,7 @@ E164FE181720F44B00263CE3 /* parser.j in Resources */ = {isa = PBXBuildFile; fileRef = E164FE171720F44B00263CE3 /* parser.j */; }; E164FE1A1720F49A00263CE3 /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = E164FE191720F49A00263CE3 /* Growl Registration Ticket.growlRegDict */; }; E164FE1F1720F51E00263CE3 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E164FE1D1720F50100263CE3 /* CoreServices.framework */; }; - E164FE211720F55600263CE3 /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E164FDF61720EBD600263CE3 /* Growl.framework */; }; + E164FE211720F55600263CE3 /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E164FDF61720EBD600263CE3 /* Growl.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; E164FE2F1721A34900263CE3 /* icon-active.png in Resources */ = {isa = PBXBuildFile; fileRef = E164FE2C1721A34900263CE3 /* icon-active.png */; }; E164FE301721A34900263CE3 /* icon-inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = E164FE2D1721A34900263CE3 /* icon-inactive.png */; }; E164FE311721A34900263CE3 /* icon-working.png in Resources */ = {isa = PBXBuildFile; fileRef = E164FE2E1721A34900263CE3 /* icon-working.png */; }; @@ -34,7 +34,7 @@ E171D25F173C168C00210893 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E171D25E173C168C00210893 /* Foundation.framework */; }; E171D262173C168C00210893 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E171D261173C168C00210893 /* main.m */; }; E171D26A173C1ADD00210893 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E164FE1D1720F50100263CE3 /* CoreServices.framework */; }; - E171D26C173C1C8300210893 /* xcc in CopyFiles */ = {isa = PBXBuildFile; fileRef = E171D25D173C168C00210893 /* xcc */; }; + E171D26C173C1C8300210893 /* xcc in CopyFiles */ = {isa = PBXBuildFile; fileRef = E171D25D173C168C00210893 /* xcc */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; E17A822D172700B90095CD83 /* XcodeCapp.iconset in Resources */ = {isa = PBXBuildFile; fileRef = E17A822C172700B90095CD83 /* XcodeCapp.iconset */; }; E17B55411732F57700809FFB /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E17B55401732F57700809FFB /* Quartz.framework */; }; E1A5594A172C5EE20088FB61 /* FindSourceFilesOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E1A55949172C5EE20088FB61 /* FindSourceFilesOperation.m */; }; @@ -389,7 +389,7 @@ E164FDC71720E77100263CE3 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0460; + LastUpgradeCheck = 0610; ORGANIZATIONNAME = "Cappuccino Project"; }; buildConfigurationList = E164FDCA1720E77100263CE3 /* Build configuration list for PBXProject "XcodeCapp" */; @@ -501,6 +501,7 @@ baseConfigurationReference = E164FDEF1720E7FA00263CE3 /* Debug.xcconfig */; buildSettings = { DSTROOT = /; + ONLY_ACTIVE_ARCH = YES; }; name = Debug; }; @@ -540,7 +541,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; @@ -576,7 +576,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; From aee89b1f63f2175d15b3ed115a0980a7479e9807 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 6 Nov 2014 12:21:23 -0800 Subject: [PATCH 030/106] NEW: option to define if the reporting window should stay on top --- Tools/XcodeCapp/XcodeCapp/AppController.m | 3 +- Tools/XcodeCapp/XcodeCapp/UserDefaults.h | 1 + Tools/XcodeCapp/XcodeCapp/UserDefaults.m | 3 +- Tools/XcodeCapp/XcodeCapp/XcodeCapp.m | 11 +- .../XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib | 159 ++++++++++++++---- 5 files changed, 140 insertions(+), 37 deletions(-) diff --git a/Tools/XcodeCapp/XcodeCapp/AppController.m b/Tools/XcodeCapp/XcodeCapp/AppController.m index e72307bd3..4647a079f 100644 --- a/Tools/XcodeCapp/XcodeCapp/AppController.m +++ b/Tools/XcodeCapp/XcodeCapp/AppController.m @@ -154,7 +154,8 @@ AppController *SharedAppControllerInstance = nil; kDefaultAutoOpenXcodeProject: @YES, kDefaultUseSymlinkWhenCreatingProject: @YES, kDefaultXCCUseDebugFrameworkWithObjj: @YES, - kDefaultXCCShouldProcessObjj: @YES + kDefaultXCCShouldProcessObjj: @YES, + kDefaultXCCPanelStyleUtility: @NO }; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; diff --git a/Tools/XcodeCapp/XcodeCapp/UserDefaults.h b/Tools/XcodeCapp/XcodeCapp/UserDefaults.h index 2843e57c7..9e5d5b804 100644 --- a/Tools/XcodeCapp/XcodeCapp/UserDefaults.h +++ b/Tools/XcodeCapp/XcodeCapp/UserDefaults.h @@ -31,5 +31,6 @@ extern NSString * const kDefaultLogLevel; extern NSString * const kDefaultAutoOpenXcodeProject; extern NSString * const kDefaultUseSymlinkWhenCreatingProject; extern NSString * const kDefaultUpdateCappuccinoWithLastVersionOfMasterBranch; +extern NSString * const kDefaultXCCPanelStyleUtility; #endif diff --git a/Tools/XcodeCapp/XcodeCapp/UserDefaults.m b/Tools/XcodeCapp/XcodeCapp/UserDefaults.m index 18e976581..d88657a6f 100644 --- a/Tools/XcodeCapp/XcodeCapp/UserDefaults.m +++ b/Tools/XcodeCapp/XcodeCapp/UserDefaults.m @@ -28,4 +28,5 @@ NSString * const kDefaultMaxRecentProjects = @"maxRecentProjects"; NSString * const kDefaultLogLevel = @"logLevel"; NSString * const kDefaultAutoOpenXcodeProject = @"autoOpenXcodeProject"; NSString * const kDefaultUseSymlinkWhenCreatingProject = @"useSymlinkWhenCreatingProject"; -NSString * const kDefaultUpdateCappuccinoWithLastVersionOfMasterBranch = @"updateCappuccinoWithLastVersionOfMasterBranch"; \ No newline at end of file +NSString * const kDefaultUpdateCappuccinoWithLastVersionOfMasterBranch = @"updateCappuccinoWithLastVersionOfMasterBranch"; +NSString * const kDefaultXCCPanelStyleUtility = @"XCCPanelStyleUtility"; \ No newline at end of file diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m index f326c2654..3037b6651 100644 --- a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m @@ -1566,18 +1566,21 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, - (IBAction)openErrorsPanel:(id)aSender { [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + [self.errorsPanel setFloatingPanel:[[NSUserDefaults standardUserDefaults] boolForKey:kDefaultXCCPanelStyleUtility]]; [self.errorsPanel makeKeyAndOrderFront:nil]; } - (IBAction)openErrorInEditor:(id)sender { id info = self.errorListController.selection; - - NSString *path = [info valueForKey:@"path"]; - + + NSString *path = [info valueForKey:@"realPath"] ? [info valueForKey:@"realPath"] : [info valueForKey:@"path"]; + + NSLog(@"09090900 %@", info); + if (path == NSNoSelectionMarker) return; - + if ([self isObjjFile:path]) { [self openObjjFile:path line:[[info valueForKey:@"line"] intValue]]; diff --git a/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib index 239798b27..28098a798 100644 --- a/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib +++ b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib @@ -2,9 +2,9 @@ 1060 - 14A389 + 14B17 6250 - 1343.14 + 1343.15 755.00 6250 @@ -243,7 +243,7 @@ - + 256 @@ -251,6 +251,8 @@ 268 {{164, 20}, {203, 143}} + + YES 68157504 @@ -287,6 +289,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 266 {{164, 171}, {221, 74}} + YES @@ -334,6 +337,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ {{17, 108}, {128, 128}} + YES @@ -353,24 +357,26 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ {402, 247} + + - {{0, 0}, {1440, 877}} + {{0, 0}, {1440, 900}} {10000000000000, 10000000000000} NO 15 2 - {{1826, 825}, {550, 237}} - 1618478080 + {{890, 663}, {550, 237}} + 1613759488 Reporting NSPanel {315, 77} - + 256 @@ -386,6 +392,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 256 {550, 201} + YES NO @@ -462,6 +469,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ {{1, 1}, {550, 201}} + @@ -473,6 +481,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ -2147483392 {{1, 273}, {512, 16}} + NO _doScroller: @@ -486,6 +495,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ -2147483392 {{535, 1}, {16, 45}} + NO _doScroller: @@ -496,6 +506,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ {{-1, 35}, {552, 203}} + 133682 @@ -511,6 +522,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 289 {{352, 8}, {85, 19}} + {250, 750} YES @@ -539,6 +551,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 292 {{20, 8}, {85, 19}} + {250, 750} YES @@ -563,6 +576,8 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 289 {{445, 8}, {85, 19}} + + {250, 750} YES @@ -583,19 +598,21 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ {550, 237} + + - {{1440, -180}, {1920, 1057}} + {{0, 0}, {1440, 900}} {315, 99} {10000000000000, 10000000000000} - errorPanel + YES 3 2 - {{1964, 505}, {369, 473}} - 1618478080 + {{534, 231}, {369, 510}} + 1613235200 Preferences NSWindow @@ -615,7 +632,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 268 - {{16, 81}, {271, 18}} + {{16, 118}, {271, 18}} @@ -649,10 +666,10 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 268 - {{16, 51}, {241, 18}} + {{16, 88}, {241, 18}} - + YES -2080374784 @@ -671,10 +688,35 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ NO + + + 268 + {{16, 58}, {260, 18}} + + + + YES + + -2080374784 + 0 + Errors & Warnings panel always on top + + + 1211912448 + 2 + + + + + 400 + 75 + + NO + 268 - {{16, 109}, {298, 18}} + {{16, 146}, {298, 18}} @@ -699,7 +741,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 268 - {{15, 20}, {106, 17}} + {{16, 17}, {106, 17}} @@ -719,7 +761,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ 268 - {{124, 14}, {56, 26}} + {{125, 11}, {56, 26}} @@ -794,13 +836,13 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ NO - {{1, 1}, {330, 139}} + {{1, 1}, {330, 176}} - {{17, 303}, {332, 155}} + {{17, 303}, {332, 192}} @@ -1144,12 +1186,12 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ NO - {369, 473} + {369, 510} - {{1440, -180}, {1920, 1057}} + {{0, 0}, {1440, 900}} {10000000000000, 10000000000000} xcc-prefs YES @@ -1164,7 +1206,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ - + 256 @@ -1176,8 +1218,6 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ {{0, 8}, {716, 654}} - - YES 1 NO @@ -1186,11 +1226,9 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ {716, 662} - - - {{0, 0}, {1440, 877}} + {{0, 0}, {1440, 900}} {10000000000000, 10000000000000} YES @@ -1291,7 +1329,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ _NS:21 - {{0, 0}, {1440, 877}} + {{0, 0}, {1440, 900}} {10000000000000, 10000000000000} updatingCappuccinoPanel YES @@ -1564,6 +1602,14 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ HyN-S0-KXD + + + save: + + + + A92-fj-Uci + openXcodeProject: @@ -2030,6 +2076,26 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ dP2-Fc-one + + + value: values.XCCPanelStyleUtility + + + + + + value: values.XCCPanelStyleUtility + value + values.XCCPanelStyleUtility + + NSValidatesImmediately + + + 2 + + + uUW-Ro-3aA + value: values.updateCappuccinoWithLastVersionOfMasterBranch @@ -2488,6 +2554,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ + @@ -2854,6 +2921,19 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ + + GDP-7Q-0W5 + + + + + + + + QpC-n8-rmF + + + @@ -2885,6 +2965,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ com.apple.InterfaceBuilder.CocoaPlugin + {182, 582.5} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2895,11 +2976,12 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ + {239, 248.5} com.apple.InterfaceBuilder.CocoaPlugin - - - {-243.5, 329.5} + + + {-183.5, 363} com.apple.InterfaceBuilder.CocoaPlugin @@ -3063,6 +3145,7 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin @@ -3084,6 +3167,18 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + If this is checked, when a Cappuccino project is opened, the project’s Xcode support project will be opened automatically + + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip @@ -3116,6 +3211,8 @@ bnRvaW5lIE1lcmNhZGFsCiAgICBhbnRvaW5lLm1lcmNhZGFsQGdtYWlsLmNvbQ com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin From 1ce6a630d2ac186e8daaaffaa00d5b050b1fc15d Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 6 Nov 2014 13:29:16 -0800 Subject: [PATCH 031/106] Fixed: warnings from objj were displayed several times --- Tools/XcodeCapp/XcodeCapp/XcodeCapp.m | 39 ++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m index f326c2654..081f44db4 100644 --- a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m @@ -1573,8 +1573,8 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, { id info = self.errorListController.selection; - NSString *path = [info valueForKey:@"path"]; - + NSString *path = [info valueForKey:@"realPath"] ? [info valueForKey:@"realPath"] : [info valueForKey:@"path"]; + if (path == NSNoSelectionMarker) return; @@ -1890,7 +1890,6 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, NSMutableArray *errors = [NSMutableArray arrayWithArray:[response componentsSeparatedByString:@"\n\n"]]; NSInteger numberOfErrors = [errors count]; - i = 0; NSMutableArray *dicts = [NSMutableArray array]; // When checking of the entire project, we have to be ready to find errors @@ -1901,6 +1900,8 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, if ([paths count] == 1) filePath = [paths firstObject]; + i = 0; + for (i = 0; i < numberOfErrors; i++) { NSMutableString *error = (NSMutableString*)[errors objectAtIndex:i]; @@ -1965,10 +1966,36 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, path , @"realPath", nil]; - // Compiler can show several times the same errors - if (![dicts containsObject:dict] && ![self.errorList containsObject:dict]) - [dicts addObject:dict]; + // Block to compare dicts + BOOL (^dictComparaison)(id obj, NSUInteger idx, BOOL *stop) = ^(id obj, NSUInteger idx, BOOL *stop){ + if ([obj valueForKey:@"line"] == [dict valueForKey:@"line"]) + { + // For an unknown reason, trim doesn't work + NSString *messsageObj = [obj valueForKey:@"message"]; + NSString *messsageDict = [dict valueForKey:@"message"]; + + messsageDict = [messsageDict stringByReplacingOccurrencesOfString:@" " withString:@""]; + messsageDict = [messsageDict stringByReplacingOccurrencesOfString:@"\n" withString:@""]; + + messsageObj = [messsageObj stringByReplacingOccurrencesOfString:@" " withString:@""]; + messsageObj = [messsageObj stringByReplacingOccurrencesOfString:@"\n" withString:@""]; + + if ([messsageDict isEqualToString:messsageObj]) + { + *stop = YES; + return YES; + } + } + + return NO; + }; + NSUInteger isInDict = [dicts indexOfObjectPassingTest:dictComparaison]; + NSUInteger isInList = [self.errorList indexOfObjectPassingTest:dictComparaison]; + + // Compiler can show several times the same errors + if (isInDict == NSNotFound && isInList == NSNotFound) + [dicts addObject:dict]; } [self performSelectorOnMainThread:@selector(objjCompilerDidGenerateError:) withObject:dicts waitUntilDone:YES]; From de2e77cc8659fd2bca58185ddfddaf05a0f5951a Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Thu, 6 Nov 2014 17:23:27 -0500 Subject: [PATCH 032/106] Adding userInfo error keys and documenting CPURLError.j --- Foundation/CPURLError.j | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Foundation/CPURLError.j b/Foundation/CPURLError.j index a54ebdaaf..77d901256 100644 --- a/Foundation/CPURLError.j +++ b/Foundation/CPURLError.j @@ -1,5 +1,18 @@ +/* + * The CPURL Error Domain + */ CPURLErrorDomain = @"CPURLErrorDomain"; + +/* + * CPURL UserInfo Error Keys + */ +CPURLErrorFailingURLErrorKey = @"CPErrorFailingURLKey"; +CPURLErrorFailingURLStringErrorKey = @"CPURLErrorFailingURLStringKey"; + +/* + * CPURL Error Codes + */ CPURLErrorUnknown = -1; CPURLErrorCancelled = kCFURLErrorCancelled; CPURLErrorBadURL = kCFURLErrorBadURL; From 57d435b6db378a1681f861b4f269838e4a5d5d5e Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 6 Nov 2014 14:59:40 -0800 Subject: [PATCH 033/106] NEW: .gitignore ignores .tm_properties --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9d53e1758..11a5e1abf 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ xcuserdata/ Tests/Manual/**/*.xcodeproj *.sublime-project *.sublime-workspace +*.tm_properties From ab2657b795f22817dfd1a81240b8aee077e7d582 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 6 Nov 2014 15:11:58 -0800 Subject: [PATCH 034/106] Fixed compilation warning in nib2cib --- Tools/nib2cib/NSDatePicker.j | 2 +- Tools/nib2cib/NSImageView.j | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Tools/nib2cib/NSDatePicker.j b/Tools/nib2cib/NSDatePicker.j index d3af0690c..a90983ec5 100644 --- a/Tools/nib2cib/NSDatePicker.j +++ b/Tools/nib2cib/NSDatePicker.j @@ -180,7 +180,7 @@ var NSDatePickerDefaultSize = 22, CPDateFormatter _formatter @accessors(getter=formatter); CPInteger _datePickerMode @accessors(getter=datePickerMode); CPInteger _datePickerElements @accessors(getter=datePickerElements); - CPinteger _datePickerType @accessors(getter=datePickerType); + CPInteger _datePickerType @accessors(getter=datePickerType); double _timeInterval @accessors(getter=timeInterval); CPColor _textColor @accessors(getter=textColor); CPColor _backgroundColor @accessors(getter=backgroundColor); diff --git a/Tools/nib2cib/NSImageView.j b/Tools/nib2cib/NSImageView.j index 909089fdf..02fd50f52 100644 --- a/Tools/nib2cib/NSImageView.j +++ b/Tools/nib2cib/NSImageView.j @@ -67,7 +67,7 @@ @end // NSImageCell - +@typedef NSImageAlignment NSImageAlignCenter = 0; NSImageAlignTop = 1; NSImageAlignTopLeft = 2; @@ -78,12 +78,13 @@ NSImageAlignBottomLeft = 6; NSImageAlignBottomRight = 7; NSImageAlignRight = 8; - +@typedef NSImageScaling NSImageScaleProportionallyDown = 0; NSImageScaleAxesIndependently = 1; NSImageScaleNone = 2; NSImageScaleProportionallyUpOrDown = 3; +@typedef NSImageFrameStyle NSImageFrameNone = 0; NSImageFramePhoto = 1; NSImageFrameGrayBezel = 2; From 9a307269ca6d8f7a3c680b5e0fe5d31584857875 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Fri, 7 Nov 2014 14:25:35 -0800 Subject: [PATCH 035/106] FIXED: CPButtonBar was not removing old button set from the view This patch ensure that when we are using setButtons: old buttons are actually removed from the superview --- AppKit/CPButtonBar.j | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AppKit/CPButtonBar.j b/AppKit/CPButtonBar.j index c524a2fcb..024924830 100644 --- a/AppKit/CPButtonBar.j +++ b/AppKit/CPButtonBar.j @@ -133,7 +133,11 @@ - (void)setButtons:(CPArray)buttons { for (var i = [_buttons count] - 1; i >= 0; i--) + { + [_buttons[i] removeFromSuperview]; [_buttons[i] removeObserver:self forKeyPath:@"hidden"]; + } + _buttons = [CPArray arrayWithArray:buttons]; From 664d5777fd95d442aaf7325fb8b6d8369ad5a598 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 7 Nov 2014 15:43:18 -0800 Subject: [PATCH 036/106] Fixed: CPWindow doesn't take the event when moving from another platformWindow Previously, when moving from platformWindow to another platformWindow, the targeted window didn't get the new event because the keyWindow of the application was still set to the other platformWindow. This PR fixes another issue about opening panel in a platformWindow. When opening a panel in a platformWindow, cappuccino set the new key window to the wrong platformWindow. --- AppKit/CPWindow/CPWindow.j | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index f770fc642..969d9fad7 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -1846,6 +1846,12 @@ CPTexturedBackgroundWindowMask if (_leftMouseDownView !== _firstResponder && [_leftMouseDownView acceptsFirstResponder]) [self makeFirstResponder:_leftMouseDownView]; + var keyWindow = [CPApp keyWindow]; + + // This is only when we move from a platform to another one + if ([keyWindow platformWindow] != [self platformWindow]) + [self makeKeyAndOrderFront:self]; + [CPApp activateIgnoringOtherApps:YES]; var theWindow = [anEvent window], @@ -2477,7 +2483,7 @@ CPTexturedBackgroundWindowMask if (currentWindow === self || currentWindow === menuWindow) continue; - if ([currentWindow isVisible] && [currentWindow canBecomeKeyWindow]) + if ([currentWindow isVisible] && [currentWindow canBecomeKeyWindow] && [currentWindow platformWindow] == [keyWindow platformWindow]) { [currentWindow makeKeyWindow]; break; From 0cafb3fac53df9b338940322845db5142d622065 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Mon, 10 Nov 2014 17:03:34 -0800 Subject: [PATCH 037/106] FIXED: CPViewController coming from a XIB could call viewDidLoad two times This patch ensure that CPViewController is never calling viewDidLoad more than one time. --- AppKit/CPViewController.j | 1 + 1 file changed, 1 insertion(+) diff --git a/AppKit/CPViewController.j b/AppKit/CPViewController.j index 2ea3a05de..0c9bec99e 100644 --- a/AppKit/CPViewController.j +++ b/AppKit/CPViewController.j @@ -210,6 +210,7 @@ var CPViewControllerCachedCibs; [cibOwner viewControllerDidLoadCib:self]; _isLoading = NO; + _isLazy = NO; [self _viewDidLoad]; } else if (_isLazy) From 0c7b2ae7023ba18a59f75cbf868f28e0d53917f9 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 12 Nov 2014 23:59:46 -0800 Subject: [PATCH 038/106] NEW: Support for multiline mode in CPTextField This patch adds support for CPTextField with multiline content. It uses a DOM textarea when needed, instead of DOM input. It also disable the spellchecking, fixes a bug where the input element was not correctly resized when the frame changed, and refactor some code --- AppKit/CPTextField.j | 282 ++++++++++++--------- AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 2 +- 2 files changed, 164 insertions(+), 120 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index fc3d833d9..63ea80fe2 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -47,9 +47,10 @@ CPTextFieldRoundedBezel = 1; /*! A textfield bezel with rounded corne CPTextFieldDidFocusNotification = @"CPTextFieldDidFocusNotification"; CPTextFieldDidBlurNotification = @"CPTextFieldDidBlurNotification"; -var CPTextFieldDOMInputElement = nil, - CPTextFieldDOMPasswordInputElement = nil, +var CPTextFieldDOMCurrentElement = nil, + CPTextFieldDOMTextAreaElement = nil, CPTextFieldDOMStandardInputElement = nil, + CPTextFieldDOMPasswordInputElement = nil, CPTextFieldInputOwner = nil, CPTextFieldTextDidChangeValue = nil, CPTextFieldInputResigning = NO, @@ -142,6 +143,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // NS-style Display Properties CPTextFieldBezelStyle _bezelStyle; BOOL _isBordered; + BOOL _usesSingleLineMode; + BOOL _wraps; + BOOL _scrolls; } + (Class)_binderClassForBinding:(CPString)aBinding @@ -246,95 +250,106 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); #if PLATFORM(DOM) - (DOMElement)_inputElement { - if (!CPTextFieldDOMInputElement) + if (!CPTextFieldDOMTextAreaElement) { - CPTextFieldDOMInputElement = document.createElement("input"); - CPTextFieldDOMInputElement.style.position = "absolute"; - CPTextFieldDOMInputElement.style.border = "0px"; - CPTextFieldDOMInputElement.style.padding = "0px"; - CPTextFieldDOMInputElement.style.margin = "0px"; - CPTextFieldDOMInputElement.style.whiteSpace = "pre"; - CPTextFieldDOMInputElement.style.background = "transparent"; - CPTextFieldDOMInputElement.style.outline = "none"; + CPTextFieldDOMTextAreaElement = document.createElement("textarea"); + CPTextFieldDOMTextAreaElement.style.position = "absolute"; + CPTextFieldDOMTextAreaElement.style.border = "0px"; + CPTextFieldDOMTextAreaElement.style.padding = "0px"; + CPTextFieldDOMTextAreaElement.style.margin = "0px"; + CPTextFieldDOMTextAreaElement.style.background = "transparent"; + CPTextFieldDOMTextAreaElement.style.outline = "none"; + CPTextFieldDOMTextAreaElement.style.resize = "none"; + CPTextFieldDOMTextAreaElement.style.overflow = "hidden"; + CPTextFieldDOMTextAreaElement.spellcheck = NO; + } + if (!CPTextFieldDOMStandardInputElement) + { + CPTextFieldDOMStandardInputElement = document.createElement("input"); + CPTextFieldDOMStandardInputElement.style.position = "absolute"; + CPTextFieldDOMStandardInputElement.style.border = "0px"; + CPTextFieldDOMStandardInputElement.style.padding = "0px"; + CPTextFieldDOMStandardInputElement.style.margin = "0px"; + CPTextFieldDOMStandardInputElement.style.whiteSpace = "pre"; + CPTextFieldDOMStandardInputElement.style.background = "transparent"; + CPTextFieldDOMStandardInputElement.style.outline = "none"; + CPTextFieldDOMStandardInputElement.spellcheck = NO; + } + + if (!CPTextFieldDOMPasswordInputElement) + { + CPTextFieldDOMPasswordInputElement = document.createElement("input"); + CPTextFieldDOMPasswordInputElement.style.position = "absolute"; + CPTextFieldDOMPasswordInputElement.style.border = "0px"; + CPTextFieldDOMPasswordInputElement.style.padding = "0px"; + CPTextFieldDOMPasswordInputElement.style.margin = "0px"; + CPTextFieldDOMPasswordInputElement.style.whiteSpace = "pre"; + CPTextFieldDOMPasswordInputElement.style.background = "transparent"; + CPTextFieldDOMPasswordInputElement.style.outline = "none"; + CPTextFieldDOMPasswordInputElement.type = "password"; + CPTextFieldDOMPasswordInputElement.spellcheck = NO; + } + + if (!CPTextFieldBlurHandler) + { CPTextFieldBlurHandler = function(anEvent) { return CPTextFieldBlurFunction( anEvent, CPTextFieldInputOwner, CPTextFieldInputOwner ? CPTextFieldInputOwner._DOMElement : nil, - CPTextFieldDOMInputElement, + CPTextFieldDOMCurrentElement, CPTextFieldInputResigning, @ref(CPTextFieldInputDidBlur)); }; + } - if (CPFeatureIsCompatible(CPInputOnInputEventFeature)) + if (!CPTextFieldInputFunction) + { + if (!CPFeatureIsCompatible(CPInputOnInputEventFeature)) + return; + + CPTextFieldInputFunction = function(anEvent) { - CPTextFieldInputFunction = function(anEvent) - { - if (!CPTextFieldInputOwner) - return; + if (!CPTextFieldInputOwner) + return; - var cappEvent = [CPEvent keyEventWithType:CPKeyUp - location:CGPointMakeZero() - modifierFlags:0 - timestamp:[CPEvent currentTimestamp] - windowNumber:[[CPApp keyWindow] windowNumber] - context:nil - characters:nil - charactersIgnoringModifiers:nil - isARepeat:NO - keyCode:nil]; + var cappEvent = [CPEvent keyEventWithType:CPKeyUp + location:CGPointMakeZero() + modifierFlags:0 + timestamp:[CPEvent currentTimestamp] + windowNumber:[[CPApp keyWindow] windowNumber] + context:nil + characters:nil + charactersIgnoringModifiers:nil + isARepeat:NO + keyCode:nil]; - [CPTextFieldInputOwner keyUp:cappEvent]; + [CPTextFieldInputOwner keyUp:cappEvent]; - [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; - } - - CPTextFieldDOMInputElement.oninput = CPTextFieldInputFunction; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; } - // FIXME make this not onblur - CPTextFieldDOMInputElement.onblur = CPTextFieldBlurHandler; + CPTextFieldDOMPasswordInputElement.oninput = CPTextFieldInputFunction; + CPTextFieldDOMPasswordInputElement.onblur = CPTextFieldBlurHandler; - CPTextFieldDOMStandardInputElement = CPTextFieldDOMInputElement; + CPTextFieldDOMStandardInputElement.oninput = CPTextFieldInputFunction; + CPTextFieldDOMPasswordInputElement.onblur = CPTextFieldBlurHandler; + + CPTextFieldDOMTextAreaElement.oninput = CPTextFieldInputFunction; + CPTextFieldDOMTextAreaElement.onblur = CPTextFieldBlurHandler; } - if (CPFeatureIsCompatible(CPInputTypeCanBeChangedFeature)) - { - if ([self isSecure]) - CPTextFieldDOMInputElement.type = "password"; - else - CPTextFieldDOMInputElement.type = "text"; - - return CPTextFieldDOMInputElement; - } if ([self isSecure]) - { - if (!CPTextFieldDOMPasswordInputElement) - { - CPTextFieldDOMPasswordInputElement = document.createElement("input"); - CPTextFieldDOMPasswordInputElement.style.position = "absolute"; - CPTextFieldDOMPasswordInputElement.style.border = "0px"; - CPTextFieldDOMPasswordInputElement.style.padding = "0px"; - CPTextFieldDOMPasswordInputElement.style.margin = "0px"; - CPTextFieldDOMPasswordInputElement.style.whiteSpace = "pre"; - CPTextFieldDOMPasswordInputElement.style.background = "transparent"; - CPTextFieldDOMPasswordInputElement.style.outline = "none"; - CPTextFieldDOMPasswordInputElement.type = "password"; - - CPTextFieldDOMPasswordInputElement.onblur = CPTextFieldBlurHandler; - } - - CPTextFieldDOMInputElement = CPTextFieldDOMPasswordInputElement; - } + CPTextFieldDOMCurrentElement = CPTextFieldDOMPasswordInputElement; + else if (_usesSingleLineMode) + CPTextFieldDOMCurrentElement = CPTextFieldDOMStandardInputElement; else - { - CPTextFieldDOMInputElement = CPTextFieldDOMStandardInputElement; - } + CPTextFieldDOMCurrentElement = CPTextFieldDOMTextAreaElement; - return CPTextFieldDOMInputElement; + return CPTextFieldDOMCurrentElement; } #endif @@ -553,6 +568,24 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return _textFieldBackgroundColor; } +/*! @ignore */ +- (void)_setUsesSingleLineMode:(BOOL)aFlag +{ + _usesSingleLineMode = aFlag; +} + +/*! @ignore */ +- (void)_setWraps:(BOOL)aFlag +{ + _wraps = aFlag; +} + +/*! @ignore */ +- (void)_setScrolls:(BOOL)aFlag +{ + _scrolls = aFlag; +} + /*! @ignore */ - (BOOL)acceptsFirstResponder { @@ -608,28 +641,10 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self _setCSSStyleForInputElement]; - var element = [self _inputElement], - font = [self currentValueForThemeAttribute:@"font"], - contentRect = [self contentRectForBounds:[self bounds]], - left = CGRectGetMinX(contentRect); - + var element = [self _inputElement]; element.value = _stringValue; - - // If the browser has a built in left padding, compensate for it. We need the input text to be exactly on top of the original text. - if (CPFeatureIsCompatible(CPInput1PxLeftPadding)) - left -= 1; - - element.style.left = left + "px"; - element.style.width = CGRectGetWidth(contentRect) + "px"; - element.style.verticalAlign = "top"; - element.style.cursor = "auto"; - _DOMElement.appendChild(element); - // The font change above doesn't work for some browsers if the element isn't already appendChild'ed. - if (!CPFeatureIsCompatible(CPInputSetFontOutsideOfDOM)) - element.style.font = [font cssString]; - CPTextFieldInputIsActive = YES; if (document.attachEvent) @@ -673,37 +688,18 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); */ - (void)_setCSSStyleForInputElement { - #if PLATFORM(DOM) - var element = [self _inputElement], - font = [self currentValueForThemeAttribute:@"font"], - lineHeight = [font defaultLineHeightForFont], - contentRect = [self contentRectForBounds:[self bounds]], - verticalAlign = [self currentValueForThemeAttribute:"vertical-alignment"]; - if ([self hasThemeState:CPTextFieldStatePlaceholder]) - element.style.color = [[self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder] cssString]; - else - element.style.color = [[self valueForThemeAttribute:@"text-color" inState:CPThemeStateEditing] cssString]; + var element = [self _inputElement], + font = [self currentValueForThemeAttribute:@"font"], + lineHeight = [font defaultLineHeightForFont], + contentRect = [self contentRectForBounds:[self bounds]], + verticalAlign = [self currentValueForThemeAttribute:"vertical-alignment"], + left = CGRectGetMinX(contentRect); - if (CPFeatureIsCompatible(CPInputSetFontOutsideOfDOM)) - element.style.font = [font cssString]; - - element.style.zIndex = 1000; - - switch ([self alignment]) - { - case CPCenterTextAlignment: - element.style.textAlign = "center"; - break; - - case CPRightTextAlignment: - element.style.textAlign = "right"; - break; - - default: - element.style.textAlign = "left"; - } + // If the browser has a built in left padding, compensate for it. We need the input text to be exactly on top of the original text. + if (CPFeatureIsCompatible(CPInput1PxLeftPadding)) + left -= 1; switch (verticalAlign) { @@ -724,12 +720,41 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); break; } - element.style.top = topPoint; - element.style.height = ROUND(lineHeight) + "px"; - element.style.lineHeight = ROUND(lineHeight) + "px"; + if ([self hasThemeState:CPTextFieldStatePlaceholder]) + element.style.color = [[self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder] cssString]; + else + element.style.color = [[self valueForThemeAttribute:@"text-color" inState:CPThemeStateEditing] cssString]; + + switch ([self alignment]) + { + case CPCenterTextAlignment: + element.style.textAlign = "center"; + break; + + case CPRightTextAlignment: + element.style.textAlign = "right"; + break; + + default: + element.style.textAlign = "left"; + } + + var isTextArea = element.nodeName.toUpperCase() == "TEXTAREA"; + + element.style.zIndex = 1000; + element.style.top = topPoint; + element.style.lineHeight = ROUND(lineHeight) + "px"; + element.style.height = isTextArea ? CGRectGetHeight(contentRect) + "px" : ROUND(lineHeight) + "px";; + element.style.width = CGRectGetWidth(contentRect) + "px"; + element.style.left = left + "px"; + element.style.verticalAlign = "top"; + element.style.cursor = "auto"; + element.style.font = [font cssString]; + + if (isTextArea) + element.style.whiteSpace = _wraps ? "pre" : "nowrap"; #endif - } /*! @ignore */ @@ -1054,6 +1079,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self _didEdit]; } + console.error("newValue : >" + newValue + "<") + console.error("_stringValue : >" + _stringValue + "<") + if ([self _valueIsValid:_stringValue]) { // If _isEditing == YES then the target action can also be called via @@ -1099,7 +1127,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); range = [self selectedRange], element = [self _inputElement]; - element.value = [element.value stringByReplacingCharactersInRange:[self selectedRange] withString:aCharacter]; + // we don't need to do this in case of textarea + // or we will end up with 2 carriage returns + if (aCharacter != CPNewlineCharacter || element.nodeName.toUpperCase() != "TEXTAREA") + element.value = [element.value stringByReplacingCharactersInRange:[self selectedRange] withString:aCharacter]; + [self _setStringValue:element.value]; // NOTE: _stringValue is now the current input element value @@ -1944,7 +1976,11 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", CPTextFieldLineBreakModeKey = "CPTextFieldLineBreakModeKey", CPTextFieldAlignmentKey = "CPTextFieldAlignmentKey", CPTextFieldBackgroundColorKey = "CPTextFieldBackgroundColorKey", - CPTextFieldPlaceholderStringKey = "CPTextFieldPlaceholderStringKey"; + CPTextFieldPlaceholderStringKey = "CPTextFieldPlaceholderStringKey", + CPTextFieldUsesSingleLineMode = "CPTextFieldUsesSingleLineMode", + CPTextFieldWraps = "CPTextFieldWraps", + CPTextFieldScrolls = "CPTextFieldScrolls"; + @implementation CPTextField (CPCoding) @@ -1970,6 +2006,10 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]]; [self setPlaceholderString:[aCoder decodeObjectForKey:CPTextFieldPlaceholderStringKey]]; + + [self _setUsesSingleLineMode:[aCoder decodeBoolForKey:CPTextFieldUsesSingleLineMode]]; + [self _setWraps:[aCoder decodeBoolForKey:CPTextFieldWraps]]; + [self _setScrolls:[aCoder decodeBoolForKey:CPTextFieldScrolls]]; } return self; @@ -1994,6 +2034,10 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [aCoder encodeInt:[self alignment] forKey:CPTextFieldAlignmentKey]; [aCoder encodeObject:_placeholderString forKey:CPTextFieldPlaceholderStringKey]; + + [aCoder encodeBool:_usesSingleLineMode forKey:CPTextFieldUsesSingleLineMode]; + [aCoder encodeBool:_wraps forKey:CPTextFieldWraps]; + [aCoder encodeBool:_scrolls forKey:CPTextFieldScrolls]; } @end diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index 31b1810ef..eeba3a894 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -1143,7 +1143,7 @@ var PreventScroll = true; _mouseDownIsRightClick = button == 2 || (CPBrowserIsOperatingSystem(CPMacOperatingSystem) && button == 0 && modifierFlags & CPControlKeyMask); - if (sourceElement.tagName === "INPUT" && sourceElement != _DOMFocusElement) + if ((sourceElement.tagName === "INPUT" || sourceElement.tagName === "TEXTAREA") && sourceElement != _DOMFocusElement) { if ([CPPlatform supportsDragAndDrop]) { From e7cde2ca5ff14b193243248ccace24307fb8e73d Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 13 Nov 2014 00:10:22 -0800 Subject: [PATCH 039/106] Add support for usesMultilineMode and fix wraps and scrolls in nib2cib --- Tools/nib2cib/NSCell.j | 34 ++++++++++++++++++---------------- Tools/nib2cib/NSTextField.j | 4 ++++ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Tools/nib2cib/NSCell.j b/Tools/nib2cib/NSCell.j index 01307538a..8be4737b8 100644 --- a/Tools/nib2cib/NSCell.j +++ b/Tools/nib2cib/NSCell.j @@ -51,6 +51,7 @@ int _lineBreakMode @accessors(readonly, getter=lineBreakMode); CPFormatter _formatter @accessors(readonly, getter=formatter); int _tag @accessors(readonly, getter=tag); + BOOL _usesSingleLineMode @accessors(readonly, getter=usesSingleLineMode); } - (id)initWithCoder:(CPCoder)aCoder @@ -62,22 +63,23 @@ var flags = [aCoder decodeIntForKey:@"NSCellFlags"], flags2 = [aCoder decodeIntForKey:@"NSCellFlags2"]; - _state = (flags & 0x80000000) ? CPOnState : CPOffState; - _isHighlighted = (flags & 0x40000000) ? YES : NO; - _isEnabled = (flags & 0x20000000) ? NO : YES; - _isEditable = (flags & 0x10000000) ? YES : NO; - _isBordered = (flags & 0x00800000) ? YES : NO; - _isBezeled = (flags & 0x00400000) ? YES : NO; - _isSelectable = (flags & 0x00200000) ? YES : NO; - _isScrollable = (flags & 0x00100000) ? YES : NO; - _isContinuous = (flags & 0x00080100) ? YES : NO; - _scrolls = (flags & 0x00100000) && (flags & 0x00000040); - _wraps = (flags & 0x00100000 === 0) && (flags & 0x00000040 === 0); - _truncates = !(flags & 0x00100000) && (flags & 0x00000040); - _alignment = (flags2 & 0x1c000000) >> 26; - _lineBreakMode = (flags2 & 0x0E00) >> 9; - _controlSize = (flags2 & 0xE0000) >> 17; - _sendsActionOnEndEditing = (flags2 & 0x00400000) ? YES : NO; + _state = (flags & 0x80000000) ? CPOnState : CPOffState; + _isHighlighted = (flags & 0x40000000) ? YES : NO; + _isEnabled = (flags & 0x20000000) ? NO : YES; + _isEditable = (flags & 0x10000000) ? YES : NO; + _isBordered = (flags & 0x00800000) ? YES : NO; + _isBezeled = (flags & 0x00400000) ? YES : NO; + _isSelectable = (flags & 0x00200000) ? YES : NO; + _isScrollable = (flags & 0x00100000) ? YES : NO; + _isContinuous = (flags & 0x00080100) ? YES : NO; + _scrolls = (flags & 0x00100000) && (flags & 0x00000040) ? YES : NO; + _wraps = !(flags & 0x00100000) && !(flags & 0x00000040) ? YES : NO; + _truncates = (flags & 0x00100000) && !(flags & 0x00000040) ? YES : NO; + _alignment = (flags2 & 0x1c000000) >> 26; + _lineBreakMode = (flags2 & 0x0E00) >> 9; + _controlSize = (flags2 & 0xE0000) >> 17; + _sendsActionOnEndEditing = (flags2 & 0x00400000) ? YES : NO; + _usesSingleLineMode = (flags2 & 0xF4240) ? YES : NO; _tag = [aCoder decodeIntForKey:@"NSTag"]; diff --git a/Tools/nib2cib/NSTextField.j b/Tools/nib2cib/NSTextField.j index 711fb8f7e..cb0fa306b 100644 --- a/Tools/nib2cib/NSTextField.j +++ b/Tools/nib2cib/NSTextField.j @@ -54,6 +54,10 @@ [self setPlaceholderString:[cell placeholderString]]; + [self _setUsesSingleLineMode:[cell usesSingleLineMode]]; + [self _setWraps:[cell wraps]]; + [self _setScrolls:[cell scrolls]]; + var textColor = [cell textColor], defaultColor = [self currentValueForThemeAttribute:@"text-color"]; From de3f6d3e829cfeb8e7dd4c372651759ec82695af Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 13 Nov 2014 00:10:32 -0800 Subject: [PATCH 040/106] Add manual test --- .../CPTextFieldMultiline/AppController.j | 46 + Tests/Manual/CPTextFieldMultiline/Info.plist | 14 + Tests/Manual/CPTextFieldMultiline/Jakefile | 184 + .../Resources/MainMenu.cib | 3 + .../Resources/MainMenu.xib | 3604 +++++++++++++++++ .../CPTextFieldMultiline/index-debug.html | 191 + Tests/Manual/CPTextFieldMultiline/index.html | 161 + Tests/Manual/CPTextFieldMultiline/main.j | 18 + 8 files changed, 4221 insertions(+) create mode 100644 Tests/Manual/CPTextFieldMultiline/AppController.j create mode 100644 Tests/Manual/CPTextFieldMultiline/Info.plist create mode 100644 Tests/Manual/CPTextFieldMultiline/Jakefile create mode 100644 Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.cib create mode 100644 Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.xib create mode 100644 Tests/Manual/CPTextFieldMultiline/index-debug.html create mode 100644 Tests/Manual/CPTextFieldMultiline/index.html create mode 100644 Tests/Manual/CPTextFieldMultiline/main.j diff --git a/Tests/Manual/CPTextFieldMultiline/AppController.j b/Tests/Manual/CPTextFieldMultiline/AppController.j new file mode 100644 index 000000000..db6ef8162 --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/AppController.j @@ -0,0 +1,46 @@ +/* + * AppController.j + * CPTextFielMultine + * + * Created by You on November 12, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPTextField field1; + @outlet CPTextField field2; + @outlet CPTextField field3; + @outlet CPWindow theWindow; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var s = [field1 frameSize]; + s.height = 83; + [field1 setFrameSize:s] + + var s = [field2 frameSize]; + s.height = 83; + [field2 setFrameSize:s] + + var s = [field3 frameSize]; + s.height = 83; + [field3 setFrameSize:s] +} + +- (void)awakeFromCib +{ + [theWindow setFullPlatformWindow:YES]; +} + +- (IBAction)actionSent:(id)aSender +{ + CPLog.debug("action sent from " + aSender); +} + +@end diff --git a/Tests/Manual/CPTextFieldMultiline/Info.plist b/Tests/Manual/CPTextFieldMultiline/Info.plist new file mode 100644 index 000000000..4e6a94074 --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPTextFieldMultiline + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2014, Your Company All rights reserved. + + diff --git a/Tests/Manual/CPTextFieldMultiline/Jakefile b/Tests/Manual/CPTextFieldMultiline/Jakefile new file mode 100644 index 000000000..6d39494ac --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/Jakefile @@ -0,0 +1,184 @@ +/* + * Jakefile + * CPTextFielMultine + * + * Created by You on November 12, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "CPTextFielMultine"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPTextFielMultine.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPTextFielMultine"); + task.setIdentifier("com.yourcompany.CPTextFielMultine"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPTextFielMultine"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPTextFielMultine.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPTextFielMultine.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (ENV["CONFIGURATION"] === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", ENV["CONFIGURATION"], projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", ENV["CONFIGURATION"], projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.cib b/Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.cib new file mode 100644 index 000000000..9affdf898 --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.cib @@ -0,0 +1,3 @@ +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;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;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;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;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;2;27E;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;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;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;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;82E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;200E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;154E;D;K;6;CP$UIDd;3;197E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;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;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;205E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;206E;E;D;K;10;$classnameS;31;CPCibRuntimeAttributesConnectorK;8;$classesA;S;31;CPCibRuntimeAttributesConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;159E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;159E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;207E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;194E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;194E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;209E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;210E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;188E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;188E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;211E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;212E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;166E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;166E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;213E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;214E;E;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;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;215E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;158E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;216E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;189E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;217E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;193E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;218E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;168E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;219E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;182E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;220E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;174E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;221E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;198E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;152E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;222E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;200E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;158E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;223E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;201E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;193E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;223E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;202E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;189E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;223E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;203E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;163E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;223E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;204E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;168E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;223E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;89E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;225E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;226E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;139E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;227E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;144E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;228E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;137E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;229E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;138E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;230E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;140E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;231E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;146E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;233E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;143E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;95E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;82E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;235E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;128E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;129E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;237E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;110E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;238E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;239E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;240E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;123E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;104E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;242E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;243E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;124E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;244E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;245E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;246E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;116E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;247E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;248E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;122E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;249E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;90E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;250E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;149E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;150E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;125E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;253E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;132E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;254E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;255E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;134E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;256E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;158E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;168E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;163E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;193E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;189E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;182E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;174E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;179E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;185E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;198E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;257E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;169E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;204E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;258E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;259E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;260E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;166E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;203E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;258E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;259E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;260E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;263E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;188E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;202E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;258E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;259E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;260E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;264E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;194E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;201E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;258E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;259E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;260E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;265E;E;D;K;6;$classD;K;6;CP$UIDd;2;76E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;159E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;200E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;258E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;3;259E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;3;260E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;3;266E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;205E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;267E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;268E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;269E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;270E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;87E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;87E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;270E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;273E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;274E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;275E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;277E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;278E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;279E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;280E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;87E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;281E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;282E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;93E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;93E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;282E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;283E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;284E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;285E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;93E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;286E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;93E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;287E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;288E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;93E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;289E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;275E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;277E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;93E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;275E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;277E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;93E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;290E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;100E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;100E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;290E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;292E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;293E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;294E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;103E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;103E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;294E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;295E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;296E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;297E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;298E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;299E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;300E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;275E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;277E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;301E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;302E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;303E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;304E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;305E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;306E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;275E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;277E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;307E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;308E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;310E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;114E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;114E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;310E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;311E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;312E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;313E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;114E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;314E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;315E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;114E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;316E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;317E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;318E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;114E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;319E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;320E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;321E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;114E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;322E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;323E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;324E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;114E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;325E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;326E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;121E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;121E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;326E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;327E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;328E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;121E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;329E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;121E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;330E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;331E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;121E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;332E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;333E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;121E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;334E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;127E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;127E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;334E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;335E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;336E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;127E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;337E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;127E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;338E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;131E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;131E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;338E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;339E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;340E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;324E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;131E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;325E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;341E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;321E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;131E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;322E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;342E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;313E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;131E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;314E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;343E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;136E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;136E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;343E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;344E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;345E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;346E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;347E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;348E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;309E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;349E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;350E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;351E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;352E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;353E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;142E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;142E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;353E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;354E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;355E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;356E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;142E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;357E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;358E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;275E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;277E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;359E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;360E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;148E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;271E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;148E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;84E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;360E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;361E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;362E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;148E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;363E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;364E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;365E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;148E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;272E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;151E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;366E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;367E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;368E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;369E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;370E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;318E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;270E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;154E;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;3;153E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;372E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;372E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;373E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;374E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;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;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;376E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;384E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;387E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;388E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;391E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;393E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;394E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;395E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;396E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;276E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;398E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;399E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;400E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;401E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;402E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;403E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;404E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;405E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;406E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;10;$classnameS;17;CPSecureTextFieldK;8;$classesA;S;17;CPSecureTextFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;162E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;407E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;408E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;396E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;276E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;409E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;410E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;411E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;412E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;413E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;414E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;403E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;415E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;416E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;401E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;417E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;418E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;419E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;420E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;408E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;396E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;276E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;409E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;421E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;416E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;401E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;422E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;403E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;423E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;411E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;424E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;425E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;426E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;427E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;428E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;10;$classnameS;10;CPComboBoxK;8;$classesA;S;10;CPComboBoxS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;429E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;430E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;431E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;432E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;276E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;K;18;CPComboBoxItemsKeyD;K;6;CP$UIDd;3;433E;K;17;CPComboBoxListKeyD;K;6;CP$UIDd;1;0E;K;21;CPComboBoxDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPComboBoxDataSourceKeyD;K;6;CP$UIDd;1;0E;K;27;CPComboBoxUsesDataSourceKeyD;K;6;CP$UIDd;3;277E;K;22;CPComboBoxCompletesKeyD;K;6;CP$UIDd;3;277E;K;33;CPComboBoxNumberOfVisibleItemsKeyD;K;6;CP$UIDd;3;434E;K;32;CPComboBoxHasVerticalScrollerKeyD;K;6;CP$UIDd;3;275E;K;27;CPComboBoxButtonBorderedKeyD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;435E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;411E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;436E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;425E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;437E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;427E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;438E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;439E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;411E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;440E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;413E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;10;$classnameS;13;CPSearchFieldK;8;$classesA;S;13;CPSearchFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;441E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;416E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;442E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;443E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;276E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;K;27;CPSendsWholeSearchStringKeyD;K;6;CP$UIDd;3;277E;K;33;CPSendsSearchStringImmediatelyKeyD;K;6;CP$UIDd;3;275E;K;19;CPMaximumRecentsKeyD;K;6;CP$UIDd;3;444E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;445E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;446E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;447E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;10;$classnameS;12;CPTokenFieldK;8;$classesA;S;12;CPTokenFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;181E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;448E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;408E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;449E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;450E;K;11;$aalignmentD;K;6;CP$UIDd;3;371E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;451E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;371E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;409E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;K;37;CPTokenFieldTokenizingCharacterSetKeyD;K;6;CP$UIDd;1;0E;K;27;CPTokenFieldCompletionDelayD;K;6;CP$UIDd;1;0E;K;25;CPTokenFieldButtonTypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;452E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;411E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;453E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;413E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;10;$classnameS;12;CPDatePickerK;8;$classesA;S;12;CPDatePickerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;184E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;454E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;455E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;456E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;457E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;458E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;460E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;13;CPIntervalKeyD;K;6;CP$UIDd;3;371E;K;19;CPDatePickerModeKeyD;K;6;CP$UIDd;3;371E;K;20;CPDatePickerStyleKeyD;K;6;CP$UIDd;3;371E;K;23;CPDatePickerElementsKeyD;K;6;CP$UIDd;3;461E;K;12;CPMinDateKeyD;K;6;CP$UIDd;3;462E;K;12;CPMaxDateKeyD;K;6;CP$UIDd;3;463E;K;14;CPDateValueKeyD;K;6;CP$UIDd;3;460E;K;13;CPTextFontKeyD;K;6;CP$UIDd;1;0E;K;11;CPLocaleKeyD;K;6;CP$UIDd;1;0E;K;20;CPBackgroundColorKeyD;K;6;CP$UIDd;3;456E;K;20;CPDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;13;CPBorderedKeyD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;464E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;465E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;466E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;467E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;411E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;468E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;413E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;469E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;400E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;401E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;470E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;395E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;396E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;276E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;398E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;471E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;472E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;473E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;388E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;474E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;475E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;476E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;403E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;477E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;395E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;396E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;276E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;275E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;275E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;397E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;409E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;478E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;400E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;401E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;479E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;405E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;480E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;481E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;388E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;389E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;371E;K;12;$atext-colorD;K;6;CP$UIDd;3;482E;K;6;$afontD;K;6;CP$UIDd;3;392E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;483E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;324E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;371E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;275E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;275E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;154E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;371E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;484E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;377E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;154E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;378E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;379E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;380E;K;11;$aalignmentD;K;6;CP$UIDd;3;381E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;321E;K;6;$afontD;K;6;CP$UIDd;3;383E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;375E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;375E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;277E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;275E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;403E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;381E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;371E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;277E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;277E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;386E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;321E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;381E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;277E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;277E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;275E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;485E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;199E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;486E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;275E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;199E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;486E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;275E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;199E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;486E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;275E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;199E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;486E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;275E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;277E;E;D;K;6;$classD;K;6;CP$UIDd;3;199E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;486E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;275E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;277E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;152E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;487E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;488E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;487E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;489E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;487E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;490E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;487E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;491E;E;E;S;8;delegateS;6;field1S;6;field2S;6;field3S;6;field5S;6;field6S;6;field7S;9;theWindowS;7;contentS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;11;actionSent:S;28;value: selection.stringValueS;5;valueS;21;selection.stringValueD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;E;E;S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;99E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;95E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;126E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;116E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;125E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;128E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;146E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;143E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, -73}, {865, 560}}S;21;{{0, 0}, {1440, 877}}d;1;0S;20;{{0, 0}, {865, 560}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;166E;D;K;6;CP$UIDd;3;169E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;190E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;176E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;172E;D;K;6;CP$UIDd;3;174E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;185E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;192E;D;K;6;CP$UIDd;3;164E;D;K;6;CP$UIDd;3;165E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;175E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;193E;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;195E;D;K;6;CP$UIDd;3;196E;D;K;6;CP$UIDd;3;197E;E;E;S;6;normalS;6;{1, 1}S;21;{{20, 20}, {268, 17}}S;19;{{0, 0}, {268, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;382E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;492E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;493E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;277E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;277E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;277E;E;S;19;Scrolls, multi lineD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;494E;E;S;21;{{21, 45}, {268, 49}}S;19;{{0, 0}, {268, 49}}S;16;controlSizeSmallD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;497E;E;D;K;6;$classD;K;6;CP$UIDd;3;382E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;492E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;498E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;277E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;277E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;277E;E;S;124;Add a new line with alt+enter, if the line is bigger than the width of the field, it should continue, scrolling to the rightS;21;{{16, 99}, {276, 83}}S;19;{{0, 0}, {276, 83}}S;47;bezeled+controlSizeRegular+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;499E;E;S;20;line 1 +line 2 +line 3S;22;{{20, 215}, {268, 83}}S;19;{{0, 0}, {268, 83}}S;5;LabelS;22;{{21, 193}, {268, 17}}S;20;String value bindingS;22;{{20, 320}, {269, 17}}S;19;{{0, 0}, {269, 17}}S;17;Secure text fieldS;22;{{16, 363}, {276, 22}}S;19;{{0, 0}, {276, 22}}S;6;Line 1S;22;{{20, 344}, {268, 14}}S;19;{{0, 0}, {268, 14}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;500E;E;S;40;You should not be able to alt+enter hereS;22;{{21, 396}, {268, 17}}S;22;{{20, 421}, {268, 22}}S;19;{{0, 0}, {268, 22}}S;23;{{298, 320}, {114, 17}}S;19;{{0, 0}, {114, 17}}S;19;Standard text fieldS;23;{{293, 363}, {276, 22}}S;23;{{298, 421}, {268, 22}}S;23;{{298, 396}, {268, 17}}S;23;{{298, 345}, {268, 14}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;501E;E;S;36;You should be able to alt+enter hereS;22;{{572, 320}, {73, 17}}S;18;{{0, 0}, {73, 17}}S;9;Combo boxS;23;{{568, 364}, {276, 26}}S;19;{{0, 0}, {276, 26}}S;8;comboboxS;63;bezeled+button-bordered+controlSizeRegular+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;502E;D;K;6;CP$UIDd;3;503E;D;K;6;CP$UIDd;3;504E;E;E;d;1;5S;23;{{572, 345}, {268, 14}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;505E;E;S;21;{{21, 471}, {73, 17}}S;12;Search fieldS;22;{{21, 496}, {268, 14}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;506E;E;S;22;{{20, 518}, {268, 22}}S;11;searchfieldS;55;bezeled+controlSizeRegular+editable+placeholder+roundedd;3;254S;22;{{296, 471}, {67, 17}}S;18;{{0, 0}, {67, 17}}S;11;Token fieldS;23;{{292, 514}, {276, 22}}S;10;tokenfieldS;35;bezeled+controlSizeRegular+editableD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;23;{{296, 496}, {268, 14}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;507E;E;S;23;{{572, 514}, {267, 29}}S;19;{{0, 0}, {267, 29}}D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;508E;E;S;10;datePickerS;35;bezeled+bordered+controlSizeRegularD;K;10;$classnameS;6;CPDateK;8;$classesA;S;6;CPDateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;459E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;371E;E;d;3;224D;K;6;$classD;K;6;CP$UIDd;3;459E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;509E;E;D;K;6;$classD;K;6;CP$UIDd;3;459E;K;13;CPDateTimeKeyD;K;6;CP$UIDd;3;510E;E;S;22;{{572, 471}, {71, 17}}S;18;{{0, 0}, {71, 17}}S;11;Date pickerS;23;{{572, 496}, {268, 14}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;511E;E;S;23;{{298, 215}, {268, 83}}S;22;{{294, 99}, {276, 83}}S;22;{{298, 20}, {268, 17}}S;17;Wraps, multi lineS;22;{{299, 45}, {268, 49}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;512E;E;S;109;Can add a new line with alt+enter, if the line is bigger than the screen, it should automatically wrap aroundS;23;{{298, 193}, {268, 17}}S;22;{{572, 99}, {276, 83}}S;23;{{576, 215}, {268, 83}}S;22;{{576, 20}, {269, 17}}S;20;Scrolls, single lineS;22;{{577, 45}, {268, 49}}D;K;6;$classD;K;6;CP$UIDd;3;390E;K;4;nameD;K;6;CP$UIDd;3;495E;K;12;defaultValueD;K;6;CP$UIDd;3;496E;K;6;valuesD;K;6;CP$UIDd;3;513E;E;S;116;Cannot add a new line, if the line is bigger than the width of the field, it should continue, scrolling to the rightS;23;{{576, 193}, {268, 17}}S;13;AppControllerS;19;CPMutableDictionaryS;15;backgroundColorD;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;514E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;515E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;516E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;517E;E;S;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;518E;D;K;6;CP$UIDd;3;518E;D;K;6;CP$UIDd;3;518E;D;K;6;CP$UIDd;3;324E;E;E;S;10;text-colorD;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;519E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;520E;E;E;d;2;11D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;324E;D;K;6;CP$UIDd;3;324E;D;K;6;CP$UIDd;3;324E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;521E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;522E;E;E;S;6;Item 1S;6;Item 2S;6;Item 3D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;523E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;524E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;525E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;324E;D;K;6;CP$UIDd;3;324E;D;K;6;CP$UIDd;3;324E;D;K;6;CP$UIDd;3;324E;E;E;d;15;-62135510400000d;14;64092297600000D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;526E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;527E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;261E;K;10;CP.objectsD;K;11;placeholderD;K;6;CP$UIDd;3;496E;K;6;normalD;K;6;CP$UIDd;3;528E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;529E;D;K;6;CP$UIDd;3;324E;E;E;f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;371E;D;K;6;CP$UIDd;3;371E;D;K;6;CP$UIDd;3;371E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;530E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;531E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;532E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;533E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;534E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;535E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;536E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;537E;E;D;K;6;$classD;K;6;CP$UIDd;3;385E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;538E;E;f;12;0.8509804606D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;539E;D;K;6;CP$UIDd;3;324E;E;E;f;12;0.2027027011E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.xib b/Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.xib new file mode 100644 index 000000000..66031528e --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/Resources/MainMenu.xib @@ -0,0 +1,3604 @@ + + + + 1050 + 14B23 + 6250 + 1343.16 + 755.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 6250 + + + NSComboBox + NSComboBoxCell + NSCustomObject + NSDatePicker + NSDatePickerCell + NSMenu + NSMenuItem + NSObjectController + NSSearchField + NSSearchFieldCell + NSSecureTextField + NSSecureTextFieldCell + NSTextField + NSTextFieldCell + NSTokenField + NSTokenFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + NewApplication + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + + NewApplication + + + + About NewApplication + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit NewApplication + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + Save As… + S + 1179648 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + + Spelling and Grammar + + + + Show Spelling… + : + 1048576 + 2147483647 + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + + Substitutions + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + + Help + + + + NewApplication Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + 7 + 2 + {{335, 390}, {865, 560}} + 1946157056 + Window + NSWindow + + + + + 256 + + + + 268 + {{20, 375}, {268, 83}} + + + + _NS:9 + YES + + -1804599231 + 272630784 + + + YES + 13 + 1044 + + bGluZSAxCmxpbmUgMgpsaW5lIDM + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + 3 + MAA + + + + NO + 1 + + + + 268 + {{18, 262}, {272, 83}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Label + + _NS:526 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + labelColor + + + + NO + 1 + + + + 268 + {{296, 262}, {272, 83}} + + + + _NS:526 + {251, 750} + YES + + 67108864 + 272629760 + Label + + _NS:526 + + + + + NO + YES + 1 + + + + 268 + {{18, 117}, {272, 22}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Label + + _NS:526 + + + + + NO + 1 + + + + 268 + {{296, 117}, {272, 22}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Label + + _NS:526 + + + + + NO + 1 + + + + 268 + {{18, 523}, {272, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Scrolls, multi line + + _NS:526 + + + + + NO + 1 + + + + 268 + {{297, 172}, {268, 22}} + + + + _NS:9 + YES + + -1804599231 + 272630784 + + + Line 1 + _NS:9 + + YES + + + + NO + 1 + + + + 268 + {{20, 172}, {268, 22}} + + + + _NS:9 + YES + + 342884416 + 272630848 + + + Line 1 + _NS:9 + + YES + + + + NSAllRomanInputSourcesLocaleIdentifier + + + NO + 1 + + + + 268 + {{298, 375}, {268, 83}} + + + + _NS:9 + YES + + -1805647871 + 272629760 + + + bGluZSAxCmxpbmUgMgpsaW5lIDM + _NS:9 + + YES + + + + NO + 1 + + + + 268 + {{296, 523}, {272, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Wraps, multi line + + _NS:526 + + + + + NO + 1 + + + + 268 + {{18, 223}, {273, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Secure text field + + _NS:526 + + + + + NO + 1 + + + + 268 + {{296, 223}, {118, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Standard text field + + _NS:526 + + + + + NO + 1 + + + + 268 + {{19, 72}, {77, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Search field + + _NS:526 + + + + + NO + 1 + + + + 268 + + NSStringPboardType + + {{296, 21}, {268, 22}} + + + + _NS:9 + YES + + 341835776 + 0 + + Line 1 + _NS:9 + + YES + + + 6 + System + controlTextColor + + + + 0.0 + 0 + + NO + 1 + 2 + + + + 268 + {{294, 72}, {71, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Token field + + _NS:526 + + + + + NO + 1 + + + + 268 + {{570, 223}, {77, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Combo box + + _NS:526 + + + + + NO + 1 + + + + 268 + {{572, 170}, {271, 26}} + + + + _NS:9 + YES + + 342884417 + 272630784 + + + _NS:9 + + YES + + + 5 + YES + + Item 1 + Item 2 + Item 3 + + + + + 274 + {13, 63} + + + _NS:29 + YES + NO + YES + tableViewAction: + + + + 0 + 10 + 10 + 3.4028234663852886e+38 + + 67108928 + 2048 + + + YES + 11 + 3100 + + + 6 + System + headerColor + + + + 6 + System + headerTextColor + + + + + 337641536 + 268437504 + Item 3 + + + + 6 + System + controlBackgroundColor + + + + + 3 + YES + + + + 3 + 2 + + + 6 + System + gridColor + + 3 + MC41AA + + + 19 + tableViewAction: + -765427712 + + + + 1 + -1 + 0 + YES + 0 + 1 + + + NO + 1 + + + + 268 + {{20, 20}, {268, 22}} + + + + YES + _NS:9 + YES + + 342884416 + 268436544 + + + _NS:9 + + YES + 1 + + + + 0 + 0 + search + + _searchFieldSearch: + + 138690560 + 0 + + 400 + 75 + + + 0 + 0 + clear + + + cancel + + + + + _searchFieldCancel: + + 138690560 + 0 + + 400 + 75 + + 255 + BgAAAA + + NO + 1 + + + + 268 + {{572, 21}, {270, 27}} + + + _NS:9 + YES + + 71303168 + 0 + + -595929600 + + US/Pacific + + VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ +y4kaoNIj9HDSYSYQ1v50INiArZDa/tGg28CQENzes6DdqayQ3r6VoN+JjpDgnneg4WlwkOJ+WaDjSVKQ +5F47oOUpNJDmR1gg5xJREOgnOiDo8jMQ6gccIOrSFRDr5v4g7LH3EO3G4CDukdkQ76/8oPBxuxDxj96g +8n/BkPNvwKD0X6OQ9U+ioPY/hZD3L4Sg+CiiEPkPZqD6CIQQ+viDIPvoZhD82GUg/chIEP64RyD/qCoQ +AJgpIAGIDBACeAsgA3EokARhJ6AFUQqQBkEJoAcw7JAHjUOgCRDOkAmtvyAK8LCQC+CvoAzZzRANwJGg +DrmvEA+priAQmZEQEYmQIBJ5cxATaXIgFFlVEBVJVCAWOTcQFyk2IBgiU5AZCRggGgI1kBryNKAb4heQ +HNIWoB3B+ZAesfigH6HbkCB2KyAhgb2QIlYNICNq2hAkNe8gJUq8ECYV0SAnKp4QJ/7toCkKgBAp3s+g +KupiECu+saAs036QLZ6ToC6zYJAvfnWgMJNCkDFnkiAycySQM0d0IDRTBpA1J1YgNjLokDcHOCA4HAUQ +OOcaIDn75xA6xvwgO9vJEDywGKA9u6sQPo/6oD+bjRBAb9ygQYSpkEJPvqBDZIuQRC+goEVEbZBF89Mg +Ry2KEEfTtSBJDWwQSbOXIErtThBLnLOgTNZqkE18laBOtkyQT1x3oFCWLpBRPFmgUnYQkFMcO6BUVfKQ +VPwdoFY11JBW5TogWB7xEFjFHCBZ/tMQWqT+IFvetRBchOAgXb6XEF5kwiBfnnkQYE3eoGGHlZBiLcCg +Y2d3kGQNoqBlR1mQZe2EoGcnO5BnzWagaQcdkGmtSKBq5v+Qa5ZlIGzQHBBtdkcgbq/+EG9WKSBwj+AQ +cTYLIHJvwhBzFe0gdE+kEHT/CaB2OMCQdt7roHgYopB4vs2gefiEkHqer6B72GaQfH6RoH24SJB+XnOg +f5gqkAABAAECAwEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA +AQABAAEAAQAB//+dkAEA//+PgAAE//+dkAEI//+dkAEMUERUAFBTVABQV1QAUFBUAAAAAAEAAAABA + + + %Y-%m-%d %H:%M:%S %z + + + _NS:9 + + 0.0 + 224 + + + + NO + + + + 268 + {{570, 72}, {75, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Date picker + + _NS:526 + + + + + NO + 1 + + + + 268 + {{19, 466}, {272, 49}} + + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + Add a new line with alt+enter, if the line is bigger than the width of the field, it should continue, scrolling to the right + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 1 + + + + 268 + {{297, 466}, {272, 49}} + + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + Can add a new line with alt+enter, if the line is bigger than the screen, it should automatically wrap around + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{19, 350}, {272, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + String value binding + + _NS:526 + + + + + NO + 1 + + + + 268 + {{296, 350}, {272, 17}} + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + String value binding + + _NS:526 + + + + + NO + 1 + + + + 268 + {{18, 202}, {272, 14}} + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + You should not be able to alt+enter here + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{19, 147}, {272, 17}} + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + String value binding + + _NS:526 + + + + + NO + 1 + + + + 268 + {{296, 147}, {272, 17}} + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + String value binding + + _NS:526 + + + + + NO + 1 + + + + 268 + {{296, 201}, {272, 14}} + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + You should be able to alt+enter here + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{570, 201}, {272, 14}} + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + You should be able to alt+enter here + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{19, 50}, {272, 14}} + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + You should not be able to alt+enter here + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{294, 50}, {272, 14}} + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + You should not be able to alt+enter here + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{570, 50}, {272, 14}} + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + You should not be able to alt+enter here + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{576, 375}, {268, 83}} + + + + _NS:9 + YES + + -1804599231 + 272630848 + + + Line 1 + _NS:9 + + YES + + + + NO + 1 + + + + 268 + {{574, 262}, {272, 83}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Label + + _NS:526 + + + + + NO + 1 + + + + 268 + {{574, 523}, {273, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Scrolls, single line + + _NS:526 + + + + + NO + 1 + + + + 268 + {{575, 466}, {272, 49}} + + + + _NS:526 + {251, 750} + YES + + 67108864 + 272760832 + Cannot add a new line, if the line is bigger than the width of the field, it should continue, scrolling to the right + + _NS:526 + + + + 1 + MC4yMDI3MDI3MDExIDAuMjAyNzAyNzAxMSAwLjIwMjcwMjcwMTEAA + + + NO + YES + 268 + 1 + + + + 268 + {{574, 350}, {272, 17}} + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + String value binding + + _NS:526 + + + + + NO + 1 + + + {865, 560} + + + + {{0, 0}, {1440, 877}} + {10000000000000, 10000000000000} + YES + + + AppController + + + YES + + + + YES + + + + YES + + + + YES + + + + YES + + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 451 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + showHelp: + + + + 360 + + + + saveDocument: + + + + 362 + + + + saveDocumentAs: + + + + 363 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + theWindow + + + + 459 + + + + actionSent: + + + + 598 + + + + actionSent: + + + + 599 + + + + field5 + + + + 584 + + + + actionSent: + + + + 602 + + + + actionSent: + + + + 601 + + + + actionSent: + + + + 600 + + + + actionSent: + + + + 603 + + + + field6 + + + + 585 + + + + field7 + + + + 586 + + + + actionSent: + + + + 604 + + + + actionSent: + + + + 605 + + + + actionSent: + + + + 606 + + + + field1 + + + + 643 + + + + field2 + + + + 644 + + + + field3 + + + + 645 + + + + value: selection.stringValue + + + + + + value: selection.stringValue + value + selection.stringValue + 2 + + + 488 + + + + content + + + + 483 + + + + value: selection.stringValue + + + + + + value: selection.stringValue + value + selection.stringValue + 2 + + + 542 + + + + value: selection.stringValue + + + + + + value: selection.stringValue + value + selection.stringValue + 2 + + + 545 + + + + content + + + + 538 + + + + content + + + + 539 + + + + value: selection.stringValue + + + + + + value: selection.stringValue + value + selection.stringValue + 2 + + + 556 + + + + content + + + + 553 + + + + value: selection.stringValue + + + + + + value: selection.stringValue + value + selection.stringValue + 2 + + + 569 + + + + content + + + + 564 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + MainMenu + + + 19 + + + + + + + + 56 + + + + + + + + 103 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 106 + + + + + + + + 111 + + + + + 57 + + + + + + + + + + + + 58 + + + + + 136 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + + + + + + 372 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 450 + + + + + 480 + + + 1 + + + 533 + + + 2 + + + 535 + + + 3 + + + 551 + + + 4 + + + 562 + + + 5 + + + 460 + + + + + + + + 461 + + + + + 517 + + + + + + + + 518 + + + + + 474 + + + + + + + + 475 + + + + + 527 + + + + + + + + 528 + + + + + 530 + + + + + + + + 531 + + + + + 548 + + + + + + + + 549 + + + + + 559 + + + + + + + + 560 + + + + + 519 + + + + + + + + 520 + + + + + 521 + + + + + + + + 522 + + + + + 462 + + + + + + + + 463 + + + + + 472 + + + + + + + + 473 + + + + + 523 + + + + + + + + 526 + + + + + 524 + + + + + + + + 525 + + + + + 546 + + + + + + + + 547 + + + + + 557 + + + + + + + + 558 + + + + + 589 + + + + + + + + 590 + + + + + 570 + + + + + + + + 571 + + + + + 572 + + + + + + + + 573 + + + + + 575 + + + + + + + + 576 + + + + + 578 + + + + + + + + 579 + + + + + 587 + + + + + + + + 588 + + + + + 591 + + + + + + + + 592 + + + + + 593 + + + + + + + + 594 + + + + + 615 + + + + + + + + 616 + + + + + 617 + + + + + + + + 618 + + + + + 619 + + + + + + + + 620 + + + + + 621 + + + + + + + + 622 + + + + + 623 + + + + + + + + 624 + + + + + 625 + + + + + + + + 626 + + + + + 627 + + + + + + + + 628 + + + + + 629 + + + + + + + + 630 + + + + + 631 + + + + + + + + 632 + + + + + 633 + + + + + + + + 634 + + + + + 635 + + + + + + + + 636 + + + + + 637 + + + + + + + + 638 + + + + + 639 + + + + + + + + 640 + + + + + 641 + + + + + + + + 642 + + + + + + + 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 + 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 + 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 + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {357.5, 439} + com.apple.InterfaceBuilder.CocoaPlugin + {{303, 221}, {480, 360}} + + + 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 + + IBUserDefinedRuntimeAttributesPlaceholderName + + IBUserDefinedRuntimeAttributesPlaceholderName + + + + com.apple.InterfaceBuilder.userDefinedRuntimeAttributeType.color + backgroundColor + + 2 + MC44NTA5ODA0NjA2IDAuODUwOTgwNDYwNiAwLjg1MDk4MDQ2MDYAA + + + + + + 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 + + IBUserDefinedRuntimeAttributesPlaceholderName + + IBUserDefinedRuntimeAttributesPlaceholderName + + + + com.apple.InterfaceBuilder.userDefinedRuntimeAttributeType.color + backgroundColor + + 2 + MC44NTA5ODA0NjA2IDAuODUwOTgwNDYwNiAwLjg1MDk4MDQ2MDYAA + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + IBUserDefinedRuntimeAttributesPlaceholderName + + IBUserDefinedRuntimeAttributesPlaceholderName + + + + com.apple.InterfaceBuilder.userDefinedRuntimeAttributeType.color + backgroundColor + + 2 + MC44NTA5ODA0NjA2IDAuODUwOTgwNDYwNiAwLjg1MDk4MDQ2MDYAA + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + IBUserDefinedRuntimeAttributesPlaceholderName + + IBUserDefinedRuntimeAttributesPlaceholderName + + + + com.apple.InterfaceBuilder.userDefinedRuntimeAttributeType.color + backgroundColor + + 2 + MC44NTA5ODA0NjA2IDAuODUwOTgwNDYwNiAwLjg1MDk4MDQ2MDYAA + + + + + + 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 + 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 + 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 + + 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 + + + + + + 645 + + + 0 + IBCocoaFramework + NO + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {12, 12} + {10, 2} + + + diff --git a/Tests/Manual/CPTextFieldMultiline/index-debug.html b/Tests/Manual/CPTextFieldMultiline/index-debug.html new file mode 100644 index 000000000..7a4693877 --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/index-debug.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + CPTextFielMultine + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTextFieldMultiline/index.html b/Tests/Manual/CPTextFieldMultiline/index.html new file mode 100644 index 000000000..cb15b05a5 --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + CPTextFielMultine + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTextFieldMultiline/main.j b/Tests/Manual/CPTextFieldMultiline/main.j new file mode 100644 index 000000000..48db81b12 --- /dev/null +++ b/Tests/Manual/CPTextFieldMultiline/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPTextFielMultine + * + * Created by You on November 12, 2014. + * Copyright 2014, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} From e2020fa7f2dfda58eba1118482a271ec82a596f5 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 13 Nov 2014 00:17:29 -0800 Subject: [PATCH 041/106] Add CPAltEnterTextAreaFeature checking. FF doesn't add a cariage return on textarea when doing alt+enter --- AppKit/CPCompatibility.j | 4 ++++ AppKit/CPTextField.j | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/AppKit/CPCompatibility.j b/AppKit/CPCompatibility.j index c471c1408..623249cd2 100644 --- a/AppKit/CPCompatibility.j +++ b/AppKit/CPCompatibility.j @@ -78,6 +78,8 @@ CPInputOnInputEventFeature = 30; CPFileAPIFeature = 31; +CPAltEnterTextAreaFeature = 32; + /* @@ -100,6 +102,7 @@ var USER_AGENT = "", // default these features to true PLATFORM_FEATURES[CPInputTypeCanBeChangedFeature] = YES; PLATFORM_FEATURES[CPInputSetFontOutsideOfDOM] = YES; +PLATFORM_FEATURES[CPAltEnterTextAreaFeature] = YES; if (typeof window !== "undefined" && typeof window.navigator !== "undefined") USER_AGENT = window.navigator.userAgent; @@ -208,6 +211,7 @@ else if (USER_AGENT.indexOf("Gecko") !== -1) // Must follow KHTML check. // Some day this might be fixed and should be version prefixed. No known fixed version yet. PLATFORM_FEATURES[CPInput1PxLeftPadding] = YES; + PLATFORM_FEATURES[CPAltEnterTextAreaFeature] = NO; // This was supposed to be added in Firefox 22, but when testing with the latest beta as of 2013-06-14 // it does not seem to work. It seems to exhibit the CPJavaScriptPasteRequiresEditableTarget problem, // and in addition doesn't seem to work with our native copy code either. diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 63ea80fe2..4b5f1dff6 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -1079,9 +1079,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self _didEdit]; } - console.error("newValue : >" + newValue + "<") - console.error("_stringValue : >" + _stringValue + "<") - if ([self _valueIsValid:_stringValue]) { // If _isEditing == YES then the target action can also be called via @@ -1129,7 +1126,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // we don't need to do this in case of textarea // or we will end up with 2 carriage returns - if (aCharacter != CPNewlineCharacter || element.nodeName.toUpperCase() != "TEXTAREA") + if (aCharacter != CPNewlineCharacter || element.nodeName.toUpperCase() != "TEXTAREA" || !CPFeatureIsCompatible(CPAltEnterTextAreaFeature)) element.value = [element.value stringByReplacingCharactersInRange:[self selectedRange] withString:aCharacter]; [self _setStringValue:element.value]; From a5283a26abc850a591b2990845412e41db684ff3 Mon Sep 17 00:00:00 2001 From: Christophe Serafin Date: Fri, 14 Nov 2014 13:49:33 -0800 Subject: [PATCH 042/106] Fixed: Enable CPTextField to have a specific height When setting controlSize, CPTextfield height was forced to min-size height. Now we check that the frame size is between the min and the max size. It allows to constrain a CPControl to have a fixed height by specifying a min-size equivalent to the maxsize. In CPTextField case, we only have a min-size which enable us to have a specific size. Changes has been made in Aristo2 only. --- AppKit/CPControl.j | 12 +++++++++++- AppKit/CPTextField.j | 2 +- AppKit/Themes/Aristo2/ThemeDescriptors.j | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index c2b1083ce..0c5836764 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -260,10 +260,20 @@ var CPControlBlackColor = [CPColor blackColor]; maxSize = [self currentValueForThemeAttribute:@"max-size"]; if (minSize.width > 0) + { frameSize.width = MAX(minSize.width, frameSize.width); + if (maxSize.width > 0) + frameSize.width = MIN(maxSize.width, frameSize.width); + } + if (minSize.height > 0) - frameSize.height = minSize.height; + { + frameSize.height = MAX(minSize.height, frameSize.height); + + if (maxSize.height > 0) + frameSize.height = MIN(maxSize.height, frameSize.height); + } [self setFrameSize:frameSize]; } diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index fc3d833d9..3bdb49c80 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -240,8 +240,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self _sizeToControlSize]; } -#pragma mark - +#pragma mark - #if PLATFORM(DOM) - (DOMElement)_inputElement diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index f5f11c7f5..bf72661f3 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -374,7 +374,7 @@ var themedButtonValues = nil, [@"font", [CPFont boldSystemFontOfSize:11.0]], [@"min-size", CGSizeMake(32.0, 20.0), CPThemeStateControlSizeSmall], - [@"max-size", CGSizeMake(1.0, 20.0), CPThemeStateControlSizeSmall], + [@"max-size", CGSizeMake(-1.0, 20.0), CPThemeStateControlSizeSmall], [@"nib2cib-adjustment-frame", CGRectMake(3.0, 4.0, -6.0, 0.0), CPThemeStateControlSizeSmall], // CPThemeStateControlSizeMini @@ -386,7 +386,7 @@ var themedButtonValues = nil, [@"min-size", CGSizeMake(32.0, 16.0), CPThemeStateControlSizeMini], [@"max-size", CGSizeMake(-1.0, 16.0), CPThemeStateControlSizeMini], - [@"nib2cib-adjustment-frame", CGRectMake(1.0, 10.0, -3.0, 0.0), CPThemeStateControlSizeMini] + [@"nib2cib-adjustment-frame", CGRectMake(1.0, 10.0, -3.0, 0.0), CPThemeStateControlSizeMini] ]; [self registerThemeValues:themeValues forView:button]; From d30659c37c9632f5039353eea0e913a8f8799d0e Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 19 Nov 2014 14:27:19 -0800 Subject: [PATCH 043/106] Fixed: CPMenu crash when opening a menu with items and then opening the menu without items Previously, when opening a menu with items and then opening another menu without items, Cappuccino simply crashed. Now it works ! --- AppKit/CPMenu/_CPMenuWindow.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPMenu/_CPMenuWindow.j b/AppKit/CPMenu/_CPMenuWindow.j index ddf53a7dd..571e3d670 100644 --- a/AppKit/CPMenu/_CPMenuWindow.j +++ b/AppKit/CPMenu/_CPMenuWindow.j @@ -410,7 +410,7 @@ _CPMenuWindowAttachedMenuBackgroundStyle = 2; { // Don't return indexes of items that aren't visible. if (!CGRectContainsPoint([_menuClipView bounds], [_menuClipView convertPoint:aPoint fromView:nil])) - return NO; + return CPNotFound; return [_menuView itemIndexAtPoint:[_menuView convertPoint:aPoint fromView:nil]]; } From 86d24319255258446652a73fc49e34cd3b0c63f9 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 19 Nov 2014 14:34:52 -0800 Subject: [PATCH 044/106] CPWebScriptObject is a class, not a typedef --- AppKit/CPPasteboard.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPPasteboard.j b/AppKit/CPPasteboard.j index 8f5c4f754..b8e0139f0 100644 --- a/AppKit/CPPasteboard.j +++ b/AppKit/CPPasteboard.j @@ -26,7 +26,7 @@ @import @import -@typedef CPWebScriptObject +@class CPWebScriptObject CPGeneralPboard = @"CPGeneralPboard"; CPFontPboard = @"CPFontPboard"; From 9e66c699e1e85b0d8f9fadf26653d242be07132f Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 19 Nov 2014 14:35:33 -0800 Subject: [PATCH 045/106] FIXED: prevent to declare a type that is already declared as a class and vice-versa --- Objective-J/ObjJAcornCompiler.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index fd6f020d3..e9bc334f5 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -1674,6 +1674,9 @@ ClassDeclarationStatement: function(node, st, c) { compiler.cmBuffer = new StringBuffer(); compiler.classBodyBuffer = new StringBuffer(); // TODO: Check if this is needed + if (compiler.getTypeDef(className)) + throw compiler.error_message(className + " is already declared as type", node.classname); + if (!generate) saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); // First we declare the class @@ -2444,6 +2447,9 @@ TypeDefStatement: function(node, st, c) { if (typeDef) throw compiler.error_message("Duplicate type definition " + typeDefName, node.typedefname); + if (compiler.getClassDef(typeDefName)) + throw compiler.error_message(typeDefName + " is already declared as class", node.typedefname); + compiler.imBuffer = new StringBuffer(); compiler.cmBuffer = new StringBuffer(); From 460a60440a54e50b548108368450faf9fe248882 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 19 Nov 2014 14:53:38 -0800 Subject: [PATCH 046/106] Correctly set the type of datasource in CPComboBox --- AppKit/CPComboBox.j | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index 01d424664..6787948e3 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -61,19 +61,19 @@ var CPComboBoxTextSubview = @"text", @implementation CPComboBox : CPTextField { - CPArray _items; - _CPPopUpList _listDelegate; - id _dataSource; - BOOL _usesDataSource; - BOOL _completes; - BOOL _canComplete; - int _numberOfVisibleItems; - BOOL _forceSelection; - BOOL _hasVerticalScroller; - CPString _selectedStringValue; - CGSize _intercellSpacing; - float _itemHeight; - BOOL _popUpButtonCausedResign; + CPArray _items; + _CPPopUpList _listDelegate; + id _dataSource; + BOOL _usesDataSource; + BOOL _completes; + BOOL _canComplete; + int _numberOfVisibleItems; + BOOL _forceSelection; + BOOL _hasVerticalScroller; + CPString _selectedStringValue; + CGSize _intercellSpacing; + float _itemHeight; + BOOL _popUpButtonCausedResign; } + (CPString)defaultThemeClass From d106e6485bb0970131e4e7fd295d0a3a97de1972 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 19 Nov 2014 16:23:56 -0800 Subject: [PATCH 047/106] Add some manual test cases for objj output --- Tests/Manual/CompilationTests/README.md | 6 ++ Tests/Manual/CompilationTests/TestCases/1.j | 13 ++++ Tests/Manual/CompilationTests/TestCases/2.j | 20 +++++ Tests/Manual/CompilationTests/TestCases/3.j | 15 ++++ Tests/Manual/CompilationTests/TestCases/4.j | 15 ++++ Tests/Manual/CompilationTests/TestCases/5.j | 22 ++++++ Tests/Manual/CompilationTests/TestCases/6.j | 16 ++++ Tests/Manual/CompilationTests/TestCases/7.j | 20 +++++ Tests/Manual/CompilationTests/TestCases/8.j | 20 +++++ Tests/Manual/CompilationTests/TestCases/9.j | 22 ++++++ Tests/Manual/CompilationTests/run.py | 82 +++++++++++++++++++++ 11 files changed, 251 insertions(+) create mode 100644 Tests/Manual/CompilationTests/README.md create mode 100644 Tests/Manual/CompilationTests/TestCases/1.j create mode 100644 Tests/Manual/CompilationTests/TestCases/2.j create mode 100644 Tests/Manual/CompilationTests/TestCases/3.j create mode 100644 Tests/Manual/CompilationTests/TestCases/4.j create mode 100644 Tests/Manual/CompilationTests/TestCases/5.j create mode 100644 Tests/Manual/CompilationTests/TestCases/6.j create mode 100644 Tests/Manual/CompilationTests/TestCases/7.j create mode 100644 Tests/Manual/CompilationTests/TestCases/8.j create mode 100644 Tests/Manual/CompilationTests/TestCases/9.j create mode 100755 Tests/Manual/CompilationTests/run.py diff --git a/Tests/Manual/CompilationTests/README.md b/Tests/Manual/CompilationTests/README.md new file mode 100644 index 000000000..04a7e90c0 --- /dev/null +++ b/Tests/Manual/CompilationTests/README.md @@ -0,0 +1,6 @@ +To run these tests: + + - open x.j + - check what is the expected output in the comments + - run objj x.j + - check you get the correct output diff --git a/Tests/Manual/CompilationTests/TestCases/1.j b/Tests/Manual/CompilationTests/TestCases/1.j new file mode 100644 index 000000000..b2585522e --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/1.j @@ -0,0 +1,13 @@ +// Expected output: 0 + +/* +*/ + + +@import + +@implementation MyCall : CPObject +{ + CPString property1; +} +@end diff --git a/Tests/Manual/CompilationTests/TestCases/2.j b/Tests/Manual/CompilationTests/TestCases/2.j new file mode 100644 index 000000000..af2c92cf1 --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/2.j @@ -0,0 +1,20 @@ +// Expected output: 0 + +/* + +START_EXPECTED + MyType property1; + ^ +WARNING line 5 in file:[__PATH__]: Unknown type 'MyType' for ivar 'property1' +END_EXPECTED +*/ + + +@import + +@implementation MyCall : CPObject +{ + MyType property1; +} + +@end diff --git a/Tests/Manual/CompilationTests/TestCases/3.j b/Tests/Manual/CompilationTests/TestCases/3.j new file mode 100644 index 000000000..e00d77593 --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/3.j @@ -0,0 +1,15 @@ +// Expected output: 0 + +/* +*/ + +@import + +@typedef MyType + +@implementation MyCall : CPObject +{ + MyType property1; +} + +@end diff --git a/Tests/Manual/CompilationTests/TestCases/4.j b/Tests/Manual/CompilationTests/TestCases/4.j new file mode 100644 index 000000000..889ab3036 --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/4.j @@ -0,0 +1,15 @@ +// Expected output: 0 + +/* +*/ + +@import + +@class MyType + +@implementation MyCall : CPObject +{ + MyType property1; +} + +@end diff --git a/Tests/Manual/CompilationTests/TestCases/5.j b/Tests/Manual/CompilationTests/TestCases/5.j new file mode 100644 index 000000000..bcbf216ab --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/5.j @@ -0,0 +1,22 @@ +// Expected output: 0 + +/* + +START_EXPECTED + MyType property1; + ^ +WARNING line 7 in file:[__PATH__]: Unknown type 'MyType' for ivar 'property1' +END_EXPECTED + +*/ + +@import + +@global MyType + +@implementation MyCall : CPObject +{ + MyType property1; +} + +@end diff --git a/Tests/Manual/CompilationTests/TestCases/6.j b/Tests/Manual/CompilationTests/TestCases/6.j new file mode 100644 index 000000000..b41c518cb --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/6.j @@ -0,0 +1,16 @@ +// Expected output: 256 + +/* + +START_EXPECTED +Error on line 10771 of file [unknown] +SyntaxError: +@typedef MyType + ^ +ERROR line 2 in file:[__PATH__]: Duplicate type definition MyType +END_EXPECTED + +*/ + +@typedef MyType +@typedef MyType diff --git a/Tests/Manual/CompilationTests/TestCases/7.j b/Tests/Manual/CompilationTests/TestCases/7.j new file mode 100644 index 000000000..cdff5aeda --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/7.j @@ -0,0 +1,20 @@ +// Expected output: 256 + +/* + +START_EXPECTED +Error on line 10001 of file [unknown] +SyntaxError: +@implementation MyType : CPObject + ^ +ERROR line 5 in file:[__PATH__]: MyType is already declared as type +END_EXPECTED + +*/ + +@import + +@typedef MyType + +@implementation MyType : CPObject +@end diff --git a/Tests/Manual/CompilationTests/TestCases/8.j b/Tests/Manual/CompilationTests/TestCases/8.j new file mode 100644 index 000000000..07a2aa769 --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/8.j @@ -0,0 +1,20 @@ +// Expected output: 256 + +/* + +START_EXPECTED +Error on line 10774 of file [unknown] +SyntaxError: +@typedef MyType + ^ +ERROR line 6 in file:[__PATH__]: MyType is already declared as class +END_EXPECTED + +*/ + +@import + +@implementation MyType : CPObject +@end + +@typedef MyType diff --git a/Tests/Manual/CompilationTests/TestCases/9.j b/Tests/Manual/CompilationTests/TestCases/9.j new file mode 100644 index 000000000..0fd6c0678 --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/9.j @@ -0,0 +1,22 @@ +// Expected output: 256 + +/* + +START_EXPECTED +Error on line 10014 of file [unknown] +SyntaxError: +@implementation MyType : CPObject + ^ +ERROR line 6 in file:[__PATH__]: Duplicate class MyType +END_EXPECTED + +*/ + +@import + +@implementation MyType : CPObject +@end + +@implementation MyType : CPObject +@end + diff --git a/Tests/Manual/CompilationTests/run.py b/Tests/Manual/CompilationTests/run.py new file mode 100755 index 000000000..e21eebaa3 --- /dev/null +++ b/Tests/Manual/CompilationTests/run.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +import os +import commands +import re + +PATH = os.path.abspath(os.path.join(os.path.dirname(__file__))) + + +def get_tests_cases(): + ret = [] + for filename in os.listdir("TestCases"): + ret.append("TestCases/%s" % filename) + return ret + # return ["TestCases/2.j"] + +def get_expected_output(test_case): + f = open(test_case) + content = f.readlines(); + f.close() + + status = int(content[0].replace("// Expected output: ", "")) + + recording = False + output = [] + + for line in content: + if "END_EXPECTED" in line: + recording = False + break; + + if "START_EXPECTED" in line: + recording = True + continue + + if recording: + output.append(line) + + output = "".join(output); + output = output.replace("[__PATH__]", "%s/%s" % (PATH, test_case)) + output = cleanup_output(output) + + return (status, output) + + +def get_actual_output(test_case): + status, output = commands.getstatusoutput("objj %s" % test_case) + output = cleanup_output(output) + return (status, output) + + +def cleanup_output(output): + if not output: + return "" + output = output.replace(" ", "") + output = output.replace("\n", "") + output = output.replace("[0m", "") + return re.sub('[^\s!-~]', '', output) + + +if __name__ == "__main__": + + for test in get_tests_cases(): + + expected_status, expected_output = get_expected_output(test) + actual_status, actual_output = get_actual_output(test) + + print "########################################" + print "Testing %s" % test + errored = False + if expected_status != actual_status: + errored = True + print " Error in %s: Status code is different: expected %d, actual %d" % (test, expected_status, actual_status) + + if expected_output != actual_output: + errored = True + print " Error in %s. Outputs are different" % test + print " EXPECTED: %s" % expected_output + print " ACTUAL: %s" % actual_output + + if not errored: + print " OK" From 653f706f1b02b867b4ccaf65b2e7667f39494382 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 19 Nov 2014 16:29:05 -0800 Subject: [PATCH 048/106] Update README --- Tests/Manual/CompilationTests/README.md | 50 ++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/Tests/Manual/CompilationTests/README.md b/Tests/Manual/CompilationTests/README.md index 04a7e90c0..c852088b8 100644 --- a/Tests/Manual/CompilationTests/README.md +++ b/Tests/Manual/CompilationTests/README.md @@ -1,6 +1,46 @@ -To run these tests: +## Run tests - - open x.j - - check what is the expected output in the comments - - run objj x.j - - check you get the correct output +./run.py + + +## Create a test case + +create a `.j` file in `TestCases` folder: + +-First line MUST be: + + // Expected output: [OBJJ_STATUS_CODE] + + +Then after that add a block comment that contains: + + /* + START_EXPECTED + [CONSOLE_OUTPUT_OF_OBJJ] + END_EXPECTED + */ + + +Be sure to replace the file path by the token `[__PATH__]` After that, add the code you want to test. + +If your test doesn't expect any output, don't put any `START_EXPECTED` and `END_EXPECTED` + + +For instance: + + /* + START_EXPECTED + Error on line 10771 of file [unknown] + SyntaxError: + @typedef MyType + ^ + ERROR line 2 in file:[__PATH__]: Duplicate type definition MyType + END_EXPECTED + */ + @import + + @implementation MyCall : CPObject + { + CPString property1; + } + @end From 37b9895878319d11409ba660363eadc852048700 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 20 Nov 2014 11:44:32 -0800 Subject: [PATCH 049/106] Add check to ensure a @class declaration is not already defined as a type --- Objective-J/ObjJAcornCompiler.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index e9bc334f5..ce3009ef7 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -2412,6 +2412,10 @@ ClassStatement: function(node, st, c) { compiler.jsBuffer.concat("//"); } var className = node.id.name; + + if (compiler.getTypeDef(className)) + throw compiler.error_message(className + " is already declared as type", node.id); + if (!compiler.getClassDef(className)) { classDef = new ClassDef(false, className); compiler.classDefs[className] = classDef; From f3090e7827b655e7eea4832ea6c668025ccc2445 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 20 Nov 2014 11:44:51 -0800 Subject: [PATCH 050/106] Update test cases --- Tests/Manual/CompilationTests/TestCases/10.j | 18 ++++++++++++++++++ Tests/Manual/CompilationTests/TestCases/6.j | 2 +- Tests/Manual/CompilationTests/TestCases/8.j | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 Tests/Manual/CompilationTests/TestCases/10.j diff --git a/Tests/Manual/CompilationTests/TestCases/10.j b/Tests/Manual/CompilationTests/TestCases/10.j new file mode 100644 index 000000000..c614eeb4d --- /dev/null +++ b/Tests/Manual/CompilationTests/TestCases/10.j @@ -0,0 +1,18 @@ +// Expected output: 256 + +/* + +START_EXPECTED +Error on line 10778 of file [unknown] +SyntaxError: +@typedef mytype + ^ +ERROR line 4 in file:[__PATH__]: mytype is already declared as class +END_EXPECTED +*/ + +@import + +@class mytype +@typedef mytype + diff --git a/Tests/Manual/CompilationTests/TestCases/6.j b/Tests/Manual/CompilationTests/TestCases/6.j index b41c518cb..37a7f86bf 100644 --- a/Tests/Manual/CompilationTests/TestCases/6.j +++ b/Tests/Manual/CompilationTests/TestCases/6.j @@ -3,7 +3,7 @@ /* START_EXPECTED -Error on line 10771 of file [unknown] +Error on line 10775 of file [unknown] SyntaxError: @typedef MyType ^ diff --git a/Tests/Manual/CompilationTests/TestCases/8.j b/Tests/Manual/CompilationTests/TestCases/8.j index 07a2aa769..393371331 100644 --- a/Tests/Manual/CompilationTests/TestCases/8.j +++ b/Tests/Manual/CompilationTests/TestCases/8.j @@ -3,7 +3,7 @@ /* START_EXPECTED -Error on line 10774 of file [unknown] +Error on line 10778 of file [unknown] SyntaxError: @typedef MyType ^ From 0dcc645f229473a7221db6fd63b0928d315ff9af Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 20 Nov 2014 11:50:18 -0800 Subject: [PATCH 051/106] Fix a missing @class declaration --- AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j | 2 -- AppKit/CPWebView.j | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j index d11eceb64..30470d5c6 100644 --- a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j +++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j @@ -24,8 +24,6 @@ @import "CPDatePicker.j" @import "CPPopUpButton.j" -@class CPRuleEditorRowType - @global CPApp @global CPMiniControlSize @global CPSmallControlSize diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j index 3f2ca713e..fe344027e 100644 --- a/AppKit/CPWebView.j +++ b/AppKit/CPWebView.j @@ -23,6 +23,7 @@ @import "CPView.j" @import "CPScrollView.j" +@class CPWebScriptObject // FIXME: implement these where possible: /* From fe25dbd87296402d921c7c2cbf8c2de2ed583e8a Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 20 Nov 2014 15:21:07 -0800 Subject: [PATCH 052/106] New: added method addObserverForName:object::usingBlock: in CPNotificationCenter Previously, the method addObserverForName:object::usingBlock: didn't exist in Cappuccino. Now it does. To observe, you need to use the method - (id )addObserverForName:(CPString)aNotificationName object:(id)anObject usingBlock:(Function)block To unregister observations, you pass the object returned by this method to removeObserver:. You must invoke removeObserver: or removeObserver:name:object:. Test /Tests/Foundation/CPNotificationCenterTest.j Fixed #2259 --- Foundation/CPNotificationCenter.j | 68 ++++++++++++++++++--- Tests/Foundation/CPNotificationCenterTest.j | 45 ++++++++++++++ 2 files changed, 106 insertions(+), 7 deletions(-) diff --git a/Foundation/CPNotificationCenter.j b/Foundation/CPNotificationCenter.j index 99ab18183..0d880276e 100644 --- a/Foundation/CPNotificationCenter.j +++ b/Foundation/CPNotificationCenter.j @@ -68,7 +68,8 @@ var CPNotificationDefaultCenter = nil; _namedRegistries = @{}; _unnamedRegistry = [[_CPNotificationRegistry alloc] init]; } - return self; + + return self; } /*! @@ -81,9 +82,35 @@ var CPNotificationDefaultCenter = nil; */ - (void)addObserver:(id)anObserver selector:(SEL)aSelector name:(CPString)aNotificationName object:(id)anObject { - var registry, + var registry = [self _registryForNotificationName:aNotificationName], observer = [[_CPNotificationObserver alloc] initWithObserver:anObserver selector:aSelector]; + [registry addObserver:observer object:anObject]; +} + +/*! + Adds an entry to the receiver’s dispatch table with a block, and optional criteria: notification name and sender. + @param aNotificationName the name of the notification the observer wants to watch + @param anObject the object in the notification the observer wants to watch + @param block the block to be executed when the notification is received. +*/ +- (id )addObserverForName:(CPString)aNotificationName object:(id)anObject usingBlock:(Function)block +{ + var registry = [self _registryForNotificationName:aNotificationName], + observer = [[_CPNotificationObserver alloc] initWithBlock:block]; + + [registry addObserver:observer object:anObject]; + + return observer; +} + +/*! + @ignore +*/ +- (_CPNotificationRegistry)_registryForNotificationName:(CPString)aNotificationName +{ + var registry; + if (aNotificationName == nil) registry = _unnamedRegistry; else if (!(registry = [_namedRegistries objectForKey:aNotificationName])) @@ -92,7 +119,7 @@ var CPNotificationDefaultCenter = nil; [_namedRegistries setObject:registry forKey:aNotificationName]; } - [registry addObserver:observer object:anObject]; + return registry; } /*! @@ -129,7 +156,10 @@ var CPNotificationDefaultCenter = nil; [_unnamedRegistry removeObserver:anObserver object:anObject]; } else + { [[_namedRegistries objectForKey:aNotificationName] removeObserver:anObserver object:anObject]; + } + } /*! @@ -233,7 +263,8 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ observersEnumerator = [observers objectEnumerator]; while ((observer = [observersEnumerator nextObject]) !== nil) - if ([observer observer] == anObserver) + if ([observer observer] == anObserver || + ([observer block] && [anObserver respondsToSelector:@selector(block)] && [observer block] == [anObserver block])) [observers removeObject:observer]; if (![observers count]) @@ -248,7 +279,8 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ observersEnumerator = [observers objectEnumerator]; while ((observer = [observersEnumerator nextObject]) !== nil) - if ([observer observer] == anObserver) + if ([observer observer] == anObserver || + ([observer block] && [anObserver respondsToSelector:@selector(block)] && [observer block] == [anObserver block])) [observers removeObject:observer]; if (![observers count]) @@ -312,8 +344,9 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ /* @ignore */ @implementation _CPNotificationObserver : CPObject { - id _observer; - SEL _selector; + id _observer; + Function _block; + SEL _selector; } - (id)initWithObserver:(id)anObserver selector:(SEL)aSelector @@ -327,13 +360,34 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ return self; } +- (id)initWithBlock:(Function)aBlock +{ + if (self) + { + _block = aBlock; + } + + return self; +} + - (id)observer { return _observer; } +- (id)block +{ + return _block; +} + - (void)postNotification:(CPNotification)aNotification { + if (_block) + { + _block(aNotification); + return; + } + [_observer performSelector:_selector withObject:aNotification]; } diff --git a/Tests/Foundation/CPNotificationCenterTest.j b/Tests/Foundation/CPNotificationCenterTest.j index b1f3b8bf5..e630e4064 100644 --- a/Tests/Foundation/CPNotificationCenterTest.j +++ b/Tests/Foundation/CPNotificationCenterTest.j @@ -52,6 +52,51 @@ var TestNotification = @"TestNotification"; [self assert:8 equals:notificationCount message:@"observer should not be notified"]; } +- (void)testNotifyWithBlocks +{ + var center = [CPNotificationCenter defaultCenter]; + + notificationCount = 0; + + var notificationBlock = function(notification){ + notificationCount += 1; + }; + + var observer2 = [center addObserverForName:TestNotification object:2 usingBlock:notificationBlock], + observer25 = [center addObserverForName:TestNotification object:25 usingBlock:notificationBlock]; + + [center postNotificationName:TestNotification object:self]; + [self assert:0 equals:notificationCount message:@"observer should only be notified for object '2'"]; + + [center postNotificationName:TestNotification object:2]; + [self assert:1 equals:notificationCount message:@"observer should be notified for object '2'"]; + + var observerNil = [center addObserverForName:TestNotification object:nil usingBlock:notificationBlock]; + + [center postNotificationName:TestNotification object:2]; + [self assert:3 equals:notificationCount message:@"observer should be notified for object '2' and for any object"]; + + [center removeObserver:observer2 name:TestNotification object:2]; + [center postNotificationName:TestNotification object:2]; + [self assert:4 equals:notificationCount message:@"observer should be notified only for any object"]; + + // At this point we have TestNofication:nil observer and a TestNotification:25 observer. + observer2 = [center addObserverForName:nil object:2 usingBlock:notificationBlock]; + + [center postNotificationName:TestNotification object:2]; + [self assert:6 equals:notificationCount message:@"observer should be notified for TestNofication and for object '2' (TestNotification)"]; + [center postNotificationName:@"RandomNotification" object:2]; + [self assert:7 equals:notificationCount message:@"observer should be notified for object '2' (RandomNotification)"]; + + [center removeObserver:observer2]; + [center removeObserver:observer25]; + [center removeObserver:observerNil]; + [center postNotificationName:TestNotification object:nil]; + [center postNotificationName:TestNotification object:2]; + [center postNotificationName:TestNotification object:25]; + [self assert:7 equals:notificationCount message:@"observer should not be notified"]; +} + - (void)testAddObserversDuringNotification { var center = [CPNotificationCenter defaultCenter]; From d481d9cca5348df486203e1954822547157bd1bb Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 20 Nov 2014 23:38:53 -0800 Subject: [PATCH 053/106] Fixed: added queue to the method addObserverForName:(CPString)aNotificationName object:(id)anObject queue:(id)queue usingBlock:(Function)block --- Foundation/CPNotificationCenter.j | 6 ++---- Tests/Foundation/CPNotificationCenterTest.j | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Foundation/CPNotificationCenter.j b/Foundation/CPNotificationCenter.j index 0d880276e..78cd7d354 100644 --- a/Foundation/CPNotificationCenter.j +++ b/Foundation/CPNotificationCenter.j @@ -92,9 +92,10 @@ var CPNotificationDefaultCenter = nil; Adds an entry to the receiver’s dispatch table with a block, and optional criteria: notification name and sender. @param aNotificationName the name of the notification the observer wants to watch @param anObject the object in the notification the observer wants to watch + @param queue is ignored for the moment @param block the block to be executed when the notification is received. */ -- (id )addObserverForName:(CPString)aNotificationName object:(id)anObject usingBlock:(Function)block +- (id )addObserverForName:(CPString)aNotificationName object:(id)anObject queue:(id)queue usingBlock:(Function)block { var registry = [self _registryForNotificationName:aNotificationName], observer = [[_CPNotificationObserver alloc] initWithBlock:block]; @@ -156,10 +157,7 @@ var CPNotificationDefaultCenter = nil; [_unnamedRegistry removeObserver:anObserver object:anObject]; } else - { [[_namedRegistries objectForKey:aNotificationName] removeObserver:anObserver object:anObject]; - } - } /*! diff --git a/Tests/Foundation/CPNotificationCenterTest.j b/Tests/Foundation/CPNotificationCenterTest.j index e630e4064..47aab1e0f 100644 --- a/Tests/Foundation/CPNotificationCenterTest.j +++ b/Tests/Foundation/CPNotificationCenterTest.j @@ -62,8 +62,8 @@ var TestNotification = @"TestNotification"; notificationCount += 1; }; - var observer2 = [center addObserverForName:TestNotification object:2 usingBlock:notificationBlock], - observer25 = [center addObserverForName:TestNotification object:25 usingBlock:notificationBlock]; + var observer2 = [center addObserverForName:TestNotification object:2 queue:nil usingBlock:notificationBlock], + observer25 = [center addObserverForName:TestNotification object:25 queue:nil usingBlock:notificationBlock]; [center postNotificationName:TestNotification object:self]; [self assert:0 equals:notificationCount message:@"observer should only be notified for object '2'"]; @@ -71,7 +71,7 @@ var TestNotification = @"TestNotification"; [center postNotificationName:TestNotification object:2]; [self assert:1 equals:notificationCount message:@"observer should be notified for object '2'"]; - var observerNil = [center addObserverForName:TestNotification object:nil usingBlock:notificationBlock]; + var observerNil = [center addObserverForName:TestNotification object:nil queue:nil usingBlock:notificationBlock]; [center postNotificationName:TestNotification object:2]; [self assert:3 equals:notificationCount message:@"observer should be notified for object '2' and for any object"]; @@ -81,7 +81,7 @@ var TestNotification = @"TestNotification"; [self assert:4 equals:notificationCount message:@"observer should be notified only for any object"]; // At this point we have TestNofication:nil observer and a TestNotification:25 observer. - observer2 = [center addObserverForName:nil object:2 usingBlock:notificationBlock]; + observer2 = [center addObserverForName:nil object:2 queue:nil usingBlock:notificationBlock]; [center postNotificationName:TestNotification object:2]; [self assert:6 equals:notificationCount message:@"observer should be notified for TestNofication and for object '2' (TestNotification)"]; From b1d56924e6411ca123971c1d7056dc4ae636b91d Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Tue, 25 Nov 2014 17:56:04 -0500 Subject: [PATCH 054/106] Fixed: Formatting --- Objective-J/CFError.js | 60 +++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/Objective-J/CFError.js b/Objective-J/CFError.js index 545c7eef5..615bbade8 100644 --- a/Objective-J/CFError.js +++ b/Objective-J/CFError.js @@ -42,24 +42,26 @@ GLOBAL(CFError) = function(/* CFString */ domain, /* int */ code, /* CFDictionar this._code = code || 0; this._userInfo = userInfo || new CFDictionary(); this._UID = objj_generateObjectUID(); -} +}; -CFError.prototype.domain = function () +CFError.prototype.domain = function() { return this._domain; -} -DISPLAY_NAME(CFError.prototype.domain) +}; -CFError.prototype.code = function () +DISPLAY_NAME(CFError.prototype.domain); + +CFError.prototype.code = function() { return this._code; -} -DISPLAY_NAME(CFError.prototype.code) +}; + +DISPLAY_NAME(CFError.prototype.code); /* This follows the same logic to generate a description as the "real" CFError. */ -CFError.prototype.description = function () +CFError.prototype.description = function() { var localizedDesc = this._userInfo.valueForKey(kCFErrorLocalizedDescriptionKey); if (localizedDesc) @@ -87,26 +89,30 @@ CFError.prototype.description = function () } return result; -} -DISPLAY_NAME(CFError.prototype.description) +}; -CFError.prototype.failureReason = function () +DISPLAY_NAME(CFError.prototype.description); + +CFError.prototype.failureReason = function() { return this._userInfo.valueForKey(kCFErrorLocalizedFailureReasonKey); -} -DISPLAY_NAME(CFError.prototype.failureReason) +}; -CFError.prototype.recoverySuggestion = function () +DISPLAY_NAME(CFError.prototype.failureReason); + +CFError.prototype.recoverySuggestion = function() { return this._userInfo.valueForKey(kCFErrorLocalizedRecoverySuggestionKey); -} -DISPLAY_NAME(CFError.prototype.recoverySuggestion) +}; + +DISPLAY_NAME(CFError.prototype.recoverySuggestion); CFError.prototype.userInfo = function () { return this._userInfo; -} -DISPLAY_NAME(CFError.prototype.userInfo) +}; + +DISPLAY_NAME(CFError.prototype.userInfo); /* CFError Bridge Functions @@ -116,43 +122,43 @@ DISPLAY_NAME(CFError.prototype.userInfo) GLOBAL(CFErrorCreate) = function(/* String */ domain, /*int */ code, /* CFDictionary */ userInfo) { return new CFError(domain, code, userInfo); -} +}; GLOBAL(CFErrorCreateWithUserInfoKeysAndValues) = function(/* String */ domain, /* int */ code, /* array */ userInfoKeys, /* array */ userInfoValues, /* int */ numUserInfoValues) { var userInfo = new CFMutableDictionary(); - while(numUserInfoValues--) + while (numUserInfoValues--) userInfo.setValueForKey(userInfoKeys[numUserInfoValues], userInfoValues[numUserInfoValues]); return new CFError(domain, code, userInfo); -} +}; GLOBAL(CFErrorGetCode) = function(/* CFError */ err) { return err.code(); -} +}; GLOBAL(CFErrorGetDomain) = function(/* CFError */ err) { return err.domain(); -} +}; GLOBAL(CFErrorCopyDescription) = function(/* CFError */ err) { return err.description(); -} +}; GLOBAL(CFErrorCopyUserInfo) = function(/* CFError */ err) { return err.userInfo(); -} +}; GLOBAL(CFErrorCopyFailureReason) = function(/* CFError */ err) { return err.failureReason(); -} +}; GLOBAL(CFErrorCopyRecoverySuggestion) = function(/* CFError */err) { return err.recoverySuggestion(); -} +}; From 6f6938deb7356bcfb27f46868b5723537bd22f4b Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Tue, 25 Nov 2014 17:58:17 -0500 Subject: [PATCH 055/106] Fixed: Updated Comment --- Foundation/CPError.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Foundation/CPError.j b/Foundation/CPError.j index 4ac772d61..edc270514 100644 --- a/Foundation/CPError.j +++ b/Foundation/CPError.j @@ -99,8 +99,8 @@ var userInfo = @{CPLocalizedDescriptionKey: @"A localized error description", /*! By default this method returns the object in the user info dictionary for the key - NSLocalizedDescriptionKey. If the user info dictionary doesn’t contain a value for - NSLocalizedDescriptionKey, a default string is constructed from the domain and code. + CPLocalizedDescriptionKey. If the user info dictionary doesn’t contain a value for + CPLocalizedDescriptionKey, a default string is constructed from the domain and code. */ - (CPString)localizedDescription { From b36cc8f1e949f152e45f89dfd9f1448dafaa6898 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 25 Nov 2014 17:29:30 -0800 Subject: [PATCH 056/106] Fixed: Memory leak in CPTableView, CPScrollView Prevously, when removing a CPTableView or a CPScrollView, the CPNotificationCenter kept a reference of these observers in the notification center. Now, the CPNotificationCenter does only have a observer when necessary. --- AppKit/CPClipView.j | 11 +++-- AppKit/CPScrollView.j | 36 +++++++++++++--- AppKit/CPTableView.j | 99 +++++++++++++++++++++++++++---------------- 3 files changed, 101 insertions(+), 45 deletions(-) diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j index 8503c4cc5..a0071ab45 100644 --- a/AppKit/CPClipView.j +++ b/AppKit/CPClipView.j @@ -62,6 +62,9 @@ - (void)_observeDocumentView { + if (!_documentView) + return; + var defaultCenter = [CPNotificationCenter defaultCenter]; [_documentView setPostsFrameChangedNotifications:YES]; @@ -87,15 +90,15 @@ [defaultCenter removeObserver:self name:CPViewFrameDidChangeNotification - object:_documentView]; + object:aDocumentView]; [defaultCenter removeObserver:self name:CPViewBoundsDidChangeNotification - object:_documentView]; + object:aDocumentView]; } -- (void)_addObservers +/*- (void)_addObservers { if (_isObserving) return; @@ -115,7 +118,7 @@ if (_documentView) [self _removeObserverDocumentView:_documentView]; -} +}*/ /*! Returns the document view. diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index c93543315..aef8453a9 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -264,11 +264,6 @@ var CPScrollerStyleGlobal = CPScrollerStyleOverlay, _delegate = nil; _scrollTimer = nil; _implementedDelegateMethods = 0; - - [[CPNotificationCenter defaultCenter] addObserver:self - selector:@selector(_didReceiveDefaultStyleChange:) - name:CPScrollerStyleGlobalChangeNotification - object:nil]; } return self; @@ -1270,6 +1265,37 @@ Notifies the delegate when the scroll view has finished scrolling. #pragma mark - #pragma mark Overrides + +- (void)_removeObservers +{ + if (!_isObserving) + return; + + [[CPNotificationCenter defaultCenter] removeObserver:self + name:CPScrollerStyleGlobalChangeNotification + object:nil]; + + [super _removeObservers]; +} + +- (void)_addObservers +{ + if (_isObserving) + return; + + //Make sure to have the last global style for the scroller + [self _didReceiveDefaultStyleChange:nil]; + + [[CPNotificationCenter defaultCenter] addObserver:self + selector:@selector(_didReceiveDefaultStyleChange:) + name:CPScrollerStyleGlobalChangeNotification + object:nil]; + + [super _addObservers]; +} + + + - (void)drawRect:(CGRect)aRect { [super drawRect:aRect]; diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 48157b537..604ec8d23 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -320,6 +320,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; CPTableColumn _draggedColumn; CPArray _differedColumnDataToRemove; + + CPView _observedClipView; } /*! @@ -4454,41 +4456,15 @@ Your delegate can implement this method to avoid subclassing the tableview to ad */ - (void)viewWillMoveToSuperview:(CPView)aView { - [super viewWillMoveToSuperview:aView]; - - var superview = [self superview], - defaultCenter = [CPNotificationCenter defaultCenter]; - - if (superview) - { - [defaultCenter - removeObserver:self - name:CPViewFrameDidChangeNotification - object:superview]; - - [defaultCenter - removeObserver:self - name:CPViewBoundsDidChangeNotification - object:superview]; - } - if ([aView isKindOfClass:[CPClipView class]]) + _observedClipView = aView; + else { - [aView setPostsFrameChangedNotifications:YES]; - [aView setPostsBoundsChangedNotifications:YES]; - - [defaultCenter - addObserver:self - selector:@selector(superviewFrameChanged:) - name:CPViewFrameDidChangeNotification - object:aView]; - - [defaultCenter - addObserver:self - selector:@selector(superviewBoundsChanged:) - name:CPViewBoundsDidChangeNotification - object:aView]; + [self _stopObservingClipView]; + _observedClipView = nil; } + + [super viewWillMoveToSuperview:aView]; } /*! @@ -5138,8 +5114,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (!_isObserving) return; + [self _stopObservingClipView]; [super _removeObservers]; - [self _stopObservingFirstResponder]; } - (void)_addObservers @@ -5147,13 +5123,64 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (_isObserving) return; + [self _startObservingClipView]; [super _addObservers]; - [self _startObservingFirstResponder]; } -- (void)_startObservingFirstResponder +/*! + Called when the receiver is about to be moved to a new window. + @param aWindow the window to which the receiver will be moved. +*/ +- (void)viewWillMoveToWindow:(CPWindow)aWindow { - [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_firstResponderDidChange:) name:_CPWindowDidChangeFirstResponderNotification object:[self window]]; + [super viewWillMoveToWindow:aWindow]; + + [self _stopObservingFirstResponder]; + + if (aWindow) + [self _startObservingFirstResponderForWindow:aWindow]; +} + +- (void)_startObservingClipView +{ + if (!_observedClipView) + return; + + var defaultCenter = [CPNotificationCenter defaultCenter]; + + [_observedClipView setPostsFrameChangedNotifications:YES]; + [_observedClipView setPostsBoundsChangedNotifications:YES]; + + [defaultCenter addObserver:self + selector:@selector(superviewFrameChanged:) + name:CPViewFrameDidChangeNotification + object:_observedClipView]; + + [defaultCenter addObserver:self + selector:@selector(superviewBoundsChanged:) + name:CPViewBoundsDidChangeNotification + object:_observedClipView]; +} + +- (void)_stopObservingClipView +{ + if (!_observedClipView) + return; + + var defaultCenter = [CPNotificationCenter defaultCenter]; + + [defaultCenter removeObserver:self + name:CPViewFrameDidChangeNotification + object:_observedClipView]; + + [defaultCenter removeObserver:self + name:CPViewBoundsDidChangeNotification + object:_observedClipView]; +} + +- (void)_startObservingFirstResponderForWindow:(CPWindow)aWindow +{ + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_firstResponderDidChange:) name:_CPWindowDidChangeFirstResponderNotification object:aWindow]; } - (void)_stopObservingFirstResponder From e9f73cbb45cf01833764b53b2020471e32523d8a Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Wed, 26 Nov 2014 11:07:48 +0000 Subject: [PATCH 057/106] Minor formatting. --- Objective-J/OldBrowserCompatibility.js | 2 +- Objective-J/json2.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objective-J/OldBrowserCompatibility.js b/Objective-J/OldBrowserCompatibility.js index 0086388ff..cd3d30517 100644 --- a/Objective-J/OldBrowserCompatibility.js +++ b/Objective-J/OldBrowserCompatibility.js @@ -37,7 +37,7 @@ if (!Object.create) // This is for IE8 support. It doesn't have the Object.keys function. if (!Object.keys) { - Object.keys = (function () + Object.keys = (function() { var hasOwnProperty = Object.prototype.hasOwnProperty, hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), diff --git a/Objective-J/json2.js b/Objective-J/json2.js index 8ba599eed..0252d58bf 100644 --- a/Objective-J/json2.js +++ b/Objective-J/json2.js @@ -161,7 +161,7 @@ if (!this.JSON) { JSON = {}; } -(function () { +(function() { function f(n) { // Format integers to have at least two digits. From fc5bb7417fc621bcc4b6b928dad11d1ae658ace7 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 10:20:07 -0800 Subject: [PATCH 058/106] Fixed: removed useless comment in CPClipView.j --- AppKit/CPClipView.j | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j index a0071ab45..655d3c36c 100644 --- a/AppKit/CPClipView.j +++ b/AppKit/CPClipView.j @@ -98,28 +98,6 @@ object:aDocumentView]; } -/*- (void)_addObservers -{ - if (_isObserving) - return; - - [super _addObservers]; - - if (_documentView) - [self _observeDocumentView]; -} - -- (void)_removeObservers -{ - if (!_isObserving) - return; - - [super _removeObservers]; - - if (_documentView) - [self _removeObserverDocumentView:_documentView]; -}*/ - /*! Returns the document view. */ From 31afae71d1ef73e5fbd9153c84d3f21e42f11fec Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 26 Nov 2014 11:52:25 -0800 Subject: [PATCH 059/106] Typos --- Objective-J/ObjJAcornCompiler.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index ce3009ef7..79646a0e6 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -1675,7 +1675,7 @@ ClassDeclarationStatement: function(node, st, c) { compiler.classBodyBuffer = new StringBuffer(); // TODO: Check if this is needed if (compiler.getTypeDef(className)) - throw compiler.error_message(className + " is already declared as type", node.classname); + throw compiler.error_message(className + " is already declared as a type", node.classname); if (!generate) saveJSBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); @@ -2414,7 +2414,7 @@ ClassStatement: function(node, st, c) { var className = node.id.name; if (compiler.getTypeDef(className)) - throw compiler.error_message(className + " is already declared as type", node.id); + throw compiler.error_message(className + " is already declared as a type", node.id); if (!compiler.getClassDef(className)) { classDef = new ClassDef(false, className); From 3269ba10ec4dac93d04dda64048f72175410bc9a Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 12:01:40 -0800 Subject: [PATCH 060/106] Fixed: CPDatePicker doesn't have a focusRing when editing Previously, the CPDatePicker didn't have a focus ring when an user was editing it. Now it does. It works for Aristo1 and Aristo2. Test App in Tests/Manual/CPDatePickerTest --- AppKit/CPDatePicker/_CPDatePickerTextField.j | 4 ++++ AppKit/Themes/Aristo/ThemeDescriptors.j | 20 ++++++++++++++++++++ AppKit/Themes/Aristo2/ThemeDescriptors.j | 16 ++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index 39935b536..18ad45a4a 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -123,6 +123,8 @@ var CPZeroKeyCode = 48, // This is usefull when clicking on the stepper when the datePicker is not selected [_stepper setObjectValue:0]; + //[_datePicker unsetThemeState:CPThemeStateEditing]; + return YES; } @@ -1771,6 +1773,7 @@ var CPMonthDateType = 0, - (void)makeSelectable { [self setThemeState:CPThemeStateSelected]; + [_datePicker setThemeState:CPThemeStateEditing]; } /*! Unsert the theme CPThemeStateSelected @@ -1779,6 +1782,7 @@ var CPMonthDateType = 0, { _firstEvent = YES; [self unsetThemeState:CPThemeStateSelected]; + [_datePicker unsetThemeState:CPThemeStateEditing]; } diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index efbbb1c23..4bac4681a 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -1258,6 +1258,19 @@ var themedButtonValues = nil, ["textfield-bezel-square-disabled-8.png", 6.0, 6.0] ]), + bezelFocusedColor = PatternColor( + [ + ["textfield-bezel-square-focused-0.png", 6.0, 6.0], + ["textfield-bezel-square-focused-1.png", 1.0, 6.0], + ["textfield-bezel-square-focused-2.png", 6.0, 6.0], + ["textfield-bezel-square-focused-3.png", 6.0, 1.0], + ["textfield-bezel-square-focused-4.png", 1.0, 1.0], + ["textfield-bezel-square-focused-5.png", 6.0, 1.0], + ["textfield-bezel-square-focused-6.png", 6.0, 6.0], + ["textfield-bezel-square-focused-7.png", 1.0, 6.0], + ["textfield-bezel-square-focused-8.png", 6.0, 6.0] + ]), + bezelColorDatePickerTextField = PatternColor( [ [@"datepicker-date-segment-0.png", 4.0, 18.0], @@ -1268,6 +1281,7 @@ var themedButtonValues = nil, themeValues = [ [@"bezel-color", bezelColor, CPThemeStateBezeled], + [@"bezel-color", bezelFocusedColor, [CPThemeStateBezeled, CPThemeStateEditing]], [@"bezel-color", bezelDisabledColor, [CPThemeStateBezeled, CPThemeStateDisabled]], [@"font", [CPFont boldSystemFontOfSize:13.0]], @@ -1275,8 +1289,10 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 3.0), CPThemeStateNormal], [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 5.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 5.0), [CPThemeStateBezeled, CPThemeStateEditing]], [@"bezel-inset", CGInsetMake(0.0, -3.0, 0.0, -3.0), CPThemeStateBezeled], + [@"bezel-inset", CGInsetMake(0.0, -3.0, 0.0, -3.0), [CPThemeStateBezeled, CPThemeStateEditing]], [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal], [@"datepicker-textfield-bezel-color", bezelColorDatePickerTextField, CPThemeStateSelected], @@ -1301,10 +1317,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeSmall [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 5.0), [CPThemeStateControlSizeSmall, CPThemeStateNormal]], [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 5.0), [CPThemeStateControlSizeSmall, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 5.0), [CPThemeStateControlSizeSmall, CPThemeStateEditing, CPThemeStateBezeled]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 16.0), CPThemeStateControlSizeSmall], [@"date-hour-margin", 5.0, CPThemeStateControlSizeSmall], [@"stepper-margin", 3.0, CPThemeStateControlSizeSmall], + [@"stepper-margin", 3.0, [CPThemeStateControlSizeSmall, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 26.0), CPThemeStateControlSizeSmall], [@"max-size", CGSizeMake(-1.0, 26.0), CPThemeStateControlSizeSmall], @@ -1313,10 +1331,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeMini [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 4.0), [CPThemeStateControlSizeMini, CPThemeStateNormal]], [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 4.0), [CPThemeStateControlSizeMini, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 4.0), [CPThemeStateControlSizeMini, CPThemeStateEditing, CPThemeStateBezeled]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 12.0), CPThemeStateControlSizeMini], [@"date-hour-margin", 2.0, CPThemeStateControlSizeMini], [@"stepper-margin", 2.0, CPThemeStateControlSizeMini], + [@"stepper-margin", 2.0, [CPThemeStateControlSizeMini, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 22.0), CPThemeStateControlSizeMini], [@"max-size", CGSizeMake(-1.0, 22.0), CPThemeStateControlSizeMini], diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index bf72661f3..86a43e46f 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -824,6 +824,14 @@ var themedButtonValues = nil, height: 4.0 }), + bezelFocusedColor = PatternColor( + "textfield-bezel-square-focused{position}.png", + { + positions: "#", + width: 9.0, + height: 9.0 + }), + bezelColorDatePickerTextField = PatternColor( [ [@"datepicker-date-segment-0.png", 4.0, 18.0], @@ -835,14 +843,17 @@ var themedButtonValues = nil, [ [@"bezel-color", bezelColor["@"], CPThemeStateBezeled], [@"bezel-color", bezelColor["disabled"], [CPThemeStateBezeled, CPThemeStateDisabled]], + [@"bezel-color", bezelFocusedColor, [CPThemeStateBezeled, CPThemeStateEditing]], [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize]], [@"text-color", [CPColor colorWithWhite:0.2 alpha:0.5], CPThemeStateDisabled], [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 3.0), CPThemeStateNormal], [@"content-inset", CGInsetMake(3.0, 0.0, 0.0, 3.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 6.0), [CPThemeStateNormal, CPThemeStateBezeled, CPThemeStateEditing]], [@"bezel-inset", CGInsetMake(3.0, 0.0, 3.0, 0.0), CPThemeStateBezeled], + [@"bezel-inset", CGInsetMake(0.0, 0, 0.0, -3.0), [CPThemeStateNormal, CPThemeStateBezeled, CPThemeStateEditing]], [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal], [@"datepicker-textfield-bezel-color", bezelColorDatePickerTextField, CPThemeStateSelected], @@ -859,6 +870,7 @@ var themedButtonValues = nil, [@"min-size-datepicker-textfield", CGSizeMake(6.0, 18.0)], [@"date-hour-margin", 7.0], [@"stepper-margin", 5.0], + [@"stepper-margin", 2.0, CPThemeStateEditing], [@"min-size", CGSizeMake(0, 29.0)], [@"max-size", CGSizeMake(-1.0, 29.0)], @@ -867,10 +879,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeSmall [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeSmall, CPThemeStateNormal]], [@"content-inset", CGInsetMake(2.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeSmall, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 6.0), [CPThemeStateControlSizeSmall, CPThemeStateBezeled, CPThemeStateEditing]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 16.0), CPThemeStateControlSizeSmall], [@"date-hour-margin", 5.0, CPThemeStateControlSizeSmall], [@"stepper-margin", 3.0, CPThemeStateControlSizeSmall], + [@"stepper-margin", 0.0, [CPThemeStateControlSizeSmall, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 26.0), CPThemeStateControlSizeSmall], [@"max-size", CGSizeMake(-1.0, 26.0), CPThemeStateControlSizeSmall], @@ -879,10 +893,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeMini [@"content-inset", CGInsetMake(3.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeMini, CPThemeStateNormal]], [@"content-inset", CGInsetMake(1.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeMini, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 6.0), [CPThemeStateControlSizeMini, CPThemeStateBezeled, CPThemeStateEditing]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 12.0), CPThemeStateControlSizeMini], [@"date-hour-margin", 2.0, CPThemeStateControlSizeMini], [@"stepper-margin", 2.0, CPThemeStateControlSizeMini], + [@"stepper-margin", -1.0, [CPThemeStateControlSizeMini, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 22.0), CPThemeStateControlSizeMini], [@"max-size", CGSizeMake(-1.0, 22.0), CPThemeStateControlSizeMini], From ad364b618438506746387bf51bd78cd33b0feef1 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 12:01:40 -0800 Subject: [PATCH 061/106] Fixed: CPDatePicker doesn't have a focusRing when editing Previously, the CPDatePicker didn't have a focus ring when an user was editing it. Now it does. It works for Aristo1 and Aristo2. Test App in Tests/Manual/CPDatePickerTest Fixed #2263 --- AppKit/CPDatePicker/_CPDatePickerTextField.j | 4 ++++ AppKit/Themes/Aristo/ThemeDescriptors.j | 20 ++++++++++++++++++++ AppKit/Themes/Aristo2/ThemeDescriptors.j | 16 ++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index 39935b536..18ad45a4a 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -123,6 +123,8 @@ var CPZeroKeyCode = 48, // This is usefull when clicking on the stepper when the datePicker is not selected [_stepper setObjectValue:0]; + //[_datePicker unsetThemeState:CPThemeStateEditing]; + return YES; } @@ -1771,6 +1773,7 @@ var CPMonthDateType = 0, - (void)makeSelectable { [self setThemeState:CPThemeStateSelected]; + [_datePicker setThemeState:CPThemeStateEditing]; } /*! Unsert the theme CPThemeStateSelected @@ -1779,6 +1782,7 @@ var CPMonthDateType = 0, { _firstEvent = YES; [self unsetThemeState:CPThemeStateSelected]; + [_datePicker unsetThemeState:CPThemeStateEditing]; } diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index efbbb1c23..4bac4681a 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -1258,6 +1258,19 @@ var themedButtonValues = nil, ["textfield-bezel-square-disabled-8.png", 6.0, 6.0] ]), + bezelFocusedColor = PatternColor( + [ + ["textfield-bezel-square-focused-0.png", 6.0, 6.0], + ["textfield-bezel-square-focused-1.png", 1.0, 6.0], + ["textfield-bezel-square-focused-2.png", 6.0, 6.0], + ["textfield-bezel-square-focused-3.png", 6.0, 1.0], + ["textfield-bezel-square-focused-4.png", 1.0, 1.0], + ["textfield-bezel-square-focused-5.png", 6.0, 1.0], + ["textfield-bezel-square-focused-6.png", 6.0, 6.0], + ["textfield-bezel-square-focused-7.png", 1.0, 6.0], + ["textfield-bezel-square-focused-8.png", 6.0, 6.0] + ]), + bezelColorDatePickerTextField = PatternColor( [ [@"datepicker-date-segment-0.png", 4.0, 18.0], @@ -1268,6 +1281,7 @@ var themedButtonValues = nil, themeValues = [ [@"bezel-color", bezelColor, CPThemeStateBezeled], + [@"bezel-color", bezelFocusedColor, [CPThemeStateBezeled, CPThemeStateEditing]], [@"bezel-color", bezelDisabledColor, [CPThemeStateBezeled, CPThemeStateDisabled]], [@"font", [CPFont boldSystemFontOfSize:13.0]], @@ -1275,8 +1289,10 @@ var themedButtonValues = nil, [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 3.0), CPThemeStateNormal], [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 5.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 5.0), [CPThemeStateBezeled, CPThemeStateEditing]], [@"bezel-inset", CGInsetMake(0.0, -3.0, 0.0, -3.0), CPThemeStateBezeled], + [@"bezel-inset", CGInsetMake(0.0, -3.0, 0.0, -3.0), [CPThemeStateBezeled, CPThemeStateEditing]], [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal], [@"datepicker-textfield-bezel-color", bezelColorDatePickerTextField, CPThemeStateSelected], @@ -1301,10 +1317,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeSmall [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 5.0), [CPThemeStateControlSizeSmall, CPThemeStateNormal]], [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 5.0), [CPThemeStateControlSizeSmall, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 5.0), [CPThemeStateControlSizeSmall, CPThemeStateEditing, CPThemeStateBezeled]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 16.0), CPThemeStateControlSizeSmall], [@"date-hour-margin", 5.0, CPThemeStateControlSizeSmall], [@"stepper-margin", 3.0, CPThemeStateControlSizeSmall], + [@"stepper-margin", 3.0, [CPThemeStateControlSizeSmall, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 26.0), CPThemeStateControlSizeSmall], [@"max-size", CGSizeMake(-1.0, 26.0), CPThemeStateControlSizeSmall], @@ -1313,10 +1331,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeMini [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 4.0), [CPThemeStateControlSizeMini, CPThemeStateNormal]], [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 4.0), [CPThemeStateControlSizeMini, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 4.0), [CPThemeStateControlSizeMini, CPThemeStateEditing, CPThemeStateBezeled]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 12.0), CPThemeStateControlSizeMini], [@"date-hour-margin", 2.0, CPThemeStateControlSizeMini], [@"stepper-margin", 2.0, CPThemeStateControlSizeMini], + [@"stepper-margin", 2.0, [CPThemeStateControlSizeMini, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 22.0), CPThemeStateControlSizeMini], [@"max-size", CGSizeMake(-1.0, 22.0), CPThemeStateControlSizeMini], diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index bf72661f3..86a43e46f 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -824,6 +824,14 @@ var themedButtonValues = nil, height: 4.0 }), + bezelFocusedColor = PatternColor( + "textfield-bezel-square-focused{position}.png", + { + positions: "#", + width: 9.0, + height: 9.0 + }), + bezelColorDatePickerTextField = PatternColor( [ [@"datepicker-date-segment-0.png", 4.0, 18.0], @@ -835,14 +843,17 @@ var themedButtonValues = nil, [ [@"bezel-color", bezelColor["@"], CPThemeStateBezeled], [@"bezel-color", bezelColor["disabled"], [CPThemeStateBezeled, CPThemeStateDisabled]], + [@"bezel-color", bezelFocusedColor, [CPThemeStateBezeled, CPThemeStateEditing]], [@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize]], [@"text-color", [CPColor colorWithWhite:0.2 alpha:0.5], CPThemeStateDisabled], [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 3.0), CPThemeStateNormal], [@"content-inset", CGInsetMake(3.0, 0.0, 0.0, 3.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(6.0, 0.0, 0.0, 6.0), [CPThemeStateNormal, CPThemeStateBezeled, CPThemeStateEditing]], [@"bezel-inset", CGInsetMake(3.0, 0.0, 3.0, 0.0), CPThemeStateBezeled], + [@"bezel-inset", CGInsetMake(0.0, 0, 0.0, -3.0), [CPThemeStateNormal, CPThemeStateBezeled, CPThemeStateEditing]], [@"datepicker-textfield-bezel-color", [CPColor clearColor], CPThemeStateNormal], [@"datepicker-textfield-bezel-color", bezelColorDatePickerTextField, CPThemeStateSelected], @@ -859,6 +870,7 @@ var themedButtonValues = nil, [@"min-size-datepicker-textfield", CGSizeMake(6.0, 18.0)], [@"date-hour-margin", 7.0], [@"stepper-margin", 5.0], + [@"stepper-margin", 2.0, CPThemeStateEditing], [@"min-size", CGSizeMake(0, 29.0)], [@"max-size", CGSizeMake(-1.0, 29.0)], @@ -867,10 +879,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeSmall [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeSmall, CPThemeStateNormal]], [@"content-inset", CGInsetMake(2.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeSmall, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(5.0, 0.0, 0.0, 6.0), [CPThemeStateControlSizeSmall, CPThemeStateBezeled, CPThemeStateEditing]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 16.0), CPThemeStateControlSizeSmall], [@"date-hour-margin", 5.0, CPThemeStateControlSizeSmall], [@"stepper-margin", 3.0, CPThemeStateControlSizeSmall], + [@"stepper-margin", 0.0, [CPThemeStateControlSizeSmall, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 26.0), CPThemeStateControlSizeSmall], [@"max-size", CGSizeMake(-1.0, 26.0), CPThemeStateControlSizeSmall], @@ -879,10 +893,12 @@ var themedButtonValues = nil, // CPThemeStateControlSizeMini [@"content-inset", CGInsetMake(3.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeMini, CPThemeStateNormal]], [@"content-inset", CGInsetMake(1.0, 0.0, 0.0, 3.0), [CPThemeStateControlSizeMini, CPThemeStateBezeled]], + [@"content-inset", CGInsetMake(4.0, 0.0, 0.0, 6.0), [CPThemeStateControlSizeMini, CPThemeStateBezeled, CPThemeStateEditing]], [@"min-size-datepicker-textfield", CGSizeMake(6.0, 12.0), CPThemeStateControlSizeMini], [@"date-hour-margin", 2.0, CPThemeStateControlSizeMini], [@"stepper-margin", 2.0, CPThemeStateControlSizeMini], + [@"stepper-margin", -1.0, [CPThemeStateControlSizeMini, CPThemeStateEditing]], [@"min-size", CGSizeMake(0, 22.0), CPThemeStateControlSizeMini], [@"max-size", CGSizeMake(-1.0, 22.0), CPThemeStateControlSizeMini], From 547522a0a41f559171839b50a2f655ecb5a842be Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 13:06:03 -0800 Subject: [PATCH 062/106] Fixed: Memory leak in CPClipView Previously, the CPClipView registered the documentView to the notificationCenter as an observer to be notified when the frame/bounds of the documentView change. Now, we don't use the notificationCenter anymore. The class CPView send a message to its superview (when it's a clipView) when the frame or bounds change. This fix the memory leak of the CPClipView Fixed #2264 --- AppKit/CPClipView.j | 64 --------------------------------------------- AppKit/CPView.j | 21 +++++++++++++++ 2 files changed, 21 insertions(+), 64 deletions(-) diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j index 8503c4cc5..93f8aacd6 100644 --- a/AppKit/CPClipView.j +++ b/AppKit/CPClipView.j @@ -46,75 +46,12 @@ return; if (_documentView) - { - [self _removeObserverDocumentView:_documentView]; [_documentView removeFromSuperview]; - } _documentView = aView; if (_documentView) - { [self addSubview:_documentView]; - [self _observeDocumentView]; - } -} - -- (void)_observeDocumentView -{ - var defaultCenter = [CPNotificationCenter defaultCenter]; - - [_documentView setPostsFrameChangedNotifications:YES]; - [_documentView setPostsBoundsChangedNotifications:YES]; - - [defaultCenter - addObserver:self - selector:@selector(viewFrameChanged:) - name:CPViewFrameDidChangeNotification - object:_documentView]; - - [defaultCenter - addObserver:self - selector:@selector(viewBoundsChanged:) - name:CPViewBoundsDidChangeNotification - object:_documentView]; -} - -- (void)_removeObserverDocumentView:(CPView)aDocumentView -{ - var defaultCenter = [CPNotificationCenter defaultCenter]; - - [defaultCenter - removeObserver:self - name:CPViewFrameDidChangeNotification - object:_documentView]; - - [defaultCenter - removeObserver:self - name:CPViewBoundsDidChangeNotification - object:_documentView]; -} - -- (void)_addObservers -{ - if (_isObserving) - return; - - [super _addObservers]; - - if (_documentView) - [self _observeDocumentView]; -} - -- (void)_removeObservers -{ - if (!_isObserving) - return; - - [super _removeObservers]; - - if (_documentView) - [self _removeObserverDocumentView:_documentView]; } /*! @@ -275,7 +212,6 @@ var CPClipViewDocumentViewKey = @"CPScrollViewDocumentView"; // Don't call setDocumentView: here. It calls addSubview:, but it's A) not necessary since the // view hierarchy is fully encoded and B) dangerous if the subview is not fully decoded. _documentView = [aCoder decodeObjectForKey:CPClipViewDocumentViewKey]; - [self _observeDocumentView]; } return self; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 1a600667c..7649b45ca 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -172,6 +172,7 @@ var CPViewFlags = { }, BOOL _postsBoundsChangedNotifications; BOOL _inhibitFrameAndBoundsChangedNotifications; BOOL _inLiveResize; + BOOL _isSuperviewAClipView; #if PLATFORM(DOM) DOMElement _DOMElement; @@ -821,6 +822,8 @@ var CPViewFlags = { }, */ - (void)viewWillMoveToSuperview:(CPView)aView { + _isSuperviewAClipView = [aView isKindOfClass:[CPClipView class]]; + [self _removeObservers]; if (aView) @@ -952,6 +955,9 @@ var CPViewFlags = { }, if (_postsFrameChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; + + if (_isSuperviewAClipView) + [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1014,6 +1020,9 @@ var CPViewFlags = { }, if (_postsFrameChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; + #if PLATFORM(DOM) var transform = _superview ? _superview._boundsTransform : NULL; @@ -1173,6 +1182,9 @@ var CPViewFlags = { }, if (_postsFrameChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; + + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1207,6 +1219,9 @@ var CPViewFlags = { }, if (_postsBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewBoundsDidChangeNotification object:self]; + + if (_isSuperviewAClipView) + [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1269,6 +1284,9 @@ var CPViewFlags = { }, if (_postsBoundsChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewBoundsDidChangeNotification object:self]; + + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1307,6 +1325,9 @@ var CPViewFlags = { }, if (_postsBoundsChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewBoundsDidChangeNotification object:self]; + + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; } From e62fd4dc005902e3285788f40c52d9e0d6dba3c0 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 13:06:03 -0800 Subject: [PATCH 063/106] Merged of CPCLipView --- AppKit/CPClipView.j | 45 --------------------------------------------- AppKit/CPView.j | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 45 deletions(-) diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j index 655d3c36c..93f8aacd6 100644 --- a/AppKit/CPClipView.j +++ b/AppKit/CPClipView.j @@ -46,56 +46,12 @@ return; if (_documentView) - { - [self _removeObserverDocumentView:_documentView]; [_documentView removeFromSuperview]; - } _documentView = aView; if (_documentView) - { [self addSubview:_documentView]; - [self _observeDocumentView]; - } -} - -- (void)_observeDocumentView -{ - if (!_documentView) - return; - - var defaultCenter = [CPNotificationCenter defaultCenter]; - - [_documentView setPostsFrameChangedNotifications:YES]; - [_documentView setPostsBoundsChangedNotifications:YES]; - - [defaultCenter - addObserver:self - selector:@selector(viewFrameChanged:) - name:CPViewFrameDidChangeNotification - object:_documentView]; - - [defaultCenter - addObserver:self - selector:@selector(viewBoundsChanged:) - name:CPViewBoundsDidChangeNotification - object:_documentView]; -} - -- (void)_removeObserverDocumentView:(CPView)aDocumentView -{ - var defaultCenter = [CPNotificationCenter defaultCenter]; - - [defaultCenter - removeObserver:self - name:CPViewFrameDidChangeNotification - object:aDocumentView]; - - [defaultCenter - removeObserver:self - name:CPViewBoundsDidChangeNotification - object:aDocumentView]; } /*! @@ -256,7 +212,6 @@ var CPClipViewDocumentViewKey = @"CPScrollViewDocumentView"; // Don't call setDocumentView: here. It calls addSubview:, but it's A) not necessary since the // view hierarchy is fully encoded and B) dangerous if the subview is not fully decoded. _documentView = [aCoder decodeObjectForKey:CPClipViewDocumentViewKey]; - [self _observeDocumentView]; } return self; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 1a600667c..7649b45ca 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -172,6 +172,7 @@ var CPViewFlags = { }, BOOL _postsBoundsChangedNotifications; BOOL _inhibitFrameAndBoundsChangedNotifications; BOOL _inLiveResize; + BOOL _isSuperviewAClipView; #if PLATFORM(DOM) DOMElement _DOMElement; @@ -821,6 +822,8 @@ var CPViewFlags = { }, */ - (void)viewWillMoveToSuperview:(CPView)aView { + _isSuperviewAClipView = [aView isKindOfClass:[CPClipView class]]; + [self _removeObservers]; if (aView) @@ -952,6 +955,9 @@ var CPViewFlags = { }, if (_postsFrameChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; + + if (_isSuperviewAClipView) + [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1014,6 +1020,9 @@ var CPViewFlags = { }, if (_postsFrameChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; + #if PLATFORM(DOM) var transform = _superview ? _superview._boundsTransform : NULL; @@ -1173,6 +1182,9 @@ var CPViewFlags = { }, if (_postsFrameChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; + + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewFrameChanged:[[CPNotification alloc] initWithName:CPViewFrameDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1207,6 +1219,9 @@ var CPViewFlags = { }, if (_postsBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewBoundsDidChangeNotification object:self]; + + if (_isSuperviewAClipView) + [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1269,6 +1284,9 @@ var CPViewFlags = { }, if (_postsBoundsChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewBoundsDidChangeNotification object:self]; + + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; } /*! @@ -1307,6 +1325,9 @@ var CPViewFlags = { }, if (_postsBoundsChangedNotifications && !_inhibitFrameAndBoundsChangedNotifications) [CachedNotificationCenter postNotificationName:CPViewBoundsDidChangeNotification object:self]; + + if (_isSuperviewAClipView && !_inhibitFrameAndBoundsChangedNotifications) + [[self superview] viewBoundsChanged:[[CPNotification alloc] initWithName:CPViewBoundsDidChangeNotification object:self userInfo:nil]]; } From 243024e2322b3208b298e7e3f276af275034a4fe Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Wed, 26 Nov 2014 13:12:39 -0800 Subject: [PATCH 064/106] Fix broken tests due to new objj type checks --- Tests/AppKit/CPArrayControllerTest.j | 3 +++ Tests/AppKit/CPBrowserTest.j | 3 +++ Tests/AppKit/CPKeyValueBindingSimpleBindingsTest.j | 2 ++ Tests/AppKit/CPMenuValidatedUserInterfaceItemTest.j | 4 +++- Tests/AppKit/CPOutlineViewTest.j | 3 +++ Tests/AppKit/CPTokenFieldTest.j | 2 ++ Tests/Foundation/CPKVCArrayTest.j | 3 +++ Tests/Foundation/CPKVOTest.j | 3 +++ Tests/Foundation/CPKeyValueCodingTest.j | 3 +++ .../Preprocessor/OutputTests/Class/accessors.j | 4 ++-- .../Preprocessor/OutputTests/Class/accessors.js | 13 +++++++------ .../OutputTests/Class/root-class-multiple-ivars.j | 2 +- .../OutputTests/Class/root-class-multiple-ivars.js | 3 +-- .../OutputTests/Class/root-class-one-ivar.j | 3 +-- .../OutputTests/Class/root-class-one-ivar.js | 2 +- .../Preprocessor/OutputTests/Class/root-class.j | 2 +- .../Preprocessor/OutputTests/Class/root-class.js | 2 +- 17 files changed, 40 insertions(+), 17 deletions(-) diff --git a/Tests/AppKit/CPArrayControllerTest.j b/Tests/AppKit/CPArrayControllerTest.j index 3365cfdcf..35b8e3388 100644 --- a/Tests/AppKit/CPArrayControllerTest.j +++ b/Tests/AppKit/CPArrayControllerTest.j @@ -3,6 +3,9 @@ @import @import +@class Department +@class Employee + @implementation CPArrayControllerTest : OJTestCase { CPArrayController _arrayController @accessors(property=arrayController); diff --git a/Tests/AppKit/CPBrowserTest.j b/Tests/AppKit/CPBrowserTest.j index 420dfb279..bc29049bb 100644 --- a/Tests/AppKit/CPBrowserTest.j +++ b/Tests/AppKit/CPBrowserTest.j @@ -1,5 +1,8 @@ @import +@class CPBrowserDelegate + + @implementation CPBrowserTest : OJTestCase { CPBrowser browser; diff --git a/Tests/AppKit/CPKeyValueBindingSimpleBindingsTest.j b/Tests/AppKit/CPKeyValueBindingSimpleBindingsTest.j index d9c0e06d1..d1bb9af84 100644 --- a/Tests/AppKit/CPKeyValueBindingSimpleBindingsTest.j +++ b/Tests/AppKit/CPKeyValueBindingSimpleBindingsTest.j @@ -1,6 +1,8 @@ @import +@class Track + /*! Bindings tests exercising the functionality seen in the Cocoa example "SimpleBindingsAdoption". */ diff --git a/Tests/AppKit/CPMenuValidatedUserInterfaceItemTest.j b/Tests/AppKit/CPMenuValidatedUserInterfaceItemTest.j index e60c456db..5757c368d 100644 --- a/Tests/AppKit/CPMenuValidatedUserInterfaceItemTest.j +++ b/Tests/AppKit/CPMenuValidatedUserInterfaceItemTest.j @@ -1,5 +1,7 @@ var CPMenuValidatedUserInterfaceItemTestValidatedItems = []; +@class MenuTarget + @implementation CPMenuValidatedUserInterfaceItemTest : OJTestCase { CPMenu _menu @accessors(property=menu); @@ -83,4 +85,4 @@ var CPMenuValidatedUserInterfaceItemTestValidatedItems = []; } -@end \ No newline at end of file +@end diff --git a/Tests/AppKit/CPOutlineViewTest.j b/Tests/AppKit/CPOutlineViewTest.j index 65219ea41..129c6965b 100644 --- a/Tests/AppKit/CPOutlineViewTest.j +++ b/Tests/AppKit/CPOutlineViewTest.j @@ -1,5 +1,8 @@ @import +@class TestOutlineDataSource + + @implementation CPOutlineViewTest : OJTestCase { CPOutlineView outlineView; diff --git a/Tests/AppKit/CPTokenFieldTest.j b/Tests/AppKit/CPTokenFieldTest.j index 6c8320eeb..cd65113ad 100644 --- a/Tests/AppKit/CPTokenFieldTest.j +++ b/Tests/AppKit/CPTokenFieldTest.j @@ -1,5 +1,7 @@ @import +@class TestDelegateTokenField + [CPApplication sharedApplication]; @implementation CPTokenFieldTest : OJTestCase diff --git a/Tests/Foundation/CPKVCArrayTest.j b/Tests/Foundation/CPKVCArrayTest.j index 12e5edd52..6948d4177 100644 --- a/Tests/Foundation/CPKVCArrayTest.j +++ b/Tests/Foundation/CPKVCArrayTest.j @@ -1,5 +1,8 @@ var COUNTER; +@class TestObject +@class ImplementedTestObject + @implementation CPKVCArrayTest : OJTestCase { TestObject _object @accessors(property=object); diff --git a/Tests/Foundation/CPKVOTest.j b/Tests/Foundation/CPKVOTest.j index 1fa905abd..631e2ac80 100644 --- a/Tests/Foundation/CPKVOTest.j +++ b/Tests/Foundation/CPKVOTest.j @@ -1,6 +1,9 @@ @import @import +@class CarTester +@class ToManyTester + @implementation CPKVOTest : OJTestCase { BOOL _sawInitialObservation; diff --git a/Tests/Foundation/CPKeyValueCodingTest.j b/Tests/Foundation/CPKeyValueCodingTest.j index ac57d9f02..ccf560401 100644 --- a/Tests/Foundation/CPKeyValueCodingTest.j +++ b/Tests/Foundation/CPKeyValueCodingTest.j @@ -22,6 +22,9 @@ @import +@class Department2 +@class Employee2 + var accessIVARS = YES; @implementation KVCTestClass : CPObject diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.j b/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.j index fe7fcc5de..820cad2f6 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.j @@ -1,10 +1,10 @@ -@implementation Class +@implementation TestClass { } @end -@implementation Class (Accessors) +@implementation TestClass (Accessors) { Type ivar @accessors; } diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.js b/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.js index 9db2e1754..ae78cbb53 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.js +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/accessors.js @@ -1,13 +1,14 @@ -var the_class=objj_allocateClassPair(Nil,"Class"),meta_class=the_class.isa; +var the_class=objj_allocateClassPair(Nil,"TestClass"),meta_class=the_class.isa; objj_registerClassPair(the_class); -var the_class=objj_getClass("Class"); +var the_class=objj_getClass("TestClass"); if(!the_class){ -throw new SyntaxError("*** Could not find definition for class \"Class\""); +throw new SyntaxError("*** Could not find definition for class \"TestClass\""); } var meta_class=the_class.isa; class_addIvars(the_class,[new objj_ivar("ivar")]); -class_addMethods(the_class,[new objj_method(sel_getUid("ivar"),function $Class__ivar(_1,_2){ +class_addMethods(the_class,[new objj_method(sel_getUid("ivar"),function $TestClass__ivar(_1,_2){ return _1.ivar; -},["Type"]),new objj_method(sel_getUid("setIvar:"),function $Class__setIvar_(_3,_4,_5){ +},["Type"]),new objj_method(sel_getUid("setIvar:"),function $TestClass__setIvar_(_3,_4,_5){ _3.ivar=_5; -},["void","Type"])]); \ No newline at end of file +},["void","Type"])]); + diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j index 50d1fa504..603bc25e5 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.j @@ -1,5 +1,5 @@ -@implementation Class +@implementation TestClass { Type ivar; CPArray array; diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js index 7eba069a9..8cf16dc3b 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-multiple-ivars.js @@ -1,5 +1,4 @@ - -var the_class = objj_allocateClassPair(Nil, "Class"), +var the_class = objj_allocateClassPair(Nil, "TestClass"), meta_class = the_class.isa; class_addIvars(the_class,[new objj_ivar("ivar"), new objj_ivar("array"), new objj_ivar("string"), new objj_ivar("integer")]); diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.j b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.j index 14fc4dd73..3aebab79d 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.j @@ -1,5 +1,4 @@ - -@implementation Class +@implementation TestClass { Type ivar; } diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.js b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.js index 4c6f93642..165c23dc8 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.js +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class-one-ivar.js @@ -1,5 +1,5 @@ -var the_class = objj_allocateClassPair(Nil, "Class"), +var the_class = objj_allocateClassPair(Nil, "TestClass"), meta_class = the_class.isa; class_addIvars(the_class,[new objj_ivar("ivar")]); diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.j b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.j index f0e079126..6f4f77d3d 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.j @@ -1,5 +1,5 @@ -@implementation Class +@implementation TestClass { } @end diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.js b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.js index c266954fc..75528fb97 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.js +++ b/Tests/Objective-J/Preprocessor/OutputTests/Class/root-class.js @@ -1,5 +1,5 @@ -var the_class = objj_allocateClassPair(Nil, "Class"), +var the_class = objj_allocateClassPair(Nil, "TestClass"), meta_class = the_class.isa; objj_registerClassPair(the_class); From 51940cea3da21190380cac6886ab704d6f9a00ec Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 15:05:22 -0800 Subject: [PATCH 065/106] Fixed: leak memory with CPTableViews delegate --- AppKit/CPTableColumn.j | 17 +-------- AppKit/CPTableView.j | 82 +++++++++++++++--------------------------- 2 files changed, 29 insertions(+), 70 deletions(-) diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 951cf45e4..44f4de504 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -28,8 +28,6 @@ @import "CPTextField.j" -@global CPTableViewColumnDidResizeNotification - @class _CPTableColumnHeaderView CPTableColumnNoResizing = 0; @@ -185,7 +183,7 @@ CPTableColumnUserResizingMask = 1 << 1; [tableView tile]; if (!_disableResizingPosting) - [self _postDidResizeNotificationWithOldWidth:oldWidth]; + [[self tableView] _didResizeTableColumn:self oldWidth:oldWidth]; } } @@ -538,19 +536,6 @@ CPTableColumnUserResizingMask = 1 << 1; return _headerToolTip; } -/*! - @ignore -*/ -- (void)_postDidResizeNotificationWithOldWidth:(float)oldWidth -{ - [[self tableView] _didResizeTableColumn:self]; - - [[CPNotificationCenter defaultCenter] - postNotificationName:CPTableViewColumnDidResizeNotification - object:[self tableView] - userInfo:@{ @"CPTableColumn": self, @"CPOldWidth": oldWidth }]; -} - @end @implementation CPTableColumnValueBinder : CPBinder diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 604ec8d23..ea9851716 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -80,10 +80,12 @@ var CPTableViewDelegate_selectionShouldChangeInTableView_ CPTableViewDelegate_tableView_typeSelectStringForTableColumn_row_ = 1 << 17, CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_ = 1 << 18, CPTableViewDelegate_tableView_willRemoveView_forTableColumn_row_ = 1 << 19, - CPTableViewDelegate_tableViewSelectionDidChange_ = 1 << 20, - CPTableViewDelegate_tableViewSelectionIsChanging_ = 1 << 21, - CPTableViewDelegate_tableViewMenuForTableColumn_row_ = 1 << 22, - CPTableViewDelegate_tableView_shouldReorderColumn_toColumn_ = 1 << 23; + CPTableViewDelegate_tableViewColumnDidMove_ = 1 << 20, + CPTableViewDelegate_tableViewColumnDidResize_ = 1 << 21, + CPTableViewDelegate_tableViewSelectionDidChange_ = 1 << 22, + CPTableViewDelegate_tableViewSelectionIsChanging_ = 1 << 23, + CPTableViewDelegate_tableViewMenuForTableColumn_row_ = 1 << 24, + CPTableViewDelegate_tableView_shouldReorderColumn_toColumn_ = 1 << 25; //CPTableViewDraggingDestinationFeedbackStyles CPTableViewDraggingDestinationFeedbackStyleNone = -1; @@ -1168,6 +1170,9 @@ NOT YET IMPLEMENTED [[CPNotificationCenter defaultCenter] postNotificationName:CPTableViewColumnDidMoveNotification object:self userInfo:@{ @"CPOldColumn": fromIndex, @"CPNewColumn": toIndex }]; + + if (_implementedDelegateMethods & CPTableViewDelegate_tableViewColumnDidMove_) + [_delegate tableViewColumnDidMove:[[CPNotification alloc] initWithName:CPTableViewColumnDidMoveNotification object:self userInfo:@{ @"CPOldColumn": fromIndex, @"CPNewColumn": toIndex }]]; } /*! @@ -1246,9 +1251,17 @@ NOT YET IMPLEMENTED /*! @ignore */ -- (void)_didResizeTableColumn:(CPTableColumn)theColumn +- (void)_didResizeTableColumn:(CPTableColumn)theColumn oldWidth:(int)oldWidth { [self _autosave]; + + [[CPNotificationCenter defaultCenter] + postNotificationName:CPTableViewColumnDidResizeNotification + object:self + userInfo:@{ @"CPTableColumn": theColumn, @"CPOldWidth": oldWidth }]; + + if (_implementedDelegateMethods & CPTableViewDelegate_tableViewColumnDidResize_) + [_delegate tableViewColumnDidResize:[[CPNotification alloc] initWithName:CPTableViewColumnDidResizeNotification object:self userInfo:@{ @"CPTableColumn": theColumn, @"CPOldWidth": oldWidth }]]; } //Selecting Columns and Rows @@ -2861,35 +2874,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (_delegate === aDelegate) return; - var defaultCenter = [CPNotificationCenter defaultCenter]; - - if (_delegate) - { - if ([_delegate respondsToSelector:@selector(tableViewColumnDidMove:)]) - [defaultCenter - removeObserver:_delegate - name:CPTableViewColumnDidMoveNotification - object:self]; - - if ([_delegate respondsToSelector:@selector(tableViewColumnDidResize:)]) - [defaultCenter - removeObserver:_delegate - name:CPTableViewColumnDidResizeNotification - object:self]; - - if ([_delegate respondsToSelector:@selector(tableViewSelectionDidChange:)]) - [defaultCenter - removeObserver:_delegate - name:CPTableViewSelectionDidChangeNotification - object:self]; - - if ([_delegate respondsToSelector:@selector(tableViewSelectionIsChanging:)]) - [defaultCenter - removeObserver:_delegate - name:CPTableViewSelectionIsChangingNotification - object:self]; - } - _delegate = aDelegate; _implementedDelegateMethods = 0; @@ -2964,32 +2948,16 @@ Your delegate can implement this method to avoid subclassing the tableview to ad _implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldReorderColumn_toColumn_; if ([_delegate respondsToSelector:@selector(tableViewColumnDidMove:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(tableViewColumnDidMove:) - name:CPTableViewColumnDidMoveNotification - object:self]; + _implementedDelegateMethods |= CPTableViewDelegate_tableViewColumnDidMove_; if ([_delegate respondsToSelector:@selector(tableViewColumnDidResize:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(tableViewColumnDidResize:) - name:CPTableViewColumnDidResizeNotification - object:self]; + _implementedDelegateMethods |= CPTableViewDelegate_tableViewColumnDidResize_; if ([_delegate respondsToSelector:@selector(tableViewSelectionDidChange:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(tableViewSelectionDidChange:) - name:CPTableViewSelectionDidChangeNotification - object:self]; + _implementedDelegateMethods |= CPTableViewDelegate_tableViewSelectionDidChange_; if ([_delegate respondsToSelector:@selector(tableViewSelectionIsChanging:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(tableViewSelectionIsChanging:) - name:CPTableViewSelectionIsChangingNotification - object:self]; + _implementedDelegateMethods |= CPTableViewDelegate_tableViewSelectionIsChanging_; } /*! @@ -5046,6 +5014,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad postNotificationName:CPTableViewSelectionIsChangingNotification object:self userInfo:nil]; + + if (_implementedDelegateMethods & CPTableViewDelegate_tableViewSelectionIsChanging_) + [_delegate tableViewSelectionIsChanging:[[CPNotification alloc] initWithName:CPTableViewSelectionIsChangingNotification object:self userInfo:nil]]; } /*! @@ -5057,6 +5028,9 @@ Your delegate can implement this method to avoid subclassing the tableview to ad postNotificationName:CPTableViewSelectionDidChangeNotification object:self userInfo:nil]; + + if (_implementedDelegateMethods & CPTableViewDelegate_tableViewSelectionDidChange_) + [_delegate tableViewSelectionDidChange:[[CPNotification alloc] initWithName:CPTableViewSelectionDidChangeNotification object:self userInfo:nil]]; } /*! From e03b6b382416618643720ce7727a170ab2c3618d Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 15:18:39 -0800 Subject: [PATCH 066/106] Fixed: _postDidResizeNotificationWithOldWidth does not exists anymore, replace by _didResizeTableColumn:tableColumn:oldWidht: --- AppKit/CPTableHeaderView.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index d22dc4f71..55e297eb8 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -625,7 +625,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal - (void)stopResizingTableColumn:(CPInteger)aColumnIndex at:(CGPoint)aPoint { var tableColumn = [[_tableView tableColumns] objectAtIndex:aColumnIndex]; - [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth]; + [_tableView _didResizeTableColumn:tableColumn oldWidth:_columnOldWidth]; [tableColumn setDisableResizingPosting:NO]; [_tableView setDisableAutomaticResizing:NO]; From 392a6cfbca7a544486de571f7a24f17f1bd4e8f4 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 15:55:50 -0800 Subject: [PATCH 067/106] Fixed: memory leak when using a delegate with a CPComboBox --- AppKit/CPComboBox.j | 66 +++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index b8a4481b8..4c8f49c45 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -53,6 +53,11 @@ CPComboBoxWillPopUpNotification = @"CPComboBoxWillPopUpNotification"; CPComboBoxStateButtonBordered = CPThemeState("button-bordered"); +var CPComboBoxDelegate_comboBoxSelectionIsChanging_ = 1 << 0, + CPComboBoxDelegate_comboBoxSelectionDidChange_ = 1 << 1, + CPComboBoxDelegate_comboBoxWillPopUp_ = 1 << 2, + CPComboBoxDelegate_comboBoxWillDismiss_ = 1 << 3; + var CPComboBoxTextSubview = @"text", CPComboBoxButtonSubview = @"button", CPComboBoxDefaultNumberOfVisibleItems = 5, @@ -61,19 +66,20 @@ var CPComboBoxTextSubview = @"text", @implementation CPComboBox : CPTextField { - CPArray _items; - _CPPopUpList _listDelegate; - CPComboBoxDataSource _dataSource; - BOOL _usesDataSource; - BOOL _completes; BOOL _canComplete; - int _numberOfVisibleItems; + BOOL _completes; BOOL _forceSelection; BOOL _hasVerticalScroller; - CPString _selectedStringValue; - CGSize _intercellSpacing; - float _itemHeight; BOOL _popUpButtonCausedResign; + BOOL _usesDataSource; + CGSize _intercellSpacing; + CPArray _items; + CPComboBoxDataSource _dataSource; + CPInteger _implementedDelegateMethods; + CPString _selectedStringValue; + float _itemHeight; + int _numberOfVisibleItems; + _CPPopUpList _listDelegate; } + (CPString)defaultThemeClass @@ -228,41 +234,19 @@ var CPComboBoxTextSubview = @"text", if (aDelegate === delegate) return; - var defaultCenter = [CPNotificationCenter defaultCenter]; - - if (delegate) - { - [defaultCenter removeObserver:delegate name:CPComboBoxSelectionIsChangingNotification object:self]; - [defaultCenter removeObserver:delegate name:CPComboBoxSelectionDidChangeNotification object:self]; - [defaultCenter removeObserver:delegate name:CPComboBoxWillDismissNotification object:self]; - [defaultCenter removeObserver:delegate name:CPComboBoxWillPopUpNotification object:self]; - } - if (aDelegate) { if ([aDelegate respondsToSelector:@selector(comboBoxSelectionIsChanging:)]) - [defaultCenter addObserver:delegate - selector:@selector(comboBoxSelectionIsChanging:) - name:CPComboBoxSelectionIsChangingNotification - object:self]; + _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxSelectionIsChanging_ if ([aDelegate respondsToSelector:@selector(comboBoxSelectionDidChange:)]) - [defaultCenter addObserver:delegate - selector:@selector(comboBoxSelectionDidChange:) - name:CPComboBoxSelectionDidChangeNotification - object:self]; + _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxSelectionDidChange_ if ([aDelegate respondsToSelector:@selector(comboBoxWillPopUp:)]) - [defaultCenter addObserver:delegate - selector:@selector(comboBoxWillPopUp:) - name:CPComboBoxWillPopUpNotification - object:self]; + _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxWillPopUp_ if ([aDelegate respondsToSelector:@selector(comboBoxWillDismiss:)]) - [defaultCenter addObserver:delegate - selector:@selector(comboBoxWillDissmis:) - name:CPComboBoxWillDismissNotification - object:self]; + _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxWillDismiss_ } [super setDelegate:aDelegate]; @@ -1005,24 +989,36 @@ var CPComboBoxTextSubview = @"text", /*! @ignore */ - (void)comboBoxSelectionIsChanging:(CPNotification)aNotification { + if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxSelectionIsChanging_) + [_delegate comboBoxSelectionIsChanging:[[CPNotification alloc] initWithName:CPComboBoxSelectionIsChangingNotification object:self userInfo:nil]]; + [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxSelectionIsChangingNotification object:self]; } /*! @ignore */ - (void)comboBoxSelectionDidChange:(CPNotification)aNotification { + if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxSelectionDidChange_) + [_delegate comboBoxSelectionDidChange:[[CPNotification alloc] initWithName:CPComboBoxSelectionDidChangeNotification object:self userInfo:nil]]; + [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxSelectionDidChangeNotification object:self]; } /*! @ignore */ - (void)comboBoxWillPopUp:(CPNotification)aNotification { + if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxWillPopUp_) + [_delegate comboBoxWillPopUp:[[CPNotification alloc] initWithName:CPComboBoxWillPopUpNotification object:self userInfo:nil]]; + [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxWillPopUpNotification object:self]; } /*! @ignore */ - (void)comboBoxWillDismiss:(CPNotification)aNotification { + if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxWillDismiss_) + [_delegate comboBoxWillDismiss:[[CPNotification alloc] initWithName:CPComboBoxWillDismissNotification object:self userInfo:nil]]; + [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxWillDismissNotification object:self]; } From 94f89acc8477b18c1e313af2532caca8c449d8a5 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 26 Nov 2014 15:56:10 -0800 Subject: [PATCH 068/106] Fixed: memory leaks when using a delegate with a CPTextField --- AppKit/CPTextField.j | 84 ++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 56d7cdccb..1a9202c06 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -38,8 +38,13 @@ @end +var CPTextFieldDelegate_control_didFailToFormatString_errorDescription_ = 1 << 1, + CPTextFieldDelegate_controlTextDidBeginEditing_ = 1 << 2, + CPTextFieldDelegate_controlTextDidChange_ = 1 << 3, + CPTextFieldDelegate_controlTextDidEndEditing_ = 1 << 4, + CPTextFieldDelegate_controlTextDidFocus_ = 1 << 5, + CPTextFieldDelegate_controlTextDidBlur_ = 1 << 6; -var CPTextFieldDelegate_control_didFailToFormatString_errorDescription_ = 1 << 1; CPTextFieldSquareBezel = 0; /*! A textfield bezel with squared corners. */ CPTextFieldRoundedBezel = 1; /*! A textfield bezel with rounded corners. */ @@ -1146,6 +1151,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if ([note object] != self) return; + if (_implementedDelegateMethods & CPTextFieldDelegate_controlTextDidBlur_) + [_delegate controlTextDidBlur:note]; + [[CPNotificationCenter defaultCenter] postNotification:note]; } @@ -1155,6 +1163,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if ([note object] != self) return; + if (_implementedDelegateMethods & CPTextFieldDelegate_controlTextDidFocus_) + [_delegate controlTextDidFocus:note]; + [[CPNotificationCenter defaultCenter] postNotification:note]; } @@ -1165,9 +1176,36 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self _continuouslyReverseSetBinding]; + if (_implementedDelegateMethods & CPTextFieldDelegate_controlTextDidChange_) + [_delegate controlTextDidChange:note]; + [super textDidChange:note]; } +- (void)textDidBeginEditing:(CPNotification)note +{ + //this looks to prevent false propagation of notifications for other objects + if ([note object] != self) + return; + + if (_implementedDelegateMethods & CPTextFieldDelegate_controlTextDidBeginEditing_) + [_delegate controlTextDidBeginEditing:[[CPNotification alloc] initWithName:CPControlTextDidBeginEditingNotification object:self userInfo:@{"CPFieldEditor": [note object]}]] + + [super textDidBeginEditing:note]; +} + +- (void)textDidEndEditing:(CPNotification)note +{ + //this looks to prevent false propagation of notifications for other objects + if ([note object] != self) + return; + + [super textDidEndEditing:note]; + + if (_implementedDelegateMethods & CPTextFieldDelegate_controlTextDidEndEditing_) + [_delegate controlTextDidEndEditing:note]; +} + - (void)_updateCursorForEvent:(CPEvent)anEvent { var frame = CGRectMakeCopy([self frame]), @@ -1712,17 +1750,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)setDelegate:(id )aDelegate { - var defaultCenter = [CPNotificationCenter defaultCenter]; - - //unsubscribe the existing delegate if it exists - if (_delegate) - { - [defaultCenter removeObserver:_delegate name:CPControlTextDidBeginEditingNotification object:self]; - [defaultCenter removeObserver:_delegate name:CPControlTextDidChangeNotification object:self]; - [defaultCenter removeObserver:_delegate name:CPControlTextDidEndEditingNotification object:self]; - [defaultCenter removeObserver:_delegate name:CPTextFieldDidFocusNotification object:self]; - [defaultCenter removeObserver:_delegate name:CPTextFieldDidBlurNotification object:self]; - } + if (_delegate == aDelegate) + return; _delegate = aDelegate; _implementedDelegateMethods = 0; @@ -1731,40 +1760,19 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); _implementedDelegateMethods |= CPTextFieldDelegate_control_didFailToFormatString_errorDescription_ if ([_delegate respondsToSelector:@selector(controlTextDidBeginEditing:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(controlTextDidBeginEditing:) - name:CPControlTextDidBeginEditingNotification - object:self]; + _implementedDelegateMethods |= CPTextFieldDelegate_controlTextDidBeginEditing_; if ([_delegate respondsToSelector:@selector(controlTextDidChange:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(controlTextDidChange:) - name:CPControlTextDidChangeNotification - object:self]; - + _implementedDelegateMethods |= CPTextFieldDelegate_controlTextDidChange_; if ([_delegate respondsToSelector:@selector(controlTextDidEndEditing:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(controlTextDidEndEditing:) - name:CPControlTextDidEndEditingNotification - object:self]; + _implementedDelegateMethods |= CPTextFieldDelegate_controlTextDidEndEditing_; if ([_delegate respondsToSelector:@selector(controlTextDidFocus:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(controlTextDidFocus:) - name:CPTextFieldDidFocusNotification - object:self]; + _implementedDelegateMethods |= CPTextFieldDelegate_controlTextDidFocus_; if ([_delegate respondsToSelector:@selector(controlTextDidBlur:)]) - [defaultCenter - addObserver:_delegate - selector:@selector(controlTextDidBlur:) - name:CPTextFieldDidBlurNotification - object:self]; + _implementedDelegateMethods |= CPTextFieldDelegate_controlTextDidBlur_; } - (id)delegate From 02a47dc7b93b866c91d46b3e7313bcb013729780 Mon Sep 17 00:00:00 2001 From: Mathieu Monney Date: Thu, 27 Nov 2014 13:25:29 +0100 Subject: [PATCH 069/106] FIXED bootstrap URL due to github URL change. --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index b5a13beaa..ed10bd9e7 100644 --- a/README.markdown +++ b/README.markdown @@ -33,7 +33,7 @@ Getting Started --------------- To get started, download and install the current release version of Cappuccino: - $ curl https://raw.github.com/cappuccino/cappuccino/v0.9.7/bootstrap.sh >/tmp/cappuccino_bootstrap.sh && bash /tmp/cappuccino_bootstrap.sh + $ curl https://raw.githubusercontent.com/cappuccino/cappuccino/0.9.7/bootstrap.sh >/tmp/cappuccino_bootstrap.sh && bash /tmp/cappuccino_bootstrap.sh If you'd just like to get started using Cappuccino for your web apps, you are done. From c3fc6a087a1d4df406599c677a03c36e4eb0adbd Mon Sep 17 00:00:00 2001 From: Mathieu Monney Date: Thu, 27 Nov 2014 13:30:31 +0100 Subject: [PATCH 070/106] Fixed URL, wasn't the tagged released one. --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index ed10bd9e7..ed87b834d 100644 --- a/README.markdown +++ b/README.markdown @@ -33,7 +33,7 @@ Getting Started --------------- To get started, download and install the current release version of Cappuccino: - $ curl https://raw.githubusercontent.com/cappuccino/cappuccino/0.9.7/bootstrap.sh >/tmp/cappuccino_bootstrap.sh && bash /tmp/cappuccino_bootstrap.sh + $ curl https://raw.githubusercontent.com/cappuccino/cappuccino/v0.9.7-1/bootstrap.sh >/tmp/cappuccino_bootstrap.sh && bash /tmp/cappuccino_bootstrap.sh If you'd just like to get started using Cappuccino for your web apps, you are done. From 18a6ecc79a66532cc9f1d4591a018ecd6665a973 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Thu, 27 Nov 2014 11:22:40 -0500 Subject: [PATCH 071/106] Fixed: z-index of -1000 caused a blank screen in some browsers Previously, a z-index value of -1000 caused some browsers to not display certain UI elements correctly. Setting this value to 0 instead seems to fix this. This commit changes the default value in the templates generated by `capp gen`. Fixes #2232, Refs #2194 --- Tools/capp/Resources/Templates/Application/index-debug.html | 2 +- Tools/capp/Resources/Templates/Application/index.html | 2 +- Tools/capp/Resources/Templates/NibApplication/index-debug.html | 2 +- Tools/capp/Resources/Templates/NibApplication/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tools/capp/Resources/Templates/Application/index-debug.html b/Tools/capp/Resources/Templates/Application/index-debug.html index 525fedab5..d862fd07e 100644 --- a/Tools/capp/Resources/Templates/Application/index-debug.html +++ b/Tools/capp/Resources/Templates/Application/index-debug.html @@ -102,7 +102,7 @@ width: 100%; /* Put it at the bottom of the stack so it doesn't interfere with UI */ - z-index: -1000; + z-index: 0; } #cappuccino-body .container { diff --git a/Tools/capp/Resources/Templates/Application/index.html b/Tools/capp/Resources/Templates/Application/index.html index 9dec4e8db..414301b1e 100644 --- a/Tools/capp/Resources/Templates/Application/index.html +++ b/Tools/capp/Resources/Templates/Application/index.html @@ -72,7 +72,7 @@ width: 100%; /* Put it at the bottom of the stack so it doesn't interfere with UI */ - z-index: -1000; + z-index: 0; } #cappuccino-body .container { diff --git a/Tools/capp/Resources/Templates/NibApplication/index-debug.html b/Tools/capp/Resources/Templates/NibApplication/index-debug.html index 525fedab5..d862fd07e 100644 --- a/Tools/capp/Resources/Templates/NibApplication/index-debug.html +++ b/Tools/capp/Resources/Templates/NibApplication/index-debug.html @@ -102,7 +102,7 @@ width: 100%; /* Put it at the bottom of the stack so it doesn't interfere with UI */ - z-index: -1000; + z-index: 0; } #cappuccino-body .container { diff --git a/Tools/capp/Resources/Templates/NibApplication/index.html b/Tools/capp/Resources/Templates/NibApplication/index.html index 9dec4e8db..414301b1e 100644 --- a/Tools/capp/Resources/Templates/NibApplication/index.html +++ b/Tools/capp/Resources/Templates/NibApplication/index.html @@ -72,7 +72,7 @@ width: 100%; /* Put it at the bottom of the stack so it doesn't interfere with UI */ - z-index: -1000; + z-index: 0; } #cappuccino-body .container { From 77f962eed4c1546c88e4bd88a1b04a35e182dc2e Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 28 Nov 2014 09:58:44 -0800 Subject: [PATCH 072/106] Style: removed comment in CPDatePicker --- AppKit/CPDatePicker/_CPDatePickerTextField.j | 2 -- 1 file changed, 2 deletions(-) diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index 18ad45a4a..d1a987c7f 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -123,8 +123,6 @@ var CPZeroKeyCode = 48, // This is usefull when clicking on the stepper when the datePicker is not selected [_stepper setObjectValue:0]; - //[_datePicker unsetThemeState:CPThemeStateEditing]; - return YES; } From 56acbfc85c1edf9043d1a4ed3559c26cbd136e61 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 28 Nov 2014 10:00:27 -0800 Subject: [PATCH 073/106] Fixed: change == to === on CPTextField when assigning a delegateo --- AppKit/CPTextField.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 77d76cf7c..d3dca7380 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -1751,7 +1751,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)setDelegate:(id )aDelegate { - if (_delegate == aDelegate) + if (_delegate === aDelegate) return; _delegate = aDelegate; From 2484fb85e9646feac6bb2786fbba8aceff40eda4 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 1 Dec 2014 14:22:06 -0800 Subject: [PATCH 074/106] Fixed: warning raised by the compiler due to unknown type in var declarations --- AppKit/CPCursor.j | 1 + AppKit/CPEvent.j | 1 + 2 files changed, 2 insertions(+) diff --git a/AppKit/CPCursor.j b/AppKit/CPCursor.j index c6c96acdc..6e0b36cff 100755 --- a/AppKit/CPCursor.j +++ b/AppKit/CPCursor.j @@ -22,6 +22,7 @@ Cursor support by browser: */ @import +@import "CPImage.j" @global CPApp diff --git a/AppKit/CPEvent.j b/AppKit/CPEvent.j index d0ab4e128..a1699aa34 100644 --- a/AppKit/CPEvent.j +++ b/AppKit/CPEvent.j @@ -32,6 +32,7 @@ @class CPTextField @class CPWindow +@class CPGraphicsContext @global CPApp From 2e66601c19faf21416671a88886a00fa2dbd9bf3 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 1 Dec 2014 14:22:39 -0800 Subject: [PATCH 075/106] Fixed: memory leak in CPComboBox Previously, when assigning a listDelegate to a CPComboBox, we never deleted the observers added by this method. Now we add and delete these observers in the method addObservers and removeObservers. This PR fix another issue. Previously, the behavior of the panel of the comboBox wasn't the same as the one in Cocoa. Now, when closing the panel, the hit view won't be the first responder as it was. Cocoa works like this as well. --- AppKit/CPComboBox.j | 100 +++++++++++++++++++++++++++++------------- AppKit/_CPPopUpList.j | 34 +++++++++----- 2 files changed, 94 insertions(+), 40 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index 844149d4b..f313e38de 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -160,7 +160,7 @@ var CPComboBoxTextSubview = @"text", - (void)setIntercellSpacing:(CGSize)aSize { - if (_intercellSpacing && CGSizeEqualToSize(aSize, _intercellSpacing)) + if (!aSize || (_intercellSpacing && CGSizeEqualToSize(aSize, _intercellSpacing))) return; _intercellSpacing = aSize; @@ -396,49 +396,53 @@ var CPComboBoxTextSubview = @"text", if (_listDelegate === aDelegate) return; - var defaultCenter = [CPNotificationCenter defaultCenter]; - - if (_listDelegate) - { - [defaultCenter removeObserver:self name:_CPPopUpListWillPopUpNotification object:_listDelegate]; - [defaultCenter removeObserver:self name:_CPPopUpListWillDismissNotification object:_listDelegate]; - [defaultCenter removeObserver:self name:_CPPopUpListDidDismissNotification object:_listDelegate]; - [defaultCenter removeObserver:self name:_CPPopUpListItemWasClickedNotification object:_listDelegate]; - - var oldTableView = [_listDelegate tableView]; - - if (oldTableView) - { - [defaultCenter removeObserver:self name:CPTableViewSelectionIsChangingNotification object:oldTableView]; - [defaultCenter removeObserver:self name:CPTableViewSelectionDidChangeNotification object:oldTableView]; - } - } + [self _removeObserversForListDelegate:_listDelegate]; _listDelegate = aDelegate; + // We only add the observers if the CPComboBox is displayed + if ([self window]) + [self _addObserversForListDelegate:_listDelegate] + + // Apply our text style to the list + [_listDelegate setFont:[self font]]; + [_listDelegate setAlignment:[self alignment]]; + + [self setHasVerticalScroller:_hasVerticalScroller]; + [self setIntercellSpacing:_intercellSpacing]; + [self setItemHeight:_itemHeight]; +} + +- (void)_addObserversForListDelegate:(_CPPopUpList)aDelegate +{ + if (!aDelegate) + return; + + var defaultCenter = [CPNotificationCenter defaultCenter]; + [defaultCenter addObserver:self selector:@selector(comboBoxWillPopUp:) name:_CPPopUpListWillPopUpNotification - object:_listDelegate]; + object:aDelegate]; [defaultCenter addObserver:self selector:@selector(comboBoxWillDismiss:) name:_CPPopUpListWillDismissNotification - object:_listDelegate]; + object:aDelegate]; [defaultCenter addObserver:self selector:@selector(listDidDismiss:) name:_CPPopUpListDidDismissNotification - object:_listDelegate]; + object:aDelegate]; [defaultCenter addObserver:self selector:@selector(itemWasClicked:) name:_CPPopUpListItemWasClickedNotification - object:_listDelegate]; + object:aDelegate]; - [[_listDelegate scrollView] setHasVerticalScroller:_hasVerticalScroller]; + [[aDelegate scrollView] setHasVerticalScroller:_hasVerticalScroller]; - var tableView = [_listDelegate tableView]; + var tableView = [aDelegate tableView]; [defaultCenter addObserver:self selector:@selector(comboBoxSelectionIsChanging:) @@ -449,13 +453,27 @@ var CPComboBoxTextSubview = @"text", selector:@selector(comboBoxSelectionDidChange:) name:CPTableViewSelectionDidChangeNotification object:tableView]; +} - // Apply our text style to the list - [_listDelegate setFont:[self font]]; - [_listDelegate setAlignment:[self alignment]]; - [[_listDelegate scrollView] setHasVerticalScroller:_hasVerticalScroller]; - [[_listDelegate tableView] setIntercellSpacing:_intercellSpacing]; - [[_listDelegate tableView] setRowHeight:_itemHeight]; +- (void)_removeObserversForListDelegate:(_CPPopUpList)aDelegate +{ + if (!aDelegate) + return; + + var defaultCenter = [CPNotificationCenter defaultCenter]; + + [defaultCenter removeObserver:self name:_CPPopUpListWillPopUpNotification object:aDelegate]; + [defaultCenter removeObserver:self name:_CPPopUpListWillDismissNotification object:aDelegate]; + [defaultCenter removeObserver:self name:_CPPopUpListDidDismissNotification object:aDelegate]; + [defaultCenter removeObserver:self name:_CPPopUpListItemWasClickedNotification object:aDelegate]; + + var oldTableView = [aDelegate tableView]; + + if (oldTableView) + { + [defaultCenter removeObserver:self name:CPTableViewSelectionIsChangingNotification object:oldTableView]; + [defaultCenter removeObserver:self name:CPTableViewSelectionDidChangeNotification object:oldTableView]; + } } - (int)indexOfItemWithObjectValue:(id)anObject @@ -982,6 +1000,28 @@ var CPComboBoxTextSubview = @"text", } } + +#pragma mark - +#pragma mark Observers method + +- (void)_addObservers +{ + if (_isObserving) + return; + + [super _addObservers]; + [self _addObserversForListDelegate:_listDelegate]; +} + +- (void)_removeObservers +{ + if (!_isObserving) + return; + + [super _removeObservers]; + [self _removeObserversForListDelegate:_listDelegate]; +} + @end @implementation CPComboBox (CPComboBoxDelegate) diff --git a/AppKit/_CPPopUpList.j b/AppKit/_CPPopUpList.j index 3dd357132..845768bd6 100644 --- a/AppKit/_CPPopUpList.j +++ b/AppKit/_CPPopUpList.j @@ -96,28 +96,41 @@ var ListColumnIdentifier = @"1"; return [super sendEvent:anEvent]; } -- (void)orderFront:(id)sender -{ - [self _trapNextMouseDown]; - [super orderFront:sender]; -} - - (void)_mouseWasClicked:(CPEvent)anEvent { + // This is needed, when the user close the list with the key enter + if (![self isVisible]) + { + [CPApp sendEvent:anEvent]; + return; + } + var mouseWindow = [anEvent window], - rect = [[[self delegate] dataSource] bounds], + rect = CGRectInsetByInset([[[self delegate] dataSource] bounds], [[[self delegate] dataSource] currentValueForThemeAttribute:@"content-inset"]), point = [[[self delegate] dataSource] convertPoint:[anEvent locationInWindow] fromView:nil]; + // If we click somewhere else than the comboBox or the panel we close the panel if (mouseWindow != self && !CGRectContainsPoint(rect, point)) + { [[self delegate] close]; + } else - [self _trapNextMouseDown]; + { + // If we click on the panel, the app will know what to do + if (mouseWindow == self) + [CPApp sendEvent:anEvent]; + + // If we click on the comboBox field, we will trap the next mouse down + if (CGRectContainsPoint(rect, point)) + [self _trapNextMouseDown]; + } + } - (void)_trapNextMouseDown { - // Don't dequeue the event so clicks in controls will work - [CPApp setTarget:self selector:@selector(_mouseWasClicked:) forNextEventMatchingMask:CPLeftMouseDownMask untilDate:nil inMode:CPDefaultRunLoopMode dequeue:NO]; + // Dequeue the event and mouseWasClicked will do what it needs to do + [CPApp setTarget:self selector:@selector(_mouseWasClicked:) forNextEventMatchingMask:CPLeftMouseDownMask untilDate:nil inMode:CPDefaultRunLoopMode dequeue:YES]; } @end @@ -336,6 +349,7 @@ var ListColumnIdentifier = @"1"; [self listWillPopUp]; + [_panel _trapNextMouseDown]; [[aView window] addChildWindow:_panel ordered:CPWindowAbove]; } From e4bfd0ef5e80cf8bb7a73ff40dc8dcea63bc970c Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 1 Dec 2014 16:07:13 -0800 Subject: [PATCH 076/106] Fixed: issue when opening a popUpList of a CPComboBox. We now firstly open the panel and then we modify the content of the panel, this occured an issue with the rendering of the view --- AppKit/CPComboBox.j | 3 +-- AppKit/_CPPopUpList.j | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index f313e38de..bfc7887ef 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -518,8 +518,6 @@ var CPComboBoxTextSubview = @"text", if (!_listDelegate) [self setListDelegate:[[_CPPopUpList alloc] initWithDataSource:self]]; - [self _selectMatchingItem]; - // Note the offset here is 1 less than the focus ring width because the outer edge // of the focus ring is very transparent and it looks better if the list is closer. if (CPComboBoxFocusRingWidth < 0) @@ -530,6 +528,7 @@ var CPComboBoxTextSubview = @"text", } [_listDelegate popUpRelativeToRect:[self _borderFrame] view:self offset:CPComboBoxFocusRingWidth - 1]; + [self _selectMatchingItem]; } /*! @ignore */ diff --git a/AppKit/_CPPopUpList.j b/AppKit/_CPPopUpList.j index 845768bd6..6ee4e1ff0 100644 --- a/AppKit/_CPPopUpList.j +++ b/AppKit/_CPPopUpList.j @@ -336,6 +336,11 @@ var ListColumnIdentifier = @"1"; if ([_panel isVisible]) return; + [self listWillPopUp]; + + [_panel _trapNextMouseDown]; + [[aView window] addChildWindow:_panel ordered:CPWindowAbove]; + var rowRect = [_tableView rectOfRow:[self numberOfRowsInTableView:_tableView] - 1], frame = CGRectMake(0, 0, MAX(_listWidth, CGRectGetWidth(aRect)), CGRectGetMaxY(rowRect)); @@ -346,11 +351,6 @@ var ListColumnIdentifier = @"1"; [_scrollView setFrameSize:CGSizeMakeCopy(frame.size)]; [_tableView setEnabled:[_dataSource numberOfItemsInList:self] > 0]; [self scrollItemAtIndexToTop:[_tableView selectedRow]]; - - [self listWillPopUp]; - - [_panel _trapNextMouseDown]; - [[aView window] addChildWindow:_panel ordered:CPWindowAbove]; } #pragma mark Setting Display Attributes From 1df0da7509cdb693b91f9f9c10eeac23e0586acc Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 1 Dec 2014 16:07:48 -0800 Subject: [PATCH 077/106] Fixed: method addObservers and removeObservers were not call all the time when ordering or not a window --- AppKit/CPWindow/CPWindow.j | 29 ++++++++++++++++++---- AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 8 ++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index e2836fe32..4d0ec1c12 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -907,18 +907,21 @@ CPTexturedBackgroundWindowMask - (void)_orderFront { - [[self contentView] _addObservers]; #if PLATFORM(DOM) // -dw- if a sheet is clicked, the parent window should come up too if (_isSheet) [_parentView orderFront:self]; - if (!_isVisible) - [self _setFrame:_frame display:YES animate:NO constrainWidth:YES constrainHeight:YES]; + // Save the boolean since it will be updated in the method order:window:relativeTo: + var isVisible = _isVisible; [_platformWindow orderFront:self]; [_platformWindow order:CPWindowAbove window:self relativeTo:nil]; + + // setFrame is set after ordering the window as this method can send some notifications + if (isVisible) + [self _setFrame:_frame display:YES animate:NO constrainWidth:YES constrainHeight:YES]; #endif if (!CPApp._keyWindow) @@ -937,8 +940,26 @@ CPTexturedBackgroundWindowMask */ - (void)_parentDidOrderInChild { + } +/* + Called when the window is displayed in the DOM +*/ +- (void)_windowWillBeAddedInTheDOM +{ + [[self contentView] _addObservers]; +} + +/* + Called when the window is removed in the DOM +*/ +- (void)_windowWillBeRemovedFromTheDOM +{ + [[self contentView] _removeObservers]; +} + + /* Makes the receiver the last window in the screen ordering. @param aSender the object that requested this @@ -968,8 +989,6 @@ CPTexturedBackgroundWindowMask if (!_isVisible) return; - [[self contentView] _removeObservers]; - if ([self isSheet]) { // -dw- as in Cocoa, orderOut: detaches the sheet and animates out diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index eeba3a894..60e0166b6 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -1299,7 +1299,10 @@ var PreventScroll = true; // When ordering out, ignore otherWindow, simply remove aWindow from its level. // If layer is nil, this will be a no-op. if (orderingMode === CPWindowOut) + { + [aWindow _windowWillBeRemovedFromTheDOM]; return [layer removeWindow:aWindow]; + } /* If aWindow is a child of otherWindow and is not yet visible, @@ -1345,6 +1348,8 @@ var PreventScroll = true; if (otherWindow) insertionIndex = orderingMode === CPWindowAbove ? otherWindow._index + 1 : otherWindow._index; + [aWindow _windowWillBeAddedInTheDOM]; + // Place the window at the appropriate index. [layer insertWindow:aWindow atIndex:insertionIndex]; @@ -1395,6 +1400,9 @@ var PreventScroll = true; var index = ordering === CPWindowAbove ? parent._index + 1 : parent._index; + if (!childWasVisible) + [child _windowWillBeAddInTheDOM]; + [aLayer insertWindow:child atIndex:index]; if (!childWasVisible) From f5d847f32059e1bb6da42d7f138f9e7f08094a4c Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 1 Dec 2014 16:08:49 -0800 Subject: [PATCH 078/106] Style: style in CPWindow --- AppKit/CPWindow/CPWindow.j | 1 - 1 file changed, 1 deletion(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 4d0ec1c12..31e7b156a 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -940,7 +940,6 @@ CPTexturedBackgroundWindowMask */ - (void)_parentDidOrderInChild { - } /* From ee13978115c23afdfd16ee0c768f52a12a737a30 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 2 Dec 2014 13:54:02 +0100 Subject: [PATCH 079/106] Fixed: @ref did not generate self.x for an ivar x --- Objective-J/ObjJAcornCompiler.js | 4 ++-- .../Preprocessor/OutputTests/Misc/ref-self.j | 11 +++++++++++ .../Preprocessor/OutputTests/Misc/ref-self.js | 9 +++++++++ .../Objective-J/Preprocessor/OutputTests/OutputTest.j | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.j create mode 100644 Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.js diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 79646a0e6..0e9d16f98 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -2381,9 +2381,9 @@ Reference: function(node, st, c) { buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. } buffer.concat("function(__input) { if (arguments.length) return "); - buffer.concat(node.element.name); + c(node.element, st, "Expression"); buffer.concat(" = __input; return "); - buffer.concat(node.element.name); + c(node.element, st, "Expression"); buffer.concat("; }"); if (!generate) compiler.lastPos = node.end; }, diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.j b/Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.j new file mode 100644 index 000000000..d94fa2450 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.j @@ -0,0 +1,11 @@ +@implementation TC +{ + id _control; +} + +- (id)a +{ + @ref(_control); +} + +@end diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.js b/Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.js new file mode 100644 index 000000000..778d931d6 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/OutputTests/Misc/ref-self.js @@ -0,0 +1,9 @@ +{var the_class = objj_allocateClassPair(Nil, "TC"), +meta_class = the_class.isa;class_addIvars(the_class, [new objj_ivar("_control")]);objj_registerClassPair(the_class); +class_addMethods(the_class, [new objj_method(sel_getUid("a"), function $TC__a(self, _cmd) +{ + function(__input) { if (arguments.length) return self._control = __input; return self._control; }; +} + +,["id"])]); +} diff --git a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j index a94c74f3b..fcd96ba3c 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j @@ -22,6 +22,7 @@ var FILENAMES = [ "Misc/regex-simple-char-classes", "Misc/empty-loops", "Misc/empty-statements", + "Misc/ref-self", ]; @implementation OutputTest : OJTestCase From c3ce0a61b6293c28d33eef970efc5038f1432810 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 2 Dec 2014 10:03:13 -0800 Subject: [PATCH 080/106] Fixed: type with the method _windowWillBeAddedToTheDOM in CPWindow --- AppKit/CPWindow/CPWindow.j | 6 +++--- AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 31e7b156a..25fd9bcf8 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -914,13 +914,13 @@ CPTexturedBackgroundWindowMask [_parentView orderFront:self]; // Save the boolean since it will be updated in the method order:window:relativeTo: - var isVisible = _isVisible; + var wasVisible = _isVisible; [_platformWindow orderFront:self]; [_platformWindow order:CPWindowAbove window:self relativeTo:nil]; // setFrame is set after ordering the window as this method can send some notifications - if (isVisible) + if (wasVisible) [self _setFrame:_frame display:YES animate:NO constrainWidth:YES constrainHeight:YES]; #endif @@ -945,7 +945,7 @@ CPTexturedBackgroundWindowMask /* Called when the window is displayed in the DOM */ -- (void)_windowWillBeAddedInTheDOM +- (void)_windowWillBeAddedToTheDOM { [[self contentView] _addObservers]; } diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index 60e0166b6..80a04feae 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -1348,7 +1348,7 @@ var PreventScroll = true; if (otherWindow) insertionIndex = orderingMode === CPWindowAbove ? otherWindow._index + 1 : otherWindow._index; - [aWindow _windowWillBeAddedInTheDOM]; + [aWindow _windowWillBeAddedToTheDOM]; // Place the window at the appropriate index. [layer insertWindow:aWindow atIndex:insertionIndex]; @@ -1401,7 +1401,7 @@ var PreventScroll = true; var index = ordering === CPWindowAbove ? parent._index + 1 : parent._index; if (!childWasVisible) - [child _windowWillBeAddInTheDOM]; + [child _windowWillBeAddedToTheDOM]; [aLayer insertWindow:child atIndex:index]; From 12ed70fec2a4fd517e3cc19d0e45f8968e766684 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 2 Dec 2014 16:37:02 -0800 Subject: [PATCH 081/106] Fixed: notifications CPWindowDidResignKeyNotification and CPWindowDidBecomeKeyNotification were not registered for a firstresponder textField when ordered again a window --- AppKit/CPTextField.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index d3dca7380..0d8576a45 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -882,7 +882,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [super _addObservers]; - if ([self window] === self) + if ([[self window] firstResponder] === self) [self _setObserveWindowKeyNotifications:YES]; } From b45399a045b64fd812572b6d0e455cbf340f530e Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 2 Dec 2014 16:37:57 -0800 Subject: [PATCH 082/106] Test: added class notificationHelper with the method registeredNotificationsForObserver --- Tests/AppKit/CPNotificationCenterHelper.j | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Tests/AppKit/CPNotificationCenterHelper.j diff --git a/Tests/AppKit/CPNotificationCenterHelper.j b/Tests/AppKit/CPNotificationCenterHelper.j new file mode 100644 index 000000000..69aaed26c --- /dev/null +++ b/Tests/AppKit/CPNotificationCenterHelper.j @@ -0,0 +1,39 @@ +@import + +@implementation CPNotificationCenterHelper : CPObject +{ +} + ++ (void)registeredNotificationsForObserver:(id)anObserver +{ + var defaultCenter = [CPNotificationCenter defaultCenter], + names = [defaultCenter._namedRegistries keyEnumerator], + notifications = [], + name; + + while ((name = [names nextObject]) !== nil) + { + var notificationRegistry = [defaultCenter._namedRegistries objectForKey:name], + objectObservers = notificationRegistry._objectObservers, + keys = [objectObservers keyEnumerator], + key; + + // Iterate through every set of observers + while ((key = [keys nextObject]) !== nil) + { + var observers = [objectObservers objectForKey:key], + observer = nil, + observersEnumerator = [observers objectEnumerator]; + + while ((observer = [observersEnumerator nextObject]) !== nil) + { + if ([observer observer] == anObserver) + [notifications addObject:name]; + } + } + } + + return notifications.sort(); +} + +@end From ec3af04f296c355d54cd7036dc3f76914c5c5a90 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 2 Dec 2014 16:38:17 -0800 Subject: [PATCH 083/106] Test: added tests for CPComboBox --- Tests/AppKit/CPComboBoxTest.j | 78 +++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Tests/AppKit/CPComboBoxTest.j diff --git a/Tests/AppKit/CPComboBoxTest.j b/Tests/AppKit/CPComboBoxTest.j new file mode 100644 index 000000000..3d12ed91c --- /dev/null +++ b/Tests/AppKit/CPComboBoxTest.j @@ -0,0 +1,78 @@ +@import +@import +@import + +@import "CPNotificationCenterHelper.j" + +[CPApplication sharedApplication]; + +@implementation CPComboBoxTest : OJTestCase +{ + CPComboBox comboBox; + BOOL wasClicked +} + +- (void)setUp +{ + comboBox = [[CPComboBox alloc] initWithFrame:CGRectMake(0, 0, 200, 30)]; +} + +- (void)testCanCreate +{ + [self assertTrue:!!comboBox]; +} + +- (void)testPublicAccessors +{ + [comboBox setHasVerticalScroller:YES]; + [comboBox setIntercellSpacing:CGSizeMakeZero()]; + [comboBox setButtonBordered:YES]; + [comboBox setItemHeight:30]; + [comboBox setNumberOfVisibleItems:10]; +} + +- (void)testPerformClick +{ + [comboBox setTarget:self]; + [comboBox setAction:@selector(clickMe:)]; + [comboBox performClick:nil]; + [self assertTrue:wasClicked]; +} + +- (void)clickMe:(id)sender +{ + wasClicked = YES; +} + +- (void)testNotificationsRegistered +{ + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:[] message:@"Notications registered for the CPComboBox in the notification center are wrong"]; + [comboBox setListDelegate:[[_CPPopUpList alloc] initWithDataSource:comboBox]]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:[] message:@"Notications registered for the CPComboBox in the notification center are wrong"]; + + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0) + styleMask:CPWindowNotSizable]; + + [[theWindow contentView] addSubview:comboBox]; + + var expectedNotifications = [@"_CPPopUpListWillPopUpNotification", @"_CPPopUpListWillDismissNotification", @"_CPPopUpListDidDismissNotification", @"_CPPopUpListItemWasClickedNotification", @"CPTableViewSelectionIsChangingNotification", @"CPTableViewSelectionDidChangeNotification"].sort(); + + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:expectedNotifications message:@"Notications registered for the CPComboBox in the notification center are wrong"]; + + [comboBox removeFromSuperview]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:[] message:@"Notications registered for the CPComboBox in the notification center are wrong"]; + + [[theWindow contentView] addSubview:comboBox]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:expectedNotifications message:@"Notications registered for the CPComboBox in the notification center are wrong"]; + + [[theWindow contentView] addSubview:comboBox]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:expectedNotifications message:@"Notications registered for the CPComboBox in the notification center are wrong"]; + + [comboBox setListDelegate:nil]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:[] message:@"Notications registered for the CPComboBox in the notification center are wrong"]; + + [comboBox setListDelegate:[[_CPPopUpList alloc] initWithDataSource:comboBox]]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:comboBox] equals:expectedNotifications message:@"Notications registered for the CPComboBox in the notification center are wrong"]; +} + +@end \ No newline at end of file From 006bf72c1735e618aa840365432d1e6c18c4a26a Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 2 Dec 2014 16:38:55 -0800 Subject: [PATCH 084/106] Test: added unit test for registered notification for the scrollView --- Tests/AppKit/CPScrollViewTest.j | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Tests/AppKit/CPScrollViewTest.j b/Tests/AppKit/CPScrollViewTest.j index d95839438..379cea865 100644 --- a/Tests/AppKit/CPScrollViewTest.j +++ b/Tests/AppKit/CPScrollViewTest.j @@ -1,5 +1,9 @@ @import +@import "CPNotificationCenterHelper.j" + +[CPApplication sharedApplication]; + @implementation CPScrollViewTest : OJTestCase { } @@ -256,6 +260,24 @@ [self assertPoint:CGPointMake(0, 0) equals:visibleRect.origin message:@"VisibleRect origin not at top left corner again"]; } +-(void)testNotificationsRegistered +{ + var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)], + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0) + styleMask:CPWindowNotSizable]; + + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:scrollView] equals:[] message:@"Notications registered for the scrollView in the notification center are wrong"]; + + [[theWindow contentView] addSubview:scrollView]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:scrollView] equals:[@"CPScrollerStyleGlobalChangeNotification"] message:@"Notications registered for the scrollView in the notification center are wrong"]; + + [[theWindow contentView] addSubview:scrollView]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:scrollView] equals:[@"CPScrollerStyleGlobalChangeNotification"] message:@"Notications registered for the scrollView in the notification center are wrong"]; + + [scrollView removeFromSuperview]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:scrollView] equals:[] message:@"Notications registered for the scrollView in the notification center are wrong"]; +} + - (void)assertPoint:(CGPoint)expected equals:(CGPoint)actual message:(CPString)message { [self assert:expected.x equals:actual.x message:@"X: " + message]; From 8efb6f8808a0998d19f48cb8ba5af2a19518c749 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 2 Dec 2014 16:39:07 -0800 Subject: [PATCH 085/106] Test: added unit test for registered notification for the tableView --- Tests/AppKit/CPTableViewTest.j | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Tests/AppKit/CPTableViewTest.j b/Tests/AppKit/CPTableViewTest.j index c1c5d0180..ede7ed1e9 100644 --- a/Tests/AppKit/CPTableViewTest.j +++ b/Tests/AppKit/CPTableViewTest.j @@ -1,5 +1,7 @@ @import +@import "CPNotificationCenterHelper.j" + [CPApplication sharedApplication]; @implementation CPTableViewTest : OJTestCase @@ -303,6 +305,36 @@ [self assertTrue:[table bounds].size.width >= 200]; } +-(void)testNotificationsRegistered +{ + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:tableView] equals:[@"_CPWindowDidChangeFirstResponderNotification"] message:@"Notications registered for the tableView in the notification center are wrong"]; + + [tableView removeFromSuperview]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:tableView] equals:[] message:@"Notications registered for the tableView in the notification center are wrong"]; + + [[theWindow contentView] addSubview:tableView]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:tableView] equals:[@"_CPWindowDidChangeFirstResponderNotification"] message:@"Notications registered for the tableView in the notification center are wrong"]; + + [[theWindow contentView] addSubview:tableView]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:tableView] equals:[@"_CPWindowDidChangeFirstResponderNotification"] message:@"Notications registered for the tableView in the notification center are wrong"]; + + + var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, 100.0, 100.0)], + expectedNotifications = [@"_CPWindowDidChangeFirstResponderNotification", @"CPViewFrameDidChangeNotification", @"CPViewBoundsDidChangeNotification"].sort(); + + [scrollView setDocumentView:tableView]; + + [[theWindow contentView] addSubview:scrollView]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:tableView] equals:expectedNotifications message:@"Notications registered for the tableView in the notification center are wrong"]; + + [[theWindow contentView] addSubview:scrollView]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:tableView] equals:expectedNotifications message:@"Notications registered for the tableView in the notification center are wrong"]; + + [scrollView removeFromSuperview]; + [self assert:[CPNotificationCenterHelper registeredNotificationsForObserver:tableView] equals:[] message:@"Notications registered for the tableView in the notification center are wrong"]; + +} + @end @implementation FirstResponderConfigurableTableView : CPTableView From c7ccff914f8b661d82a88938728eb152a601e6a7 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 2 Dec 2014 16:48:44 -0800 Subject: [PATCH 086/106] Test: added basic test for ordering window --- Tests/AppKit/CPWindowTest.j | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Tests/AppKit/CPWindowTest.j b/Tests/AppKit/CPWindowTest.j index 2244a28d9..cf51e8cba 100644 --- a/Tests/AppKit/CPWindowTest.j +++ b/Tests/AppKit/CPWindowTest.j @@ -128,4 +128,12 @@ [self assertTrue:[[[self window] representedURL] class] === [CPURL class]]; } +- (void)testOrderingMethod +{ + [_window orderFront:self]; + [_window orderBack:self]; + [_window orderFront:self]; + [_window orderOut:self]; +} + @end From 46a0ce8e981627c55a4c4cbad2e6c6e3c47e4c09 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 4 Dec 2014 11:06:50 -0800 Subject: [PATCH 087/106] Fixed: wrong condition when setting the frame in CPWindow when ordering a view --- AppKit/CPWindow/CPWindow.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 25fd9bcf8..160a03ee4 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -920,7 +920,7 @@ CPTexturedBackgroundWindowMask [_platformWindow order:CPWindowAbove window:self relativeTo:nil]; // setFrame is set after ordering the window as this method can send some notifications - if (wasVisible) + if (!wasVisible) [self _setFrame:_frame display:YES animate:NO constrainWidth:YES constrainHeight:YES]; #endif From 0f4a938dfc4ef7c94331d46b6c3aaa0810cef83d Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 5 Dec 2014 09:50:49 -0800 Subject: [PATCH 088/106] Fixed: attributes of the listDelegate of a CPComboBox could crash cappuccino --- AppKit/CPComboBox.j | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index bfc7887ef..a9bc2353f 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -160,7 +160,7 @@ var CPComboBoxTextSubview = @"text", - (void)setIntercellSpacing:(CGSize)aSize { - if (!aSize || (_intercellSpacing && CGSizeEqualToSize(aSize, _intercellSpacing))) + if (_intercellSpacing && CGSizeEqualToSize(aSize, _intercellSpacing)) return; _intercellSpacing = aSize; @@ -408,9 +408,12 @@ var CPComboBoxTextSubview = @"text", [_listDelegate setFont:[self font]]; [_listDelegate setAlignment:[self alignment]]; - [self setHasVerticalScroller:_hasVerticalScroller]; - [self setIntercellSpacing:_intercellSpacing]; - [self setItemHeight:_itemHeight]; + [[_listDelegate scrollView] setHasVerticalScroller:_hasVerticalScroller]; + + if (_intercellSpacing) + [[_listDelegate tableView] setIntercellSpacing:_intercellSpacing]; + + [[_listDelegate tableView] setRowHeight:_itemHeight]; } - (void)_addObserversForListDelegate:(_CPPopUpList)aDelegate From 4ebb2baf06c250d8b442b484bc2d9b42ec2f6c6f Mon Sep 17 00:00:00 2001 From: kevin-xu Date: Mon, 8 Dec 2014 22:00:02 +0800 Subject: [PATCH 089/106] New: Highlighted "@typedef" in VIM. "@typedef" should be highlighted since #2254. --- Tools/Editors/Vim/objj.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/Editors/Vim/objj.vim b/Tools/Editors/Vim/objj.vim index e42d14c8a..a6d9d5028 100644 --- a/Tools/Editors/Vim/objj.vim +++ b/Tools/Editors/Vim/objj.vim @@ -68,6 +68,7 @@ syn match objjImported display contained "<[-_0-9a-zA-Z.\/]*>" syn match objjImport display "^\s*\(%:\|#\|@\)\s*import\>\s*["<]" contains=objjImported " Match the important ObjJ directives +syn match objjDirective "@typedef" syn match objjDirective "@interface\|@implementation\|@protocol\|@end" syn match objjScopeDecl "@public\|@protected\|@private\|@package" syn match objjScopeDecl "@required\|@optional" From cb5fe06e58c86655131a0b516295338a8af6900f Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 8 Dec 2014 15:29:28 -0800 Subject: [PATCH 090/106] Fixed: button are always removed from the superview in layoutSubviews Previously, the button of a CPButtonBar were always removed and readded in the method layoutSubviews. Now we only remove the hidden button. --- AppKit/CPButtonBar.j | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/AppKit/CPButtonBar.j b/AppKit/CPButtonBar.j index 024924830..47f869597 100644 --- a/AppKit/CPButtonBar.j +++ b/AppKit/CPButtonBar.j @@ -234,10 +234,11 @@ { var button = buttonsNotHidden[count]; - [button removeFromSuperview]; - if ([button isHidden]) + { + [button removeFromSuperview]; [buttonsNotHidden removeObject:button]; + } } var currentButtonOffset = _resizeControlIsLeftAligned ? CGRectGetMaxX([self bounds]) + 1 : -1, From 8b29369b7edd1ff2a113f59ded59c3ff3cf206a4 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 8 Dec 2014 15:36:31 -0800 Subject: [PATCH 091/106] Fixed: wrong option for the observer in _CPPopoverWindow Previously the option of the observer in _CPPopoverWindow were set to 0, now it's set to CPKeyValueObservingOptionNew. This PR fix also another issue, the popoverWindow registered the observer in the wrong order. It firstly observed the frame of the sender and then removed it directly. Now it register when ordering front the popover and remove it when closing the popover --- AppKit/_CPPopoverWindow.j | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index 818ae6d60..bcadedcee 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -180,7 +180,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, return; _isObservingFrame = YES; - [_targetView addObserver:self forKeyPath:@"frame" options:0 context:nil]; + [_targetView addObserver:self forKeyPath:@"frame" options:CPKeyValueObservingOptionNew context:nil]; } /*! @@ -207,7 +207,6 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, return; var point = [self computeOriginFromRect:[_targetView bounds] ofView:_targetView preferredEdge:[_windowView preferredEdge]]; - [self setFrameOrigin:point]; } } @@ -362,7 +361,6 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, [self setFrameOrigin:point]; [_windowView showCursor]; [_windowView setNeedsDisplay:YES]; - [self makeKeyAndOrderFront:nil]; if (positioningView !== _targetView) { @@ -371,6 +369,8 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, _targetView = positioningView; } + [self makeKeyAndOrderFront:nil]; + /* If _targetView's window is not a full platform window, add us as a child, because when we close we are detached from From b74d49b0bf66875ece3fef694af2c3da2e8815f1 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 8 Dec 2014 15:54:25 -0800 Subject: [PATCH 092/106] Fixed: changed option for observer in _CPPopoverWindow.j --- AppKit/_CPPopoverWindow.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index bcadedcee..ce2a7898b 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -180,7 +180,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, return; _isObservingFrame = YES; - [_targetView addObserver:self forKeyPath:@"frame" options:CPKeyValueObservingOptionNew context:nil]; + [_targetView addObserver:self forKeyPath:@"frame" options:0 context:nil]; } /*! From 1016c3e22f431f5972a23e2acb43a2b54a879263 Mon Sep 17 00:00:00 2001 From: Christophe Serafin Date: Mon, 8 Dec 2014 18:54:35 -0800 Subject: [PATCH 093/106] Fix controls' heights that are displayed in CPPredicateEditor Lastly, we removed the usage of max-size to enable some controls like CPTextField to have a specific height. This may caused a CPTextField to have a wrong height. As all controls in a CPPredicateEditor have a CPControlSize to small, we now force their height to the minimum size. --- AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j index 30470d5c6..80509dd16 100644 --- a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j +++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j @@ -122,8 +122,8 @@ { var title = [[itemsArray objectAtIndex:index] title], font = [_ruleEditor font], - width = [title sizeWithFont:font].width + 20, - rect = CGRectMake(0, 0, (width - width % 40) + 80, [_ruleEditor rowHeight]), + width = [title sizeWithFont:font].width + 35, // 35 for right arrows + margins + rect = CGRectMake(0, 0, width, [_ruleEditor rowHeight]), popup = [[CPPopUpButton alloc] initWithFrame:rect]; [popup setValue:font forThemeAttribute:@"font"]; @@ -315,8 +315,14 @@ { [ruleView setControlSize:CPSmallControlSize]; + var minSize = [ruleView currentValueForThemeAttribute:@"min-size"], + frame = [ruleView frame]; + + // Force controls to their minimum size + frame.size.height = minSize.height; + [ruleView setFrame:frame]; + [_ruleOptionViews addObject:ruleView]; - var frame = [ruleView frame]; [_ruleOptionInitialViewFrames addObject:frame]; [_ruleOptionFrames addObject:frame]; From 9174338140a29ac6b79b0fde71ee9567411cccf9 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 9 Dec 2014 17:26:02 -0800 Subject: [PATCH 094/106] Fixed: CPDatePicker takes key code CPReturnKeyCode all the time Previously, the CPDatePicker took the key code CPReturnKeyCode all the time. It means, the key event wasn't redistributed to the other component, for example a defaultButton in a window. Now instead of returning YES, it returns [super performKeyEquivalent:anEvent] --- AppKit/CPDatePicker/_CPDatePickerTextField.j | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index 8fa09afce..07889ca4e 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -338,10 +338,11 @@ var CPZeroKeyCode = 48, if ([anEvent keyCode] == CPReturnKeyCode) { [_currentTextField _endEditing]; - return YES; + + return [super performKeyEquivalent:anEvent]; } - return NO; + return [super performKeyEquivalent:anEvent]; } /*! KeyDown event From 92b997fb78b25f77f228edbb84f8db5c766b0f1b Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 9 Dec 2014 19:04:12 -0800 Subject: [PATCH 095/106] Fixed: crash when dragging the first line of a RuleEditor above the field Any Previously, cappuccino crashed when dragging the first line of a CPRuleEditor above the field any. Now we make sure, we can not drag over this limit. --- AppKit/CPRuleEditor/CPRuleEditor.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPRuleEditor/CPRuleEditor.j b/AppKit/CPRuleEditor/CPRuleEditor.j index a02b8efe7..404c5546e 100644 --- a/AppKit/CPRuleEditor/CPRuleEditor.j +++ b/AppKit/CPRuleEditor/CPRuleEditor.j @@ -2207,7 +2207,7 @@ TODO: implement indexOfDropLine = FLOOR(y / _sliceHeight), numberOfRows = [self numberOfRows]; - if (indexOfDropLine < 0 || indexOfDropLine > numberOfRows || (indexOfDropLine >= [_draggingRows firstIndex] && indexOfDropLine <= [_draggingRows lastIndex] + 1)) + if (indexOfDropLine <= 0 || indexOfDropLine > numberOfRows || (indexOfDropLine >= [_draggingRows firstIndex] && indexOfDropLine <= [_draggingRows lastIndex] + 1)) { if (_subviewIndexOfDropLine !== CPNotFound && indexOfDropLine !== _subviewIndexOfDropLine) [self _clearDropLine]; From cd511da67875ee22e9a9f9642c066d024fbe3c89 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 10 Dec 2014 10:25:10 -0800 Subject: [PATCH 096/106] Fixed: used _implementedDelegateMethods in CPComboBox at the same time in CPTextField. This occured some issues with the delegate of the comboBoxDelegate when using textField delegate. This commit fix a issue about the row height of a an element in the list of the comboBox --- AppKit/CPComboBox.j | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index a9bc2353f..06b5a6b15 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -75,7 +75,7 @@ var CPComboBoxTextSubview = @"text", CGSize _intercellSpacing; CPArray _items; id _dataSource; - CPInteger _implementedDelegateMethods; + CPInteger _implementedDelegateComboBoxMethods; CPString _selectedStringValue; float _itemHeight; int _numberOfVisibleItems; @@ -234,19 +234,21 @@ var CPComboBoxTextSubview = @"text", if (aDelegate === delegate) return; + _implementedDelegateComboBoxMethods = 0; + if (aDelegate) { if ([aDelegate respondsToSelector:@selector(comboBoxSelectionIsChanging:)]) - _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxSelectionIsChanging_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxSelectionIsChanging_ if ([aDelegate respondsToSelector:@selector(comboBoxSelectionDidChange:)]) - _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxSelectionDidChange_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxSelectionDidChange_ if ([aDelegate respondsToSelector:@selector(comboBoxWillPopUp:)]) - _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxWillPopUp_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxWillPopUp_ if ([aDelegate respondsToSelector:@selector(comboBoxWillDismiss:)]) - _implementedDelegateMethods |= CPComboBoxDelegate_comboBoxWillDismiss_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxWillDismiss_ } [super setDelegate:aDelegate]; @@ -413,7 +415,8 @@ var CPComboBoxTextSubview = @"text", if (_intercellSpacing) [[_listDelegate tableView] setIntercellSpacing:_intercellSpacing]; - [[_listDelegate tableView] setRowHeight:_itemHeight]; + if (_itemHeight) + [[_listDelegate tableView] setRowHeight:_itemHeight]; } - (void)_addObserversForListDelegate:(_CPPopUpList)aDelegate @@ -1031,7 +1034,7 @@ var CPComboBoxTextSubview = @"text", /*! @ignore */ - (void)comboBoxSelectionIsChanging:(CPNotification)aNotification { - if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxSelectionIsChanging_) + if (_implementedDelegateComboBoxMethods & CPComboBoxDelegate_comboBoxSelectionIsChanging_) [_delegate comboBoxSelectionIsChanging:[[CPNotification alloc] initWithName:CPComboBoxSelectionIsChangingNotification object:self userInfo:nil]]; [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxSelectionIsChangingNotification object:self]; @@ -1040,7 +1043,7 @@ var CPComboBoxTextSubview = @"text", /*! @ignore */ - (void)comboBoxSelectionDidChange:(CPNotification)aNotification { - if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxSelectionDidChange_) + if (_implementedDelegateComboBoxMethods & CPComboBoxDelegate_comboBoxSelectionDidChange_) [_delegate comboBoxSelectionDidChange:[[CPNotification alloc] initWithName:CPComboBoxSelectionDidChangeNotification object:self userInfo:nil]]; [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxSelectionDidChangeNotification object:self]; @@ -1049,7 +1052,7 @@ var CPComboBoxTextSubview = @"text", /*! @ignore */ - (void)comboBoxWillPopUp:(CPNotification)aNotification { - if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxWillPopUp_) + if (_implementedDelegateComboBoxMethods & CPComboBoxDelegate_comboBoxWillPopUp_) [_delegate comboBoxWillPopUp:[[CPNotification alloc] initWithName:CPComboBoxWillPopUpNotification object:self userInfo:nil]]; [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxWillPopUpNotification object:self]; @@ -1058,7 +1061,9 @@ var CPComboBoxTextSubview = @"text", /*! @ignore */ - (void)comboBoxWillDismiss:(CPNotification)aNotification { - if (_implementedDelegateMethods & CPComboBoxDelegate_comboBoxWillDismiss_) + console.error(@"coucou"); + + if (_implementedDelegateComboBoxMethods & CPComboBoxDelegate_comboBoxWillDismiss_) [_delegate comboBoxWillDismiss:[[CPNotification alloc] initWithName:CPComboBoxWillDismissNotification object:self userInfo:nil]]; [[CPNotificationCenter defaultCenter] postNotificationName:CPComboBoxWillDismissNotification object:self]; From 5b4bddc2e0cd73fea395b128f94692c58ac0cd6d Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 10 Dec 2014 10:29:46 -0800 Subject: [PATCH 097/106] Fixed: removed stupid console.error(coucou).... --- AppKit/CPComboBox.j | 2 -- 1 file changed, 2 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index 06b5a6b15..18ef6487e 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -1061,8 +1061,6 @@ var CPComboBoxTextSubview = @"text", /*! @ignore */ - (void)comboBoxWillDismiss:(CPNotification)aNotification { - console.error(@"coucou"); - if (_implementedDelegateComboBoxMethods & CPComboBoxDelegate_comboBoxWillDismiss_) [_delegate comboBoxWillDismiss:[[CPNotification alloc] initWithName:CPComboBoxWillDismissNotification object:self userInfo:nil]]; From 47cced540e8e0cc1d0daa0d054154511271fd2bd Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 10 Dec 2014 10:31:38 -0800 Subject: [PATCH 098/106] Style: added missing semi-colon in CPComboBox --- AppKit/CPComboBox.j | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AppKit/CPComboBox.j b/AppKit/CPComboBox.j index 18ef6487e..f6d094eb1 100644 --- a/AppKit/CPComboBox.j +++ b/AppKit/CPComboBox.j @@ -239,16 +239,16 @@ var CPComboBoxTextSubview = @"text", if (aDelegate) { if ([aDelegate respondsToSelector:@selector(comboBoxSelectionIsChanging:)]) - _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxSelectionIsChanging_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxSelectionIsChanging_; if ([aDelegate respondsToSelector:@selector(comboBoxSelectionDidChange:)]) - _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxSelectionDidChange_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxSelectionDidChange_; if ([aDelegate respondsToSelector:@selector(comboBoxWillPopUp:)]) - _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxWillPopUp_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxWillPopUp_; if ([aDelegate respondsToSelector:@selector(comboBoxWillDismiss:)]) - _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxWillDismiss_ + _implementedDelegateComboBoxMethods |= CPComboBoxDelegate_comboBoxWillDismiss_; } [super setDelegate:aDelegate]; From 873232d5606af86299a3ae278d9320bd29d85c57 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Tue, 16 Dec 2014 18:43:08 +0100 Subject: [PATCH 099/106] FIXED : a CPOperation marked as cancelled was never started (CPOperation -start) when managed in a queue. FIXED : After an operation started, either from a queue or explicitely, its finished property was never set to true. This was causing dependant operation to never be executed. After this commit, cancelled operations are started (but not executed) and correctly marked as finished. Tests: CPOperationQueueTest and CPOperationTest for an operation managed by a queue or run explicitely. --- Foundation/CPOperation.j | 7 ++-- Foundation/CPOperationQueue.j | 4 +- Tests/Foundation/CPOperationQueueTest.j | 50 +++++++++++++++++++++++++ Tests/Foundation/CPOperationTest.j | 17 +++++++++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/Foundation/CPOperation.j b/Foundation/CPOperation.j index 4fbdd5612..b0b8a6154 100644 --- a/Foundation/CPOperation.j +++ b/Foundation/CPOperation.j @@ -117,10 +117,11 @@ CPOperationQueuePriorityVeryHigh = 8; [self willChangeValueForKey:@"isExecuting"]; _executing = NO; [self didChangeValueForKey:@"isExecuting"]; - [self willChangeValueForKey:@"isFinished"]; - _finished = YES; - [self didChangeValueForKey:@"isFinished"]; } + + [self willChangeValueForKey:@"isFinished"]; + _finished = YES; + [self didChangeValueForKey:@"isFinished"]; } /*! diff --git a/Foundation/CPOperationQueue.j b/Foundation/CPOperationQueue.j index 1e018df15..de9322ce6 100644 --- a/Foundation/CPOperationQueue.j +++ b/Foundation/CPOperationQueue.j @@ -70,7 +70,7 @@ var cpOperationMainQueue = nil; for (; i < count; i++) { var op = [_operations objectAtIndex:i]; - if ([op isReady] && ![op isCancelled] && ![op isFinished] && ![op isExecuting]) + if ([op isReady] && ![op isFinished] && ![op isExecuting]) { [op start]; } @@ -260,7 +260,7 @@ var cpOperationMainQueue = nil; for (; i < count; i++) { var op = [ops objectAtIndex:i]; - if ([op isReady] && ![op isCancelled] && ![op isFinished] && ![op isExecuting]) + if ([op isReady] && ![op isFinished] && ![op isExecuting]) { [op start]; } diff --git a/Tests/Foundation/CPOperationQueueTest.j b/Tests/Foundation/CPOperationQueueTest.j index 0cc5de666..23bea619e 100644 --- a/Tests/Foundation/CPOperationQueueTest.j +++ b/Tests/Foundation/CPOperationQueueTest.j @@ -16,6 +16,33 @@ globalResults = []; @end +@implementation TestOperation2 : CPOperation +{ + BOOL _started @accessors(getter=didStart); + BOOL _mained @accessors(getter=didMain); +} + +- (id)init +{ + self = [super init]; + _started = NO; + _mained = NO; + return self; +} + +- (void)main +{ + _mained = YES; +} + +- (void)start +{ + [super start]; + _started = YES; +} + +@end + @implementation TestObserver : CPObject { CPArray changedKeyPaths @accessors; @@ -167,4 +194,27 @@ globalResults = []; [self assert:@"name" equals:[[obs changedKeyPaths] objectAtIndex:4]]; } +- (void)testCancelledOperationDoesStart +{ + var op = [[TestOperation2 alloc] init], + queue = [[CPOperationQueue alloc] init]; + + [self assertFalse:[op isCancelled]]; + [self assertFalse:[op isFinished]]; + [self assertFalse:[op didMain]]; + [self assertFalse:[op didStart]]; + + [op cancel]; + + [self assertTrue:[op isCancelled]]; + [self assertFalse:[op isFinished]]; + + [queue addOperations:[op] waitUntilFinished:YES]; + + [self assertFalse:[op didMain]]; + [self assertTrue:[op didStart]]; + [self assertTrue:[op isCancelled]]; + [self assertTrue:[op isFinished]]; +} + @end \ No newline at end of file diff --git a/Tests/Foundation/CPOperationTest.j b/Tests/Foundation/CPOperationTest.j index 1c1beef56..ea424ef56 100644 --- a/Tests/Foundation/CPOperationTest.j +++ b/Tests/Foundation/CPOperationTest.j @@ -180,4 +180,21 @@ [self assert:@"isCancelled" equals:[[obs changedKeyPaths] objectAtIndex:9]]; } +- (void)testCancelledOperationIsFinished +{ + var results = @[], + funcOp = [CPFunctionOperation functionOperationWithFunction:function() {[results addObject:"funcOp"];}]; + + [funcOp cancel]; + [self assertTrue:[funcOp isCancelled]]; + [self assertFalse:[funcOp isFinished]]; + + [funcOp start]; + + [self assertTrue:[funcOp isCancelled]]; + [self assertTrue:[funcOp isFinished]]; + + [self assertTrue:([results count] == 0)]; +} + @end From e407eeea4069d92cb7b1d59d7a42b5b58a15835f Mon Sep 17 00:00:00 2001 From: cacaodev Date: Tue, 16 Dec 2014 21:43:19 +0100 Subject: [PATCH 100/106] FIXED : travis build --- Tests/Foundation/CPOperationQueueTest.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Foundation/CPOperationQueueTest.j b/Tests/Foundation/CPOperationQueueTest.j index 23bea619e..5005a1ae7 100644 --- a/Tests/Foundation/CPOperationQueueTest.j +++ b/Tests/Foundation/CPOperationQueueTest.j @@ -16,7 +16,7 @@ globalResults = []; @end -@implementation TestOperation2 : CPOperation +@implementation TestCancelOperation : CPOperation { BOOL _started @accessors(getter=didStart); BOOL _mained @accessors(getter=didMain); @@ -196,7 +196,7 @@ globalResults = []; - (void)testCancelledOperationDoesStart { - var op = [[TestOperation2 alloc] init], + var op = [[TestCancelOperation alloc] init], queue = [[CPOperationQueue alloc] init]; [self assertFalse:[op isCancelled]]; From 5995b428721dd89bbe9061d39e0c2d5ebd3d92d7 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Thu, 25 Dec 2014 17:37:18 +0100 Subject: [PATCH 101/106] fixed: popover positioning --- AppKit/_CPPopoverWindow.j | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index ce2a7898b..19bfa82ac 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -581,10 +581,12 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, - (void)_orderFront { - if (![self isVisible]) - [self _addFrameObserver]; + var wasVisible = [self isVisible]; [super _orderFront]; + + if (!wasVisible) + [self _addFrameObserver]; } - (void)_parentDidOrderInChild From 00ebc265d87f2d2cd778c31709d325ebdf174db3 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Fri, 2 Jan 2015 19:35:09 +0100 Subject: [PATCH 102/106] make _targetRect an ivar --- AppKit/_CPPopoverWindow.j | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index 19bfa82ac..d915b7bd5 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -64,6 +64,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, BOOL _isObservingFrame; BOOL _shouldPerformAnimation; CPInteger _implementedDelegateMethods; + CGRect _targetRect; CPWindow _targetWindow; JSObject _orderOutTransitionFunction; JSObject _transitionCompleteFunction; @@ -206,7 +207,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, if (![_targetView window]) return; - var point = [self computeOriginFromRect:[_targetView bounds] ofView:_targetView preferredEdge:[_windowView preferredEdge]]; + var point = [self computeOriginFromRect:_targetRect ofView:_targetView preferredEdge:[_windowView preferredEdge]]; [self setFrameOrigin:point]; } } @@ -369,6 +370,13 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, _targetView = positioningView; } + if (positioningView !== _targetView) + { + [[_targetView window] removeChildWindow:self]; + [self _removeFrameObserver]; + _targetView = positioningView; + } + [self makeKeyAndOrderFront:nil]; /* @@ -382,6 +390,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, [[_targetView window] addChildWindow:self ordered:CPWindowAbove]; _targetWindow = targetWindow; + _targetRect = aRect; if (!wasVisible) [self _trapNextMouseDown]; From 2f9f3db19845a8dc55cb1fc3c7831e26283d791c Mon Sep 17 00:00:00 2001 From: daboe01 Date: Sat, 3 Jan 2015 10:21:28 +0100 Subject: [PATCH 103/106] remove accidental code duplication --- AppKit/_CPPopoverWindow.j | 7 ------- 1 file changed, 7 deletions(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index d915b7bd5..f7cc50d68 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -370,13 +370,6 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, _targetView = positioningView; } - if (positioningView !== _targetView) - { - [[_targetView window] removeChildWindow:self]; - [self _removeFrameObserver]; - _targetView = positioningView; - } - [self makeKeyAndOrderFront:nil]; /* From 0f5dd991675ebc7ce4656d70a17c1d018df97a2a Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 6 Jan 2015 15:20:02 -0800 Subject: [PATCH 104/106] Fixed: the method setContentSize: of the CPPopover did not take care about the rect given when displaying the popover --- AppKit/_CPPopoverWindow.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index f7cc50d68..36fab0b48 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -419,7 +419,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, if ([self isVisible]) { - var point = [self computeOriginFromRect:[_targetView bounds] ofView:_targetView preferredEdge:[_windowView preferredEdge]]; + var point = [self computeOriginFromRect:_targetRect ofView:_targetView preferredEdge:[_windowView preferredEdge]]; [self setFrameOrigin:point]; } } From e49a9f1f064d407678b5b20f9f47df38c7b2a9f2 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 6 Jan 2015 15:28:14 -0800 Subject: [PATCH 105/106] Fixed: targetRect was assigned too late when displaying a popoverWindow. This var can be used before ordering the popoverWindow --- AppKit/_CPPopoverWindow.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index 36fab0b48..27d160e17 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -370,6 +370,7 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, _targetView = positioningView; } + _targetRect = aRect; [self makeKeyAndOrderFront:nil]; /* @@ -383,7 +384,6 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, [[_targetView window] addChildWindow:self ordered:CPWindowAbove]; _targetWindow = targetWindow; - _targetRect = aRect; if (!wasVisible) [self _trapNextMouseDown]; From fa7b71cabe851f4b19e0bf22fa8874d1320b55e8 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 9 Jan 2015 08:37:29 -0800 Subject: [PATCH 106/106] Fixed: cappuccino raised an exception when the param of constructor method of a CPDate are not a string. It now raises an warning --- Foundation/CPDate.j | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index 47abdfe7d..574873ef6 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -75,7 +75,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeIntervalSinceNow:(CPTimeInterval)seconds { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceNow: has to be an integer or a float"]; + CPLog.warn(@"The parameter of the method initWithTimeIntervalSinceNow: should be an integer or a float"); self = new Date((new Date()).getTime() + seconds * 1000); return self; @@ -84,7 +84,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeIntervalSince1970:(CPTimeInterval)seconds { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSince1970: has to be an integer or a float"]; + CPLog.warn(@"The parameter of the method initWithTimeIntervalSince1970: should be an integer or a float"); self = new Date(seconds * 1000); return self; @@ -93,7 +93,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeIntervalSinceReferenceDate:(CPTimeInterval)seconds { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeIntervalSinceReferenceDate: has to be an integer or a float"]; + CPLog.warn(@"The parameter of the method initWithTimeIntervalSinceReferenceDate: should be an integer or a float"); self = [self initWithTimeInterval:seconds sinceDate:CPDateReferenceDate]; return self; @@ -102,7 +102,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)); - (id)initWithTimeInterval:(CPTimeInterval)seconds sinceDate:(CPDate)refDate { if (!_isNumberType(seconds)) - [CPException raise:CPInvalidArgumentException reason:@"The parameter of the method initWithTimeInterval:sinceDate: has to be an integer or a float"]; + CPLog.warn(@"The parameter of the method initWithTimeInterval:sinceDate: should be an integer or a float"); self = new Date(refDate.getTime() + seconds * 1000); return self;