From 8f5bde279724a2e7cc9682a88f0770f2cacb121e Mon Sep 17 00:00:00 2001 From: daboe01 Date: Thu, 2 Jul 2020 19:38:34 +0200 Subject: [PATCH 01/30] new: unittest for replaceOccurrencesOfString:withString:options:range: --- Tests/Foundation/CPAttributedStringTest.j | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index 43321a28c..fab444a57 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -629,6 +629,17 @@ var sharedObject = [CPObject new]; [self assertTrue:[[self stringForTesting] isEqual:string] message:"setAttributedString should have made strings equal, but they were not"]; } +- (void)testReplaceAttributedString +{ + var string = [[CPMutableAttributedString alloc] initWithString:"HELLO
THERE"]; + [string replaceOccurrencesOfString:"
" + withString:"" + options:0 + range:nil] + + [self assertTrue:[string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string"]; +} + - (void)testEncoding { // We can't test using [self stringForTesting] because it contains attributes without coding support. From 05f9fd22fe346dcf73a006c82b6d8cfb17b4a8e8 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Fri, 3 Jul 2020 19:36:06 +0200 Subject: [PATCH 02/30] formatting --- Tests/Foundation/CPAttributedStringTest.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index fab444a57..86de83469 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -635,9 +635,9 @@ var sharedObject = [CPObject new]; [string replaceOccurrencesOfString:"
" withString:"" options:0 - range:nil] + range:nil]; - [self assertTrue:[string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string"]; + [self assertTrue:[string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string. Result is: " + string]; } - (void)testEncoding From 26e8432bb031c7ae3d57ad6b8f704ff43fad29ae Mon Sep 17 00:00:00 2001 From: daboe01 Date: Fri, 3 Jul 2020 19:55:51 +0200 Subject: [PATCH 03/30] debugging --- Tests/Foundation/CPAttributedStringTest.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index 86de83469..7f64ff167 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -637,7 +637,7 @@ var sharedObject = [CPObject new]; options:0 range:nil]; - [self assertTrue:[string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string. Result is: " + string]; + [self assertTrue:[string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string. Result is: " + string._string]; } - (void)testEncoding From bd6b8e4b7f70f64a569ea37d2e5c96969e016ce5 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Fri, 3 Jul 2020 21:27:48 +0200 Subject: [PATCH 04/30] fixed: comparison between wrong objects --- Tests/Foundation/CPAttributedStringTest.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index 7f64ff167..2dab05e28 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -637,7 +637,7 @@ var sharedObject = [CPObject new]; options:0 range:nil]; - [self assertTrue:[string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string. Result is: " + string._string]; + [self assertTrue:[string._string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string. Result is: " + string._string]; } - (void)testEncoding From 4b052e74f14e963f52866e5dc43ea2541aa6a2b5 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Sun, 5 Jul 2020 16:06:04 +0200 Subject: [PATCH 05/30] test whether range restriction works --- Tests/Foundation/CPAttributedStringTest.j | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index 2dab05e28..07061b958 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -640,6 +640,18 @@ var sharedObject = [CPObject new]; [self assertTrue:[string._string isEqual:"HELLO THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not properly replace the search string with the replacement string. Result is: " + string._string]; } +- (void)testReplaceAttributedStringWithRange +{ + var string = [[CPMutableAttributedString alloc] initWithString:"HELLO
THERE"]; + [string replaceOccurrencesOfString:"
" + withString:"" + options:0 + range:CPMakeRange(0, 4)]; + + [self assertTrue:[string._string isEqual:"HELLO
THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not respect the range restriction. Result is: " + string._string]; +} + + - (void)testEncoding { // We can't test using [self stringForTesting] because it contains attributes without coding support. From 9c95c9c6e9fa7d21c2a399e8bd0ea1c587722941 Mon Sep 17 00:00:00 2001 From: daboe01 Date: Mon, 13 Jul 2020 20:37:52 +0200 Subject: [PATCH 06/30] formatting --- Tests/Foundation/CPAttributedStringTest.j | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/Foundation/CPAttributedStringTest.j b/Tests/Foundation/CPAttributedStringTest.j index 07061b958..70d8b7c04 100644 --- a/Tests/Foundation/CPAttributedStringTest.j +++ b/Tests/Foundation/CPAttributedStringTest.j @@ -651,7 +651,6 @@ var sharedObject = [CPObject new]; [self assertTrue:[string._string isEqual:"HELLO
THERE"] message:"replaceOccurrencesOfString:withString:options:range: did not respect the range restriction. Result is: " + string._string]; } - - (void)testEncoding { // We can't test using [self stringForTesting] because it contains attributes without coding support. From 5ac6b1d1f173fec481540baf1566ec8b8592bcf3 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Sun, 30 Aug 2020 10:01:11 +0200 Subject: [PATCH 07/30] Update CPViewAnimator.j This fixes parameter type. --- AppKit/CoreAnimation/CPViewAnimator.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CoreAnimation/CPViewAnimator.j b/AppKit/CoreAnimation/CPViewAnimator.j index 6b9ef21da..16c928b45 100644 --- a/AppKit/CoreAnimation/CPViewAnimator.j +++ b/AppKit/CoreAnimation/CPViewAnimator.j @@ -37,7 +37,7 @@ var DEFAULT_CSS_PROPERTIES = nil, [self _setTargetValue:YES withKeyPath:@"CPAnimationTriggerOrderOut" setter:_cmd]; } -- (void)setAlphaValue:(CGPoint)alphaValue +- (void)setAlphaValue:(float)alphaValue { [self _setTargetValue:alphaValue withKeyPath:@"alphaValue" setter:_cmd]; } From c30464ee77f6dc08550f9375d83d804f41b236fe Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 11 Sep 2020 08:55:10 +0200 Subject: [PATCH 08/30] New: This adds the CSS dictionaries to the description of the color (#2911) --- AppKit/CPColor.j | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index 5866fb0d4..c7d606fcd 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -800,6 +800,9 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image var description = [super description], patternImage = [self patternImage]; + if ([self isCSSBased]) + return description + "\n" + [self cssDictionary]+ "\nBefore:\n" + [self cssBeforeDictionary] + "\nAfter:\n" + [self cssAfterDictionary]; + if (!patternImage) return description + " " + [self cssString]; From 6143ec418023e2d646f0b302a6792e833274042b Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 11 Sep 2020 09:01:33 +0200 Subject: [PATCH 09/30] Fixed: Theme compilation problem because of lack of rgba capability of the compiler environment.(#2910) --- AppKit/CPColor.j | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index c7d606fcd..0721c2397 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -561,7 +561,11 @@ var cachedBlackColor, - (void)_initCSSStringFromComponents { - var hasAlpha = CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0; + // Fix to avoid a problem when compiling a theme (missing the alpha component as theme compiler doesn't have CSS rgba capability) + var hasAlpha = YES; +#if PLATFORM(DOM) + hasAlpha = CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0; +#endif _cssString = (hasAlpha ? "rgba(" : "rgb(") + parseInt(_components[0] * 255.0) + ", " + From 03972f0aecbb2a9c8e89b39c99fa1c3f02f45b57 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 10:55:55 +0200 Subject: [PATCH 10/30] Fixed: The classname for CSS theming on CPImage was not specified in the correct DOM element (#2908) --- AppKit/CPImage.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPImage.j b/AppKit/CPImage.j index 060f6d71c..3626eac98 100644 --- a/AppKit/CPImage.j +++ b/AppKit/CPImage.j @@ -685,7 +685,7 @@ function CPAppKitImage(aFilename, aSize) aStyleNode.replaceChild(styleDescription, aStyleNode.firstChild); } - [aView setDOMClassName:@"CP"+[aView UID]]; + aDOMElement.className = @"CP"+[aView UID]; } else { From 5724868c5a07bcd59ff0aab0afcc18f9018bf469 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 10:58:20 +0200 Subject: [PATCH 11/30] Fixed: restorePreviousCSSState method for CPColor must be a class method for internal reasons (#2912) --- AppKit/CPColor.j | 4 ++-- AppKit/CPView.j | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index 0721c2397..6ee1616da 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -940,7 +940,7 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image // You can use -(BOOL)isCSSBased to determine how to cope with it in your code. // -(BOOL)hasCSSDictionary, -(BOOL)hasCSSBeforeDictionary and -(BOOL)hasCSSAfterDictionary are convience methods you can use. // -// Remark : -(void)restorePreviousCSSState and -(DOMElement)applyCSSColorForView are meant to be used by low level UI widgets (like CPView) to implement +// Remark : +(void)restorePreviousCSSState and -(DOMElement)applyCSSColorForView are meant to be used by low level UI widgets (like CPView) to implement // CSS theme support. @implementation CPColor (CSSTheming) @@ -999,7 +999,7 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image return ([_cssAfterDictionary count] > 0); } -- (void)restorePreviousCSSState:(CPArrayRef)aPreviousStateRef forDOMElement:(DOMElement)aDOMElement ++ (void)restorePreviousCSSState:(CPArrayRef)aPreviousStateRef forDOMElement:(DOMElement)aDOMElement { #if PLATFORM(DOM) var aPreviousState = @deref(aPreviousStateRef); diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 52486310d..847bb5af5 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1995,7 +1995,7 @@ var CPViewHighDPIDrawingEnabled = YES; #if PLATFORM(DOM) if (_backgroundType === BackgroundCSSStyling) - [_backgroundColor restorePreviousCSSState:@ref(_cssStylePreviousState) forDOMElement:_DOMElement]; + [CPColor restorePreviousCSSState:@ref(_cssStylePreviousState) forDOMElement:_DOMElement]; var patternImage = [_backgroundColor patternImage], colorExists = _backgroundColor && ([_backgroundColor patternImage] || [_backgroundColor alphaComponent] > 0.0), From e13cebaa3ace219a5146dda65a3781669c65cdde Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 12:13:00 +0200 Subject: [PATCH 12/30] NEW: Material icon image (#2909) --- AppKit/CPImage.j | 202 +- AppKit/CPImageView.j | 16 +- AppKit/Cib/_CPCibCustomResource.j | 18 +- .../Resources/fonts/MaterialIcons-Regular.eot | Bin 0 -> 143258 bytes .../fonts/MaterialIcons-Regular.ijmap | 1 + .../Resources/fonts/MaterialIcons-Regular.svg | 2373 +++++++++++++++++ .../Resources/fonts/MaterialIcons-Regular.ttf | Bin 0 -> 128180 bytes .../fonts/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes .../fonts/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes AppKit/Resources/fonts/material-icons.css | 36 + AppKit/_CPImageAndTextView.j | 29 +- Tools/nib2cib/NSCustomResource.j | 7 + 12 files changed, 2664 insertions(+), 18 deletions(-) create mode 100755 AppKit/Resources/fonts/MaterialIcons-Regular.eot create mode 100755 AppKit/Resources/fonts/MaterialIcons-Regular.ijmap create mode 100755 AppKit/Resources/fonts/MaterialIcons-Regular.svg create mode 100755 AppKit/Resources/fonts/MaterialIcons-Regular.ttf create mode 100755 AppKit/Resources/fonts/MaterialIcons-Regular.woff create mode 100755 AppKit/Resources/fonts/MaterialIcons-Regular.woff2 create mode 100755 AppKit/Resources/fonts/material-icons.css diff --git a/AppKit/CPImage.j b/AppKit/CPImage.j index 3626eac98..58cfd1365 100644 --- a/AppKit/CPImage.j +++ b/AppKit/CPImage.j @@ -26,10 +26,13 @@ @import @import @import +@import +@import @import "CGGeometry.j" @import "CPCompatibility.j" +@class CPColor @protocol CPImageDelegate @@ -85,9 +88,7 @@ function CPImageInBundle() if (typeof(arguments[1]) === "number") { - if (arguments[1] != nil) - size = CGSizeMake(arguments[1], arguments[2]); - + size = CGSizeMake(arguments[1], arguments[2]); bundle = arguments[3]; } else if (typeof(arguments[1]) === "object") @@ -446,6 +447,11 @@ function CPAppKitImage(aFilename, aSize) return NO; } +- (BOOL)isMaterialIconImage +{ + return NO; +} + - (CPString)description { var filename = [self filename], @@ -564,6 +570,7 @@ function CPAppKitImage(aFilename, aSize) CPDictionary _cssDictionary @accessors(property=cssDictionary); CPDictionary _cssBeforeDictionary @accessors(property=cssBeforeDictionary); CPDictionary _cssAfterDictionary @accessors(property=cssAfterDictionary); + CGSize _displaySize; } + (CPImage)imageWithCSSDictionary:(CPDictionary)aDictionary size:(CGSize)aSize @@ -582,6 +589,16 @@ function CPAppKitImage(aFilename, aSize) return [[CPImage alloc] initWithCSSDictionary:@{} beforeDictionary:nil afterDictionary:nil size:aSize]; } ++ (CPImage)imageWithMaterialIconNamed:(CPString)iconName size:(CGSize)size +{ + return [_CPMaterialIconImage imageWithIconNamed:iconName size:size]; +} + ++ (CPImage)imageWithMaterialIconNamed:(CPString)iconName size:(CGSize)size color:(CPColor)color +{ + return [_CPMaterialIconImage imageWithIconNamed:iconName size:size color:color]; +} + - (id)initWithCSSDictionary:(CPDictionary)aDictionary beforeDictionary:(CPDictionary)beforeDictionary afterDictionary:(CPDictionary)afterDictionary size:(CGSize)aSize { self = [super init]; @@ -594,6 +611,7 @@ function CPAppKitImage(aFilename, aSize) _cssDictionary = aDictionary; _cssBeforeDictionary = beforeDictionary; _cssAfterDictionary = afterDictionary; + _displaySize = CGSizeMakeCopy(aSize); } return self; @@ -707,6 +725,11 @@ function CPAppKitImage(aFilename, aSize) #endif } +- (BOOL)_shouldBeResized +{ + return NO; +} + @end var CPImageCSSDictionaryKey = @"CPImageCSSDictionaryKey", @@ -750,6 +773,168 @@ var CPImageCSSDictionaryKey = @"CPImageCSSDictionaryKey", @end +#pragma mark - + +@implementation _CPMaterialIconImage : CPImage +{ + CPMutableDictionary _cachedColorVersions; + CPColor _cachedInvertedColor; +} + ++ (_CPMaterialIconImage)imageWithIconNamed:(CPString)iconName size:(CGSize)size +{ + return [[_CPMaterialIconImage alloc] initWithIconName:iconName size:size]; +} + ++ (_CPMaterialIconImage)imageWithIconNamed:(CPString)iconName size:(CGSize)size color:(CPColor)color +{ + return [[_CPMaterialIconImage alloc] initWithIconName:iconName size:size color:color]; +} + ++ (_CPMaterialIconImage)imageWithIconNamed:(CPString)iconName size:(CGSize)size color:(CPColor)color additionalCSSDictionary:(CPDictionary)additionalCSSDictionary +{ + return [[_CPMaterialIconImage alloc] initWithIconName:iconName size:size color:color additionalCSSDictionary:additionalCSSDictionary]; +} + +- (CPDictionary)_baseMaterialIconCSSDictionaryForIconName:(CPString)iconName size:(CGSize)size +{ + return @{ + @"width": size.width + @"px", + @"height": size.height + @"px", + @"top": @"0px", + @"left": @"0px", + @"content": @"'" + iconName + @"'", + + @"position": @"absolute", + @"z-index": @"300", + + @"font-family": @"'Material Icons'", + @"font-weight": @"normal", + @"font-style": @"normal", + @"font-size": MIN(size.width, size.height) + @"px", + @"display": @"inline-block", + @"line-height": @"1", + @"text-transform": @"none", + @"letter-spacing": @"normal", + @"word-wrap": @"normal", + @"white-space": @"nowrap", + @"direction": @"ltr", + @"-webkit-font-smoothing": @"antialiased", + @"text-rendering": @"optimizeLegibility", + @"-moz-osx-font-smoothing": @"grayscale", + @"font-feature-settings": @"'liga'" + }; +} + +- (_CPMaterialIconImage)initWithIconName:(CPString)iconName size:(CGSize)size +{ + return [super initWithCSSDictionary:@{} + beforeDictionary:@{} + afterDictionary:[self _baseMaterialIconCSSDictionaryForIconName:iconName size:size] + size:size]; +} + +- (_CPMaterialIconImage)initWithIconName:(CPString)iconName size:(CGSize)size color:(CPColor)color +{ + var materialIconCSSDictionary = [self _baseMaterialIconCSSDictionaryForIconName:iconName size:size]; + + [materialIconCSSDictionary setObject:[color cssString] forKey:@"color"]; + + return [super initWithCSSDictionary:@{} + beforeDictionary:@{} + afterDictionary:materialIconCSSDictionary + size:size]; +} + +- (void)addRotationEffectWithAngle:(float)angle +{ + [self addCSSDictionary:@{ + @"transform": @"rotate("+angle+"deg)", + @"transition": @"transform 0.35s ease" + }]; +} + +- (void)addCSSDictionary:(CPDictionary)additionalCSSDictionary +{ + [_cssAfterDictionary addEntriesFromDictionary:additionalCSSDictionary]; +} + +- (void)setSize:(CGSize)aSize +{ + [self _setDisplaySize:aSize]; + [super setSize:aSize]; +} + +- (void)_setDisplaySize:(CGSize)aSize +{ + if (CGSizeEqualToSize(_displaySize, aSize)) + return; + + _displaySize = CGSizeMakeCopy(aSize); + + [_cssAfterDictionary setObject:(aSize.width + @"px") forKey:@"width"]; + [_cssAfterDictionary setObject:(aSize.height + @"px") forKey:@"height"]; + [_cssAfterDictionary setObject:(MIN(aSize.width, aSize.height) + @"px") forKey:@"font-size"]; +} + +- (BOOL)_shouldBeResized +{ + return YES; +} + +- (BOOL)isMaterialIconImage +{ + return YES; +} + +- (_CPMaterialIconImage)invertedImage +{ + if (!_cachedInvertedColor) + { + var sourceCSSColor = [_cssAfterDictionary objectForKey:@"color"] || @"rgba(0,0,0,1)", + sourceColor = [CPColor colorWithCSSString:sourceCSSColor]; + + _cachedInvertedColor = [CPColor colorWithRed:(1-[sourceColor redComponent]) + green:(1-[sourceColor greenComponent]) + blue:(1-[sourceColor blueComponent]) + alpha:[sourceColor alphaComponent]]; + } + + return [self imageVersionWithColor:_cachedInvertedColor]; +} + +- (_CPMaterialIconImage)imageVersionWithColor:(CPColor)aColor +{ + // We can't just set the color in the cssAfterDictionary as this would not be noticed as a new image, + // so -setImage won't do anything, so no visual refresh won't occur. + // The trick here is to keep in cache a clone of this image for each needed color. + var colorCSSString = [aColor cssString]; + + if (!_cachedColorVersions) + _cachedColorVersions = @{}; + + var cachedColorVersion = [_cachedColorVersions objectForKey:colorCSSString]; + + if (!cachedColorVersion) + { + cachedColorVersion = [self duplicate]; + [cachedColorVersion _setCSSColor:colorCSSString]; + + [_cachedColorVersions setObject:cachedColorVersion forKey:colorCSSString]; + } + + return cachedColorVersion; +} + +- (void)_setCSSColor:(CPString)aCSSColor +{ + [_cssAfterDictionary setObject:aCSSColor forKey:@"color"]; +} + +@end + +#pragma mark - + @implementation CPThreePartImage : CPObject { CPArray _imageSlices; @@ -890,3 +1075,14 @@ var CPNinePartImageImageSlicesKey = @"CPNinePartImageImageSlicesKey"; } @end + +#pragma mark - + +@implementation CPImage (Duplication) + +- (CPImage)duplicate +{ + return [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:self]]; +} + +@end diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j index e8afee844..677aa7cad 100644 --- a/AppKit/CPImageView.j +++ b/AppKit/CPImageView.j @@ -99,8 +99,8 @@ var CPImageViewEmptyPlaceholderImage = nil; { #if PLATFORM(DOM) var image = [self objectValue], - isCSSBasedImage = [image isCSSBased], - isIMGImageElement = _DOMImageElement && (_DOMImageElement.nodeName == "IMG"); + isCSSBasedImage = [image isCSSBased], + isIMGImageElement = _DOMImageElement && (_DOMImageElement.nodeName == "IMG"); // First, check if we need to destroy a current DOM image element. This is the case if : // - we have one but not the right one (that is a DIV but needing an IMG, and vice versa) @@ -444,6 +444,18 @@ var CPImageViewEmptyPlaceholderImage = nil; #endif } +#if PLATFORM(DOM) + if ([image isCSSBased] && [image _shouldBeResized]) + { + [image _setDisplaySize:CGSizeMake(ROUND(width), ROUND(height))]; + + _cssStyleNode = [image applyCSSImageForView:self + onDOMElement:_DOMImageElement + styleNode:_cssStyleNode + previousState:@ref(_cssStylePreviousState)]; + } +#endif + _imageRect = CGRectMake(x, y, width, height); if (_hasShadow) diff --git a/AppKit/Cib/_CPCibCustomResource.j b/AppKit/Cib/_CPCibCustomResource.j index eac3544fd..5a0ed43b1 100644 --- a/AppKit/Cib/_CPCibCustomResource.j +++ b/AppKit/Cib/_CPCibCustomResource.j @@ -54,8 +54,9 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", return; _CPCibCustomResourceTemplateImageMap = @{ - "CPAddTemplate": "button-image-plus", - "CPRemoveTemplate": "button-image-minus" + "CPAddTemplate": "button-image-plus", + "CPRemoveTemplate": "button-image-minus", + "CPActionTemplate": "button-image-action" }; } + (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize @@ -111,6 +112,19 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", (![aCoder respondsToSelector:@selector(awakenCustomResources)] || [aCoder awakenCustomResources])) if (_className === @"CPImage") { + // Is this a material icon reference ? + if ([_resourceName hasSuffix:@"@MaterialIcons"]) + { + var range = [_resourceName rangeOfString:@"@MaterialIcons"]; + + if (range.location <= 0) + [CPException raise:CPRangeException reason:"Malformed Material Icon reference ("+_resourceName+")"]; + + var iconName = [_resourceName substringToIndex:range.location]; + + return [CPImage imageWithMaterialIconNamed:iconName size:CGSizeMake(16,16)]; + } + var templateImage = [_CPCibCustomResourceTemplateImageMap objectForKey:_resourceName]; if (templateImage) diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.eot b/AppKit/Resources/fonts/MaterialIcons-Regular.eot new file mode 100755 index 0000000000000000000000000000000000000000..70508ebabc9992e64f1314f866b2d7ab90438c58 GIT binary patch literal 143258 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 Hzx)3OGG_Ot literal 0 HcmV?d00001 diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.ijmap b/AppKit/Resources/fonts/MaterialIcons-Regular.ijmap new file mode 100755 index 000000000..d9f1d259f --- /dev/null +++ b/AppKit/Resources/fonts/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.svg b/AppKit/Resources/fonts/MaterialIcons-Regular.svg new file mode 100755 index 000000000..a449327e2 --- /dev/null +++ b/AppKit/Resources/fonts/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.ttf b/AppKit/Resources/fonts/MaterialIcons-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.woff b/AppKit/Resources/fonts/MaterialIcons-Regular.woff new file mode 100755 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/AppKit/Resources/fonts/MaterialIcons-Regular.woff2 b/AppKit/Resources/fonts/MaterialIcons-Regular.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/AppKit/Resources/fonts/material-icons.css b/AppKit/Resources/fonts/material-icons.css new file mode 100755 index 000000000..2270c09d0 --- /dev/null +++ b/AppKit/Resources/fonts/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index 6c754a448..fc3764351 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -662,17 +662,6 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, if (!imageStyle) var imageStyle = _DOMImageElement.style; - if (_flags & _CPImageAndTextViewImageChangedFlag) - { - if (isCSSBasedImage) - _cssStyleNode = [_image applyCSSImageForView:self - onDOMElement:_DOMImageElement - styleNode:_cssStyleNode - previousState:@ref(_cssStylePreviousState)]; - else - _DOMImageElement.src = [_image filename]; - } - var centerX = size.width / 2.0, centerY = size.height / 2.0, imageSize = [_image size], @@ -737,6 +726,24 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0, imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px"; imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px"; } + + if (_flags & _CPImageAndTextViewImageChangedFlag) + { + if (isCSSBasedImage) + { + // For material icons images & co. + if ([_image _shouldBeResized]) + [_image _setDisplaySize:CGSizeMake(imageWidth, imageHeight)]; + + _cssStyleNode = [_image applyCSSImageForView:self + onDOMElement:_DOMImageElement + styleNode:_cssStyleNode + previousState:@ref(_cssStylePreviousState)]; + } + else + _DOMImageElement.src = [_image filename]; + } + } if (hasDOMTextElement) diff --git a/Tools/nib2cib/NSCustomResource.j b/Tools/nib2cib/NSCustomResource.j index 2d78af3e0..3889025fb 100644 --- a/Tools/nib2cib/NSCustomResource.j +++ b/Tools/nib2cib/NSCustomResource.j @@ -34,6 +34,7 @@ var FILE = require("file"), supportedTemplateImages = { "NSAddTemplate": "CPAddTemplate", "NSRemoveTemplate": "CPRemoveTemplate", + "NSActionTemplate": "CPActionTemplate", "NSToolbarShowColors": "CPImageNameColorPanel" }; @@ -64,6 +65,12 @@ var FILE = require("file"), else [CPException raise:Nib2CibException format:@"The built in image “%@” is not supported.", _resourceName]; } + else if (/^(.+)@MaterialIcons+$/.test(_resourceName)) + { + // Catch a material icon specified by "icon-name@MaterialIcons" + // Just do nothing and leave _resourceName as is. + // It will be treated during runtime by _CPCibCustomResource + } else { var match = /^(.+)@(.+)$/.exec(_resourceName); From 601d6f7c6ccf1abc79e2c288b4011199694a04de Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 12:31:22 +0200 Subject: [PATCH 13/30] New: class method to BKThemeDescriptor that enables a view to inherit theme values of another view (#2916) --- AppKit/Themes/BlendKit/BKThemeDescriptor.j | 9 +++++++++ AppKit/_CPObject+Theme.j | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/AppKit/Themes/BlendKit/BKThemeDescriptor.j b/AppKit/Themes/BlendKit/BKThemeDescriptor.j index 1512c480e..21f245881 100644 --- a/AppKit/Themes/BlendKit/BKThemeDescriptor.j +++ b/AppKit/Themes/BlendKit/BKThemeDescriptor.j @@ -325,6 +325,15 @@ var ItemSizes = { }, [self registerThemeValues:themeValues forView:aView]; } ++ (void)registerThemeValues:(CPArray)themeValues forView:(CPView)aView inheritFrom:(CPView)anotherView +{ + if (anotherView) + // We take all theme attributes values from anotherView + [aView _addThemeAttributeDictionary:[anotherView _themeAttributeDictionary]]; + + [self registerThemeValues:themeValues forView:aView]; +} + @end function BKLabelFromIdentifier(anIdentifier) diff --git a/AppKit/_CPObject+Theme.j b/AppKit/_CPObject+Theme.j index 7c906a1ca..2c6d00b88 100644 --- a/AppKit/_CPObject+Theme.j +++ b/AppKit/_CPObject+Theme.j @@ -300,6 +300,22 @@ var NULL_THEME = {}; return dictionary; } +- (void)_addThemeAttributeDictionary:(CPDictionary)themeAttributeDictionary +{ + if (!themeAttributeDictionary) + return; + + var keys = [themeAttributeDictionary allKeys]; + + for (var i = 0, count = [keys count], key, value; i < count; i++) + { + key = keys[i]; + value = [themeAttributeDictionary objectForKey:key]; + + _themeAttributes[key] = value; + } +} + - (void)setValue:(id)aValue forThemeAttribute:(CPString)aName inState:(ThemeState)aState { #if DEBUG From 92598da06fe1c91f4599fce57dbd4042c76eebd6 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 12:55:32 +0200 Subject: [PATCH 14/30] New: themable-system-font (#2919) --- AppKit/CPControl.j | 11 ++-- AppKit/CPFont.j | 126 +++++++++++++++++++++++++++++++++++++++++---- AppKit/CPTheme.j | 2 + 3 files changed, 125 insertions(+), 14 deletions(-) diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 790a74e3f..4ee5cc418 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -23,12 +23,13 @@ @import @import -@import "CPFont.j" @import "CPShadow.j" @import "CPText.j" @import "CPKeyValueBinding.j" @import "CPTrackingArea.j" +@class CPFont + @global CPApp @protocol CPControlTextEditingDelegate @@ -48,6 +49,9 @@ CPRegularControlSize = 0; CPSmallControlSize = 1; CPMiniControlSize = 2; +// To get the theme state corresponding to a control size, use CPControlSizeThemeStates[controlSize] +CPControlSizeThemeStates = @[CPThemeStateControlSizeRegular, CPThemeStateControlSizeSmall, CPThemeStateControlSizeMini]; + @typedef CPLineBreakMode CPLineBreakByWordWrapping = 0; CPLineBreakByCharWrapping = 1; @@ -131,7 +135,7 @@ var CPControlBlackColor = [CPColor blackColor]; @"vertical-alignment": CPTopVerticalTextAlignment, @"line-break-mode": CPLineBreakByClipping, @"text-color": [CPColor blackColor], - @"font": [CPFont systemFontOfSize:CPFontCurrentSystemSize], + @"font": [CPNull null], @"text-shadow-color": [CPNull null], @"text-shadow-offset": CGSizeMakeZero(), @"image-position": CPImageLeft, @@ -195,7 +199,8 @@ var CPControlBlackColor = [CPColor blackColor]; { _sendActionOn = CPLeftMouseUpMask; _trackingMouseDownFlags = 0; - + + [self setControlSize:CPThemeStateControlSizeRegular]; [self updateTrackingAreas]; } diff --git a/AppKit/CPFont.j b/AppKit/CPFont.j index 65c6786c4..fa8884278 100644 --- a/AppKit/CPFont.j +++ b/AppKit/CPFont.j @@ -25,6 +25,8 @@ @import "CPView.j" @import "CPFontDescriptor.j" +@import "_CPObject+Theme.j" +@import "CPControl.j" CPFontDefaultSystemFontFace = @"Arial, sans-serif"; CPFontDefaultSystemFontSize = 12; @@ -38,12 +40,15 @@ CPFontCurrentSystemSize = -1; // For internal use only by this class and subclasses _CPFontSystemFacePlaceholder = "_CPFontSystemFacePlaceholder"; -var _CPFontCache = {}, - _CPSystemFontCache = {}, - _CPFontSystemFontFace = CPFontDefaultSystemFontFace, - _CPFontSystemFontSize = 12, - _CPFontFallbackFaces = CPFontDefaultSystemFontFace.split(", "), - _CPFontStripRegExp = new RegExp("(^\\s*[\"']?|[\"']?\\s*$)", "g"); +var _CPFontCache = {}, + _CPSystemFontCache = {}, + _CPFontSystemFontFace = CPFontDefaultSystemFontFace, + _CPFontSystemFontSize = CPFontDefaultSystemFontSize, + _CPFontSystemFontSizeSmall = CPFontDefaultSystemFontSize - 1, + _CPFontSystemFontSizeMini = CPFontDefaultSystemFontSize - 2, + _CPFontFallbackFaces = CPFontDefaultSystemFontFace.split(", "), + _CPFontStripRegExp = new RegExp("(^\\s*[\"']?|[\"']?\\s*$)", "g"), + _CPFontSystemFontFaceSpecified = NO; #define _CPRealFontSize(aSize) (aSize <= 0 ? _CPFontSystemFontSize : aSize) @@ -109,7 +114,7 @@ following: Asap @endcode */ -@implementation CPFont : CPObject +@implementation CPFont : CPObject { CPString _name; float _size; @@ -123,6 +128,22 @@ following: CPString _cssString; } ++ (CPString)defaultThemeClass +{ + return @"font"; +} + ++ (CPDictionary)themeAttributes +{ + return @{ + @"system-font-face": [CPNull null], + @"system-font-style": [CPNull null], + @"system-font-size-regular": [CPNull null], + @"system-font-size-small": [CPNull null], + @"system-font-size-mini": [CPNull null] + }; +} + + (void)initialize { if (self !== [CPFont class]) @@ -134,7 +155,10 @@ following: systemFontFace = [[CPBundle bundleForClass:[CPView class]] objectForInfoDictionaryKey:@"CPSystemFontFace"]; if (systemFontFace) + { _CPFontSystemFontFace = _CPFontNormalizedNames(systemFontFace); + _CPFontSystemFontFaceSpecified = YES; + } var systemFontSize = [[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPSystemFontSize"]; @@ -142,7 +166,62 @@ following: systemFontSize = [[CPBundle bundleForClass:[CPView class]] objectForInfoDictionaryKey:@"CPSystemFontSize"]; if (systemFontSize) + { _CPFontSystemFontSize = systemFontSize; + _CPFontSystemFontFaceSpecified = YES; + } +} + ++ (void)initializeSystemFontFromTheme:(CPTheme)aTheme +{ + // If something was specified via +initialize (from an Info.plist file), don't do anything + if (_CPFontSystemFontFaceSpecified) + return; + + // Reset all system font caches + _CPSystemFontCache = {}; + + // Now, try to get information from the theme + var systemFontFace = [aTheme valueForAttributeWithName:@"system-font-face" forClass:[CPFont class]]; + + if (systemFontFace) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontFace = _CPFontNormalizedNames(systemFontFace); + } + + var systemFontSize = [aTheme valueForAttributeWithName:@"system-font-size-regular" forClass:[CPFont class]]; + + if (systemFontSize) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontSize = systemFontSize; + } + + systemFontSize = [aTheme valueForAttributeWithName:@"system-font-size-small" forClass:[CPFont class]]; + + if (systemFontSize) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontSizeSmall = systemFontSize; + } + + systemFontSize = [aTheme valueForAttributeWithName:@"system-font-size-mini" forClass:[CPFont class]]; + + if (systemFontSize) + { + [self _invalidateSystemFontCache]; + _CPFontSystemFontSizeMini = systemFontSize; + } + + // Is there something to add to the global syle definition ? + var systemFontStyle = [aTheme valueForAttributeWithName:@"system-font-style" forClass:[CPFont class]]; + + if (systemFontStyle) + { + // Yes, so install it in the DOM Style element + document.getElementsByTagName("STYLE")[0].innerHTML += "\n" + [aTheme setCSSResourcesPathInString:systemFontStyle]; + } } /*! @@ -177,14 +256,13 @@ following: + (CPFont)systemFontForControlSize:(CPControlSize)aSize { - // TODO These sizes should be themable or made less arbitrary in some other way. switch (aSize) { case CPSmallControlSize: - return [self systemFontOfSize:_CPFontSystemFontSize - 1]; + return [self systemFontOfSize:_CPFontSystemFontSizeSmall]; case CPMiniControlSize: - return [self systemFontOfSize:_CPFontSystemFontSize - 2]; + return [self systemFontOfSize:_CPFontSystemFontSizeMini]; case CPRegularControlSize: default: @@ -315,6 +393,10 @@ following: _isItalic = isItalic; _isSystem = isSystem; + _theme = [CPTheme defaultTheme]; + _themeState = CPThemeStateNormal; + [self _loadThemeAttributes]; + if (isSystem) { _name = aName; @@ -432,6 +514,22 @@ following: _lineHeight = [metrics objectForKey:@"lineHeight"]; } +- (CPControlSize)controlSizeCorrespondingToFontSize +{ + switch (_size) + { + case _CPFontSystemFontSizeSmall: + return CPSmallControlSize; + + case _CPFontSystemFontSizeMini: + return CPMiniControlSize; + + default: + // If we can't find a corresponding size, return regular control size + return CPRegularControlSize; + } +} + @end @implementation CPFont(DescriptorAdditions) @@ -492,7 +590,11 @@ var CPFontNameKey = @"CPFontNameKey", isItalic = [aCoder decodeBoolForKey:CPFontIsItalicKey], isSystem = [aCoder decodeBoolForKey:CPFontIsSystemKey]; - return [self _initWithName:fontName size:size bold:isBold italic:isItalic system:isSystem]; + self = [self _initWithName:fontName size:size bold:isBold italic:isItalic system:isSystem]; + + [self _decodeThemeObjectsWithCoder:aCoder]; + + return self; } /*! @@ -506,6 +608,8 @@ var CPFontNameKey = @"CPFontNameKey", [aCoder encodeBool:_isBold forKey:CPFontIsBoldKey]; [aCoder encodeBool:_isItalic forKey:CPFontIsItalicKey]; [aCoder encodeBool:_isSystem forKey:CPFontIsSystemKey]; + + [self _encodeThemeObjectsWithCoder:aCoder]; } @end diff --git a/AppKit/CPTheme.j b/AppKit/CPTheme.j index f0e66815f..c232236d8 100644 --- a/AppKit/CPTheme.j +++ b/AppKit/CPTheme.j @@ -49,6 +49,8 @@ var CPThemesByName = { }, + (void)setDefaultTheme:(CPTheme)aTheme { CPThemeDefaultTheme = aTheme; + + [CPFont initializeSystemFontFromTheme:aTheme]; } + (CPTheme)defaultTheme From 6c7d8df565d62de041e47049430798ae4fb13826 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 12:59:32 +0200 Subject: [PATCH 15/30] Aristo3: CPButton (#2920) --- AppKit/CPButton.j | 424 +++++++++++------- Tests/AppKit/CPButtonTest.j | 19 +- .../Resources/SimpleBindingsAdoption_03.cib | 2 +- .../Resources/02_WithBindings.cib | 2 +- Tools/nib2cib/NSButton.j | 49 +- 5 files changed, 303 insertions(+), 193 deletions(-) diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index af94d34fc..ab9987818 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -44,6 +44,7 @@ CPTexturedRoundedBezelStyle = 11; // Round Textured CPRoundRectBezelStyle = 12; // Round Rect CPRecessedBezelStyle = 13; // Recessed CPRoundedDisclosureBezelStyle = 14; // Disclosure +CPInlineBezelStyle = 15; // Inline CPHUDBezelStyle = -1; @@ -72,14 +73,32 @@ CPPushInCellMask = CPPushInButtonMask; CPChangeGrayCellMask = CPGrayButtonMask; CPChangeBackgroundCellMask = CPBackgroundButtonMask; -CPButtonStateMixed = CPThemeState("mixed"); -CPButtonStateBezelStyleRounded = CPThemeState("rounded"); -CPButtonStateBezelStyleRoundRect = CPThemeState("roundRect"); +CPButtonStateMixed = CPThemeState("mixed"); +CPButtonStateBezelStyleRounded = CPThemeState("rounded"); // IB style : Push +CPButtonStateBezelStyleShadowlessSquare = CPThemeState("square"); // IB style : Square +CPButtonStateBezelStyleSmallSquare = CPThemeState("gradient"); // IB style : Gradient +CPButtonStateBezelStyleTexturedRounded = CPThemeState("textured-rounded"); // IB style : Textured rounded +CPButtonStateBezelStyleRoundRect = CPThemeState("roundRect"); // IB style : Round rect +CPButtonStateBezelStyleRecessed = CPThemeState("recessed"); // IB style : Recessed +CPButtonStateBezelStyleInline = CPThemeState("inline"); // IB style : Inline +CPButtonStateBezelStyleRegularSquare = CPThemeState("bevel"); // IB style : Bevel +CPButtonStateBezelStyleTextured = CPThemeState("textured"); // IB style : Textured +CPButtonStateBezelStyleDisclosure = CPThemeState("disclosure"); // IB style : Disclosure triangle +CPButtonStateBezelStyleRoundedDisclosure = CPThemeState("rounded-disclosure"); // IB style : Rounded disclosure // add all future correspondance between bezel styles and theme state here. var CPButtonBezelStyleStateMap = @{ - CPRoundedBezelStyle: CPButtonStateBezelStyleRounded, - CPRoundRectBezelStyle: CPButtonStateBezelStyleRoundRect, + CPRoundedBezelStyle: CPButtonStateBezelStyleRounded, + CPShadowlessSquareBezelStyle: CPButtonStateBezelStyleShadowlessSquare, + CPSmallSquareBezelStyle: CPButtonStateBezelStyleSmallSquare, + CPTexturedRoundedBezelStyle: CPButtonStateBezelStyleTexturedRounded, + CPRoundRectBezelStyle: CPButtonStateBezelStyleRoundRect, + CPRecessedBezelStyle: CPButtonStateBezelStyleRecessed, + CPInlineBezelStyle: CPButtonStateBezelStyleInline, + CPRegularSquareBezelStyle: CPButtonStateBezelStyleRegularSquare, + CPTexturedSquareBezelStyle: CPButtonStateBezelStyleTextured, + CPDisclosureBezelStyle: CPButtonStateBezelStyleDisclosure, + CPRoundedDisclosureBezelStyle: CPButtonStateBezelStyleRoundedDisclosure }; /// @cond IGNORE @@ -108,6 +127,7 @@ CPButtonImageOffset = 3.0; // NS-style Display Properties CPBezelStyle _bezelStyle; + ThemeState _bezelState; CPString _keyEquivalent; unsigned _keyEquivalentModifierMask; @@ -117,7 +137,7 @@ CPButtonImageOffset = 3.0; float _periodicDelay; float _periodicInterval; - BOOL _isTracking; + BOOL _isHighlighted; } + (Class)_binderClassForBinding:(CPString)aBinding @@ -157,6 +177,13 @@ CPButtonImageOffset = 3.0; @"bezel-inset": CGInsetMakeZero(), @"content-inset": CGInsetMakeZero(), @"bezel-color": [CPNull null], + @"image-position": CPImageLeft, + @"vertical-alignment": CPCenterVerticalTextAlignment, + @"alignment": CPCenterTextAlignment, + @"image-scaling": CPImageScaleNone, + @"invert-image": NO, + @"invert-image-on-push": NO, + @"image-color": [CPNull null] // If null, image color follows text color }; } @@ -172,12 +199,12 @@ CPButtonImageOffset = 3.0; if (self) { // Should we instead override the defaults? - [self setValue:CPCenterTextAlignment forThemeAttribute:@"alignment"]; - [self setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; - [self setValue:CPImageLeft forThemeAttribute:@"image-position"]; - [self setValue:CPImageScaleNone forThemeAttribute:@"image-scaling"]; +// [self setValue:CPCenterTextAlignment forThemeAttribute:@"alignment"]; +// [self setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; +// [self setValue:CPImageLeft forThemeAttribute:@"image-position"]; +// [self setValue:CPImageScaleNone forThemeAttribute:@"image-scaling"]; - [self setBezelStyle:CPRoundRectBezelStyle]; + [self setBezelStyle:CPRoundedBezelStyle]; [self setBordered:YES]; [self _init]; @@ -258,30 +285,6 @@ CPButtonImageOffset = 3.0; anObjectValue = CPOnState; [super setObjectValue:anObjectValue]; - - switch ([self objectValue]) - { - case CPMixedState: - [self unsetThemeState:CPThemeStateSelected]; - [self setThemeState:CPButtonStateMixed]; - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self setThemeState:CPThemeStateHighlighted]; - else - [self unsetThemeState:CPThemeStateHighlighted]; - break; - - case CPOnState: - [self unsetThemeState:CPButtonStateMixed]; - [self setThemeState:CPThemeStateSelected]; - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self setThemeState:CPThemeStateHighlighted]; - else - [self unsetThemeState:CPThemeStateHighlighted]; - break; - - case CPOffState: - [self unsetThemeStates:[CPThemeStateSelected, CPButtonStateMixed, CPThemeStateHighlighted]]; - } } /*! @@ -378,12 +381,19 @@ CPButtonImageOffset = 3.0; - (void)setImage:(CPImage)anImage { - [self setValue:anImage forThemeAttribute:@"image" inState:CPThemeStateNormal]; + // This is needed when compiling themes + if (!_bezelState) + _bezelState = CPThemeStateNormal; + + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState]; } - (CPImage)image { - return [self valueForThemeAttribute:@"image" inState:CPThemeStateNormal]; + if (!_bezelState) + _bezelState = CPThemeStateNormal; + + return [self valueForThemeAttribute:@"image" inState:_bezelState]; } /*! @@ -392,7 +402,8 @@ CPButtonImageOffset = 3.0; */ - (void)setAlternateImage:(CPImage)anImage { - [self setValue:anImage forThemeAttribute:@"image" inState:CPThemeStateHighlighted]; + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateHighlighted)]; + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateSelected)]; } /*! @@ -400,7 +411,17 @@ CPButtonImageOffset = 3.0; */ - (CPImage)alternateImage { - return [self valueForThemeAttribute:@"image" inState:CPThemeStateHighlighted]; + return [self valueForThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateSelected)]; +} + +- (void)setHoveredImage:(CPImage)anImage +{ + [self setValue:anImage forThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateHovered)]; +} + +- (CPImage)hoveredImage +{ + return [self valueForThemeAttribute:@"image" inState:_bezelState.and(CPThemeStateHovered)]; } - (void)setImageOffset:(float)theImageOffset @@ -423,11 +444,6 @@ CPButtonImageOffset = 3.0; _showsStateBy = aMask; - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask) && [self state] != CPOffState) - [self setThemeState:CPThemeStateHighlighted]; - else - [self unsetThemeState:CPThemeStateHighlighted]; - [self setNeedsDisplay:YES]; [self setNeedsLayout]; } @@ -444,11 +460,8 @@ CPButtonImageOffset = 3.0; _highlightsBy = aMask; - if ([self hasThemeState:CPThemeStateHighlighted]) - { - [self setNeedsDisplay:YES]; - [self setNeedsLayout]; - } + [self setNeedsDisplay:YES]; + [self setNeedsLayout]; } - (CPInteger)highlightsBy @@ -533,6 +546,17 @@ CPButtonImageOffset = 3.0; _periodicInterval = anInterval; } +- (void)highlight:(BOOL)shouldHighlight +{ + if (_isHighlighted == shouldHighlight) + return; + + _isHighlighted = shouldHighlight; + + [self setNeedsLayout]; + [self setNeedsDisplay:YES]; +} + - (void)mouseDown:(CPEvent)anEvent { if ([self isEnabled] && [self isContinuous]) @@ -555,46 +579,12 @@ CPButtonImageOffset = 3.0; [_target performSelector:_action withObject:self]; } -- (BOOL)startTrackingAt:(CGPoint)aPoint -{ - _isTracking = YES; - - var startedTracking = [super startTrackingAt:aPoint]; - - if (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask)) - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self highlight:[self state] == CPOffState]; - else - [self highlight:YES]; - } - else - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self highlight:[self state] != CPOffState]; - else - [self highlight:NO]; - } - - return startedTracking; -} - - (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp { - _isTracking = NO; - if (mouseIsUp && CGRectContainsPoint([self bounds], aPoint)) [self setNextState]; - else - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - [self highlight:[self state] != CPOffState]; - else - [self highlight:NO]; - } - [self setNeedsLayout]; - [self setNeedsDisplay:YES]; + [self highlight:NO]; [self invalidateTimers]; } @@ -615,7 +605,7 @@ CPButtonImageOffset = 3.0; - (CGRect)contentRectForBounds:(CGRect)bounds { - var contentInset = [self currentValueForThemeAttribute:@"content-inset"]; + var contentInset = [self valueForThemeAttribute:@"content-inset" inState:[self _contentVisualState]]; return CGRectInsetByInset(bounds, contentInset); } @@ -626,7 +616,7 @@ CPButtonImageOffset = 3.0; if (![self isBordered]) return bounds; - var bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"]; + var bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"]; // FIXME: faire comme au dessus ? return CGRectInsetByInset(bounds, bezelInset); } @@ -642,7 +632,7 @@ CPButtonImageOffset = 3.0; size = [contentView frameSize]; } else - size = [([self title] || " ") sizeWithFont:[self currentValueForThemeAttribute:@"font"]]; + size = [([self title] || " ") sizeWithFont:[self font]]; //[self currentValueForThemeAttribute:@"font"]]; var contentInset = [self currentValueForThemeAttribute:@"content-inset"], minSize = [self currentValueForThemeAttribute:@"min-size"], @@ -698,87 +688,164 @@ CPButtonImageOffset = 3.0; return [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()]; } +- (CPThemeState)_backgroundVisualState +{ + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state], + buttonIsOn = (currentState !== CPOffState); + + if (_isHighlighted && (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask))) // FIXME: quid background ? + visualState = visualState.and(CPThemeStateHighlighted); + else + visualState = visualState.without(CPThemeStateHighlighted); + + if (buttonIsOn && (_showsStateBy & (CPPushInCellMask | CPChangeGrayCellMask))) // FIXME: quid background ? + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + else + visualState = visualState.without(CPThemeStateSelected); + + return visualState; +} + +// Note : We have to split content and image visual states as, for example, radio buttons don't follow push buttons behavior +- (CPThemeState)_contentVisualState +{ + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state], + buttonIsOn = (currentState !== CPOffState); + + // If the button is pushed (_isHighlighted), always add the highlighted state + if (_isHighlighted || (((_showsStateBy & CPChangeGrayCellMask) || (_showsStateBy & CPChangeBackgroundCellMask)) && buttonIsOn)) + visualState = visualState.and(CPThemeStateHighlighted); + else + visualState = visualState.without(CPThemeStateHighlighted); + + if (buttonIsOn && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + else + visualState = visualState.without(CPThemeStateSelected); + + return visualState; +} + +- (CPThemeState)_imageVisualState +{ + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state], + buttonIsOn = (currentState !== CPOffState); + + // Remove highlighted & selected theme states + visualState = visualState.without(CPThemeStateHighlighted); + visualState = visualState.without(CPThemeStateSelected); + + // Note : We have to deal with special case where button is ON, highlightsBy and showsStateBy use content, and button is pushed + // BUT this should not be used for disclosure buttons ! + if (_isHighlighted && buttonIsOn && (_highlightsBy & CPContentsCellMask) && (_showsStateBy & CPContentsCellMask) && (_bezelStyle !== CPDisclosureBezelStyle)) + return visualState; + + if (_isHighlighted && ((_highlightsBy & CPContentsCellMask) || (_highlightsBy & CPChangeGrayCellMask))) + visualState = visualState.and(CPThemeStateHighlighted); + + if (buttonIsOn && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; +} + +- (CPString)_currentTitle +{ + var buttonIsOn = ([self state] !== CPOffState); + + // Note : We have to deal with special case where button is ON, highlightsBy and showsStateBy use content, and button is pushed + if (_isHighlighted && buttonIsOn && (_highlightsBy & CPContentsCellMask) && (_showsStateBy & CPContentsCellMask)) + return _title; + + else if (_alternateTitle && ((_isHighlighted && (_highlightsBy & CPContentsCellMask)) || (buttonIsOn && (_showsStateBy & CPContentsCellMask)))) + return _alternateTitle; + + else + return _title; +} + +- (CPImage)_currentImage +{ + var visualState = [self _imageVisualState], + currentImage = [self valueForThemeAttribute:@"image" inState:visualState], + imageColor = [self valueForThemeAttribute:@"image-color" inState:visualState], + buttonIsOn = ([self state] !== CPOffState); + + if ([currentImage isMaterialIconImage]) + { + // FIXME: Keep this ? + if (([self valueForThemeAttribute:@"invert-image" inState:visualState] || ([self valueForThemeAttribute:@"invert-image-on-push" inState:visualState] && (_isHighlighted || (((_showsStateBy & CPChangeGrayCellMask) || (_showsStateBy & CPChangeBackgroundCellMask)) && buttonIsOn))))) + currentImage = [currentImage invertedImage]; + + else if (imageColor && [imageColor isKindOfClass:CPColor]) + // In some buttons, image color doesn't follow text color ! + currentImage = [currentImage imageVersionWithColor:imageColor]; + + else + // By default, image color follows text color + currentImage = [currentImage imageVersionWithColor:[self valueForThemeAttribute:@"text-color" inState:[self _contentVisualState]]]; + } + + return currentImage; +} + - (void)layoutSubviews { - var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" - positioned:CPWindowBelow - relativeToEphemeralSubviewNamed:@"content-view"]; + var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"content-view"], - [bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]]; - - var contentView = [self layoutEphemeralSubviewNamed:@"content-view" + contentView = [self layoutEphemeralSubviewNamed:@"content-view" positioned:CPWindowAbove - relativeToEphemeralSubviewNamed:@"bezel-view"]; + relativeToEphemeralSubviewNamed:@"bezel-view"], - if (contentView) - { - var title = nil, - image = nil; + image = [self _currentImage], + contentVisualState = [self _contentVisualState]; - if (_isTracking) - { - if (_highlightsBy & CPContentsCellMask) - { - if (_showsStateBy & CPContentsCellMask) - { - title = ([self state] == CPOffState && _alternateTitle) ? _alternateTitle : _title; - image = ([self state] == CPOffState && [self alternateImage]) ? [self alternateImage] : [self image]; - } - else - { - title = [self alternateTitle]; - image = [self alternateImage]; - } - } - else if (_showsStateBy & CPContentsCellMask) - { - title = ([self state] != CPOffState && _alternateTitle) ? _alternateTitle : _title; - image = ([self state] != CPOffState && [self alternateImage]) ? [self alternateImage] : [self image]; - } - else - { - title = _title; - image = [self image]; - } - } - else - { - if (_showsStateBy & CPContentsCellMask) - { - title = ([self state] != CPOffState && _alternateTitle) ? _alternateTitle : _title; - image = ([self state] != CPOffState && [self alternateImage]) ? [self alternateImage] : [self image]; - } - else - { - title = _title; - image = [self image]; - } - } + [bezelView setBackgroundColor:[self valueForThemeAttribute:@"bezel-color" inState:[self _backgroundVisualState]]]; + [contentView setText:[self _currentTitle]]; + [contentView setImage:image]; - [contentView setText:title]; - [contentView setImage:image]; - [contentView setImageOffset:[self currentValueForThemeAttribute:@"image-offset"]]; + [contentView setImageOffset:[self valueForThemeAttribute:@"image-offset" inState:contentVisualState]]; - [contentView setFont:[self currentValueForThemeAttribute:@"font"]]; - [contentView setTextColor:[self currentValueForThemeAttribute:@"text-color"]]; - [contentView setAlignment:[self currentValueForThemeAttribute:@"alignment"]]; - [contentView setVerticalAlignment:[self currentValueForThemeAttribute:@"vertical-alignment"]]; - [contentView setLineBreakMode:[self currentValueForThemeAttribute:@"line-break-mode"]]; - [contentView _setUsesSingleLineMode:YES]; - [contentView setTextShadowColor:[self currentValueForThemeAttribute:@"text-shadow-color"]]; - [contentView setTextShadowOffset:[self currentValueForThemeAttribute:@"text-shadow-offset"]]; - [contentView setImagePosition:[self currentValueForThemeAttribute:@"image-position"]]; - [contentView setImageScaling:[self currentValueForThemeAttribute:@"image-scaling"]]; - [contentView setDimsImage:[self hasThemeState:CPThemeStateDisabled] && _imageDimsWhenDisabled]; - } + [contentView setFont:[self font]]; //[self currentValueForThemeAttribute:@"font"]]; + [contentView setTextColor:[self valueForThemeAttribute:@"text-color" inState:contentVisualState]]; + [contentView setAlignment:[self valueForThemeAttribute:@"alignment" inState:contentVisualState]]; + [contentView setVerticalAlignment:[self valueForThemeAttribute:@"vertical-alignment" inState:contentVisualState]]; + [contentView setLineBreakMode:[self valueForThemeAttribute:@"line-break-mode" inState:contentVisualState]]; + [contentView _setUsesSingleLineMode:YES]; + [contentView setTextShadowColor:[self valueForThemeAttribute:@"text-shadow-color" inState:contentVisualState]]; + [contentView setTextShadowOffset:[self valueForThemeAttribute:@"text-shadow-offset" inState:contentVisualState]]; + [contentView setImagePosition:[self valueForThemeAttribute:@"image-position"]]; + [contentView setImageScaling:[self valueForThemeAttribute:@"image-scaling"]]; + + // We don't automatically dim material icon images as the color is driven by the theme + [contentView setDimsImage:[self hasThemeState:CPThemeStateDisabled] && _imageDimsWhenDisabled && ![image isMaterialIconImage]]; } - (void)setBordered:(BOOL)shouldBeBordered { if (shouldBeBordered) + { [self setThemeState:CPThemeStateBordered]; + + if (_bezelState) + _bezelState = _bezelState.and(CPThemeStateBordered); + else + _bezelState = CPThemeStateBordered; + } else + { [self unsetThemeState:CPThemeStateBordered]; + + if (_bezelState) + _bezelState = _bezelState.without(CPThemeStateBordered); + else + _bezelState = CPThemeStateNormal; + } } - (BOOL)isBordered @@ -874,17 +941,19 @@ CPButtonImageOffset = 3.0; [self setState:[self nextState]]; - var shouldHighlight = NO; - - if (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask)) - { - if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) - shouldHighlight = [self state] == CPOffState; - else - shouldHighlight = YES; - } - - [self highlight:shouldHighlight]; + // FIXME: Here +// var shouldHighlight = NO; +// +// if (_highlightsBy & (CPPushInCellMask | CPChangeGrayCellMask)) +// { +// if (_showsStateBy & (CPChangeGrayCellMask | CPChangeBackgroundCellMask)) +// shouldHighlight = [self state] == CPOffState; +// else +// shouldHighlight = YES; +// } +// +// [self highlight:shouldHighlight]; + [self highlight:YES]; try { @@ -896,7 +965,8 @@ CPButtonImageOffset = 3.0; } finally { - if (shouldHighlight) + // FIXME: Here + // if (shouldHighlight) [CPTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(unhighlightButtonTimerDidFinish:) userInfo:nil repeats:NO]; } } @@ -920,6 +990,18 @@ CPButtonImageOffset = 3.0; [self setThemeState:newState]; _bezelStyle = aBezelStyle; + + if (_bezelState && newState) + _bezelState = _bezelState.and(newState); + else + _bezelState = newState || CPThemeStateNormal; + + // For disclosure triangle and rounded, we have to move away from + // what Xcode tells us as we implement visual behavior with images (so content) + // and not background + + if ((_bezelStyle === CPDisclosureBezelStyle) || (_bezelStyle === CPRoundedDisclosureBezelStyle)) + [self setShowsStateBy:CPContentsCellMask]; } - (unsigned)bezelStyle @@ -930,7 +1012,7 @@ CPButtonImageOffset = 3.0; @end -var CPButtonImageKey = @"CPButtonImageKey", +var CPButtonImageKey = @"CPButtonImageKey", // FIXME: pas utilisé ?????? CPButtonAlternateImageKey = @"CPButtonAlternateImageKey", CPButtonTitleKey = @"CPButtonTitleKey", CPButtonAlternateTitleKey = @"CPButtonAlternateTitleKey", @@ -943,7 +1025,8 @@ var CPButtonImageKey = @"CPButtonImageKey", CPButtonPeriodicDelayKey = @"CPButtonPeriodicDelayKey", CPButtonPeriodicIntervalKey = @"CPButtonPeriodicIntervalKey", CPButtonHighlightsByKey = @"CPButtonHighlightsByKey", - CPButtonShowsStateByKey = @"CPButtonShowsStateByKey"; + CPButtonShowsStateByKey = @"CPButtonShowsStateByKey", + CPButtonBezelStyleKey = @"CPButtonBezelStyleKey"; @implementation CPButton (CPCoding) @@ -992,6 +1075,12 @@ var CPButtonImageKey = @"CPButtonImageKey", _keyEquivalentModifierMask = [aCoder decodeIntForKey:CPButtonKeyEquivalentMaskKey]; + if ([aCoder containsValueForKey:CPButtonIsBorderedKey]) + [self setBordered:[aCoder decodeBoolForKey:CPButtonIsBorderedKey]]; + + if ([aCoder containsValueForKey:CPButtonBezelStyleKey]) + [self setBezelStyle:[aCoder decodeIntForKey:CPButtonBezelStyleKey]]; + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } @@ -1026,6 +1115,9 @@ var CPButtonImageKey = @"CPButtonImageKey", [aCoder encodeObject:_periodicDelay forKey:CPButtonPeriodicDelayKey]; [aCoder encodeObject:_periodicInterval forKey:CPButtonPeriodicIntervalKey]; + + [aCoder encodeBool:[self isBordered] forKey:CPButtonIsBorderedKey]; + [aCoder encodeInt: [self bezelStyle] forKey:CPButtonBezelStyleKey]; } @end diff --git a/Tests/AppKit/CPButtonTest.j b/Tests/AppKit/CPButtonTest.j index e10550a9e..36efd1247 100644 --- a/Tests/AppKit/CPButtonTest.j +++ b/Tests/AppKit/CPButtonTest.j @@ -132,15 +132,16 @@ [self assert:CPMixedState equals:[button state] message:@"Mixed state is allowed, state should be CPMixedState"]; } -- (void)testThemeStateWhenSettingObjectValue -{ - [button unsetThemeState:[button themeState]]; - [button setObjectValue:CPOnState]; - [self assert:String(CPThemeStateSelected) equals:String([button themeState]) message:@"object should be in the selected themestate"]; - - [button setObjectValue:CPOffState]; - [self assert:String(CPThemeStateNormal) equals:String([button themeState]) message:@"object should be in the normal themestate"]; -} +// PR #2920 modifies how theme states are used. This test is no more usable. +//- (void)testThemeStateWhenSettingObjectValue +//{ +// [button unsetThemeState:[button themeState]]; +// [button setObjectValue:CPOnState]; +// [self assert:String(CPThemeStateSelected) equals:String([button themeState]) message:@"object should be in the selected themestate"]; +// +// [button setObjectValue:CPOffState]; +// [self assert:String(CPThemeStateNormal) equals:String([button themeState]) message:@"object should be in the normal themestate"]; +//} - (void)testThemeAttributes { diff --git a/Tests/AppKit/Resources/SimpleBindingsAdoption_03.cib b/Tests/AppKit/Resources/SimpleBindingsAdoption_03.cib index 9019a2d8a..87a08a420 100644 --- a/Tests/AppKit/Resources/SimpleBindingsAdoption_03.cib +++ b/Tests/AppKit/Resources/SimpleBindingsAdoption_03.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;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;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;27E;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;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;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;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;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;41E;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;42E;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;35E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;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;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;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;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;45E;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;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;46E;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;47E;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;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;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;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;35E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;49E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;37E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;55E;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;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;61E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;62E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;63E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;64E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;65E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;66E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;67E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;31E;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;30E;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;69E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;69E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;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;72E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;6;$afontD;K;6;CP$UIDd;2;76E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;68E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;77E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;78E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;2;68E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;2;79E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;2;68E;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;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;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;80E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;81E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;82E;K;6;$afontD;K;6;CP$UIDd;2;83E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;84E;K;7;$aimageD;K;6;CP$UIDd;2;86E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;78E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;87E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;88E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;89E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;90E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;68E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;91E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;84E;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;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;31E;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;92E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;93E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;94E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;95E;K;6;$afontD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;84E;K;11;$aalignmentD;K;6;CP$UIDd;2;78E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;88E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;97E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;91E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;91E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;99E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;84E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;78E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;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;100E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;94E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;71E;K;6;$afontD;K;6;CP$UIDd;2;96E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;78E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;97E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;89E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;89E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;89E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;103E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;68E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;78E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;104E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;2;91E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;2;89E;E;S;35;NSKeyValueBindingSimpleBindingsTestD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;buttonS;16;objectControllerS;6;sliderS;9;textFieldS;9;theWindowS;8;delegateS;10;muteTrack:S;23;value: selection.volumeS;5;valueS;16;selection.volumeD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;22;CPValidatesImmediatelyD;K;6;CP$UIDd;2;91E;K;17;CPNullPlaceholderD;K;6;CP$UIDd;3;105E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;20;contentObject: trackS;13;contentObjectS;5;trackD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 518}, {223, 125}}S;22;{{0, 0}, {1680, 1028}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {223, 125}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;2;38E;E;E;S;6;normalS;21;{{83, 48}, {120, 21}}S;19;{{0, 0}, {120, 21}}d;1;8D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;106E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;107E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;89E;E;d;1;5d;1;4d;2;11S;20;{{83, 82}, {70, 25}}S;18;{{0, 0}, {70, 25}}S;8;borderedD;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;108E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;109E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;91E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;91E;E;d;1;2D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;4;nameD;K;6;CP$UIDd;3;110E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;111E;K;5;valueD;K;6;CP$UIDd;3;112E;E;S;4;MuteS;0;F;d;2;14T;S;21;{{79, 16}, {128, 29}}S;19;{{0, 0}, {128, 29}}S;9;textfieldS;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;108E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;109E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;91E;E;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;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;113E;E;S;20;{{20, 23}, {55, 17}}S;18;{{0, 0}, {55, 17}}S;7;Volume:D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;114E;E;S;19;CPMutableDictionaryS;7;NothingS;9;Helveticad;2;12S;28;_CPFontSystemFacePlaceholderd;2;-1S;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;2;75E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;115E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;116E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;89E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;117E;E;E;S;13;Lucida Granded;2;13d;1;1f;18;0.6862745098039216E;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;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;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;27E;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;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;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;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;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;41E;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;42E;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;35E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;43E;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;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;44E;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;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;45E;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;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;46E;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;47E;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;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;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;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;35E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;49E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;37E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;54E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;51E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;52E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;55E;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;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;56E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;57E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;58E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;61E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;62E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;63E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;64E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;65E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;66E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;67E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;31E;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;30E;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;69E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;69E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;70E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;75E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;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;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;79E;K;6;$afontD;K;6;CP$UIDd;2;81E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;68E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;82E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;83E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;2;68E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;2;86E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;2;68E;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;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;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;87E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;89E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;90E;K;16;$aimage-positionD;K;6;CP$UIDd;2;68E;K;6;$afontD;K;6;CP$UIDd;2;91E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;68E;K;11;$aalignmentD;K;6;CP$UIDd;2;90E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;92E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;68E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;93E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;94E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;74E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;95E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;68E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;96E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;68E;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;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;2;96E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;2;97E;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;31E;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;98E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;99E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;103E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;104E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;106E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;96E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;94E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;96E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;96E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;96E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;108E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;90E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;84E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;74E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;74E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;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;109E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;79E;K;6;$afontD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;73E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;73E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;114E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;96E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;115E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;84E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;68E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;85E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;74E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;74E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;74E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;116E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;68E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;84E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;74E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;96E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;18;CPObjectControllerK;8;$classesA;S;18;CPObjectControllerS;12;CPControllerS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;117E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;2;96E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;2;74E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;2;74E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;2;74E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;119E;E;S;35;NSKeyValueBindingSimpleBindingsTestD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;buttonS;16;objectControllerS;6;sliderS;9;textFieldS;9;theWindowS;8;delegateS;10;muteTrack:S;23;value: selection.volumeS;5;valueS;16;selection.volumeD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;22;CPValidatesImmediatelyD;K;6;CP$UIDd;2;97E;K;17;CPNullPlaceholderD;K;6;CP$UIDd;3;120E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;20;contentObject: trackS;13;contentObjectS;5;trackD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 518}, {223, 125}}S;22;{{0, 0}, {1680, 1028}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {223, 125}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;2;38E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{83, 48}, {120, 21}}S;19;{{0, 0}, {120, 21}}d;1;8S;18;controlSizeRegularD;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;121E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;5d;1;4d;2;-1d;2;11S;20;{{83, 85}, {70, 25}}S;18;{{0, 0}, {70, 25}}S;35;bordered+controlSizeRegular+roundedd;1;2D;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;123E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;85E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;96E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;MuteS;0;d;2;14T;d;1;1S;21;{{79, 17}, {128, 22}}S;19;{{0, 0}, {128, 22}}S;9;textfieldS;47;bezeled+controlSizeRegular+editable+placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;124E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;126E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;127E;K;12;defaultValueD;K;6;CP$UIDd;2;90E;K;6;valuesD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;129E;K;12;defaultValueD;K;6;CP$UIDd;2;68E;K;6;valuesD;K;6;CP$UIDd;3;130E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;107E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;E;S;20;{{19, 23}, {57, 17}}S;18;{{0, 0}, {57, 17}}D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;124E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;127E;K;12;defaultValueD;K;6;CP$UIDd;2;90E;K;6;valuesD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;4;nameD;K;6;CP$UIDd;3;129E;K;12;defaultValueD;K;6;CP$UIDd;2;68E;K;6;valuesD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;139E;E;E;S;7;Volume:D;K;6;$classD;K;6;CP$UIDd;3;107E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;72E;E;S;19;CPMutableDictionaryD;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;118E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;7;NothingS;9;Helveticad;2;12S;28;_CPFontSystemFacePlaceholderS;4;fontD;K;6;$classD;K;6;CP$UIDd;2;80E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;123E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;85E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;74E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;S;15;line-break-modeD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;90E;K;6;normalD;K;6;CP$UIDd;2;90E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;84E;K;6;normalD;K;6;CP$UIDd;2;84E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;142E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;143E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;37E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;37E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;145E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;146E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;37E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;37E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;68E;K;6;normalD;K;6;CP$UIDd;2;68E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;2;84E;K;6;normalD;K;6;CP$UIDd;2;84E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;148E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;146E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;38E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;38E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;2;97E;E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;151E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;153E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;155E;E;f;18;0.6862745098039216S;57;{"origin":{"x":0,"y":1},"size":{"width":120,"height":21}}S;59;{"origin":{"x":83,"y":84},"size":{"width":120,"height":21}}S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":0}}S;59;{"origin":{"x":83,"y":83},"size":{"width":120,"height":22}}S;58;{"origin":{"x":17,"y":85},"size":{"width":61,"height":17}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.cib b/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.cib index dadce930f..3547f8943 100644 --- a/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.cib +++ b/Tests/AppKit/WithAndWithoutBindingsIntegration/02_WithBindings/Resources/02_WithBindings.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;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;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;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;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;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;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;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;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;62E;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;63E;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;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;64E;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;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;65E;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;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;66E;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;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;67E;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;42E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;68E;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;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;69E;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;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;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;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;56E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;57E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;76E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;77E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;54E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;82E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;85E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;42E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;88E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;90E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;91E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;94E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;95E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;96E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;97E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;98E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;99E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;100E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;38E;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;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;102E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;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;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;105E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;107E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;114E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;116E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;118E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;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;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;119E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;120E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;121E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;122E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;113E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;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;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;122E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;113E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;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;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;126E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;122E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;113E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;113E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;111E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;129E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;130E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;131E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;133E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;135E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;136E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;50E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;49E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;127E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;113E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;113E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;116E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;137E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;111E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;136E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;138E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;136E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;52E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;3;113E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;144E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;145E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;101E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;116E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;146E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;148E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;144E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;149E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;101E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;113E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;150E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;151E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;12;$agrid-colorD;K;6;CP$UIDd;3;153E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;154E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;155E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;101E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;112E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;116E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;113E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;113E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;113E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;113E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;156E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;153E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;101E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;116E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;158E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;47E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;159E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;160E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;161E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;162E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;164E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;165E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;166E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;116E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;113E;K;28;CPSortDescriptorPrototypeKeyD;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;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;167E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;168E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;170E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;171E;K;6;$afontD;K;6;CP$UIDd;3;172E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;7;$aimageD;K;6;CP$UIDd;3;174E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;175E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;123E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;176E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;111E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;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;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;177E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;168E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;169E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;170E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;171E;K;6;$afontD;K;6;CP$UIDd;3;172E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;7;$aimageD;K;6;CP$UIDd;3;178E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;112E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;179E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;123E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;176E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;111E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;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;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;180E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;181E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;182E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;183E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;184E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;116E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;118E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;183E;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;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;185E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;181E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;182E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;110E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;183E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;186E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;116E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;118E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;183E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;187E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;113E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;116E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;113E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;113E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;113E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;113E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;113E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;116E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;116E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;188E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;189E;E;S;10;MyDocumentD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;E;E;S;9;addButtonS;15;arrayControllerS;9;nameFieldS;12;removeButtonS;26;selectedBookmarkTitleFieldS;24;selectedBookmarkURLFieldS;9;tableViewS;10;dataSourceS;8;delegateS;7;remove:S;4;add:S;24;contentArray: collectionS;12;contentArrayS;10;collectionD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;28;value: arrangedObjects.titleS;5;valueS;21;arrangedObjects.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;20;value: selection.URLS;13;selection.URLD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;190E;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;191E;E;E;S;22;value: selection.titleS;15;selection.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;191E;E;E;S;11;value: nameS;4;nameD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 368}, {534, 323}}S;21;{{0, 0}, {1440, 878}}d;2;15S;15;02_WithBindingsd;1;0S;20;{{0, 0}, {534, 323}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;59E;E;E;S;6;normalS;21;{{20, 20}, {106, 17}}S;19;{{0, 0}, {106, 17}}d;2;36S;9;textfieldD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;192E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;193E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;113E;E;d;1;2d;1;4T;S;16;Collection Name:d;4;3072F;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;194E;E;S;22;{{130, 13}, {388, 29}}S;19;{{0, 0}, {388, 29}}d;2;34S;28;bezeled+editable+placeholderS;0;D;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;195E;E;S;22;{{57, 241}, {461, 29}}S;19;{{0, 0}, {461, 29}}d;2;10S;22;{{57, 273}, {461, 29}}S;22;{{20, 47}, {494, 150}}S;20;{{0, 0}, {494, 150}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;E;E;d;2;18S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;196E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;197E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;198E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;199E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;200E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;201E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;142E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;198E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;47E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;E;S;19;{{0, 0}, {492, 25}}S;14;tableHeaderRowS;19;{{1, 2}, {492, 15}}S;19;{{0, 0}, {492, 15}}d;1;8S;8;scrollerS;8;disabledS;29;_horizontalScrollerDidScroll:f;18;0.9904761910438538S;21;{{477, 1}, {15, 132}}S;19;{{0, 0}, {15, 132}}S;27;_verticalScrollerDidScroll:f;18;0.6157894730567932S;20;{{0, 0}, {492, 132}}S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;203E;E;d;2;25S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;54E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;204E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;205E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;206E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;E;S;5;titlef;17;489.0575866699219f;18;31.557619094848633d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;163E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;207E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;208E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;6;$afontD;K;6;CP$UIDd;3;209E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;101E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;210E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;209E;K;36;_CPTableColumnHeaderViewTextColorKeyD;K;6;CP$UIDd;1;0E;K;42;_CPTableColumnHeaderViewTextShadowColorKeyD;K;6;CP$UIDd;1;0E;K;36;_CPTableColumnHeaderViewAlignmentKeyD;K;6;CP$UIDd;3;101E;K;40;_CPTableColumnHeaderViewLineBreakModeKeyD;K;6;CP$UIDd;3;112E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;211E;K;6;$afontD;K;6;CP$UIDd;3;212E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;111E;K;11;$aalignmentD;K;6;CP$UIDd;3;101E;K;15;$acontent-insetD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;123E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;115E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;101E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;123E;E;d;1;3S;22;{{436, 214}, {78, 25}}S;18;{{0, 0}, {78, 25}}d;1;9S;6;buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;192E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;193E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;113E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;113E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;4;nameD;K;6;CP$UIDd;3;215E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;216E;K;5;valueD;K;6;CP$UIDd;3;217E;E;S;6;Removed;2;14S;22;{{346, 214}, {78, 25}}D;K;6;$classD;K;6;CP$UIDd;3;173E;K;4;nameD;K;6;CP$UIDd;3;215E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;216E;K;5;valueD;K;6;CP$UIDd;3;217E;E;S;3;AddS;21;{{20, 248}, {32, 17}}S;18;{{0, 0}, {32, 17}}d;2;12d;1;1S;6;Title:S;21;{{20, 280}, {32, 17}}S;4;URL:S;9;Bookmark2S;17;MyArrayControllerS;17;CPArrayControllerS;22;StringToURLTransformerS;12;No SelectionS;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;183E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;E;E;S;20;{{1, 1}, {492, 132}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;117E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;219E;E;S;21;{{1, 133}, {492, 17}}S;19;{{0, 0}, {492, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;E;E;S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;220E;D;K;6;CP$UIDd;3;183E;E;E;S;20;{{478, 0}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;10;cornerviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;222E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;223E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;224E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;116E;E;S;5;TitleS;11;placeholderD;K;6;$classD;K;6;CP$UIDd;3;173E;K;4;nameD;K;6;CP$UIDd;3;225E;K;12;defaultValueD;K;6;CP$UIDd;3;110E;K;6;valuesD;K;6;CP$UIDd;3;226E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;213E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;227E;E;S;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;223E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;228E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;116E;E;f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;183E;E;E;f;3;0.8D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;221E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;164E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;202E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;202E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;164E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;132E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;116E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;E;S;13;Lucida Granded;2;11S;4;fontD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;230E;E;E;S;39;{"top":0,"right":5,"bottom":0,"left":5}d;2;13D;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;231E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;182E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;113E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;116E;E;D;K;6;$classD;K;6;CP$UIDd;3;109E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;192E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;182E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;113E;E;S;17;Arial, sans-serifE;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;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;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;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;38E;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;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;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;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;36E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;62E;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;63E;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;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;64E;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;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;65E;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;41E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;66E;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;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;67E;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;42E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;68E;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;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;69E;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;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;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;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;56E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;57E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;76E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;77E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;54E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;82E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;85E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;42E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;88E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;41E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;90E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;81E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;91E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;93E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;94E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;95E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;96E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;97E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;98E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;99E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;100E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;38E;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;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;102E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;108E;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;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;109E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;115E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;116E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;118E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;120E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;107E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;127E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;131E;K;11;$aalignmentD;K;6;CP$UIDd;3;132E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;133E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;134E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;135E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;136E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;137E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;139E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;140E;K;11;$aalignmentD;K;6;CP$UIDd;3;141E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;142E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;134E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;135E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;143E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;137E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;145E;K;11;$aalignmentD;K;6;CP$UIDd;3;146E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;147E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;134E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;135E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;125E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;121E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;119E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;148E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;149E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;151E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;153E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;155E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;156E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;50E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;49E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;138E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;138E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;138E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;138E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;119E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;119E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;107E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;157E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;125E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;156E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;158E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;158E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;156E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;159E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;160E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;52E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;161E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;162E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;165E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;166E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;107E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;168E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;169E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;170E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;165E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;171E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;45E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;172E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;119E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;173E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;155E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;174E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;155E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;175E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;12;$agrid-colorD;K;6;CP$UIDd;3;177E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;178E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;179E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;180E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;101E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;121E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;107E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;119E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;119E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;119E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;119E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;181E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;177E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;101E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;107E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;182E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;184E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;47E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;185E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;186E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;187E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;188E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;190E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;191E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;192E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;107E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;119E;K;28;CPSortDescriptorPrototypeKeyD;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;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;193E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;194E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;195E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;197E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;125E;K;16;$aimage-positionD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;199E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;125E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;200E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;201E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;134E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;107E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;202E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;119E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;101E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;119E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;204E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;194E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;195E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;196E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;197E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;125E;K;16;$aimage-positionD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;199E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;11;$aalignmentD;K;6;CP$UIDd;3;125E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;205E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;206E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;134E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;107E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;202E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;119E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;101E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;K;21;CPButtonIsBorderedKeyD;K;6;CP$UIDd;3;119E;K;21;CPButtonBezelStyleKeyD;K;6;CP$UIDd;3;203E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;207E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;208E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;210E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;211E;K;11;$aalignmentD;K;6;CP$UIDd;3;212E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;213E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;107E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;203E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;119E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;107E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;38E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;215E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;208E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;38E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;216E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;217E;K;11;$aalignmentD;K;6;CP$UIDd;3;218E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;219E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;119E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;220E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;121E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;107E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;101E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;203E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;119E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;107E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;221E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;119E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;107E;K;37;CPObjectControllerUsesLazyFetchingKeyD;K;6;CP$UIDd;3;107E;K;40;CPObjectControllerIsUsingManagedProxyKeyD;K;6;CP$UIDd;3;107E;K;33;CPObjectControllerManagedProxyKeyD;K;6;CP$UIDd;3;223E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;119E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;119E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;119E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;119E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;119E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;107E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;107E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;224E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;225E;E;S;10;MyDocumentD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;E;E;S;9;addButtonS;15;arrayControllerS;9;nameFieldS;12;removeButtonS;26;selectedBookmarkTitleFieldS;24;selectedBookmarkURLFieldS;9;tableViewS;10;dataSourceS;8;delegateS;7;remove:S;4;add:S;24;contentArray: collectionS;12;contentArrayS;10;collectionD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;28;value: arrangedObjects.titleS;5;valueS;21;arrangedObjects.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;20;value: selection.URLS;13;selection.URLD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;22;CPValueTransformerNameD;K;6;CP$UIDd;3;226E;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;227E;E;E;S;22;value: selection.titleS;15;selection.titleD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;24;CPNoSelectionPlaceholderD;K;6;CP$UIDd;3;227E;E;E;S;11;value: nameS;4;nameD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;E;E;S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;9;544735232S;24;{{196, 368}, {534, 323}}S;21;{{0, 0}, {1440, 878}}d;2;15S;15;02_WithBindingsd;1;0S;20;{{0, 0}, {534, 323}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;59E;E;E;S;4;viewS;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{19, 20}, {108, 17}}S;19;{{0, 0}, {108, 17}}d;2;36S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;230E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;234E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;236E;E;E;T;S;16;Collection Name:d;1;4d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;237E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;d;1;2S;22;{{130, 14}, {388, 22}}S;19;{{0, 0}, {388, 22}}d;2;34S;47;bezeled+controlSizeRegular+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;239E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;240E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;242E;D;K;6;CP$UIDd;3;243E;E;E;S;0;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;244E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;S;22;{{57, 242}, {461, 22}}S;19;{{0, 0}, {461, 22}}d;2;10D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;245E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;246E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;247E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;248E;D;K;6;CP$UIDd;3;249E;E;E;S;22;{{57, 274}, {461, 22}}D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;250E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;251E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;253E;D;K;6;CP$UIDd;3;254E;E;E;S;22;{{20, 47}, {494, 150}}S;20;{{0, 0}, {494, 150}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;E;E;d;2;18S;10;scrollviewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;255E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;174E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;256E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;257E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;258E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;3;154E;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;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;259E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;260E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;261E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;262E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;47E;E;D;K;6;$classD;K;6;CP$UIDd;2;37E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;45E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;263E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;263E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;264E;E;S;19;{{0, 0}, {492, 23}}S;14;tableHeaderRowD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;19;{{1, 2}, {492, 15}}S;19;{{0, 0}, {492, 15}}d;1;8S;8;scrollerS;27;controlSizeRegular+disabledD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;29;_horizontalScrollerDidScroll:f;18;0.9904761910438538S;21;{{477, 1}, {15, 132}}S;19;{{0, 0}, {15, 132}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;27;_verticalScrollerDidScroll:f;18;0.6157894730567932S;20;{{0, 0}, {492, 132}}D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;265E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;266E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;2;25S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;54E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;257E;D;K;6;CP$UIDd;3;267E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;183E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;268E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;271E;E;S;5;titlef;17;489.0575866699219f;18;31.557619094848633d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;189E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;263E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;263E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;272E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;273E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;274E;K;12;$atext-colorD;K;6;CP$UIDd;3;275E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;276E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;277E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;274E;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;263E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;263E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;278E;K;6;$afontD;K;6;CP$UIDd;3;279E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;280E;K;11;$aalignmentD;K;6;CP$UIDd;3;281E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;282E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;283E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;107E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;257E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;121E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;101E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;107E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;107E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;107E;E;d;1;3S;22;{{436, 217}, {78, 25}}S;18;{{0, 0}, {78, 25}}d;1;9S;6;buttonS;35;bordered+controlSizeRegular+roundedD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;198E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;284E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;Removed;2;14d;1;1S;22;{{346, 217}, {78, 25}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;3;AddS;21;{{19, 248}, {34, 17}}S;18;{{0, 0}, {34, 17}}d;2;12D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;285E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;286E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;287E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;E;E;S;6;Title:S;21;{{19, 280}, {34, 17}}D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;289E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;291E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;292E;E;E;S;4;URL:S;9;Bookmark2D;K;10;$classnameS;15;_CPManagedProxyK;8;$classesA;S;15;_CPManagedProxyS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;222E;K;27;CPManagedProxyEntityNameKeyD;K;6;CP$UIDd;1;0E;K;31;CPManagedProxyFetchPredicateKeyD;K;6;CP$UIDd;1;0E;E;S;17;MyArrayControllerS;17;CPArrayControllerS;22;StringToURLTransformerS;12;No SelectionS;4;fontD;K;6;$classD;K;6;CP$UIDd;3;198E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;284E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;S;15;line-break-modeD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;294E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;40E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;40E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;296E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;297E;D;K;6;CP$UIDd;3;203E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;298E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;41E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;41E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;300E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;301E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;41E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;41E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;302E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;303E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;42E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;42E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;304E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;305E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;42E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;42E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;306E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;125E;K;6;normalD;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;307E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;43E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;43E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;308E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;309E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;43E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;43E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;310E;E;S;20;{{1, 1}, {492, 132}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;311E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;21;{{1, 133}, {492, 17}}S;19;{{0, 0}, {492, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;16;{{0, 0}, {0, 0}}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;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;312E;D;K;6;CP$UIDd;3;312E;D;K;6;CP$UIDd;3;312E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;313E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;S;20;{{478, 0}, {14, 25}}S;18;{{0, 0}, {14, 25}}S;10;cornerviewD;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;3;315E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;198E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;284E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;209E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;107E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;119E;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;316E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;238E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;5;TitleS;53;controlSizeRegular+editable+placeholder+tableDataViewD;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;228E;K;12;defaultValueD;K;6;CP$UIDd;3;229E;K;6;valuesD;K;6;CP$UIDd;3;317E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;231E;K;12;defaultValueD;K;6;CP$UIDd;3;125E;K;6;valuesD;K;6;CP$UIDd;3;318E;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;4;nameD;K;6;CP$UIDd;3;233E;K;12;defaultValueD;K;6;CP$UIDd;3;101E;K;6;valuesD;K;6;CP$UIDd;3;319E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;320E;D;K;6;CP$UIDd;3;321E;E;E;d;4;3072S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;101E;K;6;normalD;K;6;CP$UIDd;3;101E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;203E;K;6;normalD;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;322E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;58E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;58E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;323E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;101E;K;6;normalD;K;6;CP$UIDd;3;101E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;203E;K;6;normalD;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;324E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;2;59E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;2;59E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;325E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;327E;E;f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;328E;E;d;2;40D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;329E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;330E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;331E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;332E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;331E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;335E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;203E;E;E;f;3;0.8D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;336E;D;K;6;CP$UIDd;3;337E;D;K;6;CP$UIDd;3;338E;D;K;6;CP$UIDd;3;203E;E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;314E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;190E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;339E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;340E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;190E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;151E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;106E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;341E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;342E;D;K;6;CP$UIDd;3;342E;D;K;6;CP$UIDd;3;342E;D;K;6;CP$UIDd;3;203E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;43;editing+selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;229E;K;35;selectedTableDataView+tableDataViewD;K;6;CP$UIDd;3;229E;K;13;tableDataViewD;K;6;CP$UIDd;3;229E;K;6;normalD;K;6;CP$UIDd;3;229E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;121E;K;6;normalD;K;6;CP$UIDd;3;121E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;78E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;101E;K;6;normalD;K;6;CP$UIDd;3;101E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;343E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;299E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;191E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;191E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;344E;E;D;K;6;$classD;K;6;CP$UIDd;3;235E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;345E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;295E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;191E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;191E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;346E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;347E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;348E;E;S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":0}}S;60;{"origin":{"x":17,"y":286},"size":{"width":112,"height":17}}S;57;{"origin":{"x":0,"y":1},"size":{"width":380,"height":21}}S;61;{"origin":{"x":134,"y":285},"size":{"width":380,"height":21}}S;61;{"origin":{"x":134,"y":284},"size":{"width":380,"height":22}}S;57;{"origin":{"x":0,"y":1},"size":{"width":453,"height":21}}S;59;{"origin":{"x":61,"y":57},"size":{"width":453,"height":21}}S;59;{"origin":{"x":61,"y":56},"size":{"width":453,"height":22}}S;59;{"origin":{"x":61,"y":25},"size":{"width":453,"height":21}}S;59;{"origin":{"x":61,"y":24},"size":{"width":453,"height":22}}f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471S;18;{{5, 0}, {-10, 0}}S;18;{{0, 0}, {-10, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;f;18;0.5019607843137255D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;349E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;350E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;293E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;326E;E;S;58;{"origin":{"x":17,"y":58},"size":{"width":38,"height":17}}S;58;{"origin":{"x":17,"y":26},"size":{"width":38,"height":17}}S;55;{"origin":{"x":0,"y":1},"size":{"width":0,"height":-1}}S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":1}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tools/nib2cib/NSButton.j b/Tools/nib2cib/NSButton.j index e3d2d31d8..954cab152 100644 --- a/Tools/nib2cib/NSButton.j +++ b/Tools/nib2cib/NSButton.j @@ -43,13 +43,13 @@ var NSButtonIsBorderedMask = 0x00800000, // don't really follow much of a pattern. NSButtonImagePositionMask = 0xFF0000, NSButtonImagePositionShift = 16, - NSButtonNoImagePositionMask = 0x04, - NSButtonImageAbovePositionMask = 0x0C, - NSButtonImageBelowPositionMask = 0x1C, - NSButtonImageRightPositionMask = 0x2C, - NSButtonImageLeftPositionMask = 0x3C, - NSButtonImageOnlyPositionMask = 0x44, - NSButtonImageOverlapsPositionMask = 0x6C, + NSButtonNoImagePositionMask = 0x00, + NSButtonImageAbovePositionMask = 0x08, + NSButtonImageBelowPositionMask = 0x18, + NSButtonImageRightPositionMask = 0x28, + NSButtonImageLeftPositionMask = 0x38, + NSButtonImageOnlyPositionMask = 0x40, + NSButtonImageOverlapsPositionMask = 0x48, // You cannot set neither highlightsBy nor showsStateBy in IB, // but you can set button type which implicitly sets the masks. @@ -111,9 +111,25 @@ var NSButtonIsBorderedMask = 0x00800000, _alternateTitle = [cell alternateTitle]; [self setBordered:[cell isBordered]]; - _bezelStyle = [cell bezelStyle]; - var fixedHeight; + var bezelStyleFromIB = [cell bezelStyle]; + + // Xcode IB is not consistent between popup and pulldown buttons : + // pulldown bordered buttons (type "push") get bezel type "rounded" + // pulldown unbordered buttons (type "bevel") get bezel type "regular square" + // popup bordered buttons (type "push") get bezel type "rounded" + // popup unbordered buttons (type "bevel") get bezel type "rounded" + // In order to fix consistency, we force bezel type to be "regular square" in the last case + + if ([self isKindOfClass:CPPopUpButton] && (![self isBordered])) + bezelStyleFromIB = CPRegularSquareBezelStyle; + + [self setBezelStyle:bezelStyleFromIB]; + + + var fixedHeight, + theme = [Nib2Cib defaultTheme], + isCSSBased = [theme valueForAttributeWithName:@"css-based" forClass:[CPView class]]; // Fix height switch (_bezelStyle) @@ -122,6 +138,9 @@ var NSButtonIsBorderedMask = 0x00800000, case CPRoundedBezelStyle: // Push IB style case CPTexturedRoundedBezelStyle: // Round Textured IB style case CPHUDBezelStyle: + case CPDisclosureBezelStyle: + case CPRoundedDisclosureBezelStyle: + case CPInlineBezelStyle: // approximations: case CPRoundRectBezelStyle: // Round Rect IB style @@ -139,10 +158,8 @@ var NSButtonIsBorderedMask = 0x00800000, break; // unsupported - case CPRoundedDisclosureBezelStyle: case CPHelpButtonBezelStyle: case CPCircularBezelStyle: - case CPDisclosureBezelStyle: CPLog.warn("NSButton [%s]: unsupported bezel style: %d", _title == null ? "" : '"' + _title + '"', _bezelStyle); _bezelStyle = CPHUDBezelStyle; fixedHeight = YES; @@ -165,9 +182,8 @@ var NSButtonIsBorderedMask = 0x00800000, - If there is just a max height, use that for only for fixed height buttons. - If there is no max height either, don't do any height adjustments. */ - var theme = [Nib2Cib defaultTheme], - minSize = [theme valueForAttributeWithName:@"min-size" forClass:[self class]], - maxSize = [theme valueForAttributeWithName:@"max-size" forClass:[self class]], + var minSize = [theme valueForAttributeWithName:@"min-size" inState:[self themeState] forClass:[self class]], + maxSize = [theme valueForAttributeWithName:@"max-size" inState:[self themeState] forClass:[self class]], adjustHeight = NO; if (minSize.height > 0 && maxSize.height > 0 && minSize.height === maxSize.height) @@ -220,10 +236,11 @@ var NSButtonIsBorderedMask = 0x00800000, var frameAdjustment = [super _nib2CibAdjustment], positionOffsetSizeWidth = 0, positionOffsetOriginX = 0, - positionOffsetOriginY = 0; + positionOffsetOriginY = 0, + directAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"direct-nib2cib-adjustment" inState:[self themeState] forClass:[self class]]; // We want certain control like CPPopupButton to have their own nib2cib-adjustment-frame theme attribute - if (![self isBordered] || [self isKindOfClass:[CPPopUpButton class]]) + if (![self isBordered] || [self isKindOfClass:[CPPopUpButton class]] || directAdjustment) return frameAdjustment; // Map Cocoa bezel styles to Cappuccino bezel styles and adjust frame From 010057d9e1d9dd1f63733bc2c5024146e4e43374 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 13:05:59 +0200 Subject: [PATCH 16/30] New: CPCheckBox Aristo3 ready and compatible with new button state management (#2921) --- AppKit/CPCheckBox.j | 47 +++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/AppKit/CPCheckBox.j b/AppKit/CPCheckBox.j index e6c29b459..ecc99bb06 100644 --- a/AppKit/CPCheckBox.j +++ b/AppKit/CPCheckBox.j @@ -94,23 +94,6 @@ CPCheckBoxImageOffset = 4.0; [self takeStateFromKeyPath:aKeyPath ofObjects:objects]; } -- (CPImage)image -{ - return [self currentValueForThemeAttribute:@"image"]; -} - -- (CPImage)alternateImage -{ - return [self currentValueForThemeAttribute:@"image"]; -} - -- (BOOL)startTrackingAt:(CGPoint)aPoint -{ - var startedTracking = [super startTrackingAt:aPoint]; - [self highlight:YES]; - return startedTracking; -} - #pragma mark - #pragma mark Override methods from CPButton @@ -135,6 +118,36 @@ CPCheckBoxImageOffset = 4.0; return size; } +- (CPThemeState)_contentVisualState +{ + // Note : Behavior differs from CPButton as title doesn't follow the highlightsBy content flag + + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; +} + +- (CPThemeState)_imageVisualState +{ + // Note : Behavior differs from CPButton as we don't force "not selected" theme state + // when button is highglighted and selected + + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if (_isHighlighted && (_highlightsBy & CPContentsCellMask)) + visualState = visualState.and(CPThemeStateHighlighted); + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; +} + @end @implementation _CPCheckBoxValueBinder : CPBinder From 412baf7872f4f13e705ab4e0a90344089a6afa87 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 13:28:06 +0200 Subject: [PATCH 17/30] Fixed: Aristo3 ready and modern Cocoa behavior for CPBox (#2924) --- AppKit/CPBox.j | 393 ++++++++++++++++++++++++++++++++++-------- Tools/nib2cib/NSBox.j | 3 +- 2 files changed, 321 insertions(+), 75 deletions(-) diff --git a/AppKit/CPBox.j b/AppKit/CPBox.j index 6c21cc31e..c0dfc0c77 100644 --- a/AppKit/CPBox.j +++ b/AppKit/CPBox.j @@ -22,13 +22,14 @@ @import "CPTextField.j" @import "CPView.j" +@import // CPBoxType @typedef CPBoxType CPBoxPrimary = 0; -CPBoxSecondary = 1; +CPBoxSecondary = 1; // Deprecated CPBoxSeparator = 2; -CPBoxOldStyle = 3; +CPBoxOldStyle = 3; // Deprecated CPBoxCustom = 4; // CPBorderType @@ -58,11 +59,13 @@ CPBelowBottom = 6; @implementation CPBox : CPView { CPBoxType _boxType; - CPBorderType _borderType; + CPBorderType _borderType; // deprecated CPView _contentView; + CPView _boxView; // needed for CSS theming, will be transparent for non CSS themes + BOOL _transparent @accessors(getter=isTransparent); - CPString _title @accessors(getter=title); - int _titlePosition @accessors(getter=titlePosition); + CPString _title @accessors(getter=title); + int _titlePosition @accessors(getter=titlePosition); CPTextField _titleView; } @@ -90,8 +93,15 @@ CPBelowBottom = 6; @"inner-shadow-size": 6.0, @"inner-shadow-color": [CPNull null], @"content-margin": CGSizeMakeZero(), - @"nib2cib-adjustment-primary-frame": CGRectMake(4, -4, -8, -6) - }; + @"title-font": [CPNull null], + @"title-left-offset": 5.0, + @"title-top-offset": 0.0, + @"title-color": [CPNull null], + @"nib2cib-adjustment-primary-frame": CGRectMake(4, -4, -8, -6), + @"content-adjustment": CGRectMakeZero(), + @"min-y-correction-no-title": 0, + @"min-y-correction-title": 0 + }; } + (id)boxEnclosingView:(CPView)aView @@ -115,16 +125,26 @@ CPBelowBottom = 6; if (self) { - _borderType = CPBezelBorder; + _borderType = CPGrooveBorder; // Was CPBezelBorder but Cocoa default is CPGrooveBorder + _boxType = CPBoxPrimary; _titlePosition = CPNoTitle; _titleView = [CPTextField labelWithTitle:@""]; + [_titleView setFont:[self titleFont]]; + [_titleView setTextColor:[self titleColor]]; + + _boxView = [[CPView alloc] initWithFrame:[self bounds]]; + [_boxView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; _contentView = [[CPView alloc] initWithFrame:[self bounds]]; [_contentView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; [self setAutoresizesSubviews:YES]; - [self addSubview:_contentView]; + [self addSubview:_boxView]; + [_boxView setAutoresizesSubviews:YES]; + [_boxView addSubview:_contentView]; + + [self sizeToFit]; } return self; @@ -156,6 +176,8 @@ CPBelowBottom = 6; */ - (CPBorderType)borderType { + CPLog.warn("CPBox borderType is deprecated."); + return _borderType; } @@ -178,7 +200,8 @@ CPBelowBottom = 6; return; _borderType = aBorderType; - [self setNeedsDisplay:YES]; + + [self refreshDisplay]; } /*! @@ -218,13 +241,30 @@ CPBelowBottom = 6; */ - (void)setBoxType:(CPBoxType)aBoxType { + if ((aBoxType == CPBoxSecondary) || (aBoxType == CPBoxOldStyle)) + CPLog.warn("CPBox setBoxType: CPBoxSecondary and CPBoxOldStyle are deprecated."); + if (_boxType === aBoxType) return; _boxType = aBoxType; - [self setNeedsDisplay:YES]; + + [self refreshDisplay]; } +- (void)setTransparent:(BOOL)shouldBeTransparent +{ + if (_transparent == shouldBeTransparent) + return; + + _transparent = shouldBeTransparent; + + [self _manageTitlePositioning]; +} + +/*! + The receiver’s border color. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (CPColor)borderColor { return [self valueForThemeAttribute:@"border-color"]; @@ -232,12 +272,21 @@ CPBelowBottom = 6; - (void)setBorderColor:(CPColor)color { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setBorderColor: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setBorderColor. Ignored."); + return; + } + if ([color isEqual:[self borderColor]]) return; [self setValue:color forThemeAttribute:@"border-color"]; } +/*! + The receiver’s border width. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (float)borderWidth { return [self valueForThemeAttribute:@"border-width"]; @@ -245,12 +294,21 @@ CPBelowBottom = 6; - (void)setBorderWidth:(float)width { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setBorderWidth: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setBorderWidth. Ignored."); + return; + } + if (width === [self borderWidth]) return; [self setValue:width forThemeAttribute:@"border-width"]; } +/*! + The receiver’s corner radius. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (float)cornerRadius { return [self valueForThemeAttribute:@"corner-radius"]; @@ -258,12 +316,21 @@ CPBelowBottom = 6; - (void)setCornerRadius:(float)radius { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setCornerRadius: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setCornerRadius. Ignored."); + return; + } + if (radius === [self cornerRadius]) return; [self setValue:radius forThemeAttribute:@"corner-radius"]; } +/*! + The receiver’s background color. It must be a custom box (that is, it has a type of CPBoxCustom) and it must have a border style of CPLineBorder. + */ - (CPColor)fillColor { return [self valueForThemeAttribute:@"background-color"]; @@ -271,6 +338,12 @@ CPBelowBottom = 6; - (void)setFillColor:(CPColor)color { + if ((_boxType !== CPBoxCustom) || (_borderType !== CPLineBorder)) + { + CPLog.warn("CPBox setFillColor: the box must be of type CPBoxCustom AND border of type CPLineBorder in order to use setFillColor. Ignored."); + return; + } + if ([color isEqual:[self fillColor]]) return; @@ -287,21 +360,20 @@ CPBelowBottom = 6; if (aView === _contentView) return; - var borderWidth = [self borderWidth], - contentMargin = [self valueForThemeAttribute:@"content-margin"]; - - [aView setFrame:CGRectInset([self bounds], contentMargin.width + borderWidth, contentMargin.height + borderWidth)]; [aView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; // A nil contentView is allowed (tested in Cocoa 2013-02-22). if (!aView) [_contentView removeFromSuperview]; else if (_contentView) - [self replaceSubview:_contentView with:aView]; + [_boxView replaceSubview:_contentView with:aView]; else - [self addSubview:aView]; + [_boxView addSubview:aView]; _contentView = aView; + + [self sizeToFit]; + [self refreshDisplay]; } - (CGSize)contentViewMargins @@ -321,9 +393,14 @@ CPBelowBottom = 6; { var offset = [self _titleHeightOffset], borderWidth = [self borderWidth], - contentMargin = [self valueForThemeAttribute:@"content-margin"]; + contentMargin = [self valueForThemeAttribute:@"content-margin"], + contentAdjustment = [self valueForThemeAttribute:@"content-adjustment"], + minYCorrection = [self valueForThemeAttribute:(_titlePosition === CPNoTitle ? @"min-y-correction-no-title" : @"min-y-correction-title")]; - [self setFrame:CGRectInset(aRect, -(contentMargin.width + borderWidth), -(contentMargin.height + offset[0] + borderWidth))]; + [self setFrame:CGRectMake(aRect.origin.x - contentAdjustment.origin.x - contentMargin.width + borderWidth, + aRect.origin.y - contentAdjustment.origin.y - contentMargin.height + borderWidth - minYCorrection, + aRect.size.width + 2 * contentMargin.width - contentAdjustment.size.width, + aRect.size.height + 2 * contentMargin.height - contentAdjustment.size.height)]; } - (void)setTitle:(CPString)aTitle @@ -348,14 +425,42 @@ CPBelowBottom = 6; - (CPFont)titleFont { - return [_titleView font]; + if ([self hasThemeAttribute:@"title-font"]) + return [self valueForThemeAttribute:@"title-font"]; + else + return [_titleView font]; } - (void)setTitleFont:(CPFont)aFont { + if ([aFont isEqual:[self titleFont]]) + return; + + if ([self hasThemeAttribute:@"title-font"]) + [self setValue:aFont forThemeAttribute:@"title-font"]; + [_titleView setFont:aFont]; } +- (CPColor)titleColor +{ + if ([self hasThemeAttribute:@"title-color"]) + return [self valueForThemeAttribute:@"title-color"]; + else + return [_titleView textColor]; +} + +- (void)setTitleColor:(CPColor)aColor +{ + if ([aColor isEqual:[self titleColor]]) + return; + + if ([self hasThemeAttribute:@"title-color"]) + [self setValue:aColor forThemeAttribute:@"title-color"]; + + [_titleView setTextColor:aColor]; +} + /*! Return the text field used to display the receiver's title. @@ -366,25 +471,39 @@ CPBelowBottom = 6; return _titleView; } +/*! + Return the rectangle in which the receiver’s title is drawn. + */ +- (CGRect)titleRect +{ + return [_titleView frame]; +} + - (void)_manageTitlePositioning { - if (_titlePosition == CPNoTitle) + if ((_titlePosition == CPNoTitle) || _transparent) { [_titleView removeFromSuperview]; - [self setNeedsDisplay:YES]; + + if (_boxType !== CPBoxSeparator) + [self sizeToFit]; + + [self refreshDisplay]; return; } [_titleView setStringValue:_title]; [_titleView sizeToFit]; - [self addSubview:_titleView]; + + var titleLeftOffset = [self valueForThemeAttribute:@"title-left-offset"], + titleTopOffset = [self valueForThemeAttribute:@"title-top-offset"]; switch (_titlePosition) { case CPAtTop: case CPAboveTop: case CPBelowTop: - [_titleView setFrameOrigin:CGPointMake(5.0, 0.0)]; + [_titleView setFrameOrigin:CGPointMake(titleLeftOffset, titleTopOffset)]; // FIXME: was 0.0 [_titleView setAutoresizingMask:CPViewNotSizable]; break; @@ -392,39 +511,51 @@ CPBelowBottom = 6; case CPAtBottom: case CPBelowBottom: var h = [_titleView frameSize].height; - [_titleView setFrameOrigin:CGPointMake(5.0, [self frameSize].height - h)]; + [_titleView setFrameOrigin:CGPointMake(titleLeftOffset, [self frameSize].height - h - titleTopOffset)]; [_titleView setAutoresizingMask:CPViewMinYMargin]; break; } + if (!_transparent) + [self addSubview:_titleView]; + [self sizeToFit]; - [self setNeedsDisplay:YES]; + [self refreshDisplay]; } - (void)sizeToFit { - var contentFrame = [_contentView frame], - offset = [self _titleHeightOffset], - contentMargin = [self valueForThemeAttribute:@"content-margin"]; + var offset = [self _titleHeightOffset], + size = [self frameSize]; - if (!contentFrame) + [_boxView setFrame:CGRectMake(0, offset[1], size.width, size.height - offset[0])]; + + if (!_contentView) return; - [_contentView setFrameOrigin:CGPointMake(contentMargin.width, contentMargin.height + offset[1])]; + var boxSize = [_boxView frameSize], + contentMargin = [self valueForThemeAttribute:@"content-margin"], + contentAdjustment = [self valueForThemeAttribute:@"content-adjustment"], + borderWidth = [self valueForThemeAttribute:@"border-width"], + minYCorrection = [self valueForThemeAttribute:(_titlePosition === CPNoTitle ? @"min-y-correction-no-title" : @"min-y-correction-title")]; + + [_contentView setFrame:CGRectMake(contentAdjustment.origin.x + contentMargin.width - borderWidth, + contentAdjustment.origin.y + contentMargin.height - borderWidth + minYCorrection, + boxSize.width - 2 * contentMargin.width + contentAdjustment.size.width, + boxSize.height - 2 * contentMargin.height + contentAdjustment.size.height)]; } -- (float)_titleHeightOffset +- (CPArray)_titleHeightOffset { - if (_titlePosition == CPNoTitle) - return [0.0, 0.0]; + var titleTopOffset = [self valueForThemeAttribute:@"title-top-offset"]; switch (_titlePosition) { case CPAtTop: - return [[_titleView frameSize].height, [_titleView frameSize].height]; + return [[_titleView frameSize].height + titleTopOffset, [_titleView frameSize].height + titleTopOffset]; case CPAtBottom: - return [[_titleView frameSize].height, 0.0]; + return [[_titleView frameSize].height + titleTopOffset, 0.0]; default: return [0.0, 0.0]; @@ -441,21 +572,24 @@ CPBelowBottom = 6; - (void)drawRect:(CGRect)rect { + if ([self isCSSBased] && (_boxType !== CPBoxCustom)) + return; + var bounds = [self bounds]; - switch (_boxType) + if (_boxType === CPBoxSeparator) { - case CPBoxSeparator: - // NSBox does not include a horizontal flag for the separator type. We have to determine - // the type of separator to draw by the width and height of the frame. - if (CGRectGetWidth(bounds) === 5.0) - return [self _drawVerticalSeparatorInRect:bounds]; - else if (CGRectGetHeight(bounds) === 5.0) - return [self _drawHorizontalSeparatorInRect:bounds]; - - break; + // NSBox does not include a horizontal flag for the separator type. We have to determine + // the type of separator to draw by the width and height of the frame. + if (CGRectGetWidth(bounds) === 5.0) + return [self _drawVerticalSeparatorInRect:bounds]; + else if (CGRectGetHeight(bounds) === 5.0) + return [self _drawHorizontalSeparatorInRect:bounds]; } + if (_transparent) + return; + if (_titlePosition == CPAtTop) { bounds.origin.y += [_titleView frameSize].height; @@ -476,9 +610,6 @@ CPBelowBottom = 6; switch (_borderType) { case CPBezelBorder: - [self _drawBezelBorderInRect:bounds]; - break; - case CPGrooveBorder: case CPLineBorder: [self _drawLineBorderInRect:bounds]; @@ -595,12 +726,70 @@ CPBelowBottom = 6; @end +#pragma mark - + +@implementation CPBox (CSSTheming) + +- (void)layoutSubviews +{ + if (![self isCSSBased] || (_boxType === CPBoxCustom)) + return; + + var bounds = [self bounds]; + + if (_boxType === CPBoxSeparator) + { + if (bounds.size.width === 5.0) + { + // Vertical separator + [_boxView setFrame:CGRectMake(2,0,1,bounds.size.height)]; + } + else + { + // Horizontal separator + [_boxView setFrame:CGRectMake(0,2,bounds.size.width,1)]; + } + + [_boxView setBackgroundColor:[self valueForThemeAttribute:@"border-color"]]; + + return; + } + + // All types of boxes (beside custom which is not covered here) always draw the same way, unless they are CPNoBorder. + if ((_borderType !== CPNoBorder) && !_transparent) + { + [_boxView setBackgroundColor:[self valueForThemeAttribute:@"background-color"]]; + return; + } + + // No border or transparent + [_boxView setBackgroundColor:nil]; +} + +- (BOOL)isCSSBased +{ + return [[self theme] isCSSBased]; +} + +- (void)refreshDisplay +{ + if ([self isCSSBased] && (_boxType !== CPBoxCustom)) + [self setNeedsLayout:YES]; + else + [self setNeedsDisplay:YES]; +} + +@end + +#pragma mark - + var CPBoxTypeKey = @"CPBoxTypeKey", CPBoxBorderTypeKey = @"CPBoxBorderTypeKey", - CPBoxTitle = @"CPBoxTitle", - CPBoxTitlePosition = @"CPBoxTitlePosition", - CPBoxTitleView = @"CPBoxTitleView", - CPBoxContentView = @"CPBoxContentView"; + CPBoxTitleKey = @"CPBoxTitleKey", + CPBoxTitlePositionKey = @"CPBoxTitlePositionKey", + CPBoxTitleViewKey = @"CPBoxTitleViewKey", + CPBoxContentViewKey = @"CPBoxContentViewKey", + CPBoxBoxViewKey = @"CPBoxBoxViewKey"; @implementation CPBox (CPCoding) @@ -613,33 +802,56 @@ var CPBoxTypeKey = @"CPBoxTypeKey", _boxType = [aCoder decodeIntForKey:CPBoxTypeKey]; _borderType = [aCoder decodeIntForKey:CPBoxBorderTypeKey]; - _title = [aCoder decodeObjectForKey:CPBoxTitle]; - _titlePosition = [aCoder decodeIntForKey:CPBoxTitlePosition]; - _titleView = [aCoder decodeObjectForKey:CPBoxTitleView] || [CPTextField labelWithTitle:_title]; + _title = [aCoder decodeObjectForKey:CPBoxTitleKey]; + _titlePosition = [aCoder decodeIntForKey:CPBoxTitlePositionKey]; - if (_boxType != CPBoxSeparator) + // Important : see comment on encodeWithCoder below + + _boxView = [aCoder decodeObjectForKey:CPBoxBoxViewKey]; + + if (!_boxView) { - // FIXME: we have a problem with CIB decoding here. - // We should be able to simply add : _contentView = [self subviews][0] - // but first box subview seems to be malformed (badly decoded). - // For example, when deployed, this view doesn't have its _trackingAreas array initialized. - // As a (temporary) workaround, we encode/decode the _contentView property. We then transfer the subview hierarchy - // and replace the first (and only) box subview with this _contentView + // We're coming from nib2cib. - _contentView = [aCoder decodeObjectForKey:CPBoxContentView] || [[CPView alloc] initWithFrame:[self bounds]]; - var malformedContentView = [self subviews][0]; - [_contentView setSubviews:[malformedContentView subviews]]; - [self replaceSubview:malformedContentView with:_contentView]; + _boxView = [[CPView alloc] initWithFrame:[self bounds]]; + _titleView = [CPTextField labelWithTitle:_title]; } else { - _titlePosition = CPNoTitle; + // We're coming from elsewhere + + _titleView = [aCoder decodeObjectForKey:CPBoxTitleViewKey]; } - - [self setAutoresizesSubviews:YES]; + + _contentView = [aCoder decodeObjectForKey:CPBoxContentViewKey]; + + // FIXME: super-mega-hyper-trick : _contentView has a superview which is not normal ! + // FIXME: (see encodeWithCoder to understand why this is not possible) + // FIXME: we fix this by hand. This is horrible so please find a structural solution ! + + if (_contentView) + _contentView._superview = nil; + [_contentView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [_boxView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [_boxView setAutoresizesSubviews:YES]; + [self setAutoresizesSubviews:YES]; + + if (_contentView) + [_boxView setSubviews:@[_contentView]]; + + [self addSubview:_boxView]; + [self addSubview:_titleView]; + + if (_boxType === CPBoxSeparator) + _titlePosition = CPNoTitle; + + [_titleView setFont:[self titleFont]]; + [_titleView setTextColor:[self titleColor]]; [self _manageTitlePositioning]; + + [self refreshDisplay]; } return self; @@ -647,14 +859,47 @@ var CPBoxTypeKey = @"CPBoxTypeKey", - (void)encodeWithCoder:(CPCoder)aCoder { + // We have to distinguish between 2 cases : + // - we come from nib2cib + // - we come from elsewhere + // + // When coming from nib2cib, we have no _boxView, _contentView, _titleView. + // We fix _contentView to be the first (and only) subview. + // They will have to be added on decoding. + // + // When coming from elsewhere, we remove _boxView (and thus _contentView) and _titleView + // from the view hierarchy as we'll already encode them via variables. + // They will be putted back during decoding. This way, we reduce the space and speed needed for coding. + + var subviews = [self subviews]; + + if (!_boxView) + { + // We're coming from nib2cib. + + _contentView = subviews[0]; + + [_contentView removeFromSuperview]; + } + else + { + // We're coming from elsewhere. + + [_boxView removeFromSuperview]; + [_titleView removeFromSuperview]; + } + [super encodeWithCoder:aCoder]; + [self setSubviews:subviews]; + [aCoder encodeInt:_boxType forKey:CPBoxTypeKey]; [aCoder encodeInt:_borderType forKey:CPBoxBorderTypeKey]; - [aCoder encodeObject:_title forKey:CPBoxTitle]; - [aCoder encodeInt:_titlePosition forKey:CPBoxTitlePosition]; - [aCoder encodeObject:_titleView forKey:CPBoxTitleView]; - [aCoder encodeObject:_contentView forKey:CPBoxContentView]; + [aCoder encodeObject:_title forKey:CPBoxTitleKey]; + [aCoder encodeInt:_titlePosition forKey:CPBoxTitlePositionKey]; + [aCoder encodeConditionalObject:_contentView forKey:CPBoxContentViewKey]; + [aCoder encodeConditionalObject:_titleView forKey:CPBoxTitleViewKey]; + [aCoder encodeConditionalObject:_boxView forKey:CPBoxBoxViewKey]; } @end diff --git a/Tools/nib2cib/NSBox.j b/Tools/nib2cib/NSBox.j index 87b558008..b702f9ca8 100644 --- a/Tools/nib2cib/NSBox.j +++ b/Tools/nib2cib/NSBox.j @@ -32,6 +32,7 @@ { _boxType = [aCoder decodeIntForKey:@"NSBoxType"]; _borderType = [aCoder decodeIntForKey:@"NSBorderType"]; + _transparent = [aCoder decodeBoolForKey:@"NSTransparent"]; var borderColor = [aCoder decodeObjectForKey:@"NSBorderColor2"], fillColor = [aCoder decodeObjectForKey:@"NSFillColor2"], @@ -70,7 +71,7 @@ - (CGRect)_nib2CibAdjustment { - if ((_boxType === CPBoxPrimary) || (_boxType === CPBoxSecondary)) + if ((_boxType !== CPBoxSeparator) && ((_boxType === CPBoxPrimary) || (_boxType === CPBoxSecondary))) { // We use a special nib2cib-adjustment-frame for primary/secondary boxes var theme = [Nib2Cib defaultTheme], From 7bde091f1b3be778a29eac514776f76bf3d5af06 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 13:31:45 +0200 Subject: [PATCH 18/30] FIXED: when using a custom view with subviews, subviews were presented in the reversed order (#2913) --- .../Nib2CibSubviewsOrderTest/AppController.j | 33 ++ .../Nib2CibSubviewsOrderTest/Info.plist | 14 + .../Manual/Nib2CibSubviewsOrderTest/Jakefile | 172 ++++++++ .../Resources/MainMenu.cib | 1 + .../Resources/MainMenu.xib | 375 ++++++++++++++++++ .../Nib2CibSubviewsOrderTest/index-debug.html | 204 ++++++++++ .../Nib2CibSubviewsOrderTest/index.html | 166 ++++++++ Tests/Manual/Nib2CibSubviewsOrderTest/main.j | 18 + Tools/nib2cib/NSCustomView.j | 7 + 9 files changed, 990 insertions(+) create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/AppController.j create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/Info.plist create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/Jakefile create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.cib create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.xib create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/index-debug.html create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/index.html create mode 100644 Tests/Manual/Nib2CibSubviewsOrderTest/main.j diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/AppController.j b/Tests/Manual/Nib2CibSubviewsOrderTest/AppController.j new file mode 100644 index 000000000..21976483b --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/AppController.j @@ -0,0 +1,33 @@ +/* + * AppController.j + * Nib2CibSubviewsOrderTest + * + * Created by You on September 19, 2020. + * Copyright 2020, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:NO]; +} + +@end diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Info.plist b/Tests/Manual/Nib2CibSubviewsOrderTest/Info.plist new file mode 100644 index 000000000..8ff942055 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + Nib2CibSubviewsOrderTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2020, Your Company All rights reserved. + + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Jakefile b/Tests/Manual/Nib2CibSubviewsOrderTest/Jakefile new file mode 100644 index 000000000..9258affd9 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Jakefile @@ -0,0 +1,172 @@ +/* + * Jakefile + * Nib2CibSubviewsOrderTest + * + * Created by You on September 19, 2020. + * Copyright 2020, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "Nib2CibSubviewsOrderTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "Nib2CibSubviewsOrderTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("Nib2CibSubviewsOrderTest"); + task.setIdentifier("com.yourcompany.Nib2CibSubviewsOrderTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("Nib2CibSubviewsOrderTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g -S --inline-msg-send"); + else + task.setCompilerFlags("-O2"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.cib b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.cib new file mode 100644 index 000000000..1b10d63d6 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;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;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;138E;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;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;66E;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;70E;D;K;6;CP$UIDd;2;71E;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;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;139E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;140E;E;D;K;10;$classnameS;31;CPCibRuntimeAttributesConnectorK;8;$classesA;S;31;CPCibRuntimeAttributesConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;133E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;133E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;141E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;130E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;130E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;143E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;135E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;1;0E;K;40;CPCibRuntimeAttributesConnectorObjectKeyD;K;6;CP$UIDd;3;135E;K;42;CPCibRuntimeAttributesConnectorKeyPathsKeyD;K;6;CP$UIDd;3;145E;K;40;CPCibRuntimeAttributesConnectorValuesKeyD;K;6;CP$UIDd;3;146E;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;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;138E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;138E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;125E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;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;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;120E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;117E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;69E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;76E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;68E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;123E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;72E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;110E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;84E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;87E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;164E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;83E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;99E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;86E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;95E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;100E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;175E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;176E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;114E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;178E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;104E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;179E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;105E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;139E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;182E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;183E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;184E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;60E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;60E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;185E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;188E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;189E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;190E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;60E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;67E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;67E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;198E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;199E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;71E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;71E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;204E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;205E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;71E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;208E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;209E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;210E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;215E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;67E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;216E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;79E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;79E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;216E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;217E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;218E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;221E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;222E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;223E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;224E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;225E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;229E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;230E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;234E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;235E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;236E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;237E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;238E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;241E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;243E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;244E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;245E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;246E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;247E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;97E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;97E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;247E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;248E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;249E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;250E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;251E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;252E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;97E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;255E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;103E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;103E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;255E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;256E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;234E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;235E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;258E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;237E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;238E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;240E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;103E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;241E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;214E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;260E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;108E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;108E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;79E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;260E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;263E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;108E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;264E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;112E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;112E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;264E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;265E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;266E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;267E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;268E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;269E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;112E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;270E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;116E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;116E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;270E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;271E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;272E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;273E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;274E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;275E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;191E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;192E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;193E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;276E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;116E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;277E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;122E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;186E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;122E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;57E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;2;56E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;277E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;278E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;279E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;122E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;280E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;187E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;281E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;282E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;283E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;284E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;285E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;243E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;270E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;287E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;287E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;288E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;292E;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;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;293E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;294E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;295E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;297E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;299E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;300E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;301E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;129E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;302E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;130E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;303E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;304E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;130E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;309E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;310E;K;11;$aalignmentD;K;6;CP$UIDd;3;311E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;312E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;313E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;314E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;318E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;300E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;319E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;129E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;320E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;133E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;321E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;322E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;133E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;323E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;324E;K;11;$aalignmentD;K;6;CP$UIDd;3;325E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;326E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;327E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;314E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;128E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;129E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;328E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;300E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;329E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;129E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;296E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;289E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;330E;K;28;_CPCibCustomViewClassNameKeyD;K;6;CP$UIDd;3;298E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;135E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;331E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;332E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;135E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;333E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;334E;K;11;$aalignmentD;K;6;CP$UIDd;3;335E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;336E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;337E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;314E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;131E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;127E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;286E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;338E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;339E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;127E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;305E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;306E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;307E;K;6;$afontD;K;6;CP$UIDd;3;340E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;341E;K;11;$aalignmentD;K;6;CP$UIDd;3;342E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;291E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;291E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;193E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;3;343E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;344E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;314E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;286E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;315E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;193E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;193E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;317E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;237E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;237E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;193E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;193E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;345E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;346E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;347E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;346E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;348E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;346E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;349E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;121E;E;E;S;14;NewApplicationS;14;submenuAction:d;7;1048576S;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;E;E;S;20;About NewApplicationT;S;0;F;S;12;Preferences…S;1;,S;19;Quit NewApplicationS;1;qS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;E;E;S;3;NewS;1;nS;5;Open…S;1;oS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;72E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;4;SaveS;1;sS;8;Save As…S;1;Sd;7;1179648S;15;Revert to SavedS;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;107E;E;E;S;4;UndoS;1;zS;4;RedoS;1;ZS;3;CutS;1;xS;4;CopyS;1;cS;5;PasteS;1;vS;6;DeleteS;10;Select AllS;1;aS;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;E;E;S;5;Find…d;1;1S;1;fS;9;Find Nextd;1;2S;1;gS;13;Find Previousd;1;3S;1;GS;22;Use Selection for Findd;1;7S;1;eS;17;Jump to SelectionS;1;jS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;E;E;S;14;Show Spelling…S;1;:S;14;Check SpellingS;1;;S;27;Check Spelling While TypingS;27;Check Grammar With SpellingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;E;E;S;14;Start SpeakingS;13;Stop SpeakingS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;6;WindowS;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;E;E;S;8;MinimizeS;1;mS;4;ZoomS;18;Bring All to FrontS;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;123E;E;E;S;19;NewApplication HelpS;1;?S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1610612736S;23;{{335, 41}, {630, 447}}S;21;{{0, 0}, {1440, 878}}d;1;0S;20;{{0, 0}, {630, 447}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;137E;E;E;S;4;viewS;6;normalS;6;{1, 1}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;22;{{20, 20}, {590, 313}}S;20;{{0, 0}, {590, 313}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;135E;E;E;d;2;36D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;CPViewS;21;{{20, 20}, {163, 96}}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;3;132E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{73, 29}, {16, 39}}S;18;{{0, 0}, {16, 39}}d;1;8S;9;textfieldS;18;controlSizeRegularD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;354E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;356E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;358E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;360E;E;E;S;1;1d;1;4d;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;361E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;S;22;{{120, 76}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;134E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{73, 29}, {20, 39}}S;18;{{0, 0}, {20, 39}}D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;363E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;364E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;365E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;366E;E;E;S;1;2S;23;{{227, 136}, {163, 96}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;136E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;20;{{73, 29}, {21, 39}}S;18;{{0, 0}, {21, 39}}D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;367E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;368E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;369E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;370E;E;E;S;1;3S;22;{{20, 341}, {590, 17}}S;19;{{0, 0}, {590, 17}}D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;350E;K;12;defaultValueD;K;6;CP$UIDd;3;352E;K;6;valuesD;K;6;CP$UIDd;3;371E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;355E;K;12;defaultValueD;K;6;CP$UIDd;3;237E;K;6;valuesD;K;6;CP$UIDd;3;372E;E;D;K;6;$classD;K;6;CP$UIDd;3;308E;K;4;nameD;K;6;CP$UIDd;3;357E;K;12;defaultValueD;K;6;CP$UIDd;3;286E;K;6;valuesD;K;6;CP$UIDd;3;373E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;374E;E;E;S;85;You should see, backmost to frontmost, red view (1), green view (2) and blue view (3)S;13;AppControllerS;15;backgroundColorD;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;375E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;376E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;D;K;6;$classD;K;6;CP$UIDd;3;316E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;377E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;362E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;290E;E;S;4;fontD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;378E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;315E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;191E;E;D;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;379E;K;6;normalD;K;6;CP$UIDd;3;379E;E;E;S;15;line-break-modeD;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;S;9;alignmentD;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;314E;K;6;normalD;K;6;CP$UIDd;3;314E;E;E;D;K;10;$classnameS;14;CPTrackingAreaK;8;$classesA;S;14;CPTrackingAreaS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;381E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;132E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;132E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;383E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;234E;D;K;6;CP$UIDd;3;234E;E;E;S;5;colorD;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;384E;K;6;normalD;K;6;CP$UIDd;3;384E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;314E;K;6;normalD;K;6;CP$UIDd;3;314E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;385E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;134E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;134E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;386E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;387E;K;6;normalD;K;6;CP$UIDd;3;387E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;314E;K;6;normalD;K;6;CP$UIDd;3;314E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;388E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;136E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;136E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;389E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;390E;K;6;normalD;K;6;CP$UIDd;3;390E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;353E;K;10;CP.objectsD;K;13;tableDataViewD;K;6;CP$UIDd;3;237E;K;6;normalD;K;6;CP$UIDd;3;237E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;359E;K;25;CPTrackinkAreaViewRectKeyD;K;6;CP$UIDd;3;391E;K;24;CPTrackingAreaOptionsKeyD;K;6;CP$UIDd;3;382E;K;22;CPTrackingAreaOwnerKeyD;K;6;CP$UIDd;3;137E;K;25;CPTrackingAreaUserInfoKeyD;K;6;CP$UIDd;1;0E;K;32;CPTrackingAreaReferencingViewKeyD;K;6;CP$UIDd;3;137E;K;24;CPTrackingAreaWindowRectD;K;6;CP$UIDd;3;392E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;393E;D;K;6;CP$UIDd;3;394E;D;K;6;CP$UIDd;3;395E;D;K;6;CP$UIDd;3;234E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;396E;D;K;6;CP$UIDd;3;397E;D;K;6;CP$UIDd;3;398E;D;K;6;CP$UIDd;3;234E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;399E;D;K;6;CP$UIDd;3;400E;D;K;6;CP$UIDd;3;401E;D;K;6;CP$UIDd;3;234E;E;E;S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;402E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;403E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;193E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;d;3;546D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;405E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;402E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;403E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;406E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;402E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;403E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;193E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;407E;E;D;K;6;$classD;K;6;CP$UIDd;3;351E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;378E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;315E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;191E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;193E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;191E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;404E;E;D;K;6;$classD;K;6;CP$UIDd;3;380E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;408E;E;f;12;0.1459769905f;12;0.7245902419f;11;0.131928131f;11;0.694875896f;13;0.05106510967f;12;0.1235313565f;12;0.1622937322f;11;0.217145443f;12;0.7033613324S;14;.SF NS Displayd;2;32S;54;{"origin":{"x":0,"y":0},"size":{"width":0,"height":0}}S;60;{"origin":{"x":111,"y":339},"size":{"width":20,"height":39}}S;60;{"origin":{"x":211,"y":283},"size":{"width":24,"height":39}}S;60;{"origin":{"x":318,"y":223},"size":{"width":25,"height":39}}S;59;{"origin":{"x":18,"y":89},"size":{"width":594,"height":17}}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.xib b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.xib new file mode 100644 index 000000000..c457e6021 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/Resources/MainMenu.xib @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/index-debug.html b/Tests/Manual/Nib2CibSubviewsOrderTest/index-debug.html new file mode 100644 index 000000000..ae452f43d --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/index-debug.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + Nib2CibSubviewsOrderTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/index.html b/Tests/Manual/Nib2CibSubviewsOrderTest/index.html new file mode 100644 index 000000000..a7bd83918 --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + Nib2CibSubviewsOrderTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/Nib2CibSubviewsOrderTest/main.j b/Tests/Manual/Nib2CibSubviewsOrderTest/main.j new file mode 100644 index 000000000..8e4a1ec6e --- /dev/null +++ b/Tests/Manual/Nib2CibSubviewsOrderTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * Nib2CibSubviewsOrderTest + * + * Created by You on September 19, 2020. + * Copyright 2020, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tools/nib2cib/NSCustomView.j b/Tools/nib2cib/NSCustomView.j index f5526c5d6..aedfd7097 100644 --- a/Tools/nib2cib/NSCustomView.j +++ b/Tools/nib2cib/NSCustomView.j @@ -41,6 +41,13 @@ var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; if (self) _className = [aCoder decodeObjectForKey:@"NSClassName"]; + // FIXME: Warning : trick here ! + // Workaround for the ibtool bug which reverses subviews order when using a custom view + // Valid as of ibtool version 14460.31 + // As nib2cib doesn't deal with DOM, we can simply use reverse() + + _subviews.reverse(); + return self; } From 2a623fbb8cf488eb1c42763358b26d1fd4a130ed Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 13:49:11 +0200 Subject: [PATCH 19/30] Fixed: correct mask values used to determine image position for NSButton.j (#2906) From 6eab438778e507c33c8f546eca61c69db46f6cf1 Mon Sep 17 00:00:00 2001 From: bedalton Date: Fri, 2 Oct 2020 04:52:42 -0700 Subject: [PATCH 20/30] Fixed: CPKeyedArchiver method call does not match selector tested (#2904) Delegate methods described on lines 76 and 85 are not the selectors checked on lines 305 and line 302, but are the methods actually called on the delegate on lines 195 and 225. This fix updates the method selectors checked on the delegate, to match those defined and called within the CPKeyedArchiver class. Fixes #2679 --- Foundation/CPKeyedArchiver.j | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Foundation/CPKeyedArchiver.j b/Foundation/CPKeyedArchiver.j index c9e2f10bc..8d58fe42d 100644 --- a/Foundation/CPKeyedArchiver.j +++ b/Foundation/CPKeyedArchiver.j @@ -191,7 +191,7 @@ var _CPKeyedArchiverStringClass = Nil, */ - (void)finishEncoding { - if (_delegate && _delegateSelectors & _CPKeyedArchiverDidFinishEncodingSelector) + if (_delegate && _delegateSelectors & _CPKeyedArchiverWillFinishEncodingSelector) [_delegate archiverWillFinish:self]; var i = 0, @@ -299,10 +299,10 @@ var _CPKeyedArchiverStringClass = Nil, if ([_delegate respondsToSelector:@selector(archiver:willReplaceObject:withObject:)]) _delegateSelectors |= _CPKeyedArchiverWillReplaceObjectWithObjectSelector; - if ([_delegate respondsToSelector:@selector(archiver:didFinishEncoding:)]) + if ([_delegate respondsToSelector:@selector(archiverDidFinish:)]) _delegateSelectors |= _CPKeyedArchiverDidFinishEncodingSelector; - if ([_delegate respondsToSelector:@selector(archiver:willFinishEncoding:)]) + if ([_delegate respondsToSelector:@selector(archiverWillFinish:)]) _delegateSelectors |= _CPKeyedArchiverWillFinishEncodingSelector; } From 299f1a91025e1c50fbafa6de4a294e8b15360fa5 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 14:03:25 +0200 Subject: [PATCH 21/30] Fixed: Aristo3 ready and compatible with new button state management for CPRadio (#2922) --- AppKit/CPRadio.j | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/AppKit/CPRadio.j b/AppKit/CPRadio.j index cd5f5196d..f0c725a7e 100644 --- a/AppKit/CPRadio.j +++ b/AppKit/CPRadio.j @@ -183,21 +183,37 @@ var CPRadioRadioGroupKey = @"CPRadioRadioGroupKey"; [aCoder encodeObject:_radioGroup forKey:CPRadioRadioGroupKey]; } -- (CPImage)image +#pragma mark - +#pragma mark Override methods from CPButton + +- (CPThemeState)_contentVisualState { - return [self currentValueForThemeAttribute:@"image"]; + // Note : Behavior differs from CPButton as title doesn't follow the highlightsBy content flag + + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; } -- (CPImage)alternateImage +- (CPThemeState)_imageVisualState { - return [self currentValueForThemeAttribute:@"image"]; -} + // Note : Behavior differs from CPButton as we don't force "not selected" theme state + // when button is highglighted and selected -- (BOOL)startTrackingAt:(CGPoint)aPoint -{ - var startedTracking = [super startTrackingAt:aPoint]; - [self highlight:YES]; - return startedTracking; + var visualState = [self themeState] || CPThemeStateNormal, // Needed during theme compilation + currentState = [self state]; + + if (_isHighlighted && (_highlightsBy & CPContentsCellMask)) + visualState = visualState.and(CPThemeStateHighlighted); + + if ((currentState !== CPOffState) && (_showsStateBy & CPContentsCellMask)) + visualState = visualState.and((currentState === CPOnState) ? CPThemeStateSelected : CPButtonStateMixed); + + return visualState; } @end From 9145e270090b931eda054591a3812adbaf51ccfe Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 2 Oct 2020 14:47:50 +0200 Subject: [PATCH 22/30] Fixed: Aristo3 CSS theme ready and replaces setTextFieldBackgroundColor by setBackgroundColor for CPTextField (#2925) --- AppKit/CPControl.j | 5 ++ AppKit/CPTextField.j | 110 +++++++++++++++++++++++++++++------- Tools/nib2cib/NSTextField.j | 34 ++++++++++- 3 files changed, 128 insertions(+), 21 deletions(-) diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 4ee5cc418..20ccd2f83 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -857,6 +857,11 @@ var CPControlBlackColor = [CPColor blackColor]; [self setValue:aColor forThemeAttribute:@"text-color" inState:[self themeState]]; } +- (void)setTextColor:(CPColor)aColor inThemeStates:(CPArray)themeStates +{ + [self setValue:aColor forThemeAttribute:@"text-color" inStates:themeStates]; +} + /*! Returns the text color of the receiver. */ diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 423f37800..dff268244 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -233,7 +233,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); @"bezel-inset": CGInsetMakeZero(), @"content-inset": CGInsetMake(1.0, 0.0, 0.0, 0.0), @"bezel-color": [CPNull null], - @"min-size": CGSizeMake(0, 29) + @"min-size": CGSizeMake(0, 29), + @"background-inset": CGInsetMakeZero() }; } @@ -368,8 +369,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [self setPlaceholderString:@""]; _sendActionOn = CPKeyUpMask | CPKeyDownMask; - - [self setValue:CPNaturalTextAlignment forThemeAttribute:@"alignment"]; } return self; @@ -560,9 +559,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); Sets the background color, which is shown for non-bezeled text fields with drawsBackground set to YES @param aColor The background color */ -- (void)setTextFieldBackgroundColor:(CPColor)aColor +- (void)setBackgroundColor:(CPColor)aColor { - if (_textFieldBackgroundColor == aColor) + if (_backgroundColor == aColor) return; _textFieldBackgroundColor = aColor; @@ -574,7 +573,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); /*! Returns the background color. */ -- (CPColor)textFieldBackgroundColor +- (CPColor)backgroundColor { return _textFieldBackgroundColor; } @@ -759,7 +758,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); #if PLATFORM(DOM) var element = [self _inputElement], - font = [self currentValueForThemeAttribute:@"font"], + font = [self font], lineHeight = [font defaultLineHeightForFont], contentRect = [self contentRectForBounds:[self bounds]], verticalAlign = [self currentValueForThemeAttribute:"vertical-alignment"], @@ -1462,7 +1461,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); lineBreakMode = [self lineBreakMode], text = (_stringValue || @" "), textSize = CGSizeMakeCopy(frameSize), - font = [self currentValueForThemeAttribute:@"font"]; + font = [self font]; textSize.width -= contentInset.left + contentInset.right; textSize.height -= contentInset.top + contentInset.bottom; @@ -1866,6 +1865,12 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if (aName === "bezel-view") return [self bezelRectForBounds:[self bounds]]; + else if (aName === "background-view") + { + var backgroundInset = [self currentValueForThemeAttribute:@"background-inset"]; + + return CGRectInsetByInset([self bounds], backgroundInset); + } else if (aName === "content-view") return [self contentRectForBounds:[self bounds]]; @@ -1882,6 +1887,14 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return view; } + else if (aName === "background-view") + { + var view = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [view setHitTests:NO]; + + return view; + } else { var view = [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()]; @@ -1896,16 +1909,37 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)layoutSubviews { - var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" - positioned:CPWindowBelow - relativeToEphemeralSubviewNamed:@"content-view"]; + var bezelColor = [self currentValueForThemeAttribute:@"bezel-color"]; + + if ([bezelColor isCSSBased]) + { + // CSS Styling + // We don't need bezelView as we apply CSS styling directly on the text field view itself - if (bezelView) - [bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]]; + // We need to call [super setBackgroundColor:] as we have redefined it here + [super setBackgroundColor:bezelColor]; + + var contentView = [self layoutEphemeralSubviewNamed:@"content-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:nil], + backgroundView = [self layoutEphemeralSubviewNamed:@"background-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"content-view"]; - var contentView = [self layoutEphemeralSubviewNamed:@"content-view" - positioned:CPWindowAbove - relativeToEphemeralSubviewNamed:@"bezel-view"]; + [backgroundView setBackgroundColor:(_drawsBackground ? _textFieldBackgroundColor : [CPColor clearColor])]; + } + else + { + var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"content-view"]; + + [bezelView setBackgroundColor:bezelColor]; + + var contentView = [self layoutEphemeralSubviewNamed:@"content-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:@"bezel-view"]; + } if (contentView) { @@ -1926,7 +1960,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); [contentView setText:string]; [contentView setTextColor:[self currentValueForThemeAttribute:@"text-color"]]; - [contentView setFont:[self currentValueForThemeAttribute:@"font"]]; + [contentView setFont:[self font]]; [contentView setAlignment:[self currentValueForThemeAttribute:@"alignment"]]; [contentView setVerticalAlignment:[self currentValueForThemeAttribute:@"vertical-alignment"]]; [contentView setLineBreakMode:[self currentValueForThemeAttribute:@"line-break-mode"]]; @@ -1966,7 +2000,25 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // We don't want to change the text-color of the placeHolder of the textField var placeholderColor = [self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder]; - [super setTextColor:aColor]; + // If the text field is a cell based table data view, we need to fix the color for all possible states + if ([self hasThemeState:CPThemeStateTableDataView]) + { + [self setTextColor:aColor inThemeStates:[CPThemeStateTableDataView]]; + [self setTextColor:aColor inThemeStates:[CPThemeStateTableDataView, CPThemeStateSelectedDataView]]; + [self setTextColor:aColor inThemeStates:[CPThemeStateTableDataView, CPThemeStateSelectedDataView, CPThemeStateFirstResponder, CPThemeStateKeyWindow]]; + } + else + { + if ([self hasThemeState:CPTextFieldStateRounded]) + { + [self setTextColor:aColor inThemeStates:[CPTextFieldStateRounded]]; + [self setTextColor:aColor inThemeStates:[CPTextFieldStateRounded, CPThemeStateEditing]]; + } + + [self setTextColor:aColor inThemeStates:[CPThemeStateNormal]]; + [self setTextColor:aColor inThemeStates:[CPThemeStateEditing]]; + } + [self setValue:placeholderColor forThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder]; } @@ -2109,8 +2161,7 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]]; [self setDrawsBackground:[aCoder decodeBoolForKey:CPTextFieldDrawsBackgroundKey]]; - - [self setTextFieldBackgroundColor:[aCoder decodeObjectForKey:CPTextFieldBackgroundColorKey]]; + [self setBackgroundColor:[aCoder decodeObjectForKey:CPTextFieldBackgroundColorKey]]; [self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]]; [self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]]; @@ -2120,6 +2171,7 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", [self _setUsesSingleLineMode:[aCoder decodeBoolForKey:CPTextFieldUsesSingleLineMode]]; [self _setWraps:[aCoder decodeBoolForKey:CPTextFieldWraps]]; [self _setScrolls:[aCoder decodeBoolForKey:CPTextFieldScrolls]]; + [self updateTrackingAreas]; } return self; @@ -2319,4 +2371,22 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey", @end +#pragma mark - +@implementation CPTextField (Deprecated) + +- (void)setTextFieldBackgroundColor:(CPColor)aColor +{ + CPLog.error("[CPTextField setTextFieldBackgroundColor:] is deprecated, use [CPTextField setBackgroundColor:] instead."); + + [self setBackgroundColor:aColor]; +} + +- (CPColor)textFieldBackgroundColor +{ + CPLog.info("[CPTextField textFieldBackgroundColor] is deprecated, use [CPTextField backgroundColor] instead."); + + return [self backgroundColor]; +} + +@end diff --git a/Tools/nib2cib/NSTextField.j b/Tools/nib2cib/NSTextField.j index ddbf69b48..3a89e03e2 100644 --- a/Tools/nib2cib/NSTextField.j +++ b/Tools/nib2cib/NSTextField.j @@ -51,7 +51,7 @@ [self setLineBreakMode:[cell lineBreakMode]]; [self setAlignment:[cell alignment]]; - [self setTextFieldBackgroundColor:[cell backgroundColor]]; + [self setBackgroundColor:[cell backgroundColor]]; [self setPlaceholderString:[cell placeholderString]]; @@ -72,6 +72,38 @@ CPLog.debug(">> Formatter: " + [[self formatter] description]); } +// Labels WITHOUT background use a special adjustment frame. +// As we can't just let the theming system choose, we have to +// adapt _nib2cibAdjustment +- (CGRect)_nib2CibAdjustment +{ + // Theme has not been loaded yet. + // Get attribute value directly from the theme or from the default value of the object otherwise. + var theme = [Nib2Cib defaultTheme], + themeState = [self themeState]; + + // Is this a label with a background ? + if (!([self hasThemeState:CPThemeStateBezeled] || [self hasThemeState:CPThemeStateBordered]) && [self drawsBackground]) + + // Yes, so use normal frame adjustment (that is, consider it's bezeled) + themeState = themeState.and(CPThemeStateBezeled); + + var frameAdjustment = [theme valueForAttributeWithName:@"nib2cib-adjustment-frame" inState:themeState forClass:[self class]]; + + if (frameAdjustment) + return frameAdjustment; + + if ([self hasThemeAttribute:@"nib2cib-adjustment-frame"]) + { + frameAdjustment = [self valueForThemeAttribute:@"nib2cib-adjustment-frame" inState:themeState]; + + if (frameAdjustment) + return frameAdjustment; + } + + return nil; +} + @end @implementation NSTextField : CPTextField From c1543d4a2fb435377d15b19e1e913a31228296b4 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Fri, 2 Oct 2020 16:01:30 +0200 Subject: [PATCH 23/30] Fixed: Loading cached theme attributes will miss previous cached values if superclass is done before subclass (#2892) --- AppKit/_CPObject+Theme.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/_CPObject+Theme.j b/AppKit/_CPObject+Theme.j index 2c6d00b88..30cd13a9a 100644 --- a/AppKit/_CPObject+Theme.j +++ b/AppKit/_CPObject+Theme.j @@ -205,7 +205,7 @@ var NULL_THEME = {}; if (cachedAttributes) { - attributes = attributes.length ? attributes.concat(cachedAttributes) : attributes; + attributes = cachedAttributes.length ? attributes.concat(cachedAttributes) : attributes; break; } From ef779c346e480daee5bc3e3d7f6629437f0b0a3a Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 9 Oct 2020 09:35:56 +0200 Subject: [PATCH 24/30] New: Support modern Cocoa behavior regarding radio buttons groups. (#2941) --- AppKit/CPRadio.j | 74 +++++++++++++++++++++++++++++++++++++ Tests/AppKit/CPButtonTest.j | 63 +++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/AppKit/CPRadio.j b/AppKit/CPRadio.j index f0c725a7e..a2b6f51d9 100644 --- a/AppKit/CPRadio.j +++ b/AppKit/CPRadio.j @@ -67,6 +67,18 @@ CPRadioImageOffset = 4.0; [[button1 radioGroup] selectedRadio] returns the currently selected option. + UPDATE 09/2020 : Implementation of modern Cocoa behavior : + + As in Cocoa, radio buttons grouping is now automatic. + + To be associated in a common group (and so being mutually exclusive), + radio buttons must combine 2 criteria : + + - same superview (enclosing view) + - same action + + TODO: This first implementation uses "as is" CPRadioGroup. This could + be simplified (no more need for radio group action, for example) */ @implementation CPRadio : CPButton { @@ -160,6 +172,63 @@ CPRadioImageOffset = 4.0; [CPApp sendAction:[_radioGroup action] to:[_radioGroup target] from:_radioGroup]; } +- (void)viewDidMoveToSuperview +{ + [self _setRadioGroup]; + [super viewDidMoveToSuperview]; +} + +- (void)setAction:(SEL)anAction +{ + if (anAction === _action) + return; + + [super setAction:anAction]; + [self _setRadioGroup]; +} + +#pragma mark Private methods + +- (void)_setRadioGroup +{ + // Implementation of modern Cocoa behavior : automatic radio group + + // If no action is set or no superview, no grouping can be done. + if (![self action] || ![self superview]) + { + // If I'm in a group (size > 1), remove me. + if ([[self radioGroup] size] > 1) + [self setRadioGroup:[CPRadioGroup new]]; + + return; + } + + // Search in superview subviews for other radio buttons having the same action. + // Take the one with the radio group having the greatest number of members. + + var radioGroup; + + for (var i = 0, superviewSubviews = [[self superview] subviews], count = [superviewSubviews count], aSubview, myAction = [self action], radioGroupSize = -1; (i < count); i++) + { + aSubview = superviewSubviews[i]; + + if ([aSubview isKindOfClass:CPRadio] && (aSubview !== self) && ([aSubview action] === myAction) && ([[aSubview radioGroup] size] > radioGroupSize)) + { + radioGroup = [aSubview radioGroup]; + radioGroupSize = [radioGroup size]; + } + } + + if (radioGroup) + [self setRadioGroup:radioGroup]; + else + // No other radio buttons to group with found. + // It may be because this radio button was in a radio group and its action was changed. + // If this is the case, we must reisolate it in a new radio group. + if ([_radioGroup size] > 1) + [self setRadioGroup:[CPRadioGroup new]]; +} + @end var CPRadioRadioGroupKey = @"CPRadioRadioGroupKey"; @@ -320,6 +389,11 @@ var CPRadioRadioGroupKey = @"CPRadioRadioGroupKey"; return _radios; } +- (int)size +{ + return [_radios count]; +} + - (void)setEnabled:(BOOL)enabled { [_radios makeObjectsPerformSelector:@selector(setEnabled:) withObject:enabled]; diff --git a/Tests/AppKit/CPButtonTest.j b/Tests/AppKit/CPButtonTest.j index 36efd1247..8a0f92e78 100644 --- a/Tests/AppKit/CPButtonTest.j +++ b/Tests/AppKit/CPButtonTest.j @@ -190,6 +190,69 @@ [self assertTrue:wasClicked message:@"a user click on a radio button should fire the group action"]; } +- (void)testAutomaticRadioGroup +{ + var radioButton1 = [CPRadio radioWithTitle:@"Radio 1"], + radioButton2 = [CPRadio radioWithTitle:@"Radio 2"], + radioButton3 = [CPRadio radioWithTitle:@"Radio 3"], + simpleView1 = [[CPView alloc] initWithFrame:CGRectMakeZero()], + simpleView2 = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + // Initially, buttons are isolated + [self assertFalse:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"initially, buttons should be isolated"]; + + [simpleView1 addSubview:radioButton1]; + [simpleView1 addSubview:radioButton2]; + + // As no actions are defined, buttons are still isolated + [self assertFalse:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"no actions defined, buttons should be isolated"]; + + [radioButton1 setAction:@selector(dummyAction1:)]; + [radioButton2 setAction:@selector(dummyAction2:)]; + + // As different actions are defined, buttons are still isolatdd + [self assertFalse:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"different actions defined, buttons should be isolated"]; + + [radioButton2 setAction:@selector(dummyAction1:)]; + + // As the same action is defined, buttons must be grouped + [self assertTrue:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"same action defined, buttons should be grouped"]; + + [radioButton3 setAction:@selector(dummyAction1:)]; + + // As radioButton3 is not inserted in a view, it's isolated + [self assertTrue:([[radioButton3 radioGroup] size] === 1) message:@"not in a view, button should be isolated"]; + + [simpleView2 addSubview:radioButton3]; + + // As radioButton3 is in another view, it's isolated from radioButton1 & 2 + [self assertTrue:([[radioButton3 radioGroup] size] === 1) message:@"alone in a view, button should be isolated"]; + + [simpleView1 addSubview:radioButton3]; + + // As all 3 buttons are in the same view, with the same action, they are grouped + [self assertTrue:([[radioButton3 radioGroup] size] === 3) message:@"after moving to the same view, buttons should be grouped"]; + + [radioButton3 setAction:@selector(dummyAction2:)]; + + // As the action of button 3 is now different, it's isolated + [self assertTrue:([[radioButton3 radioGroup] size] === 1) message:@"after changing the action, button 3 should be isolated"]; + + // And buttons 1 & 2 are still grouped + [self assertTrue:([radioButton1 radioGroup] === [radioButton2 radioGroup]) message:@"buttons 1 & 2 should remain grouped"]; + [self assertTrue:([[radioButton1 radioGroup] size] === 2) message:@"radio group should contain only buttons 1 & 2"]; +} + +- (IBAction)dummyAction1:(id)sender +{ + +} + +- (IBAction)dummyAction2:(id)sender +{ + +} + - (void)testTypeMasks { button = [[CPButton alloc] initWithFrame:CGRectMakeZero()]; From 5f6df95e3026b8092ebc5589a3fc02a8b691bc97 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 9 Oct 2020 11:47:18 +0200 Subject: [PATCH 25/30] New: Modern Cocoa behavior and methods, ticked sliders and Aristo3 CSS theme ready (#2926) --- AppKit/CPLevelIndicator.j | 7 +- AppKit/CPSlider.j | 952 ++++++++++++++++++++++++++++++++------ Tools/nib2cib/NSSlider.j | 81 +++- 3 files changed, 873 insertions(+), 167 deletions(-) diff --git a/AppKit/CPLevelIndicator.j b/AppKit/CPLevelIndicator.j index 94319181f..ae3ca291f 100644 --- a/AppKit/CPLevelIndicator.j +++ b/AppKit/CPLevelIndicator.j @@ -22,15 +22,10 @@ @import "CPControl.j" @import "CPWindow_Constants.j" +@import "CPSlider.j" @global CPApp -@typedef CPTickMarkPosition -CPTickMarkBelow = 0; -CPTickMarkAbove = 1; -CPTickMarkLeft = CPTickMarkAbove; -CPTickMarkRight = CPTickMarkBelow; - @typedef CPLevelIndicatorStyle CPRelevancyLevelIndicatorStyle = 0; CPContinuousCapacityLevelIndicatorStyle = 1; diff --git a/AppKit/CPSlider.j b/AppKit/CPSlider.j index 2190118d2..b13d4d078 100644 --- a/AppKit/CPSlider.j +++ b/AppKit/CPSlider.j @@ -5,6 +5,9 @@ * Created by Francisco Tolmasky. * Copyright 2009, 280 North, Inc. * + * Adapted by Didier Korthoudt + * Copyright 2018 + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -26,8 +29,26 @@ /*! SLIDER STATES */ -CPLinearSlider = 0; -CPCircularSlider = 1; +@typedef CPSliderType +CPLinearSlider = 0; +CPCircularSlider = 1; + +/*! SLIDER TICK MARK POSITION */ + +@typedef CPTickMarkPosition +CPTickMarkPositionBelow = 0; +CPTickMarkPositionAbove = 1; +CPTickMarkPositionLeading = CPTickMarkPositionAbove; +CPTickMarkPositionTrailing = CPTickMarkPositionBelow; + +/*! Ticked sliders specific states */ + +CPThemeStateTickedSlider = CPThemeState("ticked-slider"); +CPThemeStateAboveLeftTickedSlider = CPThemeState("above-left-ticked-slider"); +CPThemeStateBelowRightTickedSlider = CPThemeState("below-right-ticked-slider"); + +/*! Tick mark affinity distance */ +var AFFINITY = 5; /*! @ingroup appkit @@ -35,13 +56,30 @@ CPCircularSlider = 1; @implementation CPSlider : CPControl { - double _minValue; - double _maxValue; - double _altIncrementValue; + double _minValue; + double _maxValue; + double _altIncrementValue; - BOOL _isVertical; + CPInteger _isVertical; + BOOL _isCircular; + BOOL _isTicked; + BOOL _isContinuous; - CGSize _dragOffset; + CGSize _dragOffset; + + CPSliderType _sliderType @accessors(property=sliderType); + BOOL _allowsTickMarkValuesOnly @accessors(property=allowsTickMarkValuesOnly); + CPTickMarkPosition _tickMarkPosition @accessors(property=tickMarkPosition); + CPInteger _numberOfTickMarks @accessors(property=numberOfTickMarks); + + CPMutableArray _cachedTickMarksRects; + CPMutableArray _cachedTickMarksSegments; + CPMutableArray _cachedTickMarksValues; + CPInteger _currentTickMarkSegment; + CPInteger _closestTickMarkIndex; + CPInteger _affinityPoint; + BOOL _canStickOnTickMarks; + BOOL _stickingOnTickMark; } + (CPString)defaultThemeClass @@ -52,10 +90,19 @@ CPCircularSlider = 1; + (CPDictionary)themeAttributes { return @{ - @"knob-color": [CPNull null], - @"knob-size": CGSizeMakeZero(), - @"track-width": 0.0, - @"track-color": [CPNull null], + @"left-track-color": [CPNull null], + @"knob-color": [CPNull null], + @"knob-size": CGSizeMakeZero(), + @"knob-offset": 0.0, + @"track-width": 0.0, + @"track-color": [CPNull null], + @"direct-nib2cib-adjustment": NO, + @"tick-mark-size": CGSizeMakeZero(), + @"tick-mark-color": [CPNull null], + @"tick-mark-margin": 0, + @"top-margin": 0, + @"bottom-margin": 0, + @"ib-size": -1 }; } @@ -69,10 +116,11 @@ CPCircularSlider = 1; _maxValue = 100.0; [self setObjectValue:50.0]; - [self setContinuous:YES]; + [self setNumberOfTickMarks:0]; + [self setSliderType:CPLinearSlider]; - [self _recalculateIsVertical]; + [self _refreshCachesAndStates]; } return self; @@ -90,6 +138,8 @@ CPCircularSlider = 1; if (doubleValue < _minValue) [self setDoubleValue:_minValue]; + [self _refreshCachesAndStates]; + // The relative position may have (did) change. [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -112,6 +162,8 @@ CPCircularSlider = 1; if (doubleValue > _maxValue) [self setDoubleValue:_maxValue]; + [self _refreshCachesAndStates]; + // The relative position may have (did) change. [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -124,7 +176,9 @@ CPCircularSlider = 1; - (void)setObjectValue:(id)aValue { + [self willChangeValueForKey:@"objectValue"]; [super setObjectValue:MIN(MAX(aValue, _minValue), _maxValue)]; + [self didChangeValueForKey:@"objectValue"]; [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -132,51 +186,115 @@ CPCircularSlider = 1; - (void)setSliderType:(CPSliderType)aSliderType { - if (aSliderType === CPCircularSlider) - [self setThemeState:CPThemeStateCircular]; - else - [self unsetThemeState:CPThemeStateCircular]; + if (aSliderType === _sliderType) + return; + + _sliderType = aSliderType; + + [self _refreshCachesAndStates]; } - (CPSliderType)sliderType { - return [self hasThemeState:CPThemeStateCircular] ? CPCircularSlider : CPLinearSlider; + return _sliderType; } - (CGRect)trackRectForBounds:(CGRect)bounds { - if ([self hasThemeState:CPThemeStateCircular]) + var trackRect = CGRectCreateCopy(bounds); + + if (_isCircular) { - var originalBounds = CGRectCreateCopy(bounds); + var tickMarkMargin = [self currentValueForThemeAttribute:@"tick-mark-margin"]; - bounds.size.width = MIN(bounds.size.width, bounds.size.height); - bounds.size.height = bounds.size.width; + trackRect.size.width = MIN(trackRect.size.width, trackRect.size.height) - tickMarkMargin * 2; + trackRect.size.height = trackRect.size.width; - if (bounds.size.width < originalBounds.size.width) - bounds.origin.x += (originalBounds.size.width - bounds.size.width) / 2.0; - else - bounds.origin.y += (originalBounds.size.height - bounds.size.height) / 2.0; + trackRect.origin.x = tickMarkMargin; + trackRect.origin.y = tickMarkMargin; } else { - var trackWidth = [self currentValueForThemeAttribute:@"track-width"]; + var trackWidth = [self currentValueForThemeAttribute:@"track-width"], + tickMarkSize = [self currentValueForThemeAttribute:@"tick-mark-size"], + tickMarkMargin = [self currentValueForThemeAttribute:@"tick-mark-margin"], + topMargin = [self currentValueForThemeAttribute:@"top-margin"], + bottomMargin = [self currentValueForThemeAttribute:@"bottom-margin"]; if (trackWidth <= 0) return CGRectMakeZero(); - if ([self isVertical]) + if (_isVertical) { - bounds.origin.x = (CGRectGetWidth(bounds) - trackWidth) / 2.0; - bounds.size.width = trackWidth; + var usableWidth = trackRect.size.width - topMargin - bottomMargin - (_isTicked ? (tickMarkSize.width + tickMarkMargin) : 0); + + trackRect.origin.x = (usableWidth - trackWidth) / 2.0 + topMargin + ((_isTicked && (_tickMarkPosition === CPTickMarkPositionLeading)) ? (tickMarkSize.width + tickMarkMargin) : 0); + trackRect.size.width = trackWidth; } else { - bounds.origin.y = (CGRectGetHeight(bounds) - trackWidth) / 2.0; - bounds.size.height = trackWidth; + var usableHeight = trackRect.size.height - topMargin - bottomMargin - (_isTicked ? (tickMarkSize.height + tickMarkMargin) : 0); + + trackRect.origin.y = (usableHeight - trackWidth) / 2.0 + topMargin + ((_isTicked && (_tickMarkPosition === CPTickMarkPositionAbove)) ? (tickMarkSize.height + tickMarkMargin) : 0); + trackRect.size.height = trackWidth; } } - return bounds; + return trackRect; +} + +- (CGRect)leftTrackRectForBounds:(CGRect)bounds +{ + // Circular and ticked slider do not have left and right parts, so we don't need to deal with them + if (_isCircular || _isTicked) + return CGRectMakeZero(); + + var trackRect = CGRectCreateCopy(bounds), + trackWidth = [self currentValueForThemeAttribute:@"track-width"], + currentValue = [self doubleValue]; + + if (_isVertical) + { + trackRect.origin.x = (trackRect.size.width - trackWidth) / 2.0; + trackRect.origin.y = ((_maxValue - currentValue) / (_maxValue - _minValue)) * trackRect.size.height; + trackRect.size.width = trackWidth; + trackRect.size.height = ((currentValue - _minValue) / (_maxValue - _minValue)) * trackRect.size.height; + } + else + { + trackRect.origin.y = (trackRect.size.height - trackWidth) / 2.0; + trackRect.size.width = ((currentValue - _minValue) / (_maxValue - _minValue)) * trackRect.size.width; + trackRect.size.height = trackWidth; + } + + return trackRect; +} + +- (CGRect)rightTrackRectForBounds:(CGRect)bounds +{ + // Circular and ticked slider do not have left and right parts, so we don't need to deal with them + if (_isCircular || _isTicked) + return CGRectMakeZero(); + + var trackRect = CGRectCreateCopy(bounds), + trackWidth = [self currentValueForThemeAttribute:@"track-width"], + currentValue = [self doubleValue]; + + if (_isVertical) + { + trackRect.origin.x = (trackRect.size.width - trackWidth) / 2.0; + trackRect.size.width = trackWidth; + trackRect.size.height = ((_maxValue - currentValue) / (_maxValue - _minValue)) * trackRect.size.height; + } + else + { + trackRect.origin.x = ((currentValue - _minValue) / (_maxValue - _minValue)) * trackRect.size.width; + trackRect.origin.y = (trackRect.size.height - trackWidth) / 2.0; + trackRect.size.width = ((_maxValue - currentValue) / (_maxValue - _minValue)) * trackRect.size.width; + trackRect.size.height = trackWidth; + } + + return trackRect; } - (CGRect)knobRectForBounds:(CGRect)bounds @@ -186,30 +304,41 @@ CPCircularSlider = 1; if (knobSize.width <= 0 || knobSize.height <= 0) return CGRectMakeZero(); - var knobRect = CGRectMake(0.0, 0.0, knobSize.width, knobSize.height), - trackRect = [self trackRectForBounds:bounds]; + var knobRect = CGRectMake(0.0, 0.0, knobSize.width, knobSize.height), + trackRect = [self trackRectForBounds:bounds], + knobOffset = [self currentValueForThemeAttribute:@"knob-offset"]; // No track, do our best to approximate a place for this thing. if (!trackRect || CGRectIsEmpty(trackRect)) trackRect = bounds; - if ([self hasThemeState:CPThemeStateCircular]) + if (_isCircular) { - var angle = 3 * PI_2 - (1.0 - [self doubleValue] - _minValue) / (_maxValue - _minValue) * PI2, - radius = CGRectGetWidth(trackRect) / 2.0 - 8.0; - - knobRect.origin.x = radius * COS(angle) + CGRectGetMidX(trackRect) - 3.0; - knobRect.origin.y = radius * SIN(angle) + CGRectGetMidY(trackRect) - 2.0; + var angle = 3 * PI_2 - (1.0 - [self doubleValue] - _minValue) / (_maxValue - _minValue) * PI2, + radius = trackRect.size.width / 2.0 - (knobOffset ? knobOffset : 8.0); + + knobRect.origin.x = radius * COS(angle) + CGRectGetMidX(trackRect) - knobSize.width / 2; // 3.0; + knobRect.origin.y = radius * SIN(angle) + CGRectGetMidY(trackRect) - knobSize.height / 2; // 2.0; } - else if ([self isVertical]) + else if (_isVertical) { - knobRect.origin.x = CGRectGetMidX(trackRect) - knobSize.width / 2.0; - knobRect.origin.y = ((_maxValue - [self doubleValue]) / (_maxValue - _minValue)) * (CGRectGetHeight(trackRect) - knobSize.height); + knobRect.origin.x = CGRectGetMidX(trackRect) - knobSize.width / 2.0 + knobOffset; + + if (_isTicked && _allowsTickMarkValuesOnly && _cachedTickMarksRects) + // This is done to garantee that the knob is perfectly aligned with the tick mark + knobRect.origin.y = _cachedTickMarksRects[_currentTickMarkSegment].origin.y - (knobSize.height - 1) / 2; + else + knobRect.origin.y = ROUND(((_maxValue - [self doubleValue]) / (_maxValue - _minValue)) * (trackRect.size.height - knobSize.height)); } else { - knobRect.origin.x = (([self doubleValue] - _minValue) / (_maxValue - _minValue)) * (CGRectGetWidth(trackRect) - knobSize.width); - knobRect.origin.y = CGRectGetMidY(trackRect) - knobSize.height / 2.0; + if (_isTicked && _allowsTickMarkValuesOnly && _cachedTickMarksRects) + // This is done to garantee that the knob is perfectly aligned with the tick mark + knobRect.origin.x = _cachedTickMarksRects[_currentTickMarkSegment].origin.x - (knobSize.width - 1) / 2; + else + knobRect.origin.x = ROUND((([self doubleValue] - _minValue) / (_maxValue - _minValue)) * (trackRect.size.width - knobSize.width)); + + knobRect.origin.y = CGRectGetMidY(trackRect) - knobSize.height / 2.0 + knobOffset; } return knobRect; @@ -217,18 +346,28 @@ CPCircularSlider = 1; - (CGRect)rectForEphemeralSubviewNamed:(CPString)aName { - if (aName === "track-view") - return [self trackRectForBounds:[self bounds]]; + switch (aName) + { + case @"track-view": + return [self trackRectForBounds:[self bounds]]; - else if (aName === "knob-view") - return [self knobRectForBounds:[self bounds]]; + case @"knob-view": + return [self knobRectForBounds:[self bounds]]; - return [super rectForEphemeralSubviewNamed:aName]; + case @"left-track-view": + return [self leftTrackRectForBounds:[self bounds]]; + + case @"right-track-view": + return [self rightTrackRectForBounds:[self bounds]]; + + default: + return [super rectForEphemeralSubviewNamed:aName]; + } } - (CPView)createEphemeralSubviewNamed:(CPString)aName { - if (aName === "track-view" || aName === "knob-view") + if (aName === "track-view" || aName === "knob-view" || aName === "left-track-view" || aName === "right-track-view") { var view = [[CPView alloc] init]; @@ -242,6 +381,7 @@ CPCircularSlider = 1; - (void)setAltIncrementValue:(float)anAltIncrementValue { + // FIXME: This is not used. BTW, tested in Cocoa and it is totally useless. So leave it like that for now... _altIncrementValue = anAltIncrementValue; } @@ -250,47 +390,64 @@ CPCircularSlider = 1; return _altIncrementValue; } -- (void)setFrameSize:(CGSize)aSize -{ - [super setFrameSize:aSize]; - [self _recalculateIsVertical]; -} - -- (void)_recalculateIsVertical -{ - // Recalculate isVertical. - var bounds = [self bounds], - width = CGRectGetWidth(bounds), - height = CGRectGetHeight(bounds); - - _isVertical = width < height ? 1 : (width > height ? 0 : -1); - - if (_isVertical === 1) - [self setThemeState:CPThemeStateVertical]; - else if (_isVertical === 0) - [self unsetThemeState:CPThemeStateVertical]; -} - -- (int)isVertical +- (CPInteger)isVertical { return _isVertical; } - (void)layoutSubviews { - var trackView = [self layoutEphemeralSubviewNamed:@"track-view" - positioned:CPWindowBelow - relativeToEphemeralSubviewNamed:@"knob-view"]; + var leftTrackColor = [self currentValueForThemeAttribute:@"left-track-color"]; - if (trackView) + if (leftTrackColor && !_isCircular && !_isTicked) + { + // Two parts layout (needed by Aristo3) + var leftTrackView = [self layoutEphemeralSubviewNamed:@"left-track-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"knob-view"], + rightTrackView = [self layoutEphemeralSubviewNamed:@"right-track-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"knob-view"]; + + [leftTrackView setBackgroundColor:leftTrackColor]; + [rightTrackView setBackgroundColor:[self currentValueForThemeAttribute:@"track-color"]]; + + var knobView = [self layoutEphemeralSubviewNamed:@"knob-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:@"left-track-view"]; + + [knobView setBackgroundColor:[self currentValueForThemeAttribute:"knob-color"]]; + } + else + { + // Normal layout + var trackView = [self layoutEphemeralSubviewNamed:@"track-view" + positioned:CPWindowBelow + relativeToEphemeralSubviewNamed:@"knob-view"]; + [trackView setBackgroundColor:[self currentValueForThemeAttribute:@"track-color"]]; - var knobView = [self layoutEphemeralSubviewNamed:@"knob-view" - positioned:CPWindowAbove - relativeToEphemeralSubviewNamed:@"track-view"]; - - if (knobView) + var knobView = [self layoutEphemeralSubviewNamed:@"knob-view" + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:@"track-view"]; + [knobView setBackgroundColor:[self currentValueForThemeAttribute:"knob-color"]]; + } +} + +- (void)drawRect:(CGRect)aRect +{ + // We only draw tick marks here + + if (!_isTicked) + return; + + var context = [[CPGraphicsContext currentContext] graphicsPort]; + + CGContextSetFillColor(context, [self currentValueForThemeAttribute:@"tick-mark-color"]); + + for (var i = 0; i < _numberOfTickMarks; i++) + CGContextFillRect(context, [self rectOfTickMarkAtIndex:i]); } - (BOOL)tracksMouseOutsideOfFrame @@ -298,71 +455,28 @@ CPCircularSlider = 1; return YES; } -- (float)_valueAtPoint:(CGPoint)aPoint -{ - var bounds = [self bounds], - knobRect = [self knobRectForBounds:bounds], - trackRect = [self trackRectForBounds:bounds]; - - if ([self hasThemeState:CPThemeStateCircular]) - { - var knobWidth = CGRectGetWidth(knobRect); - - trackRect.origin.x += knobWidth / 2; - trackRect.size.width -= knobWidth; - - var minValue = [self minValue], - dx = aPoint.x - CGRectGetMidX(trackRect), - dy = aPoint.y - CGRectGetMidY(trackRect); - - return MAX(0.0, MIN(1.0, 1.0 - (3 * PI_2 - ATAN2(dy, dx)) % PI2 / PI2)) * ([self maxValue] - minValue) + minValue; - } - else if ([self isVertical]) - { - var knobHeight = CGRectGetHeight(knobRect); - - trackRect.origin.y += knobHeight / 2; - trackRect.size.height -= knobHeight; - - var minValue = [self minValue]; - - return MAX(0.0, MIN(1.0, (CGRectGetMaxY(trackRect) - aPoint.y) / CGRectGetHeight(trackRect))) * ([self maxValue] - minValue) + minValue; - } - else - { - var knobWidth = CGRectGetWidth(knobRect); - - trackRect.origin.x += knobWidth / 2; - trackRect.size.width -= knobWidth; - - var minValue = [self minValue]; - - return MAX(0.0, MIN(1.0, (aPoint.x - CGRectGetMinX(trackRect)) / CGRectGetWidth(trackRect))) * ([self maxValue] - minValue) + minValue; - } -} - - (BOOL)startTrackingAt:(CGPoint)aPoint { - var bounds = [self bounds], - knobRect = [self knobRectForBounds:CGRectMakeCopy(bounds)]; + var bounds = [self bounds], + knobRect = [self knobRectForBounds:bounds]; if (CGRectContainsPoint(knobRect, aPoint)) _dragOffset = CGSizeMake(CGRectGetMidX(knobRect) - aPoint.x, CGRectGetMidY(knobRect) - aPoint.y); else { - var trackRect = [self trackRectForBounds:bounds]; + _dragOffset = CGSizeMakeZero(); - if (trackRect && CGRectContainsPoint(trackRect, aPoint)) + if (_allowsTickMarkValuesOnly) { - _dragOffset = CGSizeMakeZero(); - - [self setObjectValue:[self _valueAtPoint:aPoint]]; + _currentTickMarkSegment = [self indexOfTickMarkAtPoint:aPoint]; + [self setObjectValue:_cachedTickMarksValues[_currentTickMarkSegment]]; } - else - return NO; + [self setObjectValue:[self _valueAtPoint:aPoint]]; } + _stickingOnTickMark = NO; + [self setHighlighted:YES]; [self setNeedsLayout]; @@ -373,7 +487,57 @@ CPCircularSlider = 1; - (BOOL)continueTracking:(CGPoint)lastPoint at:(CGPoint)aPoint { - [self setObjectValue:[self _valueAtPoint:CGPointMake(aPoint.x + _dragOffset.width, aPoint.y + _dragOffset.height)]]; + var bounds = [self bounds], + newPoint = _isCircular ? CGPointMake(aPoint.x + _dragOffset.width, aPoint.y + _dragOffset.height) + : CGPointMake(MAX(0, MIN(bounds.size.width-1, aPoint.x + _dragOffset.width)), + MAX(0, MIN(bounds.size.height-1, aPoint.y + _dragOffset.height))); + + if (_allowsTickMarkValuesOnly) + { + var tickMarkSegment = [self indexOfTickMarkAtPoint:newPoint]; + + if (tickMarkSegment !== _currentTickMarkSegment) + { + _currentTickMarkSegment = tickMarkSegment; + [self setObjectValue:_cachedTickMarksValues[_currentTickMarkSegment]]; + } + } + + else if (_canStickOnTickMarks) + { + // Ticked but not constrained to tick marks + // We're using a tick affinity with a latency of AFFINITY pixels + + // Search the nearest tick mark + var tickMarkSegment = [self indexOfTickMarkAtPoint:newPoint], + tickRect = _cachedTickMarksRects[tickMarkSegment]; + + // Does the knob point to it ? + if ((!_isVertical && (newPoint.x === CGRectGetMidX(tickRect))) || + ( _isVertical && (newPoint.y === CGRectGetMidY(tickRect)))) + { + // Start an affinity + [self setObjectValue:_cachedTickMarksValues[tickMarkSegment]]; + + _stickingOnTickMark = YES; + _affinityPoint = _isVertical ? newPoint.y : newPoint.x; + } + + // Are we going too far from the tick mark ? + else if (_stickingOnTickMark && (ABS((_isVertical ? newPoint.y : newPoint.x) - _affinityPoint) > AFFINITY)) + { + // Yes. Stop affinity + + _stickingOnTickMark = NO; + [self setObjectValue:[self _valueAtPoint:newPoint]]; + } + + else if (!_stickingOnTickMark) // Normal situation + [self setObjectValue:[self _valueAtPoint:newPoint]]; + } + + else // Not ticked at all or no possible affinity + [self setObjectValue:[self _valueAtPoint:newPoint]]; return YES; } @@ -391,16 +555,14 @@ CPCircularSlider = 1; - (BOOL)isContinuous { - return (_sendActionOn & CPLeftMouseDraggedMask) !== 0; + return _isContinuous; } -/*! - @ignore - should we have _continuous? -*/ - (void)setContinuous:(BOOL)flag { - if (flag) + _isContinuous = flag; + + if (_isContinuous) _sendActionOn |= CPLeftMouseDraggedMask; else _sendActionOn &= ~CPLeftMouseDraggedMask; @@ -418,11 +580,491 @@ CPCircularSlider = 1; return [self setFloatValue:1.0]; } +#pragma mark - New methods as in High Sierra (10.13) + +/*! + Creates and returns a continuous horizontal slider whose values range from 0.0 to 1.0. + @param aTarget + @param anAction + */ ++ (CPSlider)sliderWithTarget:(id)aTarget action:(SEL)anAction +{ + return [self sliderWithValue:0.0 minValue:0.0 maxValue:1.0 target:aTarget action:anAction]; +} + +// Creates and returns a continuous horizontal slider that represents values over the specified range. ++ (CPSlider)sliderWithValue:(double)value minValue:(double)minValue maxValue:(double)maxValue target:(id)target action:(SEL)action +{ + var slider = [[self alloc] initWithFrame:CGRectMake(0, 0, 104, 19)]; // Size used by Cocoa + + [slider setMinValue:minValue]; + [slider setMaxValue:maxValue]; + [slider setDoubleValue:value]; + [slider setTarget:target]; + [slider setAction:action]; + [slider setContinuous:YES]; + + [slider _refreshCachesAndStates]; + + return slider; +} + +// The knob’s thickness, in pixels. +// The thickness is defined to be the extent of the knob along the long dimension of the bar. +// In a vertical slider, a knob’s thickness is its height; in a horizontal slider, a knob’s thickness is its width. +- (float)knobThickness +{ + var knobSize = [self currentValueForThemeAttribute:@"knob-size"]; + + return _isVertical ? knobSize.height : knobSize.width; +} + +// allowsTickMarkValuesOnly : A Boolean value that indicates whether the receiver fixes +// its values to those values represented by its tick marks. + +// YES if the slider fixes its values to the values represented by its tick marks; otherwise, NO. +// For example, if a slider has a minimum value of 0, a maximum value of 100, and five markers, +// the allowable values are 0, 25, 50, 75, and 100. When users move the slider’s knob, +// it jumps to the tick mark nearest the cursor when the mouse button is released. +// This method has no effect if the slider has no tick marks. + +- (void)setAllowsTickMarkValuesOnly:(BOOL)shouldAllowTickMarkValuesOnly +{ + if (shouldAllowTickMarkValuesOnly === _allowsTickMarkValuesOnly) + return; + + [self willChangeValueForKey:@"allowsTickMarkValuesOnly"]; + _allowsTickMarkValuesOnly = shouldAllowTickMarkValuesOnly; + [self didChangeValueForKey:@"allowsTickMarkValuesOnly"]; + + [self _refreshCachesAndStates]; + [self setNeedsDisplay:YES]; +} + +// Returns the value of the tick mark closest to the specified value. +- (double)closestTickMarkValueToValue:(double)value +{ + if (_numberOfTickMarks === 1) + return _cachedTickMarksValues[0]; + + _closestTickMarkIndex = CPNotFound; + + var foundDelta = 2 * _maxValue, + delta; + + for (var i = 0; i < _numberOfTickMarks; i++) + { + delta = ABS(value - _cachedTickMarksValues[i]); + + if (delta < foundDelta) + { + foundDelta = delta; + _closestTickMarkIndex = i; + } + } + + return _closestTickMarkIndex ? _cachedTickMarksValues[_closestTickMarkIndex] : _minValue; +} + +// Returns the index of the tick mark closest to the location of the receiver represented by the given point. +- (CPInteger)indexOfTickMarkAtPoint:(CGPoint)point +{ + var foundIndex = CPNotFound; + + if (_isCircular) + { + // CPCircularSlider + + var bounds = [self bounds], + dx = point.x - bounds.size.width / 2, + dy = bounds.size.height / 2 - point.y, + angle = 1 + (((-3 * PI_2 - ATAN2(dy, dx)) % PI2) / PI2); + + for (var i = 0; (i < _numberOfTickMarks) && (foundIndex === CPNotFound); i++) + if ((angle < _cachedTickMarksSegments[i]) || ((i === 0) && (angle >= (1 - _cachedTickMarksSegments[i])))) + foundIndex = i; + } + else + { + // CPLinearSlider + + if (_isVertical) + { + for (var i = 0; (i < _numberOfTickMarks) && (foundIndex === CPNotFound); i++) + if (point.y <= _cachedTickMarksSegments[i]) + foundIndex = i; + } + else + { + for (var i = 0; (i < _numberOfTickMarks) && (foundIndex === CPNotFound); i++) + if (point.x <= _cachedTickMarksSegments[i]) + foundIndex = i; + } + } + + return foundIndex; +} + +// The number of the slider's tick marks. The tick marks assigned to the minimum and maximum values are included. +- (void)setNumberOfTickMarks:(CPInteger)aNumber +{ + if (aNumber === _numberOfTickMarks) + return; + + // We try to play nicer than Cocoa when passing from a non-ticked slider to a ticked one (and vice versa) + var tickedChanged = (((_numberOfTickMarks == 0) && (aNumber > 0)) || ((_numberOfTickMarks > 0) && (aNumber == 0))); + + [self willChangeValueForKey:@"numberOfTickMarks"]; + _numberOfTickMarks = aNumber; + [self didChangeValueForKey:@"numberOfTickMarks"]; + + // If tickedChanged, this refresh is necessary to set new states but we'll have to call it again after for correct geometry + [self _refreshCachesAndStates]; + + if (tickedChanged) + { + // First, remove ephemeral subviews as they may change with new state (needed ones will be created by layoutSubviews) + + [self removeEphemeralSubviewNamed:@"track-view"]; + [self removeEphemeralSubviewNamed:@"left-track-view"]; + [self removeEphemeralSubviewNamed:@"right-track-view"]; + [self removeEphemeralSubviewNamed:@"knob-view"]; + + // Now adapt the frame size to match what Xcode IB would have provided + + var currentSize = [self frameSize], + newSize = [self currentValueForThemeAttribute:@"ib-size"]; + + if (_isCircular) + [self setFrameSize:CGSizeMake(newSize, newSize)]; + + else if (_isVertical) + [self setFrameSize:CGSizeMake(newSize, currentSize.height)]; + + else + [self setFrameSize:CGSizeMake(currentSize.width, newSize)]; + + // _refreshCachesAndStates, setNeedsDisplay and setNeedsLayout are called in setFrameSize + } + else + [self setNeedsDisplay:YES]; +} + +// Returns the bounding rectangle of the tick mark at the given index. +- (CGRect)rectOfTickMarkAtIndex:(CPInteger)index +{ + // If no tick mark is associated with index, the method raises NSRangeException + if ((index < 0) || (index >= _numberOfTickMarks)) + [CPException raise:CPRangeException reason:@"rectOfTickMarkAtIndex: index ("+index+") is outside permitted values (0.."+(_numberOfTickMarks-1)+")"]; + + return _cachedTickMarksRects[index]; +} + +// tickMarkPosition : Determines how the receiver’s tick marks are aligned with it. +// Possible values are CPTickMarkBelow, CPTickMarkAbove, CPTickMarkLeft, and CPTickMarkRight +// (the last two are for vertical sliders). The default alignments are CPTickMarkBelow and CPTickMarkLeft. +// This property has no effect if no tick marks have been assigned (that is, numberOfTickMarks returns 0). +- (void)setTickMarkPosition:(CPTickMarkPosition)aTickMarkPosition +{ + if (aTickMarkPosition === _tickMarkPosition) + return; + + [self willChangeValueForKey:@"tickMarkPosition"]; + _tickMarkPosition = aTickMarkPosition; + [self didChangeValueForKey:@"tickMarkPosition"]; + + [self _refreshCachesAndStates]; + [self setNeedsDisplay:YES]; +} + +// Returns the receiver’s value represented by the tick mark at the specified index. +- (double)tickMarkValueAtIndex:(CPInteger)index +{ + // If no tick mark is associated with index, the method raises NSRangeException + if ((index < 0) || (index >= _numberOfTickMarks)) + [CPException raise:CPRangeException reason:@"tickMarkValueAtIndex: index ("+index+") is outside permitted values (0.."+(_numberOfTickMarks-1)+")"]; + + return _cachedTickMarksValues[index]; +} + +// The color of the filled portion of the slider track, in appearances that support it. +- (void)setTrackFillColor:(CPColor)aColor +{ + var normalState = _isVertical ? [CPThemeStateVertical, CPThemeStateKeyWindow] : [CPThemeStateKeyWindow], + leftTrackColor = [self valueForThemeAttribute:@"left-track-color" inStates:normalState]; + + if (leftTrackColor === aColor) + return; + + [self setValue:aColor forThemeAttribute:@"left-track-color" inStates:normalState]; +} + +- (CPColor)trackFillColor +{ + var normalState = _isVertical ? [CPThemeStateVertical, CPThemeStateKeyWindow] : [CPThemeStateKeyWindow]; + + return [self valueForThemeAttribute:@"left-track-color" inStates:normalState]; +} + +#pragma mark - Private methods + +- (void)_refreshCachesAndStates +{ + // Purge caches + _cachedTickMarksRects = @[]; + _cachedTickMarksValues = @[]; + _cachedTickMarksSegments = @[]; + + // Reset affinity + _canStickOnTickMarks = NO; + + // Recalculate _isVertical. + var bounds = [self bounds], + boundsWidth = bounds.size.width, + boundsHeight = bounds.size.height; + + _isVertical = (boundsWidth < boundsHeight) ? 1 : ((boundsWidth > boundsHeight) ? 0 : -1); + + if (_isVertical) + [self setThemeState:CPThemeStateVertical]; + else + [self unsetThemeState:CPThemeStateVertical]; + + // Recalculate _isCircular + _isCircular = (_sliderType === CPCircularSlider); + + if (_isCircular) + [self setThemeState:CPThemeStateCircular]; + else + [self unsetThemeState:CPThemeStateCircular]; + + // Recalculate _isTicked + _isTicked = (_numberOfTickMarks > 0); + + // If this slider has no tick marks, we're done. + if (!_isTicked) + { + [self unsetThemeState:CPThemeStateTickedSlider]; + [self unsetThemeState:CPThemeStateAboveLeftTickedSlider]; + [self unsetThemeState:CPThemeStateBelowRightTickedSlider]; + return; + } + + // Set specific theme states + [self setThemeState:CPThemeStateTickedSlider]; + + if (!_isCircular) + if (_tickMarkPosition === CPTickMarkPositionAbove) + { + [self setThemeState:CPThemeStateAboveLeftTickedSlider]; + [self unsetThemeState:CPThemeStateBelowRightTickedSlider]; + } + else + { + [self unsetThemeState:CPThemeStateAboveLeftTickedSlider]; + [self setThemeState:CPThemeStateBelowRightTickedSlider]; + } + + // Calculate cached values : tick marks rects, values and segments + + var tickSize = [self currentValueForThemeAttribute:@"tick-mark-size"], + tickMarkMargin = [self currentValueForThemeAttribute:@"tick-mark-margin"], + topMargin = [self currentValueForThemeAttribute:@"top-margin"], + bottomMargin = [self currentValueForThemeAttribute:@"bottom-margin"], + knobSize = [self currentValueForThemeAttribute:@"knob-size"], + width = tickSize.width, + height = tickSize.height, + x, + y, + tickRect, + value; + + if (_isCircular) + { + // CPCircularSlider + + // Remark : Cocoa doesn't use tick affinity with circular sliders + + var delta = 1 / _numberOfTickMarks, + dX = width / 2, + dY = height / 2, + cX = boundsWidth / 2, + cY = boundsHeight / 2, + radius = cX - dX, + deltaValue = (_maxValue - _minValue) / _numberOfTickMarks; + + value = _minValue; + + for (var i = 0, angle; i < _numberOfTickMarks; i++, value += deltaValue) + { + angle = PI_2 - PI2 * i * delta; + x = radius * COS(angle) + cX; + y = radius * SIN(-angle) + cY; // Vertical coordinates are reversed in Cappuccino + + tickRect = CGRectMake(ROUND(x - dX), ROUND(y - dY), width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:value]; + [_cachedTickMarksSegments addObject:(i + 0.5) * delta]; + } + } + else + { + // CPLinearSlider + + if (_isVertical) + { + // Vertical slider + + // If there's only one tick mark, it's centered. + // If there's more than one tick mark, there's at least one at the min value and one at the max value + + var usableHeight = boundsHeight - knobSize.height, + dY = (height - 1)/2; + + x = (_tickMarkPosition === CPTickMarkPositionLeading) ? topMargin : (boundsWidth - width - bottomMargin); + + if (_numberOfTickMarks === 1) + { + y = (boundsHeight - height) / 2; + value = (_maxValue - _minValue) / 2 + _minValue; + tickRect = CGRectMake(x, ROUND(y - dY), width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:value]; + [_cachedTickMarksSegments addObject:bounds]; + } + else + { + var delta = usableHeight / (_numberOfTickMarks - 1), + deltaValue = (_maxValue - _minValue) / (_numberOfTickMarks - 1); + + y = (knobSize.height - 1) / 2; + value = _maxValue; + _canStickOnTickMarks = !_allowsTickMarkValuesOnly && (delta > AFFINITY+3); + + for (var i = 0; i < _numberOfTickMarks; i++, y += delta, value -= deltaValue) + { + tickRect = CGRectMake(x, ROUND(y - dY), width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:(i < _numberOfTickMarks - 1) ? value : _minValue]; // Avoid rounding problems on last tick mark + [_cachedTickMarksSegments addObject:(i < _numberOfTickMarks - 1) ? ROUND(y + delta/2) : boundsHeight]; + } + } + } + else + { + // Horizontal slider + + // If there's only one tick mark, it's centered. + // If there's more than one tick mark, there's at least one at the min value and one at the max value + + var usableWidth = boundsWidth - knobSize.width, + dX = (width - 1)/2; + + y = (_tickMarkPosition === CPTickMarkPositionAbove) ? topMargin : (boundsHeight - height - bottomMargin); + + if (_numberOfTickMarks === 1) + { + x = (boundsWidth - width) / 2; + value = (_maxValue - _minValue) / 2 + _minValue; + tickRect = CGRectMake(ROUND(x - dX), y, width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:value]; + [_cachedTickMarksSegments addObject:boundsWidth]; + } + else + { + var delta = usableWidth / (_numberOfTickMarks - 1), + deltaValue = (_maxValue - _minValue) / (_numberOfTickMarks - 1); + + x = (knobSize.width - 1) / 2; + value = _minValue; + _canStickOnTickMarks = !_allowsTickMarkValuesOnly && (delta > AFFINITY+3); + + for (var i = 0; i < _numberOfTickMarks; i++, x += delta, value += deltaValue) + { + tickRect = CGRectMake(ROUND(x - dX), y, width, height); + + [_cachedTickMarksRects addObject:tickRect]; + [_cachedTickMarksValues addObject:(i < _numberOfTickMarks - 1) ? value : _maxValue]; // Avoid rounding problems on last tick mark + [_cachedTickMarksSegments addObject:(i < _numberOfTickMarks - 1) ? ROUND(x + delta/2) : boundsWidth]; + } + } + } + } + +#if PLATFORM(DOM) + // Don't do this in nib2cib !.. + if (_allowsTickMarkValuesOnly) + { + [self setObjectValue:[self closestTickMarkValueToValue:[self doubleValue]]]; + _currentTickMarkSegment = _closestTickMarkIndex; + [self sendAction:[self action] to:[self target]]; + } +#endif +} + +/*! @ignore */ +- (float)_valueAtPoint:(CGPoint)aPoint +{ + var bounds = [self bounds], + knobSize = [self currentValueForThemeAttribute:@"knob-size"], + trackRect = [self trackRectForBounds:bounds], + value; + + if (_isCircular) + { + var dx = aPoint.x - CGRectGetMidX(trackRect), + dy = CGRectGetMidY(trackRect) - aPoint.y; + + value = ((1 + (((-3 * PI_2 - ATAN2(dy, dx)) % PI2) / PI2)) * (_maxValue - _minValue) + _minValue) % _maxValue; + } + else if (_isVertical) + { + var knobHeight = knobSize.height; + + trackRect.origin.y += knobHeight / 2; + trackRect.size.height -= knobHeight; + + value = MAX(0.0, MIN(1.0, (trackRect.origin.y + trackRect.size.height - aPoint.y) / trackRect.size.height)) * (_maxValue - _minValue) + _minValue; + } + else + { + var knobWidth = knobSize.width; + + trackRect.origin.x += knobWidth / 2; + trackRect.size.width -= knobWidth; + + value = MAX(0.0, MIN(1.0, (aPoint.x - trackRect.origin.x) / trackRect.size.width)) * (_maxValue - _minValue) + _minValue; + } + + return value; +} + +#pragma mark - Overrides + +- (void)setFrameSize:(CGSize)aSize +{ + [super setFrameSize:aSize]; + [self _refreshCachesAndStates]; + [self setNeedsLayout]; + [self setNeedsDisplay:YES]; +} + +#pragma mark - + @end -var CPSliderMinValueKey = "CPSliderMinValueKey", - CPSliderMaxValueKey = "CPSliderMaxValueKey", - CPSliderAltIncrValueKey = "CPSliderAltIncrValueKey"; +var CPSliderMinValueKey = "CPSliderMinValueKey", + CPSliderMaxValueKey = "CPSliderMaxValueKey", + CPSliderAltIncrValueKey = "CPSliderAltIncrValueKey", + CPSliderTypeKey = "CPSliderTypeKey", + CPSliderAllowsTickMarkValuesOnlyKey = "CPSliderAllowsTickMarkValuesOnlyKey", + CPSliderTickMarkPositionKey = "CPSliderTickMarkPositionKey", + CPSliderNumberOfTickMarksKey = "CPSliderNumberOfTickMarksKey"; @implementation CPSlider (CPCoding) @@ -435,9 +1077,15 @@ var CPSliderMinValueKey = "CPSliderMinValueKey", if (self) { - _altIncrementValue = [aCoder decodeDoubleForKey:CPSliderAltIncrValueKey]; + _altIncrementValue = [aCoder decodeDoubleForKey:CPSliderAltIncrValueKey]; + _sliderType = [aCoder decodeIntForKey: CPSliderTypeKey]; + _allowsTickMarkValuesOnly = [aCoder decodeBoolForKey: CPSliderAllowsTickMarkValuesOnlyKey]; + _tickMarkPosition = [aCoder decodeIntForKey: CPSliderTickMarkPositionKey]; + _numberOfTickMarks = [aCoder decodeIntForKey: CPSliderNumberOfTickMarksKey]; - [self _recalculateIsVertical]; + _isContinuous = (_sendActionOn & CPLeftMouseDraggedMask) !== 0; + + [self _refreshCachesAndStates]; [self setNeedsLayout]; [self setNeedsDisplay:YES]; @@ -450,9 +1098,13 @@ var CPSliderMinValueKey = "CPSliderMinValueKey", { [super encodeWithCoder:aCoder]; - [aCoder encodeDouble:_minValue forKey:CPSliderMinValueKey]; - [aCoder encodeDouble:_maxValue forKey:CPSliderMaxValueKey]; - [aCoder encodeDouble:_altIncrementValue forKey:CPSliderAltIncrValueKey]; + [aCoder encodeDouble:_minValue forKey:CPSliderMinValueKey]; + [aCoder encodeDouble:_maxValue forKey:CPSliderMaxValueKey]; + [aCoder encodeDouble:_altIncrementValue forKey:CPSliderAltIncrValueKey]; + [aCoder encodeInt: _sliderType forKey:CPSliderTypeKey]; + [aCoder encodeBool: _allowsTickMarkValuesOnly forKey:CPSliderAllowsTickMarkValuesOnlyKey]; + [aCoder encodeInt: _tickMarkPosition forKey:CPSliderTickMarkPositionKey]; + [aCoder encodeInt: _numberOfTickMarks forKey:CPSliderNumberOfTickMarksKey]; } @end diff --git a/Tools/nib2cib/NSSlider.j b/Tools/nib2cib/NSSlider.j index bfbc53ee3..a614af099 100644 --- a/Tools/nib2cib/NSSlider.j +++ b/Tools/nib2cib/NSSlider.j @@ -24,6 +24,7 @@ @import "NSCell.j" +@class Nib2Cib @implementation CPSlider (CPCoding) @@ -44,6 +45,9 @@ _altIncrementValue = [cell altIncrementValue]; [self setSliderType:[cell sliderType]]; + [self setAllowsTickMarkValuesOnly:[cell allowsTickMarkValuesOnly]]; + [self setTickMarkPosition:[cell tickMarkPosition]]; + [self setNumberOfTickMarks:[cell numberOfTickMarks]]; [self setEnabled:[cell isEnabled]]; } @@ -63,12 +67,17 @@ [self NS_initWithCell:cell]; [self _adjustNib2CibSize]; - var frame = [self frame]; + var directAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"direct-nib2cib-adjustment" forClass:[self class]]; - if ([self sliderType] === CPCircularSlider) - [self setFrameSize:CGSizeMake(frame.size.width + 2.0, frame.size.height + 2.0)]; - else - [self setFrame:CGRectMake(frame.origin.x + 2, frame.origin.y, frame.size.width - 4, frame.size.height)]; + if (!directAdjustment) + { + var frame = [self frame]; + + if ([self sliderType] === CPCircularSlider) + [self setFrameSize:CGSizeMake(frame.size.width + 2.0, frame.size.height + 2.0)]; + else + [self setFrame:CGRectMake(frame.origin.x + 2, frame.origin.y, frame.size.width - 4, frame.size.height)]; + } } return self; @@ -79,15 +88,62 @@ return [CPSlider class]; } +- (CGRect)_nib2CibAdjustment +{ + var directAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"direct-nib2cib-adjustment" forClass:[self class]]; + + if (!directAdjustment) + return [super _nib2CibAdjustment]; + + var size = [self frameSize], + state; + + if ([self sliderType] === CPCircularSlider) + state = CPThemeStateCircular; + else if (size.height > size.width) + { + state = CPThemeStateVertical; + state = state.and(([self tickMarkPosition] === CPTickMarkPositionTrailing) ? CPThemeStateBelowRightTickedSlider : CPThemeStateAboveLeftTickedSlider); + } + else + { + state = CPThemeStateNormal; + state = state.and(([self tickMarkPosition] === CPTickMarkPositionBelow) ? CPThemeStateBelowRightTickedSlider : CPThemeStateAboveLeftTickedSlider); + } + + if ([self numberOfTickMarks] > 0) + state = state.and(CPThemeStateTickedSlider); + + // Theme has not been loaded yet. + // Get attribute value directly from the theme or from the default value of the object otherwise. + var frameAdjustment = [[Nib2Cib defaultTheme] valueForAttributeWithName:@"nib2cib-adjustment-frame" inState:state forClass:[self class]]; + + if (frameAdjustment) + return frameAdjustment; + + if ([self hasThemeAttribute:@"nib2cib-adjustment-frame"]) + { + frameAdjustment = [self valueForThemeAttribute:@"nib2cib-adjustment-frame" inState:state]; + + if (frameAdjustment) + return frameAdjustment; + } + + return nil; +} + @end @implementation NSSliderCell : NSCell { - double _minValue @accessors(readonly, getter=minValue); - double _maxValue @accessors(readonly, getter=maxValue); - double _altIncrementValue @accessors(readonly, getter=altIncrementValue); - BOOL _vertical @accessors(readonly, getter=isVertical); - int _sliderType @accessors(readonly, getter=sliderType); + double _minValue @accessors(readonly, getter=minValue); + double _maxValue @accessors(readonly, getter=maxValue); + double _altIncrementValue @accessors(readonly, getter=altIncrementValue); + BOOL _vertical @accessors(readonly, getter=isVertical); + int _sliderType @accessors(readonly, getter=sliderType); + BOOL _allowsTickMarkValuesOnly @accessors(readonly, getter=allowsTickMarkValuesOnly); + int _tickMarkPosition @accessors(readonly, getter=tickMarkPosition); + int _numberOfTickMarks @accessors(readonly, getter=numberOfTickMarks); } - (id)initWithCoder:(CPCoder)aCoder @@ -103,7 +159,10 @@ self._altIncrementValue = [aCoder decodeDoubleForKey:@"NSAltIncValue"]; self._isVertical = [aCoder decodeBoolForKey:@"NSVertical"]; - self._sliderType = [aCoder decodeIntForKey:@"NSSliderType"]; + self._sliderType = [aCoder decodeIntForKey:@"NSSliderType"]; + self._allowsTickMarkValuesOnly = [aCoder decodeIntForKey:@"NSAllowsTickMarkValuesOnly"]; + self._tickMarkPosition = [aCoder decodeIntForKey:@"NSTickMarkPosition"]; + self._numberOfTickMarks = [aCoder decodeIntForKey:@"NSNumberOfTickMarks"]; } return self; From d9e8321d9e620113a48cf0ea3f36d16a2ce17bb4 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 9 Oct 2020 13:05:51 +0200 Subject: [PATCH 26/30] Fixed: CPButton's now set their font using [self font] (#2943) The corresponding adaptation in CPControl was missing in the previous PR --- AppKit/CPControl.j | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 20ccd2f83..623e6003e 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -917,7 +917,7 @@ var CPControlBlackColor = [CPColor blackColor]; */ - (CPFont)font { - return [self valueForThemeAttribute:@"font"]; + return [self currentValueForThemeAttribute:@"font"] || [CPFont systemFontForControlSize:_controlSize]; } /*! @@ -1127,6 +1127,7 @@ var CPControlActionKey = @"CPControlActionKey", [self setControlSize:[aCoder decodeIntForKey:CPControlControlSizeKey]]; [self setBaseWritingDirection:[aCoder decodeIntForKey:CPControlBaseWrittingDirectionKey]]; + [self updateTrackingAreas]; } return self; From bb064aacd5f1700b79d0f107586b20cb97746ad0 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 9 Oct 2020 13:37:47 +0200 Subject: [PATCH 27/30] New: The ability to control CPPopoverWindow background color (#2928) This introduces a Cappuccino specific behavior that permits to control the background color of the popover by setting a background color on the content view. --- AppKit/CPWindow/_CPPopoverWindowView.j | 43 +++++++++++++++++++++++++- AppKit/_CPPopoverWindow.j | 7 ++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/AppKit/CPWindow/_CPPopoverWindowView.j b/AppKit/CPWindow/_CPPopoverWindowView.j index aeba11f8a..cd4fbc54c 100644 --- a/AppKit/CPWindow/_CPPopoverWindowView.j +++ b/AppKit/CPWindow/_CPPopoverWindowView.j @@ -41,6 +41,7 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); unsigned _preferredEdge @accessors(property=preferredEdge); CGSize _cursorSize; + CPColor _contentViewSavedBackgroundColor; } + (CPString)defaultThemeClass @@ -123,6 +124,7 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); _arrowOffsetY = 0.0; _appearance = [CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]; _cursorSize = CGSizeMakeCopy(_CPPopoverWindowViewDefaultCursorSize); + _contentViewSavedBackgroundColor = nil; } return self; @@ -177,6 +179,24 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); strokeColor = [self valueForThemeAttribute:@"stroke-color-hud"]; } + // Cappuccino special behavior : + // If the content view has a background color, we use it as gradient color + var subviews = [self subviews], + contentView = [subviews count] > 0 ? subviews[0] : nil, + contentViewBackgroundColor = [contentView backgroundColor]; + + if (_contentViewSavedBackgroundColor) + { + gradient = _contentViewSavedBackgroundColor; + } + else if (contentViewBackgroundColor) + { + gradient = _contentViewSavedBackgroundColor = contentViewBackgroundColor; + + // We remove the content view background color (it will be restored when the popover closes) + [contentView setBackgroundColor:nil]; + } + // fix rect to take care of stroke and shadow frame.origin.x += halfStrokeWidth + shadowBlur; frame.origin.y += halfStrokeWidth + (shadowBlur + shadowSize.height / 2); @@ -188,7 +208,14 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); CGContextBeginPath(context); CGContextSetShadowWithColor(context, shadowSize, shadowBlur, shadowColor); - CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), 0.0), CGPointMake(CGRectGetMidX(frame), frame.size.height), 0); + + // Is gradient a CGGradient or a CPColor ? + if ('locations' in gradient) + // CGGradient + CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), 0.0), CGPointMake(CGRectGetMidX(frame), frame.size.height), 0); + else + // CPColor or CGColor + CGContextSetFillColor(context, gradient); var xMin = CGRectGetMinX(frame), xMax = CGRectGetMaxX(frame), @@ -401,4 +428,18 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); CGContextFillPath(context); } +- (void)_restoreViewBackgroundColor +{ + if (_contentViewSavedBackgroundColor) + { + // We restore the saved background color in the content view + var subviews = [self subviews], + contentView = [subviews count] > 0 ? subviews[0] : nil; + + [contentView setBackgroundColor:_contentViewSavedBackgroundColor]; + + _contentViewSavedBackgroundColor = nil; + } +} + @end diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index 88c69bb34..9d623b4f8 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -25,6 +25,7 @@ @import "CPButton.j" @import "CPMenu.j" @import "CPPanel.j" +@import "CPAnimationContext.j" // Use forward declaration because this file is imported by CPPopover @class CPPopover @@ -117,7 +118,11 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, _isClosing = NO; _browserAnimates = [self browserSupportsAnimation]; _shouldPerformAnimation = YES; - _orderOutTransitionFunction = function() { [self _orderOutRecursively:YES]; }; + _orderOutTransitionFunction = function() + { + [self _orderOutRecursively:YES]; + [_windowView _restoreViewBackgroundColor]; + }; _isOpening = YES; [self setStyleMask:aStyleMask]; From 78b3887e4a47e93399ddd0a8b26b248f0e19d5dc Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 9 Oct 2020 14:29:10 +0200 Subject: [PATCH 28/30] New: CSS shadow, new theme parameters and Aristo3 CSS theme ready for CPWindow (#2927) --- AppKit/CPWindow/CPWindow.j | 88 ++++++++++++++++++++++++++------- AppKit/CPWindow/_CPWindowView.j | 53 ++++++++++++++++++-- 2 files changed, 118 insertions(+), 23 deletions(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 3f1c742d6..0a59d1538 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -193,7 +193,7 @@ var CPWindowActionMessageKeys = [ BOOL _isDocumentEdited; BOOL _isDocumentSaving; - CPImageView _shadowView; + _CPShadowWindowView _shadowView; CPView _windowView; CPView _contentView; @@ -369,6 +369,23 @@ CPTexturedBackgroundWindowMask [_windowView _setWindow:self]; [_windowView setNextResponder:self]; + // CSS Styling +#if PLATFORM(DOM) + var radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-top-left-radius"]) + _windowView._DOMElement.style.borderTopLeftRadius = radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-top-right-radius"]) + _windowView._DOMElement.style.borderTopRightRadius = radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-bottom-left-radius"]) + _windowView._DOMElement.style.borderBottomLeftRadius = radius; + + if (radius = [_windowView actualValueForThemeAttribute:@"border-bottom-right-radius"]) + _windowView._DOMElement.style.borderBottomRightRadius = radius; +#endif + // Size calculation needs _windowView _minSize = [self _calculateMinSizeForProposedSize:CGSizeMake(0.0, 0.0)]; _maxSize = CGSizeMake(1000000.0, 1000000.0); @@ -1410,25 +1427,51 @@ CPTexturedBackgroundWindowMask return; } - - if (_hasShadow && !_shadowView) + + if ([[self actualTheme] isCSSBased]) { - _shadowView = [[_CPShadowWindowView alloc] initWithFrame:CGRectMakeZero()]; - - [_shadowView setWindowView:_windowView]; - [_shadowView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; - [_shadowView setNeedsLayout]; - + // When using CSS theming, we get rid of _shadowView and add CSS shadowing directly + // on the _windowView + #if PLATFORM(DOM) - CPDOMDisplayServerInsertBefore(_DOMElement, _shadowView._DOMElement, _windowView._DOMElement); + // We must check that _windowView exists as _updateShadow can be called by + // _setSharesChromeWithPlatformWindow whereas _windowView is not yet created + if (_windowView && _windowView._DOMElement) + { + var currentBoxShadow = _windowView._DOMElement.style.boxShadow; + + if (_hasShadow && (currentBoxShadow.length == 0)) + { + _windowView._DOMElement.style.boxShadow = [_windowView actualValueForThemeAttribute:@"window-shadow-color"]; + } + else if (!_hasShadow && (currentBoxShadow.length > 0)) + { + _windowView._DOMElement.style.boxShadow = ""; + } + } #endif } - else if (!_hasShadow && _shadowView) + else { + if (_hasShadow && !_shadowView) + { + _shadowView = [[_CPShadowWindowView alloc] initWithFrame:CGRectMakeZero()]; + + [_shadowView setWindowView:_windowView]; + [_shadowView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [_shadowView setNeedsLayout]; + #if PLATFORM(DOM) - CPDOMDisplayServerRemoveChild(_DOMElement, _shadowView._DOMElement); + CPDOMDisplayServerInsertBefore(_DOMElement, _shadowView._DOMElement, _windowView._DOMElement); #endif - _shadowView = nil; + } + else if (!_hasShadow && _shadowView) + { +#if PLATFORM(DOM) + CPDOMDisplayServerRemoveChild(_DOMElement, _shadowView._DOMElement); +#endif + _shadowView = nil; + } } } @@ -2810,7 +2853,7 @@ CPTexturedBackgroundWindowMask contentRect = [_contentView frame], sheetFrame = CGRectMakeCopy([attachedSheet frame]); - sheetFrame.origin.y = CGRectGetMinY(_frame) + CGRectGetMinY(contentRect); + sheetFrame.origin.y = [[attachedSheet _windowView] _sheetVerticalOffset]+ CGRectGetMinY(_frame) + CGRectGetMinY(contentRect); sheetFrame.origin.x = CGRectGetMinX(_frame) + FLOOR((CGRectGetWidth(_frame) - CGRectGetWidth(sheetFrame)) / 2.0); [attachedSheet setFrame:sheetFrame display:YES animate:NO]; @@ -3009,13 +3052,12 @@ CPTexturedBackgroundWindowMask } // The sheet starts hidden just above the top of a clip rect - // TODO : Make properly for the -1 in endY var sheetFrame = [sheet frame], - sheetShadowFrame = sheet._hasShadow ? [sheet._shadowView frame] : sheetFrame, + sheetShadowFrame = [sheet _shadowFrame], frame = [self frame], originX = frame.origin.x + FLOOR((frame.size.width - sheetFrame.size.width) / 2), startFrame = CGRectMake(originX, -sheetShadowFrame.size.height, sheetFrame.size.width, sheetFrame.size.height), - endY = -1 + [_windowView bodyOffset] - [[self contentView] frame].origin.y, + endY = [[sheet _windowView] _sheetVerticalOffset] + [_windowView bodyOffset] - [[self contentView] frame].origin.y, endFrame = CGRectMake(originX, endY, sheetFrame.size.width, sheetFrame.size.height); if (_toolbar && [_windowView showsToolbar] && [self isFullPlatformWindow]) @@ -3054,7 +3096,7 @@ CPTexturedBackgroundWindowMask { var sheet = _sheetContext["sheet"], sheetFrame = [sheet frame], - fullHeight = sheet._hasShadow ? [sheet._shadowView frame].size.height : sheetFrame.size.height, + fullHeight = [sheet _shadowFrame].size.height, endFrame = CGRectMakeCopy(sheetFrame), contentOrigin = [self convertBaseToGlobal:[[self contentView] frame].origin]; @@ -3086,7 +3128,7 @@ CPTexturedBackgroundWindowMask sheetOrigin = CGPointMakeCopy(sheetFrame.origin); [self _removeClipForSheet:sheet]; - [sheet setFrameOrigin:CGPointMake(sheetOrigin.x, [sheet frame].origin.y + sheetOrigin.y)]; + [self _setAttachedSheetFrameOrigin]; // we wanted to close the sheet while it animated in, do that now if (_sheetContext["shouldClose"] === YES) @@ -3133,6 +3175,14 @@ CPTexturedBackgroundWindowMask return _isSheet; } +- (CGRect)_shadowFrame +{ + if (_hasShadow) + return _shadowView ? [_shadowView frame] : [self frame]; + + return [self frame]; +} + // /* Used privately. diff --git a/AppKit/CPWindow/_CPWindowView.j b/AppKit/CPWindow/_CPWindowView.j index 812b09c7e..d3abb5ee5 100644 --- a/AppKit/CPWindow/_CPWindowView.j +++ b/AppKit/CPWindow/_CPWindowView.j @@ -70,12 +70,40 @@ _CPWindowViewResizeSlop = 3; + (CGRect)contentRectForFrameRect:(CGRect)aFrameRect { - return CGRectMakeCopy(aFrameRect); + // First, we have to check if we are compiling a theme or running an application because if working on a theme, + // we can't use theme attributes to determine the inset ! This would be a kind of circular reference... + + var compilingATheme = [[[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPApplicationDelegateClass"] isEqualToString:@"BKShowcaseController"], + frameOutset = compilingATheme ? CGInsetMakeZero() : [[CPTheme defaultTheme] valueForAttributeWithName:@"frame-outset" forClass:_CPWindowView]; + + if (!frameOutset) + // No value found in theme. Get default value. + frameOutset = [[self themeAttributes] objectForKey:@"frame-outset"]; + + if (!frameOutset) + // No value found in defaults. Get default value for _CPWindowView (we know here that the window class is not _CPWindowView) + frameOutset = [[_CPWindowView themeAttributes] objectForKey:@"frame-outset"]; + + return CGRectMake(aFrameRect.origin.x - frameOutset.left, aFrameRect.origin.y - frameOutset.top, aFrameRect.size.width + frameOutset.left + frameOutset.right, aFrameRect.size.height + frameOutset.top + frameOutset.bottom); } + (CGRect)frameRectForContentRect:(CGRect)aContentRect { - return CGRectMakeCopy(aContentRect); + // First, we have to check if we are compiling a theme or running an application because if working on a theme, + // we can't use theme attributes to determine the inset ! This would be a kind of circular reference... + + var compilingATheme = [[[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPApplicationDelegateClass"] isEqualToString:@"BKShowcaseController"], + frameOutset = compilingATheme ? CGInsetMakeZero() : [[CPTheme defaultTheme] valueForAttributeWithName:@"frame-outset" forClass:[self class]]; // _CPWindowView - [self class] + + if (!frameOutset) + // No value found in theme. Get default value. + frameOutset = [[self themeAttributes] objectForKey:@"frame-outset"]; + + if (!frameOutset) + // No value found in theme. Get default value for _CPWindowView + frameOutset = [[_CPWindowView themeAttributes] objectForKey:@"frame-outset"]; + + return CGRectMake(aContentRect.origin.x - frameOutset.left, aContentRect.origin.y - frameOutset.top, aContentRect.size.width + frameOutset.left + frameOutset.right, aContentRect.size.height + frameOutset.top + frameOutset.bottom); } + (CPString)defaultThemeClass @@ -94,6 +122,7 @@ _CPWindowViewResizeSlop = 3; @"resize-indicator": [CPNull null], @"attached-sheet-shadow-color": [CPColor blackColor], @"shadow-height": 8, + @"shadown-horizontal-offset": 0, @"close-image-origin": [CPNull null], @"close-image-size": [CPNull null], @"close-image": [CPNull null], @@ -106,6 +135,17 @@ _CPWindowViewResizeSlop = 3; @"title-alignment": CPCenterTextAlignment, @"title-line-break-mode": CPLineBreakByTruncatingTail, @"title-vertical-alignment": CPTopVerticalTextAlignment, + @"title-margin": 20, + @"border-top-left-radius": @"0px", + @"border-top-right-radius": @"0px", + @"border-bottom-left-radius": @"0px", + @"border-bottom-right-radius": @"0px", + @"minimize-image-origin": [CPNull null], + @"minimize-image-size": [CPNull null], + @"zoom-image-origin": [CPNull null], + @"zoom-image-size": [CPNull null], + @"frame-outset": CGInsetMakeZero(), + @"sheet-vertical-offset": -1 }; } @@ -932,9 +972,14 @@ _CPWindowViewResizeSlop = 3; [self setNeedsLayout]; } -- (CGRect)_shadowViewWidthForParentWindow:(CPWindow)parentWindow +- (int)_sheetVerticalOffset { - var myWidth = [self bounds].size.width, + return [self currentValueForThemeAttribute:@"sheet-vertical-offset"]; +} + +- (int)_shadowViewWidthForParentWindow:(CPWindow)parentWindow +{ + var myWidth = [self bounds].size.width - [self currentValueForThemeAttribute:@"shadown-horizontal-offset"], parentWidth = [[parentWindow contentView] bounds].size.width; return MIN(myWidth, parentWidth); From 1caf4f99cf031fc2cee6bde5e5a20febd5000656 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 9 Oct 2020 14:39:38 +0200 Subject: [PATCH 29/30] Fixed: Correct / complete theme states for themed values on CPStepper (#2930) --- AppKit/CPStepper.j | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/AppKit/CPStepper.j b/AppKit/CPStepper.j index 2374f3af3..5fb2aeab0 100644 --- a/AppKit/CPStepper.j +++ b/AppKit/CPStepper.j @@ -188,12 +188,12 @@ [_buttonUp setFrame:upFrame]; [_buttonDown setFrame:downFrame]; - [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered]; - [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled]]; - [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted]]; - [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered]; - [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled]]; - [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted]]; + [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPButtonStateBezelStyleRounded]]; + [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled, CPButtonStateBezelStyleRounded]]; + [_buttonUp setValue:[self valueForThemeAttribute:@"bezel-color-up-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted, CPButtonStateBezelStyleRounded]]; + [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPButtonStateBezelStyleRounded]]; + [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateDisabled]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateDisabled, CPButtonStateBezelStyleRounded]]; + [_buttonDown setValue:[self valueForThemeAttribute:@"bezel-color-down-button" inStates:[controlSizeThemeState, CPThemeStateBordered, CPThemeStateHighlighted]] forThemeAttribute:@"bezel-color" inStates:[CPThemeStateBordered, CPThemeStateHighlighted, CPButtonStateBezelStyleRounded]]; } - (void)_sizeToFit From 99d7c8d824b13487974565a791adb2e6005282b2 Mon Sep 17 00:00:00 2001 From: Didier Korthoudt Date: Fri, 9 Oct 2020 15:52:54 +0200 Subject: [PATCH 30/30] New: Modern Cocoa behavior for Menus (#2929) More theme parameters Modern Cocoa behavior First menubar item can be displayed specifically All 3 control sizes are now managed --- AppKit/CPMenu/CPMenu.j | 31 +++++++ AppKit/CPMenu/_CPMenuBarWindow.j | 17 +++- AppKit/CPMenu/_CPMenuManager.j | 61 ++++++++----- AppKit/CPMenu/_CPMenuWindow.j | 4 + AppKit/CPMenuItem/_CPMenuItemSeparatorView.j | 23 ++++- AppKit/CPMenuItem/_CPMenuItemStandardView.j | 96 +++++++++++++++----- 6 files changed, 181 insertions(+), 51 deletions(-) diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j index 655022c97..e96fd03c6 100644 --- a/AppKit/CPMenu/CPMenu.j +++ b/AppKit/CPMenu/CPMenu.j @@ -1293,6 +1293,37 @@ var CPMenuTitleKey = @"CPMenuTitleKey", @end +#pragma mark - + +@implementation CPMenu (CSSTheming) + ++ (void)setNamedValue:(CPString)aName forKey:(CPString)aKey inAttributes:(CPDictionary)aDictionary forTheme:(CPTheme)aTheme +{ + var value = [aTheme valueForAttributeWithName:aName forClass:_CPMenuView]; + + if (value) + [aDictionary setObject:value forKey:aKey]; + else + [aDictionary removeObjectForKey:aKey]; +} + ++ (void)updateMenuBarAttributesWithTheme:(CPTheme)aTheme +{ + var newAttributes = @{}; + + [CPMenu setNamedValue:@"menu-bar-text-color" forKey:@"CPMenuBarTextColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-title-color" forKey:@"CPMenuBarTitleColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-text-shadow-color" forKey:@"CPMenuBarTextShadowColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-title-shadow-color" forKey:@"CPMenuBarTitleShadowColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-highlight-color" forKey:@"CPMenuBarHighlightColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-highlight-text-color" forKey:@"CPMenuBarHighlightTextColor" inAttributes:newAttributes forTheme:aTheme]; + [CPMenu setNamedValue:@"menu-bar-highlight-text-shadow-color" forKey:@"CPMenuBarHighlightTextShadowColor" inAttributes:newAttributes forTheme:aTheme]; + + [CPMenu setMenuBarAttributes:newAttributes]; +} + +@end + @import "_CPMenuBarWindow.j" @import "_CPMenuWindow.j" diff --git a/AppKit/CPMenu/_CPMenuBarWindow.j b/AppKit/CPMenu/_CPMenuBarWindow.j index 876aae593..25975a70f 100644 --- a/AppKit/CPMenu/_CPMenuBarWindow.j +++ b/AppKit/CPMenu/_CPMenuBarWindow.j @@ -25,6 +25,7 @@ @class _CPMenuView @class CPMenu +@class CPMenuItem @global CPMenuDidAddItemNotification @global CPMenuDidChangeItemNotification @@ -129,10 +130,12 @@ - (void)setColor:(CPColor)aColor { + var targetView = [[CPTheme defaultTheme] valueForAttributeWithName:@"css-based" forClass:CPView] ? [[self contentView] superview] : [self contentView]; + if (!aColor) - [[self contentView] setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-background-color" forClass:_CPMenuView]]; + [targetView setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-background-color" forClass:_CPMenuView]]; else - [[self contentView] setBackgroundColor:aColor]; + [targetView setBackgroundColor:aColor]; } - (void)setTextColor:(CPColor)aColor @@ -277,6 +280,16 @@ [menuItemView setTextColor:_textColor]; [menuItemView setHidden:[item isHidden]]; + // If first menu item has tag -1 and if there is a special theme value menu-bar-window-first-item-font, + // set the corresponding font. This is used to set bold on the first item of the menubar (à la Cocoa) + if ((index == 0) && ([item tag] == -1)) + { + var firstItemFont = [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-bar-window-first-item-font" forClass:_CPMenuView]; + + if (firstItemFont) + [item setFont:firstItemFont]; + } + [menuItemView synchronizeWithMenuItem]; [contentView addSubview:menuItemView]; diff --git a/AppKit/CPMenu/_CPMenuManager.j b/AppKit/CPMenu/_CPMenuManager.j index 8ad054f34..187b669db 100644 --- a/AppKit/CPMenu/_CPMenuManager.j +++ b/AppKit/CPMenu/_CPMenuManager.j @@ -28,6 +28,8 @@ @class CPWindow @class _CPMenuWindow +@class _CPMenuView +@class CPMenuItem @global CPApp @@ -223,7 +225,7 @@ var STICKY_TIME_INTERVAL = 0.4, _lastGlobalLocation = globalLocation; // If the item isn't enabled its as if we clicked on nothing. - if (![activeItem isEnabled] || [activeItem _isMenuBarButton]) + if ([activeItem _isMenuBarButton]) { activeItemIndex = CPNotFound; activeItem = nil; @@ -352,7 +354,23 @@ var STICKY_TIME_INTERVAL = 0.4, if ([activeMenuContainer isMenuBar]) newMenuOrigin = CGPointMake(CGRectGetMinX(activeItemRect), CGRectGetMaxY(activeItemRect)); else - newMenuOrigin = CGPointMake(CGRectGetMaxX(activeItemRect), CGRectGetMinY(activeItemRect)); + { + // New theme attributes to have more precise submenus positioning + + var defaultTheme = [CPTheme defaultTheme], + themeDeltaX = [defaultTheme valueForAttributeWithName:@"menu-window-submenu-delta-x" forClass:_CPMenuView], + themeDeltaY = [defaultTheme valueForAttributeWithName:@"menu-window-submenu-delta-y" forClass:_CPMenuView], + themeFirstDeltaY = [defaultTheme valueForAttributeWithName:@"menu-window-submenu-first-level-delta-y" forClass:_CPMenuView], + activeMenuIndex = [_menuContainerStack indexOfObject:activeMenuContainer], + + deltaX = themeDeltaX ? themeDeltaX : 0, + deltaY = themeDeltaY ? themeDeltaY : 0; + + if (themeFirstDeltaY && (activeMenuIndex == 1) && [_menuContainerStack[0] isMenuBar]) + deltaY += themeFirstDeltaY; + + newMenuOrigin = CGPointMake(CGRectGetMaxX(activeItemRect)+deltaX, CGRectGetMinY(activeItemRect)+deltaY); + } newMenuOrigin = [activeMenuContainer convertBaseToGlobal:newMenuOrigin]; @@ -580,6 +598,8 @@ var STICKY_TIME_INTERVAL = 0.4, [self selectNextItemBeginningWith:_keyBuffer inMenu:menu]; _lastGlobalLocation = nil; } + + [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:NO]; } - (void)selectNextItemBeginningWith:(CPString)characters inMenu:(CPMenu)menu @@ -725,39 +745,32 @@ var STICKY_TIME_INTERVAL = 0.4, - (void)moveDown:(CPMenu)menu { - var index = menu._highlightedIndex + 1; + var index = menu._highlightedIndex + 1, + item; + + // Search for the next enabled item + while ((index < [menu numberOfItems]) && (item = [menu itemAtIndex:index]) && ([item isSeparatorItem] || [item isHidden] || ![item isEnabled])) + index++; if (index < [menu numberOfItems]) - { [menu _highlightItemAtIndex:index]; - - var item = [menu highlightedItem]; - - if ([item isSeparatorItem] || [item isHidden] || ![item isEnabled]) - [self moveDown:menu]; - } else if (menu == [CPApp mainMenu]) [menu _highlightItemAtIndex:0]; } - (void)moveUp:(CPMenu)menu { - var index = menu._highlightedIndex - 1; + var index = menu._highlightedIndex - 1, + item; - if (index < 0) - { - if (index != CPNotFound || menu == [CPApp mainMenu]) - [menu _highlightItemAtIndex:[menu numberOfItems] - 1]; + // Search for the previous enabled item + while ((index >= 0) && (item = [menu itemAtIndex:index]) && ([item isSeparatorItem] || [item isHidden] || ![item isEnabled])) + index--; - return; - } - - [menu _highlightItemAtIndex:index]; - - var item = [menu highlightedItem]; - - if ([item isSeparatorItem] || [item isHidden] || ![item isEnabled]) - [self moveUp:menu]; + if (index >= 0) + [menu _highlightItemAtIndex:index]; + else if (menu == [CPApp mainMenu]) + [menu _highlightItemAtIndex:[menu numberOfItems] - 1]; } - (void)insertNewline:(CPMenu)menu diff --git a/AppKit/CPMenu/_CPMenuWindow.j b/AppKit/CPMenu/_CPMenuWindow.j index 91672280f..53237a5a1 100644 --- a/AppKit/CPMenu/_CPMenuWindow.j +++ b/AppKit/CPMenu/_CPMenuWindow.j @@ -465,6 +465,7 @@ _CPMenuWindowAttachedMenuBackgroundStyle = 2; @"menu-bar-window-background-color": [CPNull null], @"menu-bar-window-background-selected-color": [CPNull null], @"menu-bar-window-font": [CPNull null], + @"menu-bar-window-first-item-font": [CPNull null], @"menu-bar-window-height": 30.0, @"menu-bar-window-margin": 10.0, @"menu-bar-window-left-margin": 10.0, @@ -482,6 +483,9 @@ _CPMenuWindowAttachedMenuBackgroundStyle = 2; @"menu-general-icon-new": [CPNull null], @"menu-general-icon-save": [CPNull null], @"menu-general-icon-open": [CPNull null], + @"menu-window-submenu-delta-x": 0.0, + @"menu-window-submenu-delta-y": 0.0, + @"menu-window-submenu-first-level-delta-y": 0.0 }; } diff --git a/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j b/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j index 86f756b11..c9c2af563 100644 --- a/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j +++ b/AppKit/CPMenuItem/_CPMenuItemSeparatorView.j @@ -31,7 +31,9 @@ + (id)view { - return [[self alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 10.0)]; + var themedHeight = [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-item-separator-view-height" forClass:_CPMenuItemStandardView]; + + return [[self alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, (themedHeight ? themedHeight : 10.0))]; } - (id)initWithFrame:(CGRect)aFrame @@ -47,12 +49,25 @@ - (void)drawRect:(CGRect)aRect { var context = [[CPGraphicsContext currentContext] graphicsPort], - bounds = [self bounds]; + bounds = [self bounds], + height = CGRectGetMaxY(bounds), + themedHeight = [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-item-separator-height" forClass:_CPMenuItemStandardView], + lineHeight = themedHeight ? themedHeight : 1.0; CGContextBeginPath(context); - CGContextMoveToPoint(context, CGRectGetMinX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); - CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); + CGContextSetLineWidth(context, lineHeight); + + if (!!((height - lineHeight) % 2)) + { + CGContextMoveToPoint(context, CGRectGetMinX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); + CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5); + } + else + { + CGContextMoveToPoint(context, CGRectGetMinX(bounds), FLOOR(CGRectGetMidY(bounds))); + CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), FLOOR(CGRectGetMidY(bounds))); + } CGContextSetStrokeColor(context, [[CPTheme defaultTheme] valueForAttributeWithName:@"menu-item-separator-color" forClass:_CPMenuItemStandardView]); CGContextStrokePath(context); diff --git a/AppKit/CPMenuItem/_CPMenuItemStandardView.j b/AppKit/CPMenuItem/_CPMenuItemStandardView.j index 76453ac4a..0c7a2e5de 100644 --- a/AppKit/CPMenuItem/_CPMenuItemStandardView.j +++ b/AppKit/CPMenuItem/_CPMenuItemStandardView.j @@ -41,6 +41,8 @@ _CPImageAndTextView _imageAndTextView; _CPImageAndTextView _keyEquivalentView; CPView _submenuIndicatorView; + + BOOL _hasSubmenuIndicatorImage; } + (CPString)defaultThemeClass @@ -63,12 +65,17 @@ @"menu-item-default-mixed-state-image": [CPNull null], @"menu-item-default-mixed-state-highlighted-image": [CPNull null], @"menu-item-separator-color": [CPNull null], + @"menu-item-separator-height": 1.0, + @"menu-item-separator-view-height": 10.0, @"left-margin": 3.0, @"right-margin": 17.0, @"state-column-width": 14.0, @"indentation-width": 17.0, @"vertical-margin": 4.0, + @"vertical-offset": 0.0, @"right-columns-margin": 30.0, + @"submenu-indicator-image": [CPNull null], + @"submenu-indicator-highlighted-image": [CPNull null] }; } @@ -91,6 +98,7 @@ _stateView = [[CPImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 0.0)]; [_stateView setImageScaling:CPImageScaleNone]; + [_stateView setImageAlignment:CPImageAlignCenter]; [self addSubview:_stateView]; @@ -109,9 +117,24 @@ [self addSubview:_keyEquivalentView]; - _submenuIndicatorView = [[_CPMenuItemSubmenuIndicatorView alloc] initWithFrame:CGRectMake(0.0, 0.0, 8.0, 10.0)]; + // Do we have a submenu indicator image specified in the theme ? + _hasSubmenuIndicatorImage = !![self valueForThemeAttribute:@"submenu-indicator-image"]; + + if (_hasSubmenuIndicatorImage) + { + // Yes, then use an imageView + _submenuIndicatorView = [[CPImageView alloc] initWithFrame:CGRectMakeZero()]; + + [_submenuIndicatorView setImageAlignment:CPImageAlignCenter]; + } + else + { + // No, then use self drawing _CPMenuItemSubmenuIndicatorView + _submenuIndicatorView = [[_CPMenuItemSubmenuIndicatorView alloc] initWithFrame:CGRectMake(0.0, 0.0, 8.0, 10.0)]; + + [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; + } - [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; [_submenuIndicatorView setAutoresizingMask:CPViewMinXMargin]; [self addSubview:_submenuIndicatorView]; @@ -149,11 +172,24 @@ _font = aFont; } +- (CPFont)font +{ + // Menu item font is forced local font or _menuItem font or system font + return _font || [_menuItem font] || [CPFont systemFontOfSize:CPFontCurrentSystemSize]; +} + +// FIXME: update is called 2 times at each display. Find why and fix. - (void)update { var x = [self valueForThemeAttribute:@"left-margin"] + [_menuItem indentationLevel] * [self valueForThemeAttribute:@"indentation-width"], height = 0.0, - hasStateColumn = [[_menuItem menu] showsStateColumn]; + hasStateColumn = [[_menuItem menu] showsStateColumn], + myFont = [self font], + + // When possible, use specific vertical margin/offset value based on font size (which could have been set by control size) + correspondingControlSize = [myFont controlSizeCorrespondingToFontSize], + verticalMargin = [self valueForThemeAttribute:@"vertical-margin" inState:CPControlSizeThemeStates[correspondingControlSize]], + verticalOffset = [self valueForThemeAttribute:@"vertical-offset" inState:CPControlSizeThemeStates[correspondingControlSize]]; if (hasStateColumn) { @@ -163,15 +199,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: @@ -188,7 +224,7 @@ else [_stateView setHidden:YES]; - [_imageAndTextView setFont:[_menuItem font] || _font]; + [_imageAndTextView setFont:myFont]; [_imageAndTextView setVerticalAlignment:CPCenterVerticalTextAlignment]; [_imageAndTextView setImage:[_menuItem image]]; [_imageAndTextView setText:[_menuItem title]]; @@ -201,7 +237,7 @@ imageAndTextViewFrame.origin.x = x; x += CGRectGetWidth(imageAndTextViewFrame); - height = MAX(height, CGRectGetHeight(imageAndTextViewFrame)); + height = MAX(height, CGRectGetHeight(imageAndTextViewFrame)); // FIXME: here, height = 0 -> MAX useless var hasKeyEquivalent = !![_menuItem keyEquivalent], hasSubmenu = [_menuItem hasSubmenu]; @@ -211,14 +247,14 @@ if (hasKeyEquivalent) { - [_keyEquivalentView setFont:[_menuItem font] || _font]; + [_keyEquivalentView setFont:myFont]; [_keyEquivalentView setVerticalAlignment:CPCenterVerticalTextAlignment]; [_keyEquivalentView setImage:[_menuItem image]]; [_keyEquivalentView setText:[_menuItem keyEquivalentStringRepresentation]]; [_keyEquivalentView setTextColor:[self textColor]]; [_keyEquivalentView setTextShadowColor:[self textShadowColor]]; [_keyEquivalentView setTextShadowOffset:CGSizeMake(0, 1)]; - [_keyEquivalentView setFrameOrigin:CGPointMake(x, [self valueForThemeAttribute:@"vertical-margin"])]; + [_keyEquivalentView setFrameOrigin:CGPointMake(x, verticalMargin)]; [_keyEquivalentView sizeToFit]; var keyEquivalentViewFrame = [_keyEquivalentView frame]; @@ -235,6 +271,14 @@ if (hasSubmenu) { + if (_hasSubmenuIndicatorImage) + { + var submenuIndicatorImage = [self valueForThemeAttribute:@"submenu-indicator-image" inState:CPControlSizeThemeStates[correspondingControlSize]]; + + [_submenuIndicatorView setImage:submenuIndicatorImage]; + [_submenuIndicatorView setFrameSize:[submenuIndicatorImage size]]; + } + [_submenuIndicatorView setHidden:NO]; var submenuViewFrame = [_submenuIndicatorView frame]; @@ -247,9 +291,9 @@ else [_submenuIndicatorView setHidden:YES]; - height += 2.0 * [self valueForThemeAttribute:@"vertical-margin"]; + height += 2.0 * verticalMargin; - imageAndTextViewFrame.origin.y = FLOOR((height - CGRectGetHeight(imageAndTextViewFrame)) / 2.0); + imageAndTextViewFrame.origin.y = FLOOR((height - CGRectGetHeight(imageAndTextViewFrame)) / 2.0) + verticalOffset; [_imageAndTextView setFrame:imageAndTextViewFrame]; if (hasStateColumn) @@ -257,7 +301,7 @@ if (hasKeyEquivalent) { - keyEquivalentViewFrame.origin.y = FLOOR((height - CGRectGetHeight(keyEquivalentViewFrame)) / 2.0); + keyEquivalentViewFrame.origin.y = FLOOR((height - CGRectGetHeight(keyEquivalentViewFrame)) / 2.0) + verticalOffset; [_keyEquivalentView setFrame:keyEquivalentViewFrame]; } @@ -282,6 +326,8 @@ _highlighted = shouldHighlight; + var correspondingControlSize = [[self font] controlSizeCorrespondingToFontSize]; + [_imageAndTextView setTextColor:[self textColor]]; [_keyEquivalentView setTextColor:[self textColor]]; [_imageAndTextView setTextShadowColor:[self textShadowColor]]; @@ -291,13 +337,21 @@ { [self setBackgroundColor:[self valueForThemeAttribute:@"menu-item-selection-color"]]; [_imageAndTextView setImage:[_menuItem alternateImage] || [_menuItem image]]; - [_submenuIndicatorView setColor:[self textColor]]; + + if (_hasSubmenuIndicatorImage) + [_submenuIndicatorView setImage:[self valueForThemeAttribute:@"submenu-indicator-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + else + [_submenuIndicatorView setColor:[self textColor]]; } else { [self setBackgroundColor:nil]; [_imageAndTextView setImage:[_menuItem image]]; - [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; + + if (_hasSubmenuIndicatorImage) + [_submenuIndicatorView setImage:[self valueForThemeAttribute:@"submenu-indicator-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + else + [_submenuIndicatorView setColor:[self valueForThemeAttribute:@"submenu-indicator-color"]]; } if ([[_menuItem menu] showsStateColumn]) @@ -307,15 +361,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-highlighted-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-highlighted-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-highlighted-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: @@ -327,15 +381,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image"]]; + [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: