diff --git a/AppKit/CPAnimation.j b/AppKit/CPAnimation.j index 148db1f6f..3192ea152 100644 --- a/AppKit/CPAnimation.j +++ b/AppKit/CPAnimation.j @@ -307,7 +307,7 @@ ACTUAL_FRAME_RATE = 0; if ([_delegate respondsToSelector:@selector(animation:valueForProgress:)]) return [_delegate animation:self valueForProgress:t]; - + if (_animationCurve == CPAnimationLinear) return t; diff --git a/AppKit/CPCookie.j b/AppKit/CPCookie.j index 8b040362b..76ae57560 100644 --- a/AppKit/CPCookie.j +++ b/AppKit/CPCookie.j @@ -111,8 +111,12 @@ for (var i = 0; i < ca.length; i++) { var c = ca[i]; - while (c.charAt(0) == ' ') c = c.substring(1, c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); + + while (c.charAt(0) == ' ') + c = c.substring(1, c.length); + + if (c.indexOf(nameEQ) == 0) + return c.substring(nameEQ.length, c.length); } #endif return ""; diff --git a/AppKit/CPGraphics.j b/AppKit/CPGraphics.j index af4da70ec..494b70afe 100644 --- a/AppKit/CPGraphics.j +++ b/AppKit/CPGraphics.j @@ -70,7 +70,10 @@ function CPDrawColorTiledRects( if (_CGRectIsEmpty(slice)) continue; - var minX, maxX, minY, maxY; + var minX, + maxX, + minY, + maxY; if (side == CPMinXEdge || side == CPMaxXEdge) { @@ -105,4 +108,4 @@ function CPDrawColorTiledRects( CGContextRestoreGState(context); return resultRect; -} \ No newline at end of file +} diff --git a/AppKit/CPLevelIndicator.j b/AppKit/CPLevelIndicator.j index 911dea311..e4a5474d1 100644 --- a/AppKit/CPLevelIndicator.j +++ b/AppKit/CPLevelIndicator.j @@ -253,7 +253,7 @@ var _CPLevelIndicatorBezelColor = nil, var location = [self convertPoint:[anEvent locationInWindow] fromView:nil], bounds = [self bounds], - oldValue = [self doubleValue]; + oldValue = [self doubleValue], newValue = oldValue; // Moving the mouse outside of the widget to the left sets it diff --git a/AppKit/CPPopover.j b/AppKit/CPPopover.j index dc523c79a..f1fec56b7 100644 --- a/AppKit/CPPopover.j +++ b/AppKit/CPPopover.j @@ -296,7 +296,7 @@ Set the behavior of the CPPopover. It can be: /*! @ignore */ - (BOOL)attachedWindowShouldClose:(_CPAttachedWindow)anAttachedWindow { - [self close]; + [self performClose:self]; // We return NO, because we want the CPPopover to determine // if the attached window can be closed and to give us a chance @@ -375,4 +375,4 @@ var CPPopoverNeedsNewAttachedWindowKey = @"CPPopoverNeedsNewAttachedWindowKey", [aCoder encodeInt:_behavior forKey:CPPopoverBehaviorKey]; } -@end \ No newline at end of file +@end diff --git a/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j b/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j index 102747a46..0843f8ea1 100644 --- a/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j +++ b/AppKit/CPRuleEditor/CPPredicateEditorRowTemplate.j @@ -185,7 +185,8 @@ CPTransformableAttributeType = 1800; if (![[self operators] containsObject:[predicate predicateOperatorType]]) return 0; - if (!_rightIsWildcard && ![[self rightExpressions] containsObject:[predicate rightExpression]]) return 0; + if (!_rightIsWildcard && ![[self rightExpressions] containsObject:[predicate rightExpression]]) + return 0; return 1; } diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index 35058b37a..02b1e06f9 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -1065,7 +1065,7 @@ The sum of the views and the sum of the dividers should be equal to the size of */ - (void)_autosave { - if (!_shouldAutosave || !autosaveName) + if (!_shouldAutosave || !_autosaveName) return; var userDefaults = [CPUserDefaults standardUserDefaults], diff --git a/AppKit/CPWindow/_CPDocModalWindowView.j b/AppKit/CPWindow/_CPDocModalWindowView.j index ae691300d..8bd6540d4 100644 --- a/AppKit/CPWindow/_CPDocModalWindowView.j +++ b/AppKit/CPWindow/_CPDocModalWindowView.j @@ -24,7 +24,7 @@ var _CPStandardWindowViewBodyBackgroundColor = nil; if (self) { var theClass = [self class], - bounds = [self bounds]; + bounds = [self bounds]; _bodyView = [[CPView alloc] initWithFrame:_CGRectMake(0.0, 0.0, _CGRectGetWidth(bounds), _CGRectGetHeight(bounds))]; @@ -54,4 +54,4 @@ var _CPStandardWindowViewBodyBackgroundColor = nil; return aContentRect; } -@end \ No newline at end of file +@end diff --git a/AppKit/Cib/CPCibHelpConnector.j b/AppKit/Cib/CPCibHelpConnector.j index 8049abda9..925b3393f 100644 --- a/AppKit/Cib/CPCibHelpConnector.j +++ b/AppKit/Cib/CPCibHelpConnector.j @@ -25,8 +25,8 @@ @implementation CPCibHelpConnector : CPCibConnector { id _destination; - id _file; - id _marker; + id _file; + id _marker; } - (id)initWithCoder:(CPCoder)aCoder diff --git a/AppKit/CoreGraphics/CGColorSpace.j b/AppKit/CoreGraphics/CGColorSpace.j index 711d7725b..f6a529c1a 100644 --- a/AppKit/CoreGraphics/CGColorSpace.j +++ b/AppKit/CoreGraphics/CGColorSpace.j @@ -193,7 +193,7 @@ function CGColorSpaceRetain(aColorSpace) } // FIXME: We should refer to some default values. -#define STANDARDIZE(components, index, minimum, maximum, multiplier) \ +#define STANDARDIZE(components, index, minimum, maximum, multiplier) \ { \ if (index > components.length) \ { \ diff --git a/AppKit/CoreGraphics/CGGeometry.j b/AppKit/CoreGraphics/CGGeometry.j index ecb0cb4e3..20775a1a8 100644 --- a/AppKit/CoreGraphics/CGGeometry.j +++ b/AppKit/CoreGraphics/CGGeometry.j @@ -245,14 +245,14 @@ function CGPointFromString(aString) { var comma = aString.indexOf(','); - return { x:parseInt(aString.substr(1, comma - 1)), y:parseInt(aString.substring(comma + 1, aString.length)) }; + return { x:parseFloat(aString.substr(1, comma - 1)), y:parseFloat(aString.substring(comma + 1, aString.length)) }; } function CGSizeFromString(aString) { var comma = aString.indexOf(','); - return { width:parseInt(aString.substr(1, comma - 1)), height:parseInt(aString.substring(comma + 1, aString.length)) }; + return { width:parseFloat(aString.substr(1, comma - 1)), height:parseFloat(aString.substring(comma + 1, aString.length)) }; } function CGRectFromString(aString) diff --git a/AppKit/Themes/Default/AppController.j b/AppKit/Themes/Default/AppController.j index 8a421e4c3..8ccddb630 100644 --- a/AppKit/Themes/Default/AppController.j +++ b/AppKit/Themes/Default/AppController.j @@ -31,9 +31,8 @@ [_CPCibCustomResource imageResourceWithName:"horizontal-track-center.png" size:CPSizeMake(1.0, 4.0)], [_CPCibCustomResource imageResourceWithName:"horizontal-track-right.png" size:CPSizeMake(2.0, 4.0)] ] - isVertical:NO]]; - - var horizontalSlider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 24.0)]; + isVertical:NO]], + horizontalSlider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 24.0)]; [horizontalSlider setTrackWidth:4.0]; [horizontalSlider setHorizontalTrackColor:horizontalTrackColor]; @@ -55,9 +54,8 @@ [_CPCibCustomResource imageResourceWithName:"vertical-track-center.png" size:CPSizeMake(4.0, 1.0)], [_CPCibCustomResource imageResourceWithName:"vertical-track-bottom.png" size:CPSizeMake(4.0, 2.0)] ] - isVertical:YES]]; - - var verticalSlider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 24.0, 50.0)]; + isVertical:YES]], + verticalSlider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 24.0, 50.0)]; [verticalSlider setTrackWidth:4]; [verticalSlider setVerticalTrackColor:verticalTrackColor]; diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index e666ceb15..d65b4226a 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -245,7 +245,7 @@ Date.parseISO8601 = function (date) if (isNaN(timestamp) && (struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) { - // avoid NaN timestamps caused by “undefined” values being passed to Date.UTC + // avoid NaN timestamps caused by "undefined" values being passed to Date.UTC for (var i = 0, k; (k = numericKeys[i]); ++i) struct[k] = +struct[k] || 0; diff --git a/Foundation/CPDecimal.j b/Foundation/CPDecimal.j index c8b52f739..ec06deea7 100644 --- a/Foundation/CPDecimal.j +++ b/Foundation/CPDecimal.j @@ -181,7 +181,7 @@ function CPDecimalMakeWithParts(mantissa, exponent) var m = [], isNegative = NO; - if (mantissa < 0 ) + if (mantissa < 0) { isNegative = YES; mantissa = ABS(mantissa); @@ -1400,10 +1400,9 @@ function CPDecimalRound(result, dcm, scale ,roundingMode) function CPDecimalCompact(dcm) { // if positive or zero exp leading zeros simply delete, trailing ones u need to increment exponent - if (!dcm || dcm._mantissa.length == 0 || CPDecimalIsNotANumber(dcm) ) + if (!dcm || dcm._mantissa.length == 0 || CPDecimalIsNotANumber(dcm)) return; - if (CPDecimalIsZero(dcm)) { // handle zero number compacting diff --git a/Foundation/CPNumber.j b/Foundation/CPNumber.j index 870740614..1373a025a 100644 --- a/Foundation/CPNumber.j +++ b/Foundation/CPNumber.j @@ -222,7 +222,8 @@ FIXME: Do we need this? - (CPString)descriptionWithLocale:(CPDictionary)aDictionary { - if (!aDictionary) return toString(); + if (!aDictionary) + return toString(); throw new Error("descriptionWithLocale: NOT YET IMPLEMENTED"); } @@ -234,37 +235,43 @@ FIXME: Do we need this? - (double)doubleValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } - (float)floatValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } - (int)intValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } - (long long)longLongValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } - (long)longValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } - (short)shortValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } @@ -280,7 +287,8 @@ FIXME: Do we need this? - (unsigned int)unsignedIntValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } /* @@ -292,20 +300,24 @@ FIXME: Do we need this? */ - (unsigned long)unsignedLongValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } - (unsigned short)unsignedShortValue { - if (typeof self == "boolean") return self ? 1 : 0; + if (typeof self == "boolean") + return self ? 1 : 0; return self; } - (CPComparisonResult)compare:(CPNumber)aNumber { - if (self > aNumber) return CPOrderedDescending; - else if (self < aNumber) return CPOrderedAscending; + if (self > aNumber) + return CPOrderedDescending; + else if (self < aNumber) + return CPOrderedAscending; return CPOrderedSame; } diff --git a/Foundation/CPScanner.j b/Foundation/CPScanner.j index cd362ad5a..ea2ffb3dc 100644 --- a/Foundation/CPScanner.j +++ b/Foundation/CPScanner.j @@ -292,7 +292,7 @@ loc += (""+f).length; var i = 0; - while (!isNaN(parseFloat(str.substring(loc+i, str.length)))) + while (!isNaN(parseFloat(str.substring(loc + i, str.length)))) {i++;} [self setScanLocation:loc + i]; diff --git a/Foundation/CPString.j b/Foundation/CPString.j index 6b8779ccd..4dc630026 100644 --- a/Foundation/CPString.j +++ b/Foundation/CPString.j @@ -66,9 +66,9 @@ CPNumericSearch = 64; */ CPDiacriticInsensitiveSearch = 128; -var CPStringUIDs = new CFMutableDictionary(); +var CPStringUIDs = new CFMutableDictionary(), -var CPStringRegexSpecialCharacters = [ + CPStringRegexSpecialCharacters = [ '/', '.', '*', '+', '?', '|', '$', '^', '(', ')', '[', ']', '{', '}', '\\' ], @@ -624,9 +624,9 @@ var CPStringRegexSpecialCharacters = [ rhs = [rhs lowercaseString]; } - for (; len < min; len++ ) + for (; len < min; len++) { - if ( [lhs characterAtIndex:len] !== [rhs characterAtIndex:len] ) + if ([lhs characterAtIndex:len] !== [rhs characterAtIndex:len]) break; } @@ -706,14 +706,77 @@ var CPStringRegexSpecialCharacters = [ Returns an the path components of this string. This method assumes that the string's content is a '/' separated file system path. + Multiple '/' separators between components are truncated to a single one. */ - (CPArray)pathComponents { + if (length === 0) + return [""]; + + if (self === "/") + return ["/"]; + var result = split('/'); + if (result[0] === "") result[0] = "/"; - if (result[result.length - 1] === "") - result.pop(); + + var index = result.length - 1; + + if (index > 0) + { + if (result[index] === "") + result[index] = "/"; + + while (index--) + { + while (result[index] === "") + result.splice(index--, 1); + } + } + + return result; +} + +/*! + Returns a string built from the strings in a given array by + concatenating them with a path separator between each pair. + This method assumes that the string's content is a '/' + separated file system path. + Multiple '/' separators between components are truncated to a single one. +*/ ++ (CPString)pathWithComponents:(CPArray)components +{ + var size = components.length, + result = "", + i = -1, + firstRound = true, + firstIsSlash = false; + + while (++i < size) + { + var component = components[i], + lenMinusOne = component.length - 1; + + if (lenMinusOne >= 0 && (component !== "/" || firstRound)) // Skip "" and "/" (not first time) + { + if (lenMinusOne > 0 && component.indexOf("/",lenMinusOne) === lenMinusOne) // Ends with "/" + component = component.substring(0, lenMinusOne); + + if (firstRound) + { + if (component === "/") + firstIsSlash = true; + firstRound = false; + } + else if (!firstIsSlash) + result += "/"; + else + firstIsSlash = false; + + result += component; + } + } return result; } @@ -737,41 +800,87 @@ var CPStringRegexSpecialCharacters = [ */ - (CPString)lastPathComponent { - var components = [self pathComponents]; - return components[components.length - 1]; + var components = [self pathComponents], + lastIndex = components.length - 1, + lastComponent = components[lastIndex]; + + return lastIndex > 0 && lastComponent === "/" ? components[lastIndex - 1] : lastComponent; +} + +/*! + Returns a new string made by appending to the receiver a given string + This method assumes that the string's content is a '/' + separated file system path. + Multiple '/' separators between components are truncated to a single one. +*/ +- (CPString)stringByAppendingPathComponent:(CPString)aString +{ + var components = [self pathComponents], + addComponents = aString && aString !== "/" ? [aString pathComponents] : []; + + return [CPString pathWithComponents:components.concat(addComponents)]; +} + +/*! + Returns a new string made by appending to the receiver an extension separator followed by a given extension + This method assumes that the extension separator is a '.' + Extension can't include a '/' character, receiver can't be empty or be just a '/'. If so the + result will be the receiver itself. + Multiple '/' separators between components are truncated to a single one. +*/ +- (CPString)stringByAppendingPathExtension:(CPString)ext +{ + if (ext.indexOf('/') >= 0 || length === 0 || self === "/") // Can't handle these + return self; + + var components = [self pathComponents], + last = components.length - 1; + + if (last > 0 && components[last] === "/") + components.splice(last--, 1); + + components[last] = components[last] + "." + ext; + + return [CPString pathWithComponents:components]; } /*! Deletes the last path component of a string. This method assumes that the string's content is a '/' separated file system path. + Multiple '/' separators between components are truncated to a single one. */ - (CPString)stringByDeletingLastPathComponent { - var path = self, - start = length - 1; + if (length === 0) + return ""; + else if (self === "/") + return "/"; - while (path.charAt(start) === '/') - start--; + var components = [self pathComponents], + last = components.length - 1; - path = path.substr(0, path.lastIndexOf('/', start)); + if (components[last] === "/") + last--; - if (path === "" && charAt(0) === '/') - return '/'; + components.splice(last, components.length - last); - return path; + return [CPString pathWithComponents:components]; } /*! Deletes the extension of a string. + This method assumes that the string's content is a '/' + separated file system path. + Multiple '/' separators between components are truncated to a single one. */ - (CPString)stringByDeletingPathExtension { var extension = [self pathExtension]; + if (extension === "") return self; - - if (lastIndexOf('.') < 1) + else if (lastIndexOf('.') < 1) return self; return substr(0, [self length] - (extension.length + 1)); @@ -785,6 +894,7 @@ var CPStringRegexSpecialCharacters = [ @end + @implementation CPString (JSON) /*! @@ -824,12 +934,14 @@ var CPStringRegexSpecialCharacters = [ @end + var diacritics = [[192,198],[224,230],[231,231],[232,235],[236,239],[242,246],[249,252]], // Basic Latin ; Latin-1 Supplement. normalized = [65,97,99,101,105,111,117]; String.prototype.stripDiacritics = function() { var output = ""; + for (var indexSource = 0; indexSource < this.length; indexSource++) { var code = this.charCodeAt(indexSource); diff --git a/Tests/AppKit/CPSplitViewTest.j b/Tests/AppKit/CPSplitViewTest.j index bb05b417e..04a99b9be 100644 --- a/Tests/AppKit/CPSplitViewTest.j +++ b/Tests/AppKit/CPSplitViewTest.j @@ -111,11 +111,27 @@ { // Verify that the split view does not attempt to auto save without an auto save name. + // This storage class will cause a crash if a save is attempted. [[CPUserDefaults standardUserDefaults] setPersistentStoreClass:CPUserDefaultsFailingStore forDomain:CPApplicationDomain reloadData:NO]; - [splitView setPosition:50 ofDividerAtIndex:0]; - [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + + // Now test that it does work normally. + [[CPUserDefaults standardUserDefaults] setPersistentStoreClass:CPUserDefaultsTestStore forDomain:CPApplicationDomain reloadData:NO]; + [splitView setAutosaveName:@"Charles"]; + [splitView setPosition:25 ofDividerAtIndex:0]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + + // Recreate the split view. + [self setUp]; + [splitView setAutosaveName:@"Charles"]; + // FIXME At the moment restore from autosave only happens if the split view is loaded from a + // coder. It seems like it should happen when initialising in code too, but some research of + // Cocoa's behaviour will need to be done first. + splitView._needsRestoreFromAutosave = YES; + // Trigger autosave restore. + [splitView setFrameSize:CGSizeMake(110, 100)]; + [self assert:25 equals:[viewA frameSize].height message:@"divider position restored"]; } @end @@ -131,6 +147,7 @@ } @end + /*! This store always fails. */ @@ -149,3 +166,24 @@ } @end + +/*! + This is a temporary store. +*/ +@implementation CPUserDefaultsTestStore : CPUserDefaultsStore +{ + CPData _data; +} + +- (CPData)data +{ + return _data; +} + +- (void)setData:(CPData)aData +{ + _data = aData; +} + +@end + diff --git a/Tests/Foundation/CPStringTest.j b/Tests/Foundation/CPStringTest.j index 678a560ce..67f06f299 100644 --- a/Tests/Foundation/CPStringTest.j +++ b/Tests/Foundation/CPStringTest.j @@ -225,6 +225,52 @@ [self assert:"ffffff" equals:[CPString stringWithHash:16777215]]; } +- (void)testStringByAppendingPathComponent +{ + var testStrings = [ + ["/tmp/", "scratch.tiff", "/tmp/scratch.tiff"], + ["/tmp///", "scratch.tiff", "/tmp/scratch.tiff"], + ["/tmp///", "///scratch.tiff", "/tmp/scratch.tiff"], + ["/tmp", "scratch.tiff", "/tmp/scratch.tiff"], + ["/tmp///", "scratch.tiff", "/tmp/scratch.tiff"], + ["/tmp///", "///scratch.tiff", "/tmp/scratch.tiff"], + ["/", "scratch.tiff", "/scratch.tiff"], + ["", "scratch.tiff", "scratch.tiff"], + ["", "", ""], + ["", "/", ""], + ["/", "/", "/"], + ["/tmp", nil, "/tmp"], + ["/tmp", "/", "/tmp"], + ["/tmp/", "", "/tmp"] + ]; + + for (var i = 0; i < testStrings.length; i++) + { + var result = [testStrings[i][0] stringByAppendingPathComponent:testStrings[i][1]]; + + [self assertTrue:result === testStrings[i][2] message:"Value <" + testStrings[i][0] + "> Adding <" + testStrings[i][1] + "> Expected <" + testStrings[i][2] + "> was <" + result + ">"]; + } +} + +- (void)testStringByAppendingPathExtension +{ + var testStrings = [ + ["/tmp/scratch.old", "tiff", "/tmp/scratch.old.tiff"], + ["/tmp/scratch.", "tiff", "/tmp/scratch..tiff"], + ["/tmp///", "tiff", "/tmp.tiff"], + ["scratch", "tiff", "scratch.tiff"], + ["/", "tiff", "/"], + ["", "tiff", ""] + ]; + + for (var i = 0; i < testStrings.length; i++) + { + var result = [testStrings[i][0] stringByAppendingPathExtension:testStrings[i][1]]; + + [self assertTrue:result === testStrings[i][2] message:"Value <" + testStrings[i][0] + "> Adding <" + testStrings[i][1] + "> Expected <" + testStrings[i][2] + "> was <" + result + ">"]; + } +} + - (void)testStringByDeletingLastPathComponent { var testStrings = [ @@ -235,22 +281,58 @@ ["/", "/"], ["scratch.tiff", ""], ["a/b/c/d//////", "a/b/c"], + ["a/b/////////c/d//////", "a/b/c"], ["a/b/././././c/d/./././", "a/b/././././c/d/./."], [@"a/b/././././d////", "a/b/./././."], [@"~/a", "~"], [@"~/a/", "~"], - [@"../../", ".."] + [@"../../", ".."], + [@"", ""] ]; for (var i = 0; i < testStrings.length; i++) - [self assert:[testStrings[i][0] stringByDeletingLastPathComponent] equals:testStrings[i][1]]; + { + var result = [testStrings[i][0] stringByDeletingLastPathComponent]; + + [self assertTrue:result === testStrings[i][1] message:"Value <" + testStrings[i][0] + "> Expected <" + testStrings[i][1] + "> was <" + result + ">"]; + } +} + +- (void)testPathWithComponents +{ + var testStrings = [ + [["tmp", "scratch"], "tmp/scratch"], + [["/", "tmp", "scratch"], "/tmp/scratch"], + [["/", "tmp", "/", "scratch"], "/tmp/scratch"], + [["/", "tmp", "scratch", "/"], "/tmp/scratch"], + [["/", "tmp", "scratch", ""], "/tmp/scratch"], + [["", "/tmp", "scratch", ""], "/tmp/scratch"], + [["", "tmp", "scratch", ""], "tmp/scratch"], + [["/"], "/"], + [["/", "/", "/"], "/"], + [["", "", ""], ""], + [[""], ""] + ]; + + for (var i = 0; i < testStrings.length; i++) + { + var result = [CPString pathWithComponents:testStrings[i][0]]; + + [self assertTrue:result === testStrings[i][1] message:"Value <" + testStrings[i][0] + "> Expected [" + testStrings[i][1] + "] was [" + result + "]"]; + } } - (void)testPathComponents { var testStrings = [ ["tmp/scratch", ["tmp", "scratch"]], - ["/tmp/scratch", ["/", "tmp", "scratch"]] + ["/tmp/scratch", ["/", "tmp", "scratch"]], + ["/tmp/scratch/", ["/", "tmp", "scratch", "/"]], + ["/tmp/", ["/", "tmp", "/"]], + ["/////tmp/////scratch///", ["/", "tmp", "scratch", "/"]], + ["scratch.tiff", ["scratch.tiff"]], + ["/", ["/"]], + ["", [""]] ]; for (var i = 0; i < testStrings.length; i++) @@ -268,7 +350,8 @@ ["/tmp/scratch", "scratch"], ["/tmp/", "tmp"], ["scratch", "scratch"], - ["/", "/"] + ["/", "/"], + ["", ""] ]; for (var i = 0; i < testStrings.length; i++) diff --git a/Tests/Manual/CPPopover/AppController.j b/Tests/Manual/CPPopover/AppController.j index 73f8c9af3..6d58f9762 100644 --- a/Tests/Manual/CPPopover/AppController.j +++ b/Tests/Manual/CPPopover/AppController.j @@ -143,7 +143,7 @@ } } -- (IBAction)open:(id)sender +- (@action)open:(id)sender { var edge = [self popoverEdge], appearance; @@ -169,12 +169,12 @@ [popoverWindow orderFront:nil]; } -- (IBAction)openWindowPopover:(id)sender +- (@action)openWindowPopover:(id)sender { [windowPopover showRelativeToRect:nil ofView:sender preferredEdge:[self popoverEdge]]; } -- (IBAction)movePopover:(id)sender +- (@action)movePopover:(id)sender { if (++lastPreferredEdge > CPMaxYEdge) lastPreferredEdge = CPMinXEdge; @@ -182,6 +182,11 @@ [popover showRelativeToRect:CGRectMakeZero() ofView:lastButton preferredEdge:lastPreferredEdge]; } +- (@action)closePopover:(id)sender +{ + [popover close]; +} + - (void)initPopover:(CPPopover)aPopover withAppearance:(int)appearance { [aPopover setDelegate:self]; diff --git a/Tests/Manual/CPPopover/Resources/MainMenu.cib b/Tests/Manual/CPPopover/Resources/MainMenu.cib index 5e479a9d1..cc2a9d47f 100644 --- a/Tests/Manual/CPPopover/Resources/MainMenu.cib +++ b/Tests/Manual/CPPopover/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;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;19E;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;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;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;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;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;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;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;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;52E;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;2;53E;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;2;54E;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;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;55E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;57E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;48E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;31E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;35E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;31E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;60E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;47E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;49E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;48E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;47E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;60E;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;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;40E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;61E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;63E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;51E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;48E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;61E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;53E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;64E;E;D;K;10;$classnameS;16;CPViewControllerK;8;$classesA;S;16;CPViewControllerS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;23;CPViewControllerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPViewControllerTitleKeyD;K;6;CP$UIDd;1;0E;K;26;CPViewControllerCibNameKeyD;K;6;CP$UIDd;1;0E;K;25;CPViewControllerBundleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;9;CPPopoverK;8;$classesA;S;9;CPPopoverS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;22;CPPopoverAppearanceKeyD;K;6;CP$UIDd;2;65E;K;20;CPPopoverAnimatesKeyD;K;6;CP$UIDd;2;66E;K;33;CPPopoverContentViewControllerKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverDelegateKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverBehaviorKeyD;K;6;CP$UIDd;2;67E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;68E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;69E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;2;72E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;73E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;74E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;75E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;6;$afontD;K;6;CP$UIDd;2;79E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;80E;K;11;$aalignmentD;K;6;CP$UIDd;2;81E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;82E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;83E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;66E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;66E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;66E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;85E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;80E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;81E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;87E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;89E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;6;$afontD;K;6;CP$UIDd;2;90E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;67E;K;11;$aalignmentD;K;6;CP$UIDd;2;80E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;91E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;83E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;92E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;92E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;92E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;67E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;80E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;93E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;96E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;97E;K;6;$afontD;K;6;CP$UIDd;2;98E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;65E;K;11;$aalignmentD;K;6;CP$UIDd;2;80E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;81E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;99E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;80E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;65E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;100E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;96E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;97E;K;6;$afontD;K;6;CP$UIDd;2;98E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;65E;K;11;$aalignmentD;K;6;CP$UIDd;2;80E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;81E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;102E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;80E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;65E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;103E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;104E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;105E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;106E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;107E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;45E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;108E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;108E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;110E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;111E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;75E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;96E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;97E;K;6;$afontD;K;6;CP$UIDd;2;98E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;65E;K;11;$aalignmentD;K;6;CP$UIDd;2;80E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;81E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;112E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;80E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;65E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;23;CPViewControllerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPViewControllerTitleKeyD;K;6;CP$UIDd;1;0E;K;26;CPViewControllerCibNameKeyD;K;6;CP$UIDd;1;0E;K;25;CPViewControllerBundleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;22;CPPopoverAppearanceKeyD;K;6;CP$UIDd;2;65E;K;20;CPPopoverAnimatesKeyD;K;6;CP$UIDd;2;66E;K;33;CPPopoverContentViewControllerKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverDelegateKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverBehaviorKeyD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;113E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;113E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;114E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;117E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;6;$afontD;K;6;CP$UIDd;2;79E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;80E;K;11;$aalignmentD;K;6;CP$UIDd;2;80E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;83E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;92E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;92E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;92E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;80E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;80E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;119E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;49E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;95E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;96E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;97E;K;6;$afontD;K;6;CP$UIDd;2;98E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;65E;K;11;$aalignmentD;K;6;CP$UIDd;2;80E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;81E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;99E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;92E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;80E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;65E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;120E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;120E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;6;$afontD;K;6;CP$UIDd;2;79E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;80E;K;11;$aalignmentD;K;6;CP$UIDd;2;81E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;66E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;121E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;83E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;92E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;92E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;92E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;80E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;81E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;8;delegateS;7;popoverS;13;popoverWindowS;13;windowPopoverS;4;viewS;21;contentViewControllerS;13;performClose:S;12;movePopover:S;18;openWindowPopover:S;13;AppControllerd;1;0T;d;1;1S;20;{{0, 0}, {301, 217}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;38E;E;E;d;2;12S;6;normalS;6;CPViewS;21;{{25, 94}, {247, 29}}S;19;{{0, 0}, {247, 29}}d;2;45S;9;textfieldS;19;bezeled+placeholderD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;122E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;70E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;92E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;92E;E;d;1;2d;1;4S;0;d;4;3072D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;123E;E;S;15;Write somethingS;21;{{28, 43}, {245, 34}}S;19;{{0, 0}, {245, 34}}d;2;37D;K;6;$classD;K;6;CP$UIDd;2;78E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;122E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;124E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;66E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;92E;E;S;14;I’m a popover!F;S;22;{{38, 153}, {114, 24}}S;19;{{0, 0}, {114, 24}}d;2;13S;6;buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;2;78E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;122E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;70E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;66E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;92E;E;S;12;performCloseS;22;{{197, 153}, {62, 24}}S;18;{{0, 0}, {62, 24}}S;4;MoveS;32;{10000000000000, 10000000000000}S;8;CPWindowS;24;{{344, 245}, {212, 112}}d;2;15S;6;WindowS;20;{{0, 0}, {212, 112}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;46E;E;E;S;20;{{60, 43}, {87, 24}}S;18;{{0, 0}, {87, 24}}S;9;Click me!S;19;{{0, 0}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;50E;E;E;S;20;{{37, 20}, {89, 17}}S;18;{{0, 0}, {89, 17}}d;2;36S;11;From windowS;21;{{22, 54}, {114, 24}}S;18;{{0, 0}, {38, 17}}S;5;LabelS;17;Arial, sans-serifD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;E;E;d;2;20E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;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;19E;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;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;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;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;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;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;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;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;54E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;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;2;55E;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;2;56E;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;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;57E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;60E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;36E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;61E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;34E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;32E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;49E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;61E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;50E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;49E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;62E;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;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;63E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;42E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;48E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;65E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;53E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;63E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;66E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;55E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;67E;E;D;K;10;$classnameS;16;CPViewControllerK;8;$classesA;S;16;CPViewControllerS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;23;CPViewControllerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPViewControllerTitleKeyD;K;6;CP$UIDd;1;0E;K;26;CPViewControllerCibNameKeyD;K;6;CP$UIDd;1;0E;K;25;CPViewControllerBundleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;9;CPPopoverK;8;$classesA;S;9;CPPopoverS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;22;CPPopoverAppearanceKeyD;K;6;CP$UIDd;2;68E;K;20;CPPopoverAnimatesKeyD;K;6;CP$UIDd;2;69E;K;33;CPPopoverContentViewControllerKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverDelegateKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverBehaviorKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;16;_CPCibCustomViewK;8;$classesA;S;16;_CPCibCustomViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;71E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;71E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;72E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;73E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;2;75E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;76E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;77E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;6;$afontD;K;6;CP$UIDd;2;81E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;70E;K;11;$aalignmentD;K;6;CP$UIDd;2;82E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;69E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;83E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;85E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;85E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;85E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;70E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;82E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;86E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;87E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;88E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;89E;K;6;$afontD;K;6;CP$UIDd;2;90E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;82E;K;11;$aalignmentD;K;6;CP$UIDd;2;91E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;69E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;69E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;69E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;69E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;94E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;82E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;91E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;2;95E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;96E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;100E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;102E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;85E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;68E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;100E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;105E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;85E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;68E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;106E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;100E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;108E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;85E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;68E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;109E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;110E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;111E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;112E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;113E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;47E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;114E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;114E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;115E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;116E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;117E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;88E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;100E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;118E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;85E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;68E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;23;CPViewControllerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPViewControllerTitleKeyD;K;6;CP$UIDd;1;0E;K;26;CPViewControllerCibNameKeyD;K;6;CP$UIDd;1;0E;K;25;CPViewControllerBundleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;22;CPPopoverAppearanceKeyD;K;6;CP$UIDd;2;68E;K;20;CPPopoverAnimatesKeyD;K;6;CP$UIDd;2;69E;K;33;CPPopoverContentViewControllerKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverDelegateKeyD;K;6;CP$UIDd;1;0E;K;20;CPPopoverBehaviorKeyD;K;6;CP$UIDd;2;68E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;119E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;119E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;120E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;73E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;2;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;121E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;122E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;6;$afontD;K;6;CP$UIDd;2;90E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;82E;K;11;$aalignmentD;K;6;CP$UIDd;2;82E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;69E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;124E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;85E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;85E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;85E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;82E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;82E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;100E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;108E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;85E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;82E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;68E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;73E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;6;$afontD;K;6;CP$UIDd;2;90E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;82E;K;11;$aalignmentD;K;6;CP$UIDd;2;91E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;69E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;127E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;85E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;85E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;85E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;82E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;91E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;8;delegateS;7;popoverS;13;popoverWindowS;13;windowPopoverS;4;viewS;21;contentViewControllerS;13;performClose:S;12;movePopover:S;18;openWindowPopover:S;13;closePopover:S;13;AppControllerd;1;0T;d;1;1S;20;{{0, 0}, {301, 261}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;39E;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;38E;E;E;d;2;12S;6;normalS;6;CPViewS;21;{{28, 43}, {245, 34}}S;19;{{0, 0}, {245, 34}}d;2;37S;9;textfieldD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;128E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;129E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;69E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;85E;E;d;1;2S;14;I’m a popover!d;4;3072F;S;21;{{25, 98}, {247, 29}}S;19;{{0, 0}, {247, 29}}d;2;45S;19;bezeled+placeholderD;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;128E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;73E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;85E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;85E;E;d;1;4S;0;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;93E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;130E;E;S;15;Write somethingS;22;{{118, 181}, {61, 24}}S;18;{{0, 0}, {61, 24}}d;2;13S;6;buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;128E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;73E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;69E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;85E;E;S;5;closeS;22;{{117, 213}, {62, 24}}S;18;{{0, 0}, {62, 24}}S;4;MoveS;22;{{91, 149}, {114, 24}}S;19;{{0, 0}, {114, 24}}S;12;performCloseS;32;{10000000000000, 10000000000000}S;8;CPWindowS;24;{{344, 485}, {212, 112}}d;2;15S;6;WindowS;20;{{0, 0}, {212, 112}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;48E;E;E;S;20;{{60, 43}, {87, 24}}S;18;{{0, 0}, {87, 24}}S;9;Click me!S;19;{{0, 0}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;52E;E;E;S;20;{{37, 20}, {89, 17}}S;18;{{0, 0}, {89, 17}}d;2;36S;11;From windowS;21;{{22, 54}, {114, 24}}S;18;{{0, 0}, {38, 17}}S;5;LabelS;17;Arial, sans-serifd;2;20D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;70E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPPopover/Resources/MainMenu.xib b/Tests/Manual/CPPopover/Resources/MainMenu.xib index b05caa61a..48341fcdb 100644 --- a/Tests/Manual/CPPopover/Resources/MainMenu.xib +++ b/Tests/Manual/CPPopover/Resources/MainMenu.xib @@ -2,10 +2,10 @@ 1050 - 11D50 + 11E53 2182 - 1138.32 - 568.00 + 1138.47 + 569.00 com.apple.InterfaceBuilder.CocoaPlugin 2182 @@ -62,7 +62,7 @@ 301 - {{31, 97}, {239, 22}} + {{31, 137}, {239, 22}} @@ -101,10 +101,33 @@ + + + 293 + {{114, 50}, {73, 32}} + + + _NS:9 + YES + + 67239424 + 134217728 + close + + _NS:9 + + -2038284033 + 129 + + + 200 + 25 + + 293 - {{193, 34}, {74, 32}} + {{113, 18}, {74, 32}} @@ -128,7 +151,7 @@ 293 - {{34, 34}, {126, 32}} + {{87, 82}, {126, 32}} @@ -152,7 +175,7 @@ 269 - {{28, 141}, {245, 32}} + {{28, 185}, {245, 32}} @@ -187,7 +210,7 @@ - {301, 217} + {301, 261} @@ -239,7 +262,7 @@ _NS:20 - {{0, 0}, {1920, 1178}} + {{0, 0}, {2560, 1418}} {10000000000000, 10000000000000} YES @@ -263,6 +286,7 @@ {{18, 12}, {126, 32}} + _NS:9 YES @@ -286,7 +310,7 @@ {{37, 59}, {89, 17}} - + _NS:1505 YES @@ -309,11 +333,9 @@ NSView - + 268 {38, 17} - - _NS:1505 YES @@ -379,6 +401,14 @@ 555 + + + closePopover: + + + + 559 + view @@ -478,10 +508,11 @@ YES - - + + + @@ -638,6 +669,20 @@ + + 556 + + + YES + + + + + + 557 + + + @@ -675,6 +720,8 @@ 536.IBPluginDependency 551.IBPluginDependency 552.IBPluginDependency + 556.IBPluginDependency + 557.IBPluginDependency YES @@ -709,6 +756,8 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin @@ -723,7 +772,7 @@ - 555 + 559 @@ -735,6 +784,7 @@ YES YES + closePopover: movePopover: open: openWindowPopover: @@ -744,18 +794,24 @@ id id id + id YES YES + closePopover: movePopover: open: openWindowPopover: YES + + closePopover: + id + movePopover: id diff --git a/Tools/capp/Resources/Templates/NibApplication/Resources/MainMenu.xib b/Tools/capp/Resources/Templates/NibApplication/Resources/MainMenu.xib index 0c98cf0b6..5a9d4667c 100644 --- a/Tools/capp/Resources/Templates/NibApplication/Resources/MainMenu.xib +++ b/Tools/capp/Resources/Templates/NibApplication/Resources/MainMenu.xib @@ -2,13 +2,13 @@ 1050 - 10J869 - 1306 - 1038.35 - 461.00 + 11E53 + 2182 + 1138.47 + 569.00 com.apple.InterfaceBuilder.CocoaPlugin - 1306 + 2182 YES @@ -27,11 +27,8 @@ com.apple.InterfaceBuilder.CocoaPlugin - YES - - YES - - + PluginDependencyRecalculationVersion + YES @@ -1127,8 +1124,9 @@ Window NSWindow + - + 256 YES @@ -1137,7 +1135,6 @@ 301 {{192, 143}, {96, 21}} - YES -2079981824 @@ -1164,7 +1161,6 @@ 301 {{192, 191}, {96, 22}} - YES -1804468671 @@ -1199,11 +1195,10 @@ {{7, 11}, {480, 360}} - - {{0, 0}, {1440, 878}} - {1e+13, 1e+13} + {10000000000000, 10000000000000} + YES AppController @@ -1212,6 +1207,30 @@ YES + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 451 + performMiniaturize: @@ -1252,14 +1271,6 @@ 127 - - - orderFrontStandardAboutPanel: - - - - 142 - performClose: @@ -1692,21 +1703,13 @@ 448 - - - terminate: - - - - 449 - - delegate - - + theWindow + + - 451 + 459 @@ -1716,21 +1719,15 @@ 458 - - - theWindow - - - - 459 - YES 0 - + + YES + @@ -1794,7 +1791,6 @@ - 1 217 @@ -1837,19 +1833,16 @@ 75 - 3 80 - 8 78 - 6 72 @@ -1860,7 +1853,6 @@ 82 - 9 124 @@ -1875,31 +1867,26 @@ 77 - 5 73 - 1 79 - 7 112 - 10 74 - 2 125 @@ -2072,7 +2059,6 @@ - 2 111 @@ -2117,7 +2103,6 @@ 136 - 1111 144 @@ -2128,7 +2113,6 @@ 129 - 121 143 @@ -2661,142 +2645,70 @@ -2.IBPluginDependency -3.IBPluginDependency 103.IBPluginDependency - 103.ImportedFromIB2 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect 111.IBPluginDependency - 111.ImportedFromIB2 112.IBPluginDependency - 112.ImportedFromIB2 124.IBPluginDependency - 124.ImportedFromIB2 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency - 126.ImportedFromIB2 129.IBPluginDependency - 129.ImportedFromIB2 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect 131.IBPluginDependency - 131.ImportedFromIB2 134.IBPluginDependency - 134.ImportedFromIB2 136.IBPluginDependency - 136.ImportedFromIB2 143.IBPluginDependency - 143.ImportedFromIB2 144.IBPluginDependency - 144.ImportedFromIB2 145.IBPluginDependency - 145.ImportedFromIB2 149.IBPluginDependency - 149.ImportedFromIB2 150.IBPluginDependency - 150.ImportedFromIB2 19.IBPluginDependency - 19.ImportedFromIB2 195.IBPluginDependency - 195.ImportedFromIB2 196.IBPluginDependency - 196.ImportedFromIB2 197.IBPluginDependency - 197.ImportedFromIB2 198.IBPluginDependency - 198.ImportedFromIB2 199.IBPluginDependency - 199.ImportedFromIB2 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect 201.IBPluginDependency - 201.ImportedFromIB2 202.IBPluginDependency - 202.ImportedFromIB2 203.IBPluginDependency - 203.ImportedFromIB2 204.IBPluginDependency - 204.ImportedFromIB2 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect 206.IBPluginDependency - 206.ImportedFromIB2 207.IBPluginDependency - 207.ImportedFromIB2 208.IBPluginDependency - 208.ImportedFromIB2 209.IBPluginDependency - 209.ImportedFromIB2 210.IBPluginDependency - 210.ImportedFromIB2 211.IBPluginDependency - 211.ImportedFromIB2 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect 213.IBPluginDependency - 213.ImportedFromIB2 214.IBPluginDependency - 214.ImportedFromIB2 215.IBPluginDependency - 215.ImportedFromIB2 216.IBPluginDependency - 216.ImportedFromIB2 217.IBPluginDependency - 217.ImportedFromIB2 218.IBPluginDependency - 218.ImportedFromIB2 219.IBPluginDependency - 219.ImportedFromIB2 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency - 221.ImportedFromIB2 23.IBPluginDependency - 23.ImportedFromIB2 236.IBPluginDependency - 236.ImportedFromIB2 239.IBPluginDependency - 239.ImportedFromIB2 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect 295.IBPluginDependency 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 346.IBPluginDependency - 346.ImportedFromIB2 348.IBPluginDependency - 348.ImportedFromIB2 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect 350.IBPluginDependency - 350.ImportedFromIB2 351.IBPluginDependency - 351.ImportedFromIB2 354.IBPluginDependency - 354.ImportedFromIB2 - 371.IBEditorWindowLastContentRect 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch - 371.editorWindowContentRectSynchronizationRect 372.IBPluginDependency 375.IBPluginDependency - 376.IBEditorWindowLastContentRect 376.IBPluginDependency 377.IBPluginDependency 378.IBPluginDependency @@ -2809,7 +2721,6 @@ 385.IBPluginDependency 386.IBPluginDependency 387.IBPluginDependency - 388.IBEditorWindowLastContentRect 388.IBPluginDependency 389.IBPluginDependency 390.IBPluginDependency @@ -2848,183 +2759,92 @@ 456.IBPluginDependency 457.IBPluginDependency 5.IBPluginDependency - 5.ImportedFromIB2 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBEditorWindowLastContentRect 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency - 58.ImportedFromIB2 72.IBPluginDependency - 72.ImportedFromIB2 73.IBPluginDependency - 73.ImportedFromIB2 74.IBPluginDependency - 74.ImportedFromIB2 75.IBPluginDependency - 75.ImportedFromIB2 77.IBPluginDependency - 77.ImportedFromIB2 78.IBPluginDependency - 78.ImportedFromIB2 79.IBPluginDependency - 79.ImportedFromIB2 80.IBPluginDependency - 80.ImportedFromIB2 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect 82.IBPluginDependency - 82.ImportedFromIB2 83.IBPluginDependency - 83.ImportedFromIB2 92.IBPluginDependency - 92.ImportedFromIB2 - + YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{596, 852}, {216, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - 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 - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{187, 434}, {243, 243}} - 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 - - {{608, 612}, {167, 43}} - 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 - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{525, 802}, {197, 73}} - {{143, 285}, {478, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{6, 978}, {478, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - 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 + 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 {{303, 221}, {480, 360}} - {{33, 99}, {480, 360}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{437, 242}, {86, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3037,7 +2857,6 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{523, 2}, {178, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3076,40 +2895,21 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {{155, 102}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin - - {{23, 794}, {245, 183}} 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 - - {{145, 474}, {199, 203}} com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - @@ -3168,10 +2968,10 @@ NSMenuCheckmark NSMenuMixedState - + YES - {9, 8} - {7, 2} + {11, 11} + {10, 3} diff --git a/Tools/capp_lint/capp_lint b/Tools/capp_lint/capp_lint index 85fc96fb2..599eb7002 100755 --- a/Tools/capp_lint/capp_lint +++ b/Tools/capp_lint/capp_lint @@ -36,7 +36,7 @@ import os import os.path import re import sys - +import unittest EXIT_CODE_SHOW_HTML = 205 EXIT_CODE_SHOW_TOOLTIP = 206 @@ -77,7 +77,54 @@ def relative_path(basedir, filename): return filename +def string_replacer(line): + """Take string literals like 'hello' and replace them with empty string literals, while respecting escaping.""" + + r = [] + in_quote = None + escapes = 0 + for i, c in enumerate(line): + if in_quote: + if not escapes and c == in_quote: + in_quote = None + r.append(c) + continue + + # We're inside of a string literal. Ignore everything. + else: + if not escapes and (c == '"' or c == "'"): + in_quote = c + r.append(c) + continue + + # Outside of a string literal, preserve everything. + r.append(c) + + if c == '\\': + escapes = (escapes + 1) % 2 + else: + escapes = 0 + + if in_quote: + # Unterminated string literal. + pass + return "".join(r) + + class LintChecker(object): + """Examine Objective-J code statically and generate warnings for possible errors and deviations from the coding-style standard. + + >>> LintChecker().lint_text('var b = 5+5;') + [{'positions': [9], 'filename': '', 'lineNum': 1, 'message': 'binary operator without surrounding spaces', 'type': 2, 'line': u'var b = 5+5;'}] + + >>> LintChecker().lint_text(''' + ... if( 1 ) { + ... var b=7; + ... c = 8; + ... } + ... ''') + [{'positions': [2], 'filename': '', 'lineNum': 2, 'message': 'missing space between control statement and parentheses', 'type': 2, 'line': u'if( 1 ) {'}, {'positions': [8], 'filename': '', 'lineNum': 2, 'message': 'braces should be on their own line', 'type': 1, 'line': u'if( 1 ) {'}, {'positions': [3, 5], 'filename': '', 'lineNum': 2, 'message': 'space inside parentheses', 'type': 1, 'line': u'if( 1 ) {'}, {'positions': [7], 'filename': '', 'lineNum': 3, 'message': 'assignment operator without surrounding spaces', 'type': 2, 'line': u' var b=7;'}, {'lineNum': 4, 'message': 'accidental global variable', 'type': 1, 'line': u' c = 8;', 'filename': ''}] + """ VAR_BLOCK_START_RE = re.compile(ur'''(?x) (?P\s*) # indent before a var keyword @@ -128,15 +175,33 @@ class LintChecker(object): TRAILING_WHITESPACE_RE = re.compile(ur'^.*(\s+)$') STRIP_LINE_COMMENT_RE = re.compile(ur'(.*)\s*(?://.*|/\*.*\*/\s*)$') LINE_COMMENT_RE = re.compile(ur'\s*(?:/\*.*\*/\s*|//.*)$') + COMMENT_RE = re.compile(ur'/\*.*?\*/') BLOCK_COMMENT_START_RE = re.compile(ur'\s*/\*.*(?!\*/\s*)$') BLOCK_COMMENT_END_RE = re.compile(ur'.*?\*/') METHOD_RE = ur'[-+]\s*\([a-zA-Z_$]\w*\)\s*[a-zA-Z_$]\w*' FUNCTION_RE = re.compile(ur'\s*function\s*(?P[a-zA-Z_$]\w*)?\(.*\)\s*\{?') - STRING_LITERAL_RE = re.compile(ur'(?]*\)\s*\w+|[a-zA-Z_$]\w*(\+\+|--)|([ -+*/%^&|<>!]=?|&&|\|\||<<|>>>|={1,3}|!==?)\s*[-+][\w(\[])'), 'pass': False}, - 'preprocess': STD_IGNORES, - 'regex': re.compile(ur'(?<=[\w)\]"\']|([ ]))([-+*/%^]|&&?|\|\|?|<<|>>>?)(?=[\w({\["\']|(?(1)\b\b|[ ]))'), - 'error': 'binary operator without surrounding spaces', + # Also convert literals like 1.5e+7 to 42 so that the - or + in there is ignored for purposes of this warning. + 'preprocess': STD_IGNORES + EXPONENTIAL_TO_SIMPLE, + 'regex': re.compile(ur'(?<=[\w)\]"\']|([ ]))([-+*/%^]|&&?|\|\|?|<<|>>>?)(?=[\w({\["\']|(?(1)\b\b|[ ]))'), + 'error': 'binary operator without surrounding spaces', 'showPositionForGroup': 2, 'type': ERROR_TYPE_WARNING }, - { - # Filter out @import statements, method declarations - 'filter': {'regex': re.compile(ur'^(@import\b|\s*' + METHOD_RE + ')'), 'pass': False}, - - 'preprocess': STD_IGNORES, - 'regex': re.compile(ur'(?:[-*/%^&|<>!]=?|&&|\|\||<<|>>>|={1,3}|!==?)\s*(?>>?=)(?=[\w({\["\']|(?(1)\b\b|[ ]))'), - 'error': 'assignment operator without surrounding spaces', + 'regex': re.compile(ur'(?<=[\w)\]"\']|([ ]))(=|[-+*/%^&|]=|<<=|>>>?=)(?=[\w({\["\']|(?(1)\b\b|[ ]))'), + 'error': 'assignment operator without surrounding spaces', 'showPositionForGroup': 2, 'type': ERROR_TYPE_WARNING }, @@ -216,8 +293,8 @@ class LintChecker(object): 'filter': {'regex': re.compile(ur'^(@import\b|@implementation\b|\s*' + METHOD_RE + ')'), 'pass': False}, 'preprocess': STD_IGNORES, - 'regex': re.compile(ur'(?<=[\w)\]"\']|([ ]))(===?|!==?|[<>]=?)(?=[\w({\["\']|(?(1)\b\b|[ ]))'), - 'error': 'comparison operator without surrounding spaces', + 'regex': re.compile(ur'(?<=[\w)\]"\']|([ ]))(===?|!==?|[<>]=?)(?=[\w({\["\']|(?(1)\b\b|[ ]))'), + 'error': 'comparison operator without surrounding spaces', 'showPositionForGroup': 2, 'type': ERROR_TYPE_WARNING }, @@ -254,7 +331,7 @@ class LintChecker(object): TEXT_ERROR_SINGLE_FILE_TEMPLATE = Template(u'$lineNum: $message.\n+$line\n') TEXT_ERROR_MULTI_FILE_TEMPLATE = Template(u'$filename:$lineNum: $message.\n+$line\n') - def __init__(self, view, basedir='', var_declarations=VAR_DECLARATIONS_SINGLE, verbose=False): + def __init__(self, view=None, basedir='', var_declarations=VAR_DECLARATIONS_SINGLE, verbose=False): self.view = view self.basedir = unicode(basedir, 'utf-8') self.errors = [] @@ -284,6 +361,7 @@ class LintChecker(object): continue line = self.line + originalLine = line lineFilter = check.get('filter') if lineFilter: @@ -304,6 +382,11 @@ class LintChecker(object): if regex: line = regex.sub(processor.get('replace', ''), line) + fnct = processor.get('function') + + if fnct: + line = fnct(line) + regex = check.get('regex') if not regex: @@ -315,29 +398,40 @@ class LintChecker(object): continue positions = [] - group = check.get('showPositionForGroup') + groups = check.get('showPositionForGroup') if (check.get('id') == 'tabs'): line = tabs2spaces(line, positions=positions) - elif group is not None: + elif groups is not None: line = tabs2spaces(line) - for match in regex.finditer(line): - if group > 0: - positions.append(match.start(group)) - else: - # group 0 means show the first non-empty match - for i in range(1, len(match.groups()) + 1): - if match.start(i) >= 0: - positions.append(match.start(i)) - break + if not isinstance(groups, (list, tuple)): + groups = (groups,) - self.error(check['error'], line=line, positions=positions, type=check['type']) + for match in regex.finditer(line): + for group in groups: + if group > 0: + start = match.start(group) + + if start >= 0: + positions.append(start) + else: + # group 0 means show the first non-empty match + for i in range(1, len(match.groups()) + 1): + if match.start(i) >= 0: + positions.append(match.start(i)) + break + + if positions: + self.error(check['error'], line=originalLine, positions=positions, type=check['type']) def next_statement(self, expect_line=False, check_line=True): try: while True: - raw_line = self.sourcefile.next()[:-1] # strip EOL + raw_line = self.sourcefile.next() + # strip EOL + if raw_line[-1] == '\n': # ... unless this is the last line which might not have a \n. + raw_line = raw_line[:-1] try: self.line = unicode(raw_line, 'utf-8', 'strict') # convert to Unicode @@ -410,7 +504,7 @@ class LintChecker(object): # Remove all quoted strings from the expression so that we don't # count unmatched pairs inside the strings. - self.expression = self.STRING_LITERAL_RE.sub(self.EMPTY_SELF_STRING_LITERAL_FUNCTION, self.expression) + self.expression = string_replacer(self.expression) self.strip_comment() self.expression = self.expression.strip() @@ -727,7 +821,7 @@ class LintChecker(object): print u'EOF\n' pass - def lint_text(self, text, filename): + def lint_text(self, text, filename=""): self.filename = filename self.filesToCheck = [] @@ -739,6 +833,8 @@ class LintChecker(object): print u'EOF\n' pass + return self.errors + def count_files_checked(self): return len(self.filesToCheck) @@ -939,6 +1035,50 @@ class LintChecker(object): exit_show_html(html) +class MiscTest(unittest.TestCase): + def test_string_replacer(self): + self.assertEquals(string_replacer("x = 'hello';"), "x = '';") + self.assertEquals(string_replacer("x = '\\' hello';"), "x = '';") + self.assertEquals(string_replacer("x = '\\\\';"), "x = '';") + self.assertEquals(string_replacer("""x = '"string in string"';"""), "x = '';") + + self.assertEquals(string_replacer('x = "hello";'), 'x = "";') + self.assertEquals(string_replacer('x = "\\" hello";'), 'x = "";') + self.assertEquals(string_replacer('x = "\\\\";'), 'x = "";') + self.assertEquals(string_replacer('''x = "'";'''), 'x = "";') + + +class LintCheckerTest(unittest.TestCase): + def test_exponential_notation(self): + """Test that exponential notation such as 1.1e-6 doesn't cause a warning about missing whitespace.""" + + # This should not report "binary operator without surrounding spaces". + self.assertEquals(LintChecker().lint_text("a = 2.1e-6;"), []) + self.assertEquals(LintChecker().lint_text("a = 2.1e+6;"), []) + self.assertEquals(LintChecker().lint_text("a = 2e-0;"), []) + self.assertEquals(LintChecker().lint_text("a = 2e+0;"), []) + + # But this should. + self.assertEquals(LintChecker().lint_text("a = 1.1e-6+2e2;"), [{'positions': [6], 'filename': '', 'lineNum': 1, 'message': 'binary operator without surrounding spaces', 'type': 2, 'line': u'a = 1.1e-6+2e2;'}]) + + def test_function_types(self): + """Test that function definitions like function(/*CPString*/key) don't cause warnings about surrounding spaces.""" + + # This should not report "binary operator without surrounding spaces". + self.assertEquals(LintChecker().lint_text("var resolveMultipleValues = function(/*CPString*/key, /*CPDictionary*/bindings, /*GSBindingOperationKind*/operation)"), []) + + def test_unary_plus(self): + """Test that = +, like in `x = +y;`, doesn't cause a warning.""" + + # + converts number in a string to a number. + self.assertEquals(LintChecker().lint_text("var y = +x;"), []) + + def test_string_escaping(self): + """Test that string literals are not parsed as syntax, even when they end with a double backslash.""" + + self.assertEquals(LintChecker().lint_text('var x = "(\\\\";'), []) + + if __name__ == '__main__': usage = 'usage: %prog [options] [file ... | -]' parser = OptionParser(usage=usage, version='1.02') diff --git a/Tools/nib2cib/NSPredicateEditor.j b/Tools/nib2cib/NSPredicateEditor.j index 2ef4ea8a1..add06a19b 100644 --- a/Tools/nib2cib/NSPredicateEditor.j +++ b/Tools/nib2cib/NSPredicateEditor.j @@ -27,12 +27,12 @@ - (id)NS_initWithCoder:(CPCoder)aCoder { self = [super NS_initWithCoder:aCoder]; - + if (self) - { + { _allTemplates = [aCoder decodeObjectForKey:@"NSPredicateTemplates"]; } - + return self; } @@ -59,7 +59,7 @@ - (id)NS_initWithCoder:(CPCoder)aCoder { self = [super init]; - + if (self) { _templateType = [aCoder decodeIntForKey:@"NSPredicateTemplateType"]; @@ -71,7 +71,7 @@ _rightIsWildcard = [aCoder decodeBoolForKey:@"NSPredicateTemplateRightIsWildcard"]; _views = [aCoder decodeObjectForKey:@"NSPredicateTemplateViews"]; } - + return self; } diff --git a/Tools/nib2cib/NSRuleEditor.j b/Tools/nib2cib/NSRuleEditor.j index 8955626f4..fb7be960d 100644 --- a/Tools/nib2cib/NSRuleEditor.j +++ b/Tools/nib2cib/NSRuleEditor.j @@ -32,7 +32,7 @@ - (id)NS_initWithCoder:(CPCoder)aCoder { self = [super NS_initWithCoder:aCoder]; - + if (self) { _alignmentGridWidth = [aCoder decodeFloatForKey:@"NSRuleEditorAlignmentGridWidth"]; @@ -40,20 +40,20 @@ _stringsFilename = [aCoder decodeObjectForKey:@"NSRuleEditorStringsFileName"]; _editable = [aCoder decodeBoolForKey:@"NSRuleEditorEditable"]; _allowsEmptyCompoundRows = [aCoder decodeBoolForKey:@"NSRuleEditorAllowsEmptyCompoundRows"]; - _disallowEmpty = [aCoder decodeBoolForKey:@"NSRuleEditorDisallowEmpty"]; + _disallowEmpty = [aCoder decodeBoolForKey:@"NSRuleEditorDisallowEmpty"]; _nestingMode = [aCoder decodeIntForKey:@"NSRuleEditorNestingMode"]; _typeKeyPath = [aCoder decodeObjectForKey:@"NSRuleEditorRowTypeKeyPath"]; _itemsKeyPath = [aCoder decodeObjectForKey:@"NSRuleEditorItemsKeyPath"]; _valuesKeyPath = [aCoder decodeObjectForKey:@"NSRuleEditorValuesKeyPath"]; _subrowsArrayKeyPath = [aCoder decodeObjectForKey:@"NSRuleEditorSubrowsArrayKeyPath"]; _boundArrayKeyPath = [aCoder decodeObjectForKey:@"NSRuleEditorBoundArrayKeyPath"]; - + //_slicesHolder = [aCoder decodeObjectForKey:@"NSRuleEditorViewSliceHolder"]; _boundArrayOwner = [aCoder decodeObjectForKey:@"NSRuleEditorBoundArrayOwner"]; _slices = [aCoder decodeObjectForKey:@"NSRuleEditorSlices"]; - _ruleDelegate = [aCoder decodeObjectForKey:@"NSRuleEditorDelegate"]; + _ruleDelegate = [aCoder decodeObjectForKey:@"NSRuleEditorDelegate"]; } - + return self; } @@ -99,7 +99,7 @@ { if (self = [super init]) boundArray = [aCoder decodeObjectForKey:@"NSBoundArray"]; - + return self; } diff --git a/Tools/nib2cib/Nib2Cib.j b/Tools/nib2cib/Nib2Cib.j index 424570cb5..20a9942e9 100644 --- a/Tools/nib2cib/Nib2Cib.j +++ b/Tools/nib2cib/Nib2Cib.j @@ -40,7 +40,7 @@ var FILE = require("file"), DefaultTheme = "Aristo", BuildTypes = ["Debug", "Release"], DefaultFile = "MainMenu", - AllowedStoredOptionsRe = new RegExp("^(defaultTheme|auxThemes|verbosity|quiet|frameworks|format)$"); + AllowedStoredOptionsRe = new RegExp("^(defaultTheme|auxThemes|verbosity|quiet|frameworks|format)$"), ArgsRe = /"[^\"]+"|'[^\']+'|\S+/g; @@ -127,6 +127,8 @@ var FILE = require("file"), if (systemFontSize) [CPFont setSystemFontSize:parseFloat(systemFontSize, 10)]; } + else + infoPlist = [CPDictionary dictionary]; var themeList = [self getThemeList:options], themes = [self loadThemesFromList:themeList];