diff --git a/.gitignore b/.gitignore index 5cfbb4d84..5f09485ed 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,7 @@ Demos ./Aristo WebSite .push-package +*.xcodeproj/*.pbxuser +*.xcodeproj/*.perspectivev3 +xcuserdata/ +!*.xcodeproj/project.pbxproj diff --git a/AppKit/CPFont.j b/AppKit/CPFont.j index 517ae1b28..897ef4971 100644 --- a/AppKit/CPFont.j +++ b/AppKit/CPFont.j @@ -25,20 +25,49 @@ @import "CPView.j" +CPFontDefaultSystemFontFace = @"Arial, sans-serif"; +CPFontDefaultSystemFontSize = 12; -var _CPFonts = {}, - _CPFontSystemFontFace = @"Arial, sans-serif", - _CPWrapRegExp = new RegExp("\\s*,\\s*", "g"); +var _CPFonts = {}, + _CPFontSystemFontFace = CPFontDefaultSystemFontFace, + _CPFontSystemFontSize = 12, + _CPFontFallbackFaces = CPFontDefaultSystemFontFace.split(", "), + _CPFontStripRegExp = new RegExp("(^\\s*[\"']?|[\"']?\\s*$)", "g"); -#define _CPCreateCSSString(aName, aSize, isBold) (isBold ? @"bold " : @"") + ROUND(aSize) + @"px " + ((aName === _CPFontSystemFontFace) ? aName : (@"\"" + aName.replace(_CPWrapRegExp, '", "') + @"\", " + _CPFontSystemFontFace)) -#define _CPCachedFont(aName, aSize, isBold) _CPFonts[_CPCreateCSSString(aName, aSize, isBold)] +#define _CPFontNormalizedNames(aName) _CPFontNormalizedNameArray(aName).join(", ") +#define _CPCachedFont(aName, aSize, isBold, isItalic) _CPFonts[_CPFontCreateCSSString(_CPFontNormalizedNames(aName), aSize, isBold, isItalic)] /*! @ingroup appkit @class CPFont - The CPFont class allows control of the fonts used for displaying text anywhere on the screen. The primary method for getting a particular font is through one of the class methods that take a name and/or size as arguments, and return the appropriate CPFont. + The CPFont class allows control of the fonts used for displaying text anywhere on the screen. + The primary method for getting a particular font is through one of the class methods that take + a name and/or size as arguments, and return the appropriate CPFont. + + By default the system font face/size is Arial 12px, with a fallback to sans-serif. You may + configure this at runtime in two ways: + + - By sending [CPFont @link CPFont::setSystemFontFace: setSystemFontFace:@endlink] and/or [CPFont @link CPFont::setSystemFontSize: setSystemFontSize:@endlink]. + - By configuring Info.plist for your application or for AppKit. You can set the font face + by adding a CPSystemFontFace string item to the Info.plist, and you can set the font size + by adding a CPSystemFontSize integer item to the Info.plist. + + Note that in either case, you can specify a comma-delimited list of fonts as the font face. + The browser will use the first available font in the list. CPFont always ensures that Arial + and sans-serif are always in the generated CSS string, so there is no need to add them to + the end of your font list. + + If you are using nib2cib, you should use the second method (using Info.plist), + and be sure to run nib2cib again any time you modify the CPSystemFontFace or CPSystemFontSize items. + For example, you might add this to your application's Info.plist to set the system font to Lucida Grande, + with an automatic fallback to Arial or sans-serif: + + @code +CPSystemFontFace +Lucida Grande + @endcode */ @implementation CPFont : CPObject { @@ -47,78 +76,153 @@ var _CPFonts = {}, float _ascender; float _descender; float _lineHeight; - BOOL _isBold; + BOOL _isBold @accessors(readonly, getter=isBold); + BOOL _isItalic @accessors(readonly, getter=isItalic); CPString _cssString; } + (void)initialize { - var systemFont = [[CPBundle bundleForClass:[CPView class]] objectForInfoDictionaryKey:"CPSystemFontFace"]; + var systemFontFace = [[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPSystemFontFace"]; - if (systemFont) - _CPFontSystemFontFace = systemFont; + if (!systemFontFace) + systemFontFace = [[CPBundle bundleForClass:[CPView class]] objectForInfoDictionaryKey:@"CPSystemFontFace"]; + + if (systemFontFace) + [self setSystemFontFace:systemFontFace]; + + var systemFontSize = [[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPSystemFontSize"]; + + if (!systemFontSize) + systemFontSize = [[CPBundle bundleForClass:[CPView class]] objectForInfoDictionaryKey:@"CPSystemFontSize"]; + + if (systemFontSize) + _CPFontSystemFontSize = systemFontSize; +} + +/*! + Returns the default system font face, which may consist of several comma-separated family names. +*/ ++ (CPString)systemFontFace +{ + return _CPFontSystemFontFace; +} + +/*! + Sets the default system font face, which may consist of several comma-separated family names. +*/ ++ (CPString)setSystemFontFace:(CPString)aFace +{ + _CPFontSystemFontFace = _CPFontNormalizedNames(aFace); +} + +/*! + Returns the default system font size. +*/ ++ (float)systemFontSize +{ + return _CPFontSystemFontSize; +} + +/*! + Sets the default system font size. +*/ ++ (float)setSystemFontSize:(float)size +{ + if (size > 0) + _CPFontSystemFontSize = size; } /*! Returns a font with the specified name and size. @param aName the name of the font - @param aSize the size of the font (in points) + @param aSize the size of the font (in px) @return the requested font */ + (CPFont)fontWithName:(CPString)aName size:(float)aSize { - return _CPCachedFont(aName, aSize, NO) || [[CPFont alloc] _initWithName:aName size:aSize bold:NO]; + return _CPCachedFont(aName, aSize, NO, NO) || [[CPFont alloc] _initWithName:aName size:aSize bold:NO italic:NO]; +} + +/*! + Returns a font with the specified name, size and style. + @param aName the name of the font + @param aSize the size of the font (in px) + @param italic whether the font should be italicized + @return the requested font +*/ ++ (CPFont)fontWithName:(CPString)aName size:(float)aSize italic:(BOOL)italic +{ + return _CPCachedFont(aName, aSize, NO, NO) || [[CPFont alloc] _initWithName:aName size:aSize bold:NO italic:italic]; } /*! Returns a bold font with the specified name and size. @param aName the name of the font - @param aSize the size of the font (in points) + @param aSize the size of the font (in px) @return the requested bold font */ + (CPFont)boldFontWithName:(CPString)aName size:(float)aSize { - return _CPCachedFont(aName, aSize, YES) || [[CPFont alloc] _initWithName:aName size:aSize bold:YES]; + return _CPCachedFont(aName, aSize, YES, NO) || [[CPFont alloc] _initWithName:aName size:aSize bold:YES italic:NO]; +} + +/*! + Returns a bold font with the specified name, size and style. + @param aName the name of the font + @param aSize the size of the font (in px) + @param italic whether the font should be italicized + @return the requested font +*/ ++ (CPFont)boldFontWithName:(CPString)aName size:(float)aSize italic:(BOOL)italic +{ + return _CPCachedFont(aName, aSize, NO, NO) || [[CPFont alloc] _initWithName:aName size:aSize bold:YES italic:italic]; } /*! Returns the system font scaled to the specified size - @param aSize the size of the font (in points) + @param aSize the size of the font (in px) @return the requested system font */ + (CPFont)systemFontOfSize:(CPSize)aSize { - return _CPCachedFont(_CPFontSystemFontFace, aSize, NO) || [[CPFont alloc] _initWithName:_CPFontSystemFontFace size:aSize bold:NO]; + return _CPCachedFont(_CPFontSystemFontFace, aSize, NO, NO) || [[CPFont alloc] _initWithName:_CPFontSystemFontFace size:aSize bold:NO italic:NO]; } /*! Returns the bold system font scaled to the specified size - @param aSize the size of the font (in points) + @param aSize the size of the font (in px) @return the requested bold system font */ + (CPFont)boldSystemFontOfSize:(CPSize)aSize { - return _CPCachedFont(_CPFontSystemFontFace, aSize, YES) || [[CPFont alloc] _initWithName:_CPFontSystemFontFace size:aSize bold:YES]; + return _CPCachedFont(_CPFontSystemFontFace, aSize, YES, NO) || [[CPFont alloc] _initWithName:_CPFontSystemFontFace size:aSize bold:YES italic:NO]; } /* FIXME Font Descriptor @ignore */ - (id)_initWithName:(CPString)aName size:(float)aSize bold:(BOOL)isBold +{ + return [self _initWithName:aName size:aSize bold:isBold italic:NO]; +} + +- (id)_initWithName:(CPString)aName size:(float)aSize bold:(BOOL)isBold italic:(BOOL)isItalic { self = [super init]; if (self) { - _name = aName; + _name = _CPFontNormalizedNames(aName); _size = aSize; _ascender = 0; _descender = 0; _lineHeight = 0; _isBold = isBold; + _isItalic = isItalic; - _cssString = _CPCreateCSSString(_name, _size, _isBold); + _cssString = _CPFontCreateCSSString(_name, _size, _isBold, _isItalic); _CPFonts[_cssString] = self; } @@ -139,7 +243,7 @@ var _CPFonts = {}, /*! Returns the bottom y coordinate (in CSS px), offset from the baseline, of the receiver's longest descender. - Thus, if the longest descender extends 2 points below the baseline, descender will return –2. + Thus, if the longest descender extends 2 px below the baseline, descender will return –2. */ - (float)descender { @@ -188,12 +292,17 @@ var _CPFonts = {}, - (BOOL)isEqual:(id)anObject { - return [anObject isKindOfClass:[CPFont class]] && [anObject cssString] === [self cssString]; + return [anObject isKindOfClass:[CPFont class]] && [anObject cssString] === _cssString; } - (CPString)description { - return [CPString stringWithFormat:@"%@ %@ %f pt.", [super description], [self familyName], [self size]]; + return [CPString stringWithFormat:@"%@ %@", [super description], [self cssString]]; +} + +- (id)copy +{ + return [[CPFont alloc] _initWithName:_name size:_size bold:_isBold italic:_isItalic]; } - (void)_getMetrics @@ -207,9 +316,10 @@ var _CPFonts = {}, @end -var CPFontNameKey = @"CPFontNameKey", - CPFontSizeKey = @"CPFontSizeKey", - CPFontIsBoldKey = @"CPFontIsBoldKey"; +var CPFontNameKey = @"CPFontNameKey", + CPFontSizeKey = @"CPFontSizeKey", + CPFontIsBoldKey = @"CPFontIsBoldKey", + CPFontIsItalicKey = @"CPFontIsItalicKey"; @implementation CPFont (CPCoding) @@ -220,9 +330,12 @@ var CPFontNameKey = @"CPFontNameKey", */ - (id)initWithCoder:(CPCoder)aCoder { - return [self _initWithName:[aCoder decodeObjectForKey:CPFontNameKey] - size:[aCoder decodeFloatForKey:CPFontSizeKey] - bold:[aCoder decodeBoolForKey:CPFontIsBoldKey]]; + var fontName = [aCoder decodeObjectForKey:CPFontNameKey], + size = [aCoder decodeFloatForKey:CPFontSizeKey], + isBold = [aCoder decodeBoolForKey:CPFontIsBoldKey], + isItalic = [aCoder decodeBoolForKey:CPFontIsItalicKey]; + + return [self _initWithName:fontName size:size bold:isBold italic:isItalic]; } /*! @@ -234,6 +347,50 @@ var CPFontNameKey = @"CPFontNameKey", [aCoder encodeObject:_name forKey:CPFontNameKey]; [aCoder encodeFloat:_size forKey:CPFontSizeKey]; [aCoder encodeBool:_isBold forKey:CPFontIsBoldKey]; + [aCoder encodeBool:_isItalic forKey:CPFontIsItalicKey]; } @end + + +// aName must be normalized +var _CPFontCreateCSSString = function(aName, aSize, isBold, isItalic) +{ + var properties = (isItalic ? "italic " : "") + (isBold ? "bold " : "") + aSize + "px "; + + return properties + _CPFontConcatNameWithFallback(aName); +}; + +var _CPFontConcatNameWithFallback = function(aName) +{ + var names = _CPFontNormalizedNameArray(aName), + fallbackFaces = _CPFontFallbackFaces.slice(0); + + // Remove the fallback names used in the names passed in + for (var i = 0; i < names.length; ++i) + { + for (var j = 0; j < fallbackFaces.length; ++j) + { + if (names[i].toLowerCase() === fallbackFaces[j].toLowerCase()) + { + fallbackFaces.splice(j, 1); + break; + } + } + + if (names[i].indexOf(" ") > 0) + names[i] = '"' + names[i] + '"'; + } + + return names.concat(fallbackFaces).join(", "); +}; + +var _CPFontNormalizedNameArray = function(aName) +{ + var names = aName.split(","); + + for (var i = 0; i < names.length; ++i) + names[i] = names[i].replace(_CPFontStripRegExp, ""); + + return names; +}; diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 7ed7b2af6..dfa108e50 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -26,6 +26,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, CPNumber _selectedIndex; CPTabViewType _type; + CPFont _font; id _delegate; unsigned _delegateSelectors; @@ -267,6 +268,27 @@ var CPTabViewDidSelectTabViewItemSelector = 1, return [_items objectAtIndex:_selectedIndex]; } +// Modifying the font +/*! + Returns the font for tab label text. +*/ +- (CPFont)font +{ + return _font; +} + +/*! + Sets the font for tab label text to font. +*/ +- (void)setFont:(CPFont)font +{ + if ([_font isEqual:font]) + return; + + _font = font; + [_tabs setFont:_font]; +} + // /*! Sets the tab view type. @@ -415,6 +437,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, var CPTabViewItemsKey = "CPTabViewItemsKey", CPTabViewSelectedItemKey = "CPTabViewSelectedItemKey", CPTabViewTypeKey = "CPTabViewTypeKey", + CPTabViewFontKey = "CPTabViewFontKey", CPTabViewDelegateKey = "CPTabViewDelegateKey"; @implementation CPTabView (CPCoding) @@ -425,12 +448,16 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", { [self _init]; + _font = [aCoder decodeObjectForKey:CPTabViewFontKey]; + [_tabs setFont:_font]; + _items = [aCoder decodeObjectForKey:CPTabViewItemsKey]; [self _updateItems]; [self _repositionTabs]; var selected = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey]; + if (selected) [self selectTabViewItem:selected]; @@ -450,6 +477,7 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", [aCoder encodeObject:[self selectedTabViewItem] forKey:CPTabViewSelectedItemKey]; [aCoder encodeInt:_type forKey:CPTabViewTypeKey]; + [aCoder encodeObject:_font forKey:CPTabViewFontKey]; [aCoder encodeConditionalObject:_delegate forKey:CPTabViewDelegateKey]; } diff --git a/CommonJS/lib/cappuccino/fontinfo.j b/CommonJS/lib/cappuccino/fontinfo.j new file mode 100644 index 000000000..2b7b8d9ba --- /dev/null +++ b/CommonJS/lib/cappuccino/fontinfo.j @@ -0,0 +1,12 @@ + +var OS = require("os"); + +exports.fontinfo = function(name, size) +{ + var p = OS.popen(["fontinfo", "-n", name, size || 12]); + + if (p.wait() === 0) + return JSON.parse(p.stdout.read()); + else + return null; +} diff --git a/Objective-J/CPLog.js b/Objective-J/CPLog.js index 3a9e863e4..11a3676ee 100644 --- a/Objective-J/CPLog.js +++ b/Objective-J/CPLog.js @@ -166,16 +166,11 @@ var stream; GLOBAL(CPLogColorize) = function(aString, aLevel) { - if (stream) - { - // Try to determine if a colorizing stanza is already open, they can't be nested - if (/^.*\x00\w+\([^\x00]*$/.test(aString)) - return aString; - else - return "\0" + (levelColorMap[aLevel] || "info") + "(" + aString + "\0)"; - } - else + // Try to determine if a colorizing stanza is already open, they can't be nested + if (/^.*\x00\w+\([^\x00]*$/.test(aString)) return aString; + else + return "\0" + (levelColorMap[aLevel] || "info") + "(" + aString + "\0)"; } GLOBAL(CPLogPrint) = function(aString, aLevel, aTitle, aFormatter) diff --git a/Tests/AppKit/CPFontTest.j b/Tests/AppKit/CPFontTest.j index caf41d3ee..aed30aec1 100644 --- a/Tests/AppKit/CPFontTest.j +++ b/Tests/AppKit/CPFontTest.j @@ -4,7 +4,7 @@ { CPFont _systemFont; CPFont _boldSystemFont; - + CPFont _customFont; CPFont _boldCustomFont; } @@ -13,29 +13,33 @@ { _systemFont = [CPFont systemFontOfSize:15]; _boldSystemFont = [CPFont boldSystemFontOfSize:15]; - + _customFont = [CPFont fontWithName:@"Marker Felt, Lucida Grande, Helvetica" size:30]; _boldCustomFont = [CPFont boldFontWithName:@"Helvetica" size:30]; } - (void)testSystemFontCSSString { - [self assert:[_systemFont cssString] equals:@"15px Arial, sans-serif"]; + var font = _CPFontConcatNameWithFallback([CPFont systemFontFace]); + + [self assert:[_systemFont cssString] equals:@"15px " + font]; } - (void)testBoldSystemFontCSSString { - [self assert:[_boldSystemFont cssString] equals:@"bold 15px Arial, sans-serif"]; + var font = _CPFontConcatNameWithFallback([CPFont systemFontFace]); + + [self assert:[_boldSystemFont cssString] equals:@"bold 15px " + font]; } - (void)testCustomFontCSSString { - [self assert:[_customFont cssString] equals:@"30px \"Marker Felt\", \"Lucida Grande\", \"Helvetica\", Arial, sans-serif"]; + [self assert:[_customFont cssString] equals:@"30px \"Marker Felt\", \"Lucida Grande\", Helvetica, Arial, sans-serif"]; } - (void)testBoldCustomFontCSSString { - [self assert:[_boldCustomFont cssString] equals:@"bold 30px \"Helvetica\", Arial, sans-serif"]; + [self assert:[_boldCustomFont cssString] equals:@"bold 30px Helvetica, Arial, sans-serif"]; } - (void)testIsEqual @@ -48,3 +52,39 @@ } @end + +var _CPFontStripRegExp = new RegExp("(^\\s*[\"']?|[\"']?\\s*$)", "g"); + +var _CPFontConcatNameWithFallback = function(aName) +{ + var names = _CPFontNormalizedNameArray(aName), + fallbackFaces = ["Arial", "sans-serif"]; + + // Remove the fallback names used in the names passed in + for (var i = 0; i < names.length; ++i) + { + for (var j = 0; j < fallbackFaces.length; ++j) + { + if (names[i].toLowerCase() === fallbackFaces[j].toLowerCase()) + { + fallbackFaces.splice(j, 1); + break; + } + } + + if (names[i].indexOf(" ") > 0) + names[i] = '"' + names[i] + '"'; + } + + return names.concat(fallbackFaces).join(", "); +}; + +var _CPFontNormalizedNameArray = function(aName) +{ + var names = aName.split(","); + + for (var i = 0; i < names.length; ++i) + names[i] = names[i].replace(_CPFontStripRegExp, ""); + + return names; +}; diff --git a/Tests/Manual/FontEnhancementTest/AppController.j b/Tests/Manual/FontEnhancementTest/AppController.j new file mode 100644 index 000000000..6a2bd3518 --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/AppController.j @@ -0,0 +1,120 @@ +/* + * AppController.j + * test + * + * Created by aparajita on March 9, 2011. + * Copyright 2011, Victory-Heart Productions All rights reserved. + */ + +@import + + +var fontLabelField = nil, + defaultFontLabelText = @""; + + +@implementation AppController : CPObject +{ + CPWindow theWindow; //this "outlet" is connected automatically by the Cib + CPTextField label1; + CPTextField fontLabel; + CPTableView theTableView; + CPRadio radio1; + CPRadio radio2; +} + +- (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]; + + fontLabelField = fontLabel; + defaultFontLabelText = [fontLabelField stringValue]; + + var font = [CPFont fontWithName:@"Palatino, Cambria" size:14]; + + [radio1 setFont:font]; + [radio2 setFont:font]; +} + +- (int)numberOfRowsInTableView:(id)aTableView +{ + return 7; +} + +- (id)tableView:(id)tableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow +{ + return ["one", "two", "three"][parseInt([aColumn identifier], 10)]; +} + +@end + + +@implementation CPView (testApp) + +- (void)doMouseEntered +{ + [fontLabelField setStringValue:@"View font: " + [[self font] cssString]]; +} + +- (void)doMouseExited +{ + [fontLabelField setStringValue:defaultFontLabelText]; +} + +@end + + +@implementation CPControl (testApp) + +- (void)awakeFromCib +{ + [super awakeFromCib]; + + var size = [self frameSize], + lineHeight = [[self font] defaultLineHeightForFont], + inset = [self hasThemeAttribute:@"content-inset"] ? [self currentValueForThemeAttribute:@"content-inset"] : nil, + minSize = [self hasThemeAttribute:@"min-size"] ? [self currentValueForThemeAttribute:@"min-size"] : nil, + height = lineHeight + (inset ? inset.top + inset.bottom : 0); + + if (minSize) + height = MAX(height, minSize.height); + + [self setFrameSize:CGSizeMake(size.width, MAX(size.height, height))]; +} + +- (void)mouseEntered:(CPEvent)anEvent +{ + [self doMouseEntered]; +} + +- (void)mouseExited:(CPEvent)anEvent +{ + [self doMouseExited]; +} + +@end + + +@implementation CPTabView (testApp) + +- (void)mouseEntered:(CPEvent)anEvent +{ + [_tabs doMouseEntered]; +} + +- (void)mouseExited:(CPEvent)anEvent +{ + [_tabs doMouseExited]; +} + +@end diff --git a/Tests/Manual/FontEnhancementTest/Info.plist b/Tests/Manual/FontEnhancementTest/Info.plist new file mode 100644 index 000000000..bb75f15fa --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + FontEnhancementTest + CPSystemFontFace + Lucida Grande + CPSystemFontSize + 12 + + diff --git a/Tests/Manual/FontEnhancementTest/Jakefile b/Tests/Manual/FontEnhancementTest/Jakefile new file mode 100644 index 000000000..cdafe78a4 --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/Jakefile @@ -0,0 +1,94 @@ +/* + * Jakefile + * test + * + * Created by aparajita on March 9, 2011. + * Copyright 2011, Victory-Heart Productions 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"); + +app ("test", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "test.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("test"); + task.setIdentifier("com.aparajitaworld.test"); + task.setVersion("1.0"); + task.setAuthor("Victory-Heart Productions"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("test"); + task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + task.setNib2CibFlags("-R Resources/"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["test"], function() +{ + printResults(configuration); +}); + +task ("build", ["default"]); + +task ("debug", function() +{ + ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", "test", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "test", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "test")); + OS.system(["press", "-f", FILE.join("Build", "Release", "test"), FILE.join("Build", "Deployment", "test")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "test")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "test"), FILE.join("Build", "Desktop", "test", "test.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "test", "test.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "test")); + print("----------------------------"); +} diff --git a/Tests/Manual/FontEnhancementTest/Resources/MainMenu.cib b/Tests/Manual/FontEnhancementTest/Resources/MainMenu.cib new file mode 100644 index 000000000..55f912794 --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;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;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;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;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;154E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;3;158E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;161E;D;K;6;CP$UIDd;3;162E;D;K;6;CP$UIDd;3;163E;D;K;6;CP$UIDd;3;164E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;1;0E;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;1;0E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;44E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;61E;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;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;165E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;168E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;169E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;170E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;6;$afontD;K;6;CP$UIDd;3;174E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;176E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;177E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;178E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;180E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;180E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;180E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;176E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;181E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;182E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;183E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;185E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;186E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;187E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;188E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;189E;K;6;$afontD;K;6;CP$UIDd;3;190E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;176E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;177E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;177E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;193E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;176E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;194E;E;D;K;10;$classnameS;13;CPPopUpButtonK;8;$classesA;S;13;CPPopUpButtonS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;44E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;195E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;196E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;197E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;198E;K;6;$afontD;K;6;CP$UIDd;3;199E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;176E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;200E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;201E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;202E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;203E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;204E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;76E;E;D;K;10;$classnameS;9;CPTabViewK;8;$classesA;S;9;CPTabViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;205E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;206E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;167E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;3;208E;K;24;CPTabViewSelectedItemKeyD;K;6;CP$UIDd;2;42E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;3;167E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;3;209E;K;20;CPTabViewDelegateKeyD;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;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;210E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;211E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;213E;K;16;$aimage-positionD;K;6;CP$UIDd;3;167E;K;6;$afontD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;194E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;167E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;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;33E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;215E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;216E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;217E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;218E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;220E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;221E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;36E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;75E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;222E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;222E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;222E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;222E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;177E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;180E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;177E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;224E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;225E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;175E;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;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;226E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;227E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;228E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;229E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;230E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;231E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;167E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;34E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;232E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;167E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;233E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;234E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;235E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;189E;K;6;$afontD;K;6;CP$UIDd;3;236E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;176E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;177E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;177E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;193E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;176E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;237E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;238E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;239E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;240E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;241E;K;16;$aimage-positionD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;242E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;243E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;73E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;244E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;186E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;73E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;228E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;10;$classnameS;13;CPTabViewItemK;8;$classesA;S;13;CPTabViewItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;2;84E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;245E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;70E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;246E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;247E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;45E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;84E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;248E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;249E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;250E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;252E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;253E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;254E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;180E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;177E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;255E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;256E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;240E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;241E;K;16;$aimage-positionD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;190E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;194E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;61E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;257E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;214E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;52E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;258E;E;D;K;10;$classnameS;13;CPSearchFieldK;8;$classesA;S;13;CPSearchFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;259E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;188E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;260E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;261E;K;6;$afontD;K;6;CP$UIDd;3;190E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;176E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;177E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;193E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;176E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;194E;K;27;CPSendsWholeSearchStringKeyD;K;6;CP$UIDd;3;180E;K;33;CPSendsSearchStringImmediatelyKeyD;K;6;CP$UIDd;3;180E;K;19;CPMaximumRecentsKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;246E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;263E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;264E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;61E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;257E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;52E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;265E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;61E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;257E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;52E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;258E;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;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;221E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;266E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;266E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;221E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;267E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;64E;K;33;CPTableHeaderViewDrawsColumnLinesD;K;6;CP$UIDd;3;177E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;165E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;2;85E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;268E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;77E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;270E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;260E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;261E;K;6;$afontD;K;6;CP$UIDd;3;271E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;176E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;177E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;177E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;193E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;176E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;272E;K;27;CPSendsWholeSearchStringKeyD;K;6;CP$UIDd;3;180E;K;33;CPSendsSearchStringImmediatelyKeyD;K;6;CP$UIDd;3;180E;K;19;CPMaximumRecentsKeyD;K;6;CP$UIDd;3;262E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;274E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;275E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;2;52E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;276E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;196E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;197E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;198E;K;6;$afontD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;176E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;1;0E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;277E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;26E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;257E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;3;214E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;44E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;258E;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;63E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;220E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;278E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;278E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;220E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;279E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;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;280E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;281E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;167E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;167E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;180E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;177E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;177E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;177E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;177E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;282E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;1;0E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;180E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;224E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;56E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;265E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;26E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;257E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;44E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;264E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;26E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;257E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;1;0E;K;18;CPMenuItemStateKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;44E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;2;85E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;2;96E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;40E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;283E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;284E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;213E;K;16;$aimage-positionD;K;6;CP$UIDd;3;167E;K;6;$afontD;K;6;CP$UIDd;3;285E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;286E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;167E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;287E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;288E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;6;$afontD;K;6;CP$UIDd;3;289E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;176E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;177E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;290E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;180E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;180E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;180E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;176E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;30E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;291E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;292E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;30E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;228E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;10;$classnameS;18;CPSegmentedControlK;8;$classesA;S;18;CPSegmentedControlS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;293E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;294E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;6;$afontD;K;6;CP$UIDd;3;296E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;297E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;167E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;214E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;298E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;299E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;300E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;25;CPViewAutoresizesSubviewsD;K;6;CP$UIDd;3;167E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;3;301E;K;24;CPTabViewSelectedItemKeyD;K;6;CP$UIDd;2;67E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;3;167E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;3;302E;K;20;CPTabViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;45E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;83E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;303E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;249E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;250E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;304E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;305E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;254E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;180E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;177E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;306E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;307E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;228E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;229E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;230E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;308E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;167E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;34E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;309E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;167E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;310E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;311E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;311E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;312E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;313E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;292E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;314E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;315E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;6;$afontD;K;6;CP$UIDd;3;174E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;176E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;177E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;194E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;180E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;180E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;180E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;175E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;176E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;2;84E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;316E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;23E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;317E;E;D;K;6;$classD;K;6;CP$UIDd;2;45E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;85E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;318E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;222E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;319E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;320E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;321E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;254E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;180E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;177E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;71E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;322E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;323E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;184E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;295E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;6;$afontD;K;6;CP$UIDd;3;209E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;29;CPSegmentedControlSegmentsKeyD;K;6;CP$UIDd;3;324E;K;29;CPSegmentedControlSelectedKeyD;K;6;CP$UIDd;3;167E;K;33;CPSegmentedControlSegmentStyleKeyD;K;6;CP$UIDd;3;214E;K;33;CPSegmentedControlTrackingModeKeyD;K;6;CP$UIDd;3;167E;E;S;1;0S;1;1S;1;2S;1;3S;1;8S;1;5S;1;6S;1;7S;1;4S;1;9S;2;10S;2;11S;2;12S;2;13S;2;14S;2;15S;2;16S;2;17S;2;18S;2;19S;2;20S;2;21S;2;22S;2;23S;2;24S;2;25S;2;26S;2;27S;2;28S;2;29S;2;30S;2;31S;2;32S;2;33S;2;34S;2;35S;2;36S;2;37S;2;38S;2;40S;2;39S;2;41S;2;42S;2;45S;2;44S;2;43S;2;46S;2;47S;2;48S;2;49S;2;50S;2;51S;2;52S;2;53S;2;54S;2;55S;2;56S;2;57S;2;58S;2;59S;2;60S;2;61S;2;62S;2;63S;2;64S;2;65S;2;66S;12;File's OwnerS;2;67S;2;68S;2;69S;2;70D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;80E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;325E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;326E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;69E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;327E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;329E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;330E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;331E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;332E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;64E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;333E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;80E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;334E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;80E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;335E;E;D;K;6;$classD;K;6;CP$UIDd;3;155E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;80E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;325E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;E;E;d;1;0S;21;{{29, 14}, {578, 17}}S;19;{{0, 0}, {578, 17}}d;2;34S;9;textfieldS;6;normalD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;336E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;337E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;d;1;2d;1;4T;S;45;View font: d;4;3072F;S;23;{{363, 353}, {218, 18}}S;19;{{0, 0}, {218, 18}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;338E;D;K;6;CP$UIDd;3;339E;E;E;d;2;36S;21;{{10, 33}, {237, 39}}S;19;{{0, 0}, {237, 39}}S;22;{{29, 159}, {209, 29}}S;19;{{0, 0}, {209, 29}}S;19;bezeled+placeholderD;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;336E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;337E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;S;0;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;192E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;340E;E;S;15;Default IB fontS;23;{{360, 223}, {204, 24}}S;19;{{0, 0}, {204, 24}}S;12;popup-buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;341E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;342E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;S;32;{10000000000000, 10000000000000}S;8;CPWindowS;23;{{256, 60}, {612, 664}}d;1;7S;21;Font Enhancement TestS;23;{{322, 564}, {266, 85}}S;19;{{0, 0}, {266, 85}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;58E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;336E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;337E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;177E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;S;22;{{363, 89}, {118, 24}}S;19;{{0, 0}, {118, 24}}S;6;buttonS;17;selected+borderedd;1;1S;23;{{32, 405}, {455, 135}}S;20;{{0, 0}, {455, 135}}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;2;36E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;3;221E;D;K;6;CP$UIDd;3;224E;D;K;6;CP$UIDd;3;225E;E;E;S;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;219E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;343E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;278E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;344E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;228E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;3;219E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;346E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;347E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;348E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;228E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;345E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;56E;E;d;2;10D;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;223E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;167E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;349E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;350E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;228E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;351E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;S;21;{{439, 1}, {15, 117}}S;19;{{0, 0}, {15, 117}}d;1;8d;11;-2147483648S;8;scrollerS;17;disabled+verticalS;27;_verticalScrollerDidScroll:f;18;0.8717948717948718S;22;{{29, 123}, {209, 32}}S;19;{{0, 0}, {209, 32}}D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;353E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;354E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;S;15;Trebuchet MS 14S;23;{{361, 146}, {213, 18}}S;19;{{0, 0}, {213, 18}}S;9;check-boxS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;355E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;356E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;177E;E;S;25;Times New Roman italic 16S;21;{{10, 13}, {237, 39}}S;7;DefaultS;10;OtherViewsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;65E;E;E;d;3;131d;2;40d;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;251E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;357E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;358E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;167E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;359E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;190E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;360E;K;6;$afontD;K;6;CP$UIDd;3;362E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;176E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;15;$acontent-insetD;K;6;CP$UIDd;3;364E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;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;176E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;167E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;191E;E;d;1;3S;23;{{361, 178}, {113, 18}}S;19;{{0, 0}, {113, 18}}S;17;_popUpItemAction:d;7;1048576S;22;{{29, 242}, {209, 29}}S;11;searchfieldS;27;bezeled+rounded+placeholderd;3;254D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;E;E;S;6;Item 2S;6;Item 3S;19;{{0, 0}, {453, 23}}S;14;tableHeaderRowS;7;IB fontS;22;{{29, 210}, {210, 29}}S;19;{{0, 0}, {210, 29}}D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;365E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;337E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;S;10;Verdana 12S;23;{{363, 319}, {218, 20}}S;19;{{0, 0}, {218, 20}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;329E;D;K;6;CP$UIDd;3;331E;E;E;S;23;{{360, 260}, {204, 24}}S;17;Lucida Console 13S;20;{{0, 0}, {453, 117}}S;9;tableviewd;2;23S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;81E;E;E;S;22;{{363, 52}, {168, 24}}S;19;{{0, 0}, {168, 24}}D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;353E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;354E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;177E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;S;20;Trebuchet MS Bold 14S;21;{{29, 50}, {221, 26}}S;19;{{0, 0}, {221, 26}}D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;366E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;367E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;177E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;177E;E;S;22;Georgia bold italic 18S;21;{{10, 13}, {246, 39}}S;19;{{0, 0}, {246, 39}}S;22;{{26, 295}, {182, 24}}S;19;{{0, 0}, {182, 24}}S;17;segmented-controlD;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;368E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;342E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;177E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;370E;D;K;6;CP$UIDd;3;371E;D;K;6;CP$UIDd;3;372E;E;E;S;22;{{25, 564}, {257, 85}}S;19;{{0, 0}, {257, 85}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;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;79E;D;K;6;CP$UIDd;2;67E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;316E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;342E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;d;3;137D;K;6;$classD;K;6;CP$UIDd;3;251E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;373E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;358E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;167E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;374E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;190E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;360E;K;6;$afontD;K;6;CP$UIDd;3;375E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;176E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;15;$acontent-insetD;K;6;CP$UIDd;3;376E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;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;176E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;167E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;191E;E;S;24;{{-100, 220}, {426, 15}}S;19;{{0, 0}, {426, 15}}S;8;disabledS;29;_horizontalScrollerDidScroll:f;18;0.9906976744186047S;20;{{0, 0}, {612, 664}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;30E;E;E;S;21;{{10, 33}, {246, 39}}S;20;{{29, 84}, {95, 17}}S;18;{{0, 0}, {95, 17}}S;6;ImpactS;13;AppControllerd;3;125d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;3;251E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;377E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;358E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;167E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;378E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;190E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;171E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;360E;K;6;$afontD;K;6;CP$UIDd;3;379E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;176E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;15;$acontent-insetD;K;6;CP$UIDd;3;380E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;191E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;179E;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;176E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;167E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;191E;E;S;22;{{26, 330}, {152, 24}}S;19;{{0, 0}, {152, 24}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;381E;D;K;6;CP$UIDd;3;382E;D;K;6;CP$UIDd;3;383E;E;E;S;8;delegateS;9;fontLabelS;6;label1D;K;10;$classnameS;7;CPRadioK;8;$classesA;S;7;CPRadioS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;328E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;60E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;384E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;384E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;60E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;385E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;386E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;198E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;175E;K;16;$aimage-positionD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;387E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;388E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;24;CPButtonKeyEquivalentKeyD;K;6;CP$UIDd;3;389E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;390E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;3;392E;E;S;6;radio1D;K;6;$classD;K;6;CP$UIDd;3;328E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;60E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;393E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;384E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;60E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;385E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;386E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;213E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;175E;K;16;$aimage-positionD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;387E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;167E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;394E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;24;CPButtonKeyEquivalentKeyD;K;6;CP$UIDd;3;395E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;258E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;3;392E;E;S;6;radio2S;12;theTableViewS;9;theWindowS;10;dataSourceS;13;Lucida Granded;2;12D;K;6;$classD;K;6;CP$UIDd;3;328E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;396E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;396E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;385E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;386E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;213E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;175E;K;16;$aimage-positionD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;190E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;175E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;214E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;245E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;3;397E;E;D;K;6;$classD;K;6;CP$UIDd;3;328E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;398E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;396E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;385E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;386E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;399E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;175E;K;16;$aimage-positionD;K;6;CP$UIDd;3;175E;K;6;$afontD;K;6;CP$UIDd;3;190E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;167E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;214E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;176E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;268E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;180E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;1;0E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;175E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;167E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;3;397E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;214E;E;E;S;14;Lucida Consoled;2;13S;20;{{1, 1}, {453, 117}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;192E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;400E;E;S;21;{{1, 118}, {453, 17}}S;19;{{0, 0}, {453, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;56E;E;E;S;22;{{439, 112}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;10;cornerviewS;16;{{0, 0}, {0, 0}}S;12;Trebuchet MSd;2;14S;15;Times New Romand;2;16D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;402E;E;E;S;12;columnHeaderS;14;Courier New 13S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;361E;K;4;nameD;K;6;CP$UIDd;3;403E;K;6;valuesD;K;6;CP$UIDd;3;405E;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;363E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;406E;E;S;7;VerdanaS;7;Georgiad;2;18S;13;Comic Sans MSD;K;10;$classnameS;14;_CPSegmentItemK;8;$classesA;S;14;_CPSegmentItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;369E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;407E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;177E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;177E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;369E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;408E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;180E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;177E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;214E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;369E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;2;96E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;180E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;177E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;409E;E;E;S;19;Courier New Bold 13D;K;6;$classD;K;6;CP$UIDd;3;361E;K;4;nameD;K;6;CP$UIDd;3;403E;K;6;valuesD;K;6;CP$UIDd;3;410E;E;D;K;6;$classD;K;6;CP$UIDd;3;363E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;406E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;411E;E;E;S;15;Default IB FontD;K;6;$classD;K;6;CP$UIDd;3;361E;K;4;nameD;K;6;CP$UIDd;3;403E;K;6;valuesD;K;6;CP$UIDd;3;412E;E;D;K;6;$classD;K;6;CP$UIDd;3;363E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;406E;E;D;K;6;$classD;K;6;CP$UIDd;3;369E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;245E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;177E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;177E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;369E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;413E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;180E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;177E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;3;214E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;3;369E;K;21;CPSegmentItemImageKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemLabelKeyD;K;6;CP$UIDd;3;403E;K;20;CPSegmentItemMenuKeyD;K;6;CP$UIDd;1;0E;K;24;CPSegmentItemSelectedKeyD;K;6;CP$UIDd;3;180E;K;23;CPSegmentItemEnabledKeyD;K;6;CP$UIDd;3;177E;K;19;CPSegmentItemTagKeyD;K;6;CP$UIDd;1;0E;K;21;CPSegmentItemWidthKeyD;K;6;CP$UIDd;1;0E;E;S;19;{{0, 0}, {107, 20}}D;K;6;$classD;K;6;CP$UIDd;3;192E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;414E;E;S;5;radioD;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;415E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;354E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;S;11;Palatino orS;4;cAA=d;7;1572864D;K;10;$classnameS;12;CPRadioGroupK;8;$classesA;S;12;CPRadioGroupS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;391E;K;21;CPRadioGroupRadiosKeyD;K;6;CP$UIDd;3;416E;K;28;CPRadioGroupSelectedRadioKeyD;K;6;CP$UIDd;3;331E;E;S;21;{{111, 0}, {107, 20}}S;10;Cambria 14S;4;QwA=S;19;{{0, 0}, {107, 18}}D;K;6;$classD;K;6;CP$UIDd;3;391E;K;21;CPRadioGroupRadiosKeyD;K;6;CP$UIDd;3;417E;K;28;CPRadioGroupSelectedRadioKeyD;K;6;CP$UIDd;3;338E;E;S;21;{{111, 0}, {107, 18}}S;17;disabled+borderedD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;214E;D;K;6;CP$UIDd;3;214E;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;401E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;252E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;252E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;S;4;fontD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;404E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;418E;K;6;normalD;K;6;CP$UIDd;3;419E;E;E;S;39;{"top":0,"right":5,"bottom":0,"left":5}S;10;Comic SansS;4;boldD;K;6;$classD;K;6;CP$UIDd;3;401E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;304E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;304E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;3;404E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;418E;K;6;normalD;K;6;CP$UIDd;3;418E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;401E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;320E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;352E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;352E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;320E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;367E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;3;404E;K;10;CP.objectsD;K;21;selectedTableDataViewD;K;6;CP$UIDd;3;209E;K;6;normalD;K;6;CP$UIDd;3;190E;E;E;S;2;IBD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;E;E;S;8;PalatinoD;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;420E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;421E;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;422E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;342E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;177E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;3;173E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;422E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;342E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;180E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;180E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;329E;D;K;6;CP$UIDd;3;331E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;338E;D;K;6;CP$UIDd;3;339E;E;E;S;11;Courier NewE;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/FontEnhancementTest/Resources/MainMenu.xib b/Tests/Manual/FontEnhancementTest/Resources/MainMenu.xib new file mode 100644 index 000000000..84e7e776a --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/Resources/MainMenu.xib @@ -0,0 +1,2119 @@ + + + + 1050 + 10J869 + 804 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 804 + + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + 7 + 2 + {{256, 694}, {612, 664}} + 1946157056 + Font Enhancement Test + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + YES + + + 268 + {{29, 588}, {221, 26}} + + YES + + 68288064 + 272630784 + Georgia bold italic 18 + + Georgia-BoldItalic + 18 + 16 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 266 + {{29, 633}, {578, 17}} + + YES + + 68288064 + 272630784 + View font: <roll over a view to see its font> + + LucidaGrande + 13 + 16 + + + + + + + + + 268 + {{29, 563}, {95, 17}} + + YES + + 68288064 + 272630784 + Default IB font + + LucidaGrande + 13 + 1044 + + + + + + + + + 268 + {{363, 584}, {168, 25}} + + YES + + -2080244224 + 134217728 + Trebuchet MS Bold 14 + + TrebuchetMS-Bold + 14 + 16 + + + -2038152961 + 163 + + + 400 + 75 + + + + + 268 + {{363, 547}, {118, 25}} + + YES + + -2080244224 + 134217728 + Default IB font + + + -2038152961 + 163 + + + 400 + 75 + + + + + 268 + + YES + + + 2304 + + YES + + + 256 + {453, 117} + + YES + + + 256 + {453, 17} + + + + + + -2147483392 + {{439, 0}, {16, 17}} + + + + YES + + 0 + 137 + 40 + 1000 + + 75628096 + 2048 + Courier New Bold 13 + + LucidaGrande + 11 + 3100 + + + 3 + MC4zMzMzMzI5ODU2AA + + + 6 + System + headerTextColor + + + + + 337772096 + 2048 + Text Cell + + CourierNewPS-BoldMT + 13 + 16 + + + + 6 + System + controlBackgroundColor + + + + + 3 + YES + YES + + + + 1 + 131 + 40 + 1000 + + 75628096 + 2048 + Courier New 13 + + + + + + 337772096 + 2048 + Text Cell + + CourierNewPSMT + 13 + 16 + + + + + + 3 + YES + YES + + + + 2 + 125 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Default IB Font + + + 6 + System + headerColor + + 3 + MQA + + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + YES + + + + 3 + 2 + + + 6 + System + gridColor + + 3 + MC41AA + + + 17 + -702545920 + + + 0 + 15 + 0 + YES + 0 + + + {{1, 17}, {453, 117}} + + + + + 4 + + + + -2147483392 + {{439, 17}, {15, 117}} + + + _doScroller: + 0.87179487179487181 + + + + -2147483392 + {{-100, -100}, {426, 15}} + + 1 + + _doScroller: + 0.99069767441860468 + + + + 2304 + + YES + + + {{1, 0}, {453, 17}} + + + + + 4 + + + + {{32, 124}, {455, 135}} + + + 530 + + + + + + QSAAAEEgAABBmAAAQZgAAA + + + + 268 + {{32, 512}, {202, 25}} + + YES + + -1804468671 + 272630784 + + + TrebuchetMS + 14 + 16 + + Trebuchet MS 14 + + YES + + 6 + System + textBackgroundColor + + + + 6 + System + textColor + + + + + + + 268 + {{32, 479}, {202, 22}} + + YES + + -1804468671 + 272630784 + + + Default IB font + + YES + + + + + + + 268 + {{32, 428}, {203, 22}} + + YES + + 343014976 + 268436544 + + + Verdana + 12 + 16 + + Verdana 12 + + YES + 1 + + + + 130560 + 0 + search + + _searchFieldSearch: + + 138690815 + 0 + + 400 + 75 + + + 130560 + 0 + clear + + YES + + YES + + YES + AXDescription + NSAccessibilityEncodedAttributesValueType + + + YES + cancel + + + + + + _searchFieldCancel: + + 138690815 + 0 + + 400 + 75 + + 255 + + + + + 268 + {{32, 396}, {202, 22}} + + YES + + 343014976 + 268436544 + + + Default IB font + + YES + 1 + + + + 130560 + 0 + search + + _searchFieldSearch: + + 138690815 + 0 + + 400 + 75 + + + 130560 + 0 + clear + + YES + + YES + + YES + AXDescription + NSAccessibilityEncodedAttributesValueType + + + YES + cancel + + + + + + _searchFieldCancel: + + 138690815 + 0 + + 400 + 75 + + 255 + + + + + 268 + {{361, 500}, {213, 18}} + + YES + + -2080244224 + 0 + Times New Roman italic 16 + + TimesNewRomanPS-ItalicMT + 16 + 16 + + + 1211912703 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + + + + 268 + {{361, 468}, {113, 18}} + + YES + + -2080244224 + 0 + Default IB font + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{360, 413}, {204, 26}} + + YES + + -2076049856 + 2048 + + LucidaConsole + 13 + 16 + + + 109199615 + 129 + + + 400 + 75 + + + Lucida Console 13 + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + Item 2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item 3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{360, 376}, {204, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Default IB font + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + Item 2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item 3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{30, 345}, {182, 24}} + + YES + + -2080244224 + 0 + + ComicSansMS-Bold + 13 + 16 + + + + YES + + Comic Sans + YES + 0 + + + bold + 1 + 0 + + + 13 + 0 + + + 1 + + + + + 268 + {{30, 310}, {152, 24}} + + YES + + 67239424 + 0 + + + + YES + + Default + YES + 0 + + + IB + 1 + 0 + + + font + 0 + + + 1 + + + + + 268 + {{363, 325}, {218, 20}} + + YES + 1 + 2 + + YES + + 67239424 + 0 + Palatino or + + Palatino-Roman + 14 + 16 + + + 1 + 1211912703 + 402653184 + + NSRadioButton + + + p + 200 + 25 + + + -2080244224 + 33554432 + Cambria 14 + + + 1211912703 + 268435456 + + C + 400 + 75 + + + {107, 20} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + 3 + MCAwAA + + + + 400 + 75 + + 1 + + + + + + + + 268 + {{363, 293}, {218, 18}} + + YES + 1 + 2 + + YES + + -2080244224 + 134217728 + Default + + + 1 + 1211912703 + 0 + + + + 200 + 25 + + + 604110336 + 67108864 + IB font + + + 1211912703 + 0 + + 400 + 75 + + + {107, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + + 12 + {{25, 15}, {257, 85}} + + + YES + + 1 + + + 256 + {{10, 33}, {237, 39}} + + Impact + + + + + 2 + + + 256 + {{10, 33}, {237, 39}} + + + 13 + + + + + + + Impact + 13 + 16 + + 0 + YES + + YES + + + + + + 12 + {{322, 15}, {266, 85}} + + + YES + + 1 + + + 256 + {{10, 33}, {246, 39}} + + + Default + + + + + 2 + + + 256 + {{10, 33}, {246, 39}} + + IB font + + + + + + + LucidaGrande-Bold + 13 + 16 + + 0 + YES + + YES + + + + + {612, 664} + + + {{0, 0}, {2560, 1418}} + {1.79769e+308, 1.79769e+308} + + + AppController + + + + + YES + + + delegate + + + + 451 + + + + theWindow + + + + 459 + + + + label1 + + + + 462 + + + + fontLabel + + + + 465 + + + + theTableView + + + + 491 + + + + dataSource + + + + 514 + + + + delegate + + + + 515 + + + + radio1 + + + + 581 + + + + radio2 + + + + 582 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 371 + + + YES + + + + + + 372 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + 450 + + + + + 460 + + + YES + + + + + + 461 + + + + + 463 + + + YES + + + + + + 464 + + + + + 468 + + + YES + + + + + + 469 + + + + + 474 + + + YES + + + + + + 475 + + + + + 476 + + + YES + + + + + + 477 + + + + + 478 + + + YES + + + + + + + + + 479 + + + + + 480 + + + + + 481 + + + YES + + + + + + + + 482 + + + + + 483 + + + YES + + + + + + 484 + + + YES + + + + + + 485 + + + + + 486 + + + + + 492 + + + YES + + + + + + 493 + + + + + 516 + + + YES + + + + + + 517 + + + + + 518 + + + YES + + + + + + 519 + + + + + 520 + + + YES + + + + + + 521 + + + + + 522 + + + YES + + + + + + 523 + + + + + 528 + + + YES + + + + + + 529 + + + + + 530 + + + YES + + + + + + 531 + + + + + 532 + + + YES + + + + + + 533 + + + YES + + + + + + 534 + + + YES + + + + + + + + 535 + + + + + 536 + + + + + 537 + + + + + 538 + + + YES + + + + + + 539 + + + YES + + + + + + 540 + + + YES + + + + + + + + 541 + + + + + 542 + + + + + 543 + + + + + 544 + + + YES + + + + + + 545 + + + + + 546 + + + YES + + + + + + 547 + + + + + 548 + + + YES + + + + + + + + 549 + + + + + 551 + + + + + 552 + + + + + 558 + + + YES + + + + + + + + 560 + + + + + 561 + + + + + 562 + + + + + 563 + + + YES + + + + + + + 564 + + + YES + + + + + + 565 + + + YES + + + + + + 566 + + + + + 567 + + + + + 573 + + + YES + + + + + + + 574 + + + YES + + + + + + 575 + + + YES + + + + + + 576 + + + + + 577 + + + + + + + YES + + YES + -3.IBPluginDependency + 371.IBEditorWindowLastContentRect + 371.IBPluginDependency + 371.IBWindowTemplateEditedContentRect + 371.NSWindowTemplate.visibleAtLaunch + 371.editorWindowContentRectSynchronizationRect + 371.windowTemplate.maxSize + 372.IBPluginDependency + 460.IBPluginDependency + 460.IBViewBoundsToFrameTransform + 461.IBPluginDependency + 463.IBPluginDependency + 463.IBViewBoundsToFrameTransform + 464.IBPluginDependency + 468.IBPluginDependency + 468.IBViewBoundsToFrameTransform + 469.IBPluginDependency + 474.IBPluginDependency + 474.IBViewBoundsToFrameTransform + 475.IBPluginDependency + 476.IBPluginDependency + 476.IBViewBoundsToFrameTransform + 477.IBPluginDependency + 478.IBPluginDependency + 478.IBViewBoundsToFrameTransform + 479.IBPluginDependency + 480.IBPluginDependency + 481.IBPluginDependency + 482.IBPluginDependency + 483.IBPluginDependency + 484.IBPluginDependency + 485.IBPluginDependency + 486.IBPluginDependency + 516.IBPluginDependency + 516.IBViewBoundsToFrameTransform + 517.IBPluginDependency + 518.IBPluginDependency + 518.IBViewBoundsToFrameTransform + 519.IBPluginDependency + 520.IBPluginDependency + 520.IBViewBoundsToFrameTransform + 521.IBPluginDependency + 522.IBPluginDependency + 522.IBViewBoundsToFrameTransform + 523.IBPluginDependency + 528.IBPluginDependency + 528.IBViewBoundsToFrameTransform + 529.IBPluginDependency + 530.IBPluginDependency + 530.IBViewBoundsToFrameTransform + 531.IBPluginDependency + 532.IBPluginDependency + 532.IBViewBoundsToFrameTransform + 533.IBPluginDependency + 534.IBEditorWindowLastContentRect + 534.IBPluginDependency + 535.IBPluginDependency + 536.IBPluginDependency + 537.IBPluginDependency + 538.IBPluginDependency + 538.IBViewBoundsToFrameTransform + 539.IBPluginDependency + 540.IBPluginDependency + 541.IBPluginDependency + 542.IBPluginDependency + 543.IBPluginDependency + 544.IBPluginDependency + 544.IBSegmentedControlTracker.RoundRobinState + 544.IBSegmentedControlTracker.WasGrowing + 544.IBViewBoundsToFrameTransform + 545.IBPluginDependency + 546.IBPluginDependency + 546.IBViewBoundsToFrameTransform + 547.IBPluginDependency + 548.IBPluginDependency + 548.IBViewBoundsToFrameTransform + 549.IBPluginDependency + 551.IBPluginDependency + 558.IBPluginDependency + 558.IBViewBoundsToFrameTransform + 561.IBPluginDependency + 562.IBPluginDependency + 563.IBPluginDependency + 563.IBViewBoundsToFrameTransform + 564.IBPluginDependency + 565.IBPluginDependency + 566.IBPluginDependency + 567.IBPluginDependency + 573.IBPluginDependency + 574.IBPluginDependency + 575.IBPluginDependency + 576.IBPluginDependency + 577.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + {{742, 702}, {612, 664}} + com.apple.InterfaceBuilder.CocoaPlugin + {{742, 702}, {612, 664}} + + {{33, 99}, {480, 360}} + {3.40282e+38, 3.40282e+38} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCjAAAxBvAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAxD5AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB6AAAxBeAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDv4AAxBfAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDv4AAxA6AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCAAAAw8gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCAAAAxA6AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCAAAAxAaAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB4AAAw/oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCAAAAw+IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDvoAAxAEAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDvoAAw/IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDvgAAw9qAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1091, 1078}, {204, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDvgAAw8gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + P4AAAL+AAABBkAAAw8mAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABAwAAAw7gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDv4AAw6uAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDv4AAw5qAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABByAAAw3IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 582 + + + + YES + + AppController + NSObject + + YES + + YES + fontLabel + label1 + radio1 + radio2 + theTableView + theWindow + + + YES + id + id + id + id + id + NSWindow + + + + YES + + YES + fontLabel + label1 + radio1 + radio2 + theTableView + theWindow + + + YES + + fontLabel + id + + + label1 + id + + + radio1 + id + + + radio2 + id + + + theTableView + id + + + theWindow + NSWindow + + + + + IBUserSource + + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../adsfsdf.xcodeproj + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + NSSwitch + + + YES + {9, 8} + {7, 2} + {15, 15} + + + + diff --git a/Tests/Manual/FontEnhancementTest/Resources/spinner.gif b/Tests/Manual/FontEnhancementTest/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/FontEnhancementTest/Resources/spinner.gif differ diff --git a/Tests/Manual/FontEnhancementTest/index-debug.html b/Tests/Manual/FontEnhancementTest/index-debug.html new file mode 100644 index 000000000..52138da4a --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/index-debug.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + FontEnhancementTest + + + + + + + + + + + + + + + + + + + + + + JavaScript is required for this site to work correctly but is either disabled or not supported by your browser. + Show me how to enable JavaScript + You may want to upgrade to a newer browser while you're at it: + + Safari + Firefox + Chrome + Opera + Internet Explorer + + + + + + + + + diff --git a/Tests/Manual/FontEnhancementTest/index.html b/Tests/Manual/FontEnhancementTest/index.html new file mode 100644 index 000000000..6ce00e85e --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/index.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + FontEnhancementTest + + + + + + + + + + + + + + + + + + + + JavaScript is required for this site to work correctly but is either disabled or not supported by your browser. + Show me how to enable JavaScript + You may want to upgrade to a newer browser while you're at it: + + Safari + Firefox + Chrome + Opera + Internet Explorer + + + + + + + + + diff --git a/Tests/Manual/FontEnhancementTest/main.j b/Tests/Manual/FontEnhancementTest/main.j new file mode 100644 index 000000000..43bb72ba4 --- /dev/null +++ b/Tests/Manual/FontEnhancementTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * test + * + * Created by aparajita on March 9, 2011. + * Copyright 2011, Victory-Heart Productions All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tools/Jakefile b/Tools/Jakefile index e9e0f5fc9..e468d8c69 100644 --- a/Tools/Jakefile +++ b/Tools/Jakefile @@ -1,5 +1,7 @@ require("../common.jake"); -// nib2cib has to come before capp since capp uses nib2cib -subtasks(["nib2cib", "capp", "NativeHost"], ["build"/*, "clean", "clobber"*/]); +// nib2cib uses fontinfo and capp uses nib2cib +subtasks(["fontinfo", "nib2cib", "capp", "NativeHost"], ["build"/*, "clean", "clobber"*/]); + +subtasks(["fontinfo"], ["clean", "clobber"]); diff --git a/Tools/fontinfo/.gitignore b/Tools/fontinfo/.gitignore new file mode 100644 index 000000000..567609b12 --- /dev/null +++ b/Tools/fontinfo/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/Tools/fontinfo/Jakefile b/Tools/fontinfo/Jakefile new file mode 100644 index 000000000..de6d54f40 --- /dev/null +++ b/Tools/fontinfo/Jakefile @@ -0,0 +1,40 @@ + +require ("../../common.jake"); + +var OS = require("os"), + task = require("jake").task; + +task ("build", function() +{ + if (executableExists("xcodebuild")) + { + var args = "-alltargets -configuration " + $CONFIGURATION; + + if (FILE.exists(FILE.join("/", "Developer", "SDKs", "MacOSX10.5.sdk"))) + args = "-sdk macosx10.5 " + args; + + else + args = "-sdk macosx " + args; + + if (OS.system("xcodebuild " + args)) + OS.exit(1); + } + else + { + print("Building fontinfo requires Xcode."); + } +}); + +task ("clean", function() +{ + if (OS.system("xcodebuild clean")) + OS.exit(1); +}); + +task ("clobber", function() +{ + if (OS.system("xcodebuild clean")) + OS.exit(1); +}); + +task ("default", ["build"]); diff --git a/Tools/fontinfo/README b/Tools/fontinfo/README new file mode 100644 index 000000000..536622752 --- /dev/null +++ b/Tools/fontinfo/README @@ -0,0 +1,51 @@ +NAME + fontinfo -- retrieve information about a font + +SYNOPSIS + fontinfo [-n] font [size [string]] + +DESCRIPTION + fontinfo is a tiny utility that returns information about a font. + The font name must be a full PostScript name, not a display name. So you would use something + like "LucidaGrande-Bold", not "Lucida Grande Bold". The size can be any floating point number + greater than zero. If no size is given, it defaults to 12. + + If the -n option is passed, the output will not be terminated with a linefeed. + + If the string argument is passed, its width in the given font is measured and returned. + +EXIT STATUS + fontinfo exits with a return status of zero if there are no errors. + fontinfo exits with a return status of 1 if any arguments are invalid, or a status of 2 if the font + cannot be found. + +OUTPUT + fontinfo outputs a stringified JSON object with the following structure: + + { + familyName:, + bold:, + italic:, + ascender:, + descender:, + line-height: + width: + } + + If -n is not passed, the JSON is terminated with a linefeed. The fields of the object are as follows: + + familyName: The display name of the font's family + bold: Whether the font's stylistic traits are considered bold + italic: Whether the font's stylistic traits are considered italic + ascender: The offset from the baseline in points (not pixels!) of the longest ascender of the given font at + the given size. + descender: The negative offset from the baseline in points (not pixels!) + of the longest descender of the given font at the given size. + lineHeight: The height in points (not pixels!) of the largest glyph in the given font at the given size. + Note that glyphs include diacritical marks that may appear above and below the largest ascender + and descender, so the line height will almost always be greater than ascender + descender. + width: If a string is passed, the width in pixels of the string in the given font, otherwise zero + +AUTHORS + Aparajita Fishman, Victory-Heart Productions + http://www.aparajita.com diff --git a/Tools/fontinfo/fontinfo.m b/Tools/fontinfo/fontinfo.m new file mode 100644 index 000000000..6f281b43b --- /dev/null +++ b/Tools/fontinfo/fontinfo.m @@ -0,0 +1,114 @@ +/* + font_info + + Copyright 2010 Aparajita Fishman +*/ + +#import +#import + +#define resultFormat @"{\"familyName\":\"%@\", \"bold\":%@, \"italic\":%@, \"ascender\":%g, \"descender\":%g, \"lineHeight\":%g, \"width\":%g}" + +enum { + kErrInvalidArguments = 1, + kErrInvalidFontName +}; + + +int main(int argc, const char* argv[]) +{ + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + int exitCode = 0; + NSString* stringToMeasure = nil; + + // usage: fontinfo [-n] face [size [string]] + + if (argc >= 2) + { + BOOL appendLineFeed = YES; + int nextArgument = 1; + + if (argv[1][0] == '-') + { + if (argv[1][1] == 'n') + { + appendLineFeed = NO; + ++nextArgument; + } + else + exitCode = kErrInvalidArguments; + } + + if (exitCode == 0) + { + CGFloat fontSize = 12; + + NSString* fontName = [NSString stringWithUTF8String:argv[nextArgument++]]; + + if (argc > nextArgument) + fontSize = atof(argv[nextArgument++]); + + if (fontSize > 0.0) + { + NSFont* font = [NSFont fontWithName:fontName size:fontSize]; + + if (font) + { + if (argc > nextArgument) + stringToMeasure = [NSString stringWithUTF8String:argv[nextArgument]]; + + NSString* familyName = [font familyName]; + NSFontDescriptor* descriptor = [font fontDescriptor]; + NSFontSymbolicTraits traits = [descriptor symbolicTraits]; + BOOL isBold = traits & NSFontBoldTrait; + BOOL isItalic = traits & NSFontItalicTrait; + CGFloat ascender = [font ascender]; + CGFloat descender = [font descender]; + + NSLayoutManager* layout = [NSLayoutManager new]; + CGFloat lineHeight = [layout defaultLineHeightForFont:font]; + [layout release]; + + CGFloat width = 0.0; + + if (stringToMeasure) + { + NSDictionary* attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; + NSAttributedString* attrString = [[NSAttributedString alloc] initWithString:stringToMeasure attributes:attributes]; + + if (attrString) + width = [attrString size].width; + + [attrString release]; + } + + NSMutableString* result = [NSMutableString stringWithFormat:resultFormat, + familyName, + isBold ? @"true" : @"false", isItalic ? @"true" : @"false", + ascender, descender, lineHeight, + width]; + + if (appendLineFeed) + [result appendString:@"\n"]; + + printf("%s", [result UTF8String]); + } + else + { + exitCode = kErrInvalidFontName; + } + } + else + { + exitCode = kErrInvalidArguments; + } + } + } + else + { + exitCode = kErrInvalidArguments; + } + + [pool drain]; + return exitCode; +} diff --git a/Tools/fontinfo/fontinfo.xcodeproj/project.pbxproj b/Tools/fontinfo/fontinfo.xcodeproj/project.pbxproj new file mode 100644 index 000000000..9e523b2ac --- /dev/null +++ b/Tools/fontinfo/fontinfo.xcodeproj/project.pbxproj @@ -0,0 +1,223 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + E1C392BC133D513B0092D7CA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E1C392BB133D513B0092D7CA /* Cocoa.framework */; }; + E1D3CFAA12AFFB7F00CBB79E /* fontinfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* fontinfo.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 08FB7796FE84155DC02AAC07 /* fontinfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = fontinfo.m; sourceTree = ""; }; + 08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 32A70AAB03705E1F00C91783 /* fontinfo_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fontinfo_Prefix.pch; sourceTree = ""; }; + E11C89CC1277CECE0012609B /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + E18587D81279B93100FB6A47 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + E1C392BB133D513B0092D7CA /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + E1E20D0B12B09283005A6A64 /* fontinfo */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fontinfo; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E1D3CF6912AFEE3800CBB79E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E1C392BC133D513B0092D7CA /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* font_info */ = { + isa = PBXGroup; + children = ( + 08FB7795FE84155DC02AAC07 /* Source */, + E18587DD1279B93600FB6A47 /* Documentation */, + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = font_info; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 32A70AAB03705E1F00C91783 /* fontinfo_Prefix.pch */, + 08FB7796FE84155DC02AAC07 /* fontinfo.m */, + ); + name = Source; + sourceTree = ""; + }; + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 08FB779EFE84155DC02AAC07 /* Foundation.framework */, + E11C89CC1277CECE0012609B /* AppKit.framework */, + E1C392BB133D513B0092D7CA /* Cocoa.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + E1E20D0B12B09283005A6A64 /* fontinfo */, + ); + name = Products; + sourceTree = ""; + }; + E18587DD1279B93600FB6A47 /* Documentation */ = { + isa = PBXGroup; + children = ( + E18587D81279B93100FB6A47 /* README */, + ); + name = Documentation; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E1D3CF6A12AFEE3800CBB79E /* fontinfo */ = { + isa = PBXNativeTarget; + buildConfigurationList = E1D3CF6F12AFEE3B00CBB79E /* Build configuration list for PBXNativeTarget "fontinfo" */; + buildPhases = ( + E1D3CF6812AFEE3800CBB79E /* Sources */, + E1D3CF6912AFEE3800CBB79E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = fontinfo; + productName = font_info; + productReference = E1E20D0B12B09283005A6A64 /* fontinfo */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "fontinfo" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* font_info */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E1D3CF6A12AFEE3800CBB79E /* fontinfo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + E1D3CF6812AFEE3800CBB79E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E1D3CFAA12AFFB7F00CBB79E /* fontinfo.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB927908733DD40010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(NATIVE_ARCH_ACTUAL)"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; + CONFIGURATION_TEMP_DIR = "$(CAPP_BUILD)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = fontinfo_Prefix.pch; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + OBJROOT = "$(CAPP_BUILD)"; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = fontinfo; + SDKROOT = macosx10.5; + SYMROOT = "$(CAPP_BUILD)/Debug/CommonJS/cappuccino/bin"; + }; + name = Debug; + }; + 1DEB927A08733DD40010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(NATIVE_ARCH_ACTUAL)"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; + CONFIGURATION_TEMP_DIR = "$(CAPP_BUILD)"; + DEPLOYMENT_LOCATION = NO; + DEPLOYMENT_POSTPROCESSING = NO; + DSTROOT = "/tmp/$(PROJECT_NAME).dst"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INSTALL_PATH = ""; + OBJROOT = "$(CAPP_BUILD)"; + ONLY_ACTIVE_ARCH = NO; + PREBINDING = NO; + PRODUCT_NAME = fontinfo; + SDKROOT = macosx10.5; + SYMROOT = "$(CAPP_BUILD)/Release/CommonJS/cappuccino/bin"; + }; + name = Release; + }; + E1D3CF6D12AFEE3900CBB79E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + E1D3CF6E12AFEE3900CBB79E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + MACOSX_DEPLOYMENT_TARGET = 10.5; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "fontinfo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB927908733DD40010E9CD /* Debug */, + 1DEB927A08733DD40010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E1D3CF6F12AFEE3B00CBB79E /* Build configuration list for PBXNativeTarget "fontinfo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E1D3CF6D12AFEE3900CBB79E /* Debug */, + E1D3CF6E12AFEE3900CBB79E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/Tools/fontinfo/fontinfo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Tools/fontinfo/fontinfo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..a3fe95833 --- /dev/null +++ b/Tools/fontinfo/fontinfo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Tools/fontinfo/fontinfo_Prefix.pch b/Tools/fontinfo/fontinfo_Prefix.pch new file mode 100644 index 000000000..8a571c50e --- /dev/null +++ b/Tools/fontinfo/fontinfo_Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the 'font_info' target in the 'font_info' project. +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/Tools/nib2cib/Converter+Mac.j b/Tools/nib2cib/Converter+Mac.j index ccf3d71c2..581f12686 100644 --- a/Tools/nib2cib/Converter+Mac.j +++ b/Tools/nib2cib/Converter+Mac.j @@ -23,25 +23,25 @@ @import "Converter.j" - @implementation Converter (Mac) - (void)convertedDataFromMacData:(CPData)data resourcesPath:(CPString)aResourcesPath { // Unarchive the NS data var unarchiver = [[Nib2CibKeyedUnarchiver alloc] initForReadingWithData:data resourcesPath:aResourcesPath], - objectData = [unarchiver decodeObjectForKey:@"IB.objectdata"]; - - // Perform a bit of post-processing on views since all CP views are flipped. - // It's better to do this here (instead of say, in NSView::initWithCoder:), - // because at this point all the objects an mappings are stabilized. - var objects = [unarchiver allObjects], + objectData = [unarchiver decodeObjectForKey:@"IB.objectdata"], + objects = [unarchiver allObjects], count = [objects count]; + // Perform a bit of post-processing on fonts and views since all CP views are flipped. + // It's better to do this here (instead of say, in NSView::initWithCoder:), + // because at this point all the objects and mappings are stabilized. while (count--) { var object = objects[count]; + [self replaceFontForObject:object]; + if (![object isKindOfClass:[CPView class]]) continue; @@ -76,20 +76,82 @@ var convertedData = [CPData data], archiver = [[CPKeyedArchiver alloc] initForWritingWithMutableData:convertedData]; - [archiver setDelegate:self]; [archiver encodeObject:objectData forKey:@"CPCibObjectDataKey"]; [archiver finishEncoding]; return convertedData; } -// For some reason, occasionally an attempt is made to archive NSMatrix. That will fail, so prevent it here. -- (id)archiver:(CPKeyedArchiver)archiver willEncodeObject:(id)object +- (void)replaceFontForObject:(id)object { - if ([object isKindOfClass:[NSMatrix class]]) - return nil; + if ([object respondsToSelector:@selector(font)] && + [object respondsToSelector:@selector(setFont:)]) + { + var nibFont = [object font]; + + if (nibFont) + [self replaceFont:nibFont forObject:object]; + } + else if ([object isKindOfClass:[CPView class]]) + { + /* + Determine if a view is actually a container for radio buttons. + They have to be manually iterated over because they are not + part of the top level object data. + */ + var subviews = [object subviews], + count = [subviews count]; + + if (count && [subviews[0] isKindOfClass:[CPRadio class]]) + { + while (count--) + { + var radio = subviews[count]; + + [self replaceFont:[radio font] forObject:radio]; + } + } + } +} + +- (void)replaceFont:(CPFont)nibFont forObject:(id)object +{ + var cibFont = nil; + + if ([object respondsToSelector:@selector(cibFontForNibFont)]) + cibFont = [object cibFontForNibFont]; else - return object; + cibFont = [NSFont cibFontForNibFont:[object font]]; + + if (!cibFont || ![cibFont isEqual:nibFont]) + { + var source = ""; + + // nil cibFont means try to use theme font + if (!cibFont) + { + var bold = [nibFont isBold]; + + cibFont = [theme valueForAttributeWithName:@"font" inState:[object themeState] forClass:[object class]]; + + // Substitute legacy theme fonts for the current system font + if (!cibFont || [cibFont familyName] === CPFontDefaultSystemFontFace) + { + var size = [cibFont size] || CPFontDefaultSystemFontSize, + bold = cibFont ? [cibFont isBold] : bold; + + if (size === CPFontDefaultSystemFontSize) + size = [CPFont systemFontSize]; + + cibFont = bold ? [CPFont boldSystemFontOfSize:size] : [CPFont systemFontOfSize:size]; + source = " (from theme)" + } + } + + [object setFont:cibFont]; + + CPLog.debug("%s: substituted <%s>%s for <%fpx %s>", [object className], cibFont ? [cibFont cssString] : "theme default", source, [nibFont size], [nibFont familyName]); + } } @end diff --git a/Tools/nib2cib/Converter.j b/Tools/nib2cib/Converter.j index edf1780de..f8f747e38 100644 --- a/Tools/nib2cib/Converter.j +++ b/Tools/nib2cib/Converter.j @@ -18,113 +18,142 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ +*/ -@import -@import +@import +@import +@import var FILE = require("file"), - OS = require("os"); + OS = require("os"), + SharedConverter = nil; -NibFormatUndetermined = 0, -NibFormatMac = 1, -NibFormatIPhone = 2; +NibFormatUndetermined = 0, +NibFormatMac = 1, +NibFormatIPhone = 2; -ConverterConversionException = @"ConverterConversionException"; +ConverterModeLegacy = 0; +ConverterModeNew = 1; + +ConverterConversionException = @"ConverterConversionException"; @implementation Converter : CPObject { - NibFormat format @accessors; - CPString inputPath @accessors; - CPString outputPath @accessors; - CPString resourcesPath @accessors; + CPString inputPath @accessors(readonly); + CPString outputPath @accessors; + CPString resourcesPath @accessors; + NibFormat format @accessors(readonly); + CPTheme theme @accessors(readonly); } -- (id)init ++ (Converter)sharedConverter +{ + if (!SharedConverter) + SharedConverter = [[Converter alloc] init]; + + return SharedConverter; +} + +- (id)initWithInputPath:(CPString)aPath format:(NibFormat)nibFormat theme:(CPTheme)aTheme { self = [super init]; if (self) - [self setFormat:NibFormatUndetermined]; + { + inputPath = aPath; + format = nibFormat; + theme = aTheme; + } return self; } - (void)convert { - try + if ([resourcesPath length] && !FILE.isReadable(resourcesPath)) + [CPException raise:ConverterConversionException reason:@"Could not read Resources at path \"" + resourcesPath + "\""]; + + var inferredFormat = format; + + if (inferredFormat === NibFormatUndetermined) { - if ([resourcesPath length] && !FILE.isReadable(resourcesPath)) - [CPException raise:ConverterConversionException reason:@"Could not read Resources at path \"" + resourcesPath + "\""]; + // Assume its a Mac file. + inferredFormat = NibFormatMac; - var inferredFormat = format; - - if (inferredFormat === NibFormatUndetermined) - { - // Assume its a Mac file. - inferredFormat = NibFormatMac; - - // Some .xibs are iPhone nibs, check the actual contents in this case. - if (FILE.extension(inputPath) !== ".nib" && FILE.isFile(inputPath) && - FILE.read(inputPath, { charset:"UTF-8" }).indexOf("\s*CF\$UID\s*\<\/key\>/g, "CP$UID"); - if (system.engine === "rhino") - plistContents = String(java.lang.String(plistContents).replaceAll("\\\\s*CF\\$UID\\s*\\<\/key\\>", "CP\\$UID")); - else - plistContents = plistContents.replace(/\\s*CF\$UID\s*\<\/key\>/g, "CP$UID"); + if (!FILE.isReadable(temporaryPlistFilePath)) + [CPException raise:ConverterConversionException reason:@"Unable to convert nib file."]; - plistContents = plistContents.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]<\/string>/g, function(c) { - CPLog.warn("Warning: Converting character 0x"+c.charCodeAt(8).toString(16)+" to base64 representation"); - return ""+CFData.encodeBase64String(c.charAt(8))+""; - }); + var plistContents = FILE.read(temporaryPlistFilePath, { charset:"UTF-8" }); + + // Minor NS keyed archive to CP keyed archive conversion. + // Use Java directly because rhino's string.replace is *so slow*. 4 seconds vs. 1 millisecond. + // plistContents = plistContents.replace(/\\s*CF\$UID\s*\<\/key\>/g, "CP$UID"); + if (system.engine === "rhino") + plistContents = String(java.lang.String(plistContents).replaceAll("\\\\s*CF\\$UID\\s*\\<\/key\\>", "CP\\$UID")); + else + plistContents = plistContents.replace(/\\s*CF\$UID\s*\<\/key\>/g, "CP$UID"); + + plistContents = plistContents.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]<\/string>/g, function(c) + { + CPLog.warn("Warning: converting character 0x" + c.charCodeAt(8).toString(16) + " to base64 representation"); + return ""+CFData.encodeBase64String(c.charAt(8))+""; + }); + } + finally + { + if (temporaryNibFilePath !== "" && FILE.isWritable(temporaryNibFilePath)) + FILE.remove(temporaryNibFilePath); + + if (temporaryPlistFilePath !== "" && FILE.isWritable(temporaryPlistFilePath)) + FILE.remove(temporaryPlistFilePath); + } return [CPData dataWithRawString:plistContents]; } diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index 1d9b3aa28..1003a954e 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -83,7 +83,7 @@ function CP_NSMapClassName(aClassName) if (CPClassFromString(mappedClassName)) { - CPLog.info("Mapping " + aClassName + " to " + mappedClassName); + CPLog.debug("NSAppKit: mapping " + aClassName + " to " + mappedClassName); return mappedClassName; } diff --git a/Tools/nib2cib/NSButton.j b/Tools/nib2cib/NSButton.j index 5008f9095..7a1c5ac4f 100644 --- a/Tools/nib2cib/NSButton.j +++ b/Tools/nib2cib/NSButton.j @@ -32,6 +32,7 @@ var _CPButtonBezelStyleHeights = {}; + _CPButtonBezelStyleHeights[CPRoundedBezelStyle] = 18; _CPButtonBezelStyleHeights[CPTexturedRoundedBezelStyle] = 20; _CPButtonBezelStyleHeights[CPHUDBezelStyle] = 20; @@ -117,18 +118,18 @@ var NSButtonIsBorderedMask = 0x00800000, case CPHelpButtonBezelStyle: case CPCircularBezelStyle: case CPDisclosureBezelStyle: - CPLog.warn("Unsupported bezel style: " + _bezelStyle); + CPLog.warn("NSButton [%s]: unsupported bezel style: %d", _title == null ? "" : '"' + _title + '"', _bezelStyle); _bezelStyle = CPHUDBezelStyle; break; // error: default: - CPLog.error("Unknown bezel style: " + _bezelStyle); + CPLog.warn("NSButton [%s]: unknown bezel style: %d", _title == null ? "" : '"' + _title + '"', _bezelStyle); _bezelStyle = CPHUDBezelStyle; } if ([cell isBordered]) { - CPLog.info("Adjusting CPButton height from " +_frame.size.height+ " / " + _bounds.size.height+" to " + CPButtonDefaultHeight); + CPLog.debug("NSButton [%s]: adjusting height from %d to %d", _title == null ? "" : '"' + _title + '"', _frame.size.height, CPButtonDefaultHeight); _frame.size.height = CPButtonDefaultHeight; _frame.origin.y += 4.0; _bounds.size.height = CPButtonDefaultHeight; diff --git a/Tools/nib2cib/NSColor.j b/Tools/nib2cib/NSColor.j index fb71f241a..1023d96d0 100644 --- a/Tools/nib2cib/NSColor.j +++ b/Tools/nib2cib/NSColor.j @@ -119,7 +119,7 @@ var NSUnknownColorSpaceModel = -1, } break; default: - CPLog(@"-[%@ %s] unknown color space %d", isa, _cmd, colorSpace); + CPLog.warn(@"-[%@ %s] unknown color space %d", isa, _cmd, colorSpace); result = [CPColor blackColor]; break; } diff --git a/Tools/nib2cib/NSCustomResource.j b/Tools/nib2cib/NSCustomResource.j index 3a108ac0c..46afc017c 100644 --- a/Tools/nib2cib/NSCustomResource.j +++ b/Tools/nib2cib/NSCustomResource.j @@ -41,13 +41,13 @@ var FILE = require("file"); var size = CGSizeMakeZero(); if (![[aCoder resourcesPath] length]) - CPLog.warn("*** WARNING: Resources found in nib, but no resources path specified with -R option."); + CPLog.warn("Resources found in nib, but no resources path specified with -R option."); else { var resourcePath = [aCoder resourcePathForName:_resourceName]; if (!resourcePath) - CPLog.warn("*** WARNING: Resource named " + _resourceName + " not found in supplied resources path."); + CPLog.warn("Resource named " + _resourceName + " not found in the supplied resources path."); else size = imageSize(FILE.join(FILE.cwd(), resourcePath)); diff --git a/Tools/nib2cib/NSFont.j b/Tools/nib2cib/NSFont.j index a08990d11..cb26ca353 100644 --- a/Tools/nib2cib/NSFont.j +++ b/Tools/nib2cib/NSFont.j @@ -22,35 +22,56 @@ @import +var OS = require("os"), + fontinfo = require("cappuccino/fontinfo").fontinfo; + +var IBDefaultFontFace = @"Lucida Grande", + IBDefaultFontSize = 13.0; @implementation CPFont (NSCoding) - (id)NS_initWithCoder:(CPCoder)aCoder { - var isBold = NO, - fontName = [aCoder decodeObjectForKey:@"NSName"], - size = [aCoder decodeDoubleForKey:@"NSSize"]; + var name = [aCoder decodeObjectForKey:@"NSName"], + size = [aCoder decodeDoubleForKey:@"NSSize"], + isBold = false, + isItalic = false, + info = fontinfo(name, size); - if (fontName === "LucidaGrande" && size === 13) + if (info) { - CPLog.debug("Removing default IB font: <"+fontName+", "+size+"> for theme default font."); - return nil; + name = info.familyName; + isBold = info.bold; + isItalic = info.italic; } - // FIXME: Is this alwasy true? - if (fontName.indexOf("-Bold") === fontName.length - "-Bold".length) - isBold = YES; - - if (fontName === "LucidaGrande" || fontName === "LucidaGrande-Bold") - fontName = "Arial"; - - return [self _initWithName:fontName size:size bold:isBold]; + return [self _initWithName:name size:size bold:isBold italic:isItalic]; } @end @implementation NSFont : CPFont + ++ (void)initialize { + CPLog.debug("NSFont: default IB font: %s %f", IBDefaultFontFace, IBDefaultFontSize); +} + ++ (id)cibFontForNibFont:(CPFont)aFont +{ + var name = [aFont familyName]; + + if (name === IBDefaultFontFace) + { + var size = [aFont size]; + + if (size === IBDefaultFontSize) + return nil; + else + return [[CPFont alloc] _initWithName:[CPFont systemFontFace] size:size bold:[aFont isBold] italic:[aFont isItalic]]; + } + + return [aFont copy]; } - (id)initWithCoder:(CPCoder)aCoder diff --git a/Tools/nib2cib/NSIBObjectData.j b/Tools/nib2cib/NSIBObjectData.j index 6ac46a872..94c2c7025 100644 --- a/Tools/nib2cib/NSIBObjectData.j +++ b/Tools/nib2cib/NSIBObjectData.j @@ -127,7 +127,7 @@ children.forEach(function(aChild) { - CPLog.info("Promoted " + aChild + " to child of " + parent); + CPLog.debug("NSIBObjectData: promoted " + aChild + " to child of " + parent); _objectsKeys.push(aChild); _objectsValues.push(parent); }); diff --git a/Tools/nib2cib/NSMatrix.j b/Tools/nib2cib/NSMatrix.j index 100c66277..a71e3ef98 100644 --- a/Tools/nib2cib/NSMatrix.j +++ b/Tools/nib2cib/NSMatrix.j @@ -1,3 +1,24 @@ +/* + * NSMatrix.j + * nib2cib + * + * Created by Francisco Tolmasky. + * Copyright 2008, 280 North, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ @import @import @@ -9,61 +30,94 @@ var NSMatrixRadioModeMask = 0x40000000, NSMatrixDrawsBackgroundMask = 0x01000000; -@implementation NSMatrix : CPObject -{ -} +@implementation NSMatrix : CPView - (id)initWithCoder:(CPCoder)aCoder { - var view = [[CPView alloc] NS_initWithCoder:aCoder]; + return [self NS_initWithCoder:aCoder]; +} - var numberOfRows = [aCoder decodeIntForKey:@"NSNumRows"], - numberOfColumns = [aCoder decodeIntForKey:@"NSNumCols"], - cellSize = [aCoder decodeSizeForKey:@"NSCellSize"], - intercellSpacing = [aCoder decodeSizeForKey:@"NSIntercellSpacing"], - flags = [aCoder decodeIntForKey:@"NSMatrixFlags"], - isRadioMode = flags & NSMatrixRadioModeMask, - drawsBackground = flags & NSMatrixDrawsBackgroundMask, - backgroundColor = [aCoder decodeObjectForKey:@"NSBackgroundColor"], - cells = [aCoder decodeObjectForKey:@"NSCells"], - selectedCell = [aCoder decodeObjectForKey:@"NSSelectedCell"]; +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super NS_initWithCoder:aCoder]; - if (isRadioMode) + if (self) { - var radioGroup = [CPRadioGroup new], - frame = CGRectMake(0.0, 0.0, cellSize.width, cellSize.height); + var numberOfRows = [aCoder decodeIntForKey:@"NSNumRows"], + numberOfColumns = [aCoder decodeIntForKey:@"NSNumCols"], + cellSize = [aCoder decodeSizeForKey:@"NSCellSize"], + intercellSpacing = [aCoder decodeSizeForKey:@"NSIntercellSpacing"], + flags = [aCoder decodeIntForKey:@"NSMatrixFlags"], + isRadioMode = flags & NSMatrixRadioModeMask, + drawsBackground = flags & NSMatrixDrawsBackgroundMask, + backgroundColor = [aCoder decodeObjectForKey:@"NSBackgroundColor"], + cells = [aCoder decodeObjectForKey:@"NSCells"], + selectedCell = [aCoder decodeObjectForKey:@"NSSelectedCell"]; - for (var rowIndex = 0; rowIndex < numberOfRows; ++rowIndex) + if (isRadioMode) { - frame.origin.x = 0; + var radioGroup = [CPRadioGroup new], + frame = CGRectMake(0.0, 0.0, cellSize.width, cellSize.height); - for (var columnIndex = 0; columnIndex < numberOfColumns; ++columnIndex) + for (var rowIndex = 0; rowIndex < numberOfRows; ++rowIndex) { - var cell = cells[rowIndex * numberOfColumns + columnIndex], - cellView = [[CPRadio alloc] initWithFrame:frame radioGroup:radioGroup]; + frame.origin.x = 0; - [cellView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; - [cellView setTitle:[cell title]]; - [cellView setBackgroundColor:[CPColor clearColor]]; // the IB default - [cellView setObjectValue:[cell objectValue]]; + for (var columnIndex = 0; columnIndex < numberOfColumns; ++columnIndex) + { + var cell = cells[rowIndex * numberOfColumns + columnIndex], + cellView = [[CPRadio alloc] initWithFrame:frame radioGroup:radioGroup cell:cell]; - [view addSubview:cellView]; + [self addSubview:cellView]; - NIB_CONNECTION_EQUIVALENCY_TABLE[[cell UID]] = cellView; + NIB_CONNECTION_EQUIVALENCY_TABLE[[cell UID]] = cellView; - frame.origin.x = CGRectGetMaxX(frame) + intercellSpacing.width; + frame.origin.x = CGRectGetMaxX(frame) + intercellSpacing.width; + } + + frame.origin.y = CGRectGetMaxY(frame) + intercellSpacing.height; } - frame.origin.y = CGRectGetMaxY(frame) + intercellSpacing.height; + if (drawsBackground) + [self setBackgroundColor:backgroundColor]; + + self.isa = [CPView class]; + } + else + { + // Non-radio group NSMatrix is not supported + self = nil; } - - if (drawsBackground) - [view setBackgroundColor:backgroundColor]; - - NIB_CONNECTION_EQUIVALENCY_TABLE[[self UID]] = view; } - return view; + return self; +} + +@end + +@implementation CPRadio (NS) + +- (id)initWithFrame:(CGRect)aFrame radioGroup:(CPRadioGroup)aRadioGroup cell:(NSButtonCell)aCell +{ + self = [self initWithFrame:aFrame radioGroup:aRadioGroup]; + + if (self) + { + [self setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [self setTitle:[aCell title]]; + [self setBackgroundColor:[CPColor clearColor]]; // the IB default + [self setFont:[aCell font]]; + [self setAlignment:[aCell alignment]]; + [self setLineBreakMode:[aCell lineBreakMode]]; + [self setImagePosition:[aCell imagePosition]]; + [self setKeyEquivalent:[aCell keyEquivalent]]; + [self setKeyEquivalentModifierMask:[aCell keyEquivalentModifierMask]]; + [self setAllowsMixedState:[aCell allowsMixedState]]; + [self setObjectValue:[aCell objectValue]]; + [self setEnabled:[aCell isEnabled]]; + } + + return self; } @end diff --git a/Tools/nib2cib/NSNibConnector.j b/Tools/nib2cib/NSNibConnector.j index 67aca8c7f..04bb9c7ee 100644 --- a/Tools/nib2cib/NSNibConnector.j +++ b/Tools/nib2cib/NSNibConnector.j @@ -43,17 +43,17 @@ NIB_CONNECTION_EQUIVALENCY_TABLE = {}; if (sourceUID in NIB_CONNECTION_EQUIVALENCY_TABLE) { - CPLog.trace("Swapped object: "+_source+" for object: "+NIB_CONNECTION_EQUIVALENCY_TABLE[sourceUID]); + CPLog.debug("NSNibConnector: swapped object: " + _source + " for object: " + NIB_CONNECTION_EQUIVALENCY_TABLE[sourceUID]); _source = NIB_CONNECTION_EQUIVALENCY_TABLE[sourceUID]; } if (destinationUID in NIB_CONNECTION_EQUIVALENCY_TABLE) { - CPLog.trace("Swapped object: "+_destination+" for object: "+NIB_CONNECTION_EQUIVALENCY_TABLE[destinationUID]); + CPLog.debug("NSNibConnector: swapped object: " + _destination + " for object: " + NIB_CONNECTION_EQUIVALENCY_TABLE[destinationUID]); _destination = NIB_CONNECTION_EQUIVALENCY_TABLE[destinationUID]; } - CPLog.debug(@"Connection: " + [_source description] + " " + [_destination description] + " " + _label); + CPLog.debug(@"NSNibConnector: connection: " + [_source description] + " " + [_destination description] + " " + _label); } return self; @@ -144,7 +144,7 @@ var NSTramsformers = [CPSet setWithObjects: [_options setObject:NSValue forKey:CPKey]; } - CPLog.debug(@"Binding Connector: " + [_binding description] + " to: " + _destination + " " + [_keyPath description] + " " + [_options description]); + CPLog.debug(@"NSNibConnector: binding connector: " + [_binding description] + " to: " + _destination + " " + [_keyPath description] + " " + [_options description]); } return self; diff --git a/Tools/nib2cib/NSTabView.j b/Tools/nib2cib/NSTabView.j index d47b61cd1..920cee8f9 100644 --- a/Tools/nib2cib/NSTabView.j +++ b/Tools/nib2cib/NSTabView.j @@ -37,6 +37,7 @@ _items = [aCoder decodeObjectForKey:@"NSTabViewItems"]; _selectedIndex = [_items indexOfObject:[aCoder decodeObjectForKey:@"NSSelectedTabViewItem"]]; + _font = [aCoder decodeObjectForKey:@"NSFont"]; //_delegate = [aCoder decodeObjectForKey:@""]; diff --git a/Tools/nib2cib/NSTableColumn.j b/Tools/nib2cib/NSTableColumn.j index 7791446a6..785227901 100644 --- a/Tools/nib2cib/NSTableColumn.j +++ b/Tools/nib2cib/NSTableColumn.j @@ -45,26 +45,29 @@ else { _dataView = [[CPTextField alloc] initWithFrame:CPRectMakeZero()]; - + var font = [dataViewCell font], selectedFont = nil; - + + if (font) + font = [NSFont cibFontForNibFont:font]; + if (!font) - font = [CPFont systemFontOfSize:12.0]; - + font = [CPFont systemFontOfSize:[CPFont systemFontSize]]; + var selectedFont = [CPFont boldFontWithName:[font familyName] size:[font size]]; - + [_dataView setFont:font]; [_dataView setValue:selectedFont forThemeAttribute:@"font" inState:CPThemeStateSelectedDataView]; - + [_dataView setLineBreakMode:CPLineBreakByTruncatingTail]; [_dataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; [_dataView setValue:CGInsetMake(0.0, 5.0, 0.0, 5.0) forThemeAttribute:@"content-inset"]; - + var textColor = [dataViewCell textColor], defaultColor = [_dataView currentValueForThemeAttribute:@"text-color"]; - + // Don't change the text color if it is not the default, that messes up the theme lookups later if (![textColor isEqual:defaultColor]) [_dataView setTextColor:[dataViewCell textColor]]; diff --git a/Tools/nib2cib/NSTextField.j b/Tools/nib2cib/NSTextField.j index d4dea04fa..732ddf429 100644 --- a/Tools/nib2cib/NSTextField.j +++ b/Tools/nib2cib/NSTextField.j @@ -72,7 +72,7 @@ [self setFrameSize:CGSizeMake(frame.size.width + 7.0, frame.size.height + 7.0)]; } - CPLog.debug([self stringValue] + " => isBordered=" + [self isBordered] + ", isBezeled=" + [self isBezeled] + ", bezelStyle=" + [self bezelStyle] + "("+[cell stringValue]+", " + [cell placeholderString] + ")"); + CPLog.debug("NSTextField: title=\"" + [self stringValue] + "\", placeholder=" + ([cell placeholderString] == null ? "" : '"' + [cell placeholderString] + '"') + ", isBordered=" + [self isBordered] + ", isBezeled=" + [self isBezeled] + ", bezelStyle=" + [self bezelStyle]); } return self; diff --git a/Tools/nib2cib/NSView.j b/Tools/nib2cib/NSView.j index da27b7dce..25b86fcdd 100644 --- a/Tools/nib2cib/NSView.j +++ b/Tools/nib2cib/NSView.j @@ -84,8 +84,6 @@ var NSViewAutoresizingMask = 0x3F, @end @implementation NSView : CPView -{ -} - (id)initWithCoder:(CPCoder)aCoder { diff --git a/Tools/nib2cib/main.j b/Tools/nib2cib/main.j index 96cdc83c2..098117cf2 100644 --- a/Tools/nib2cib/main.j +++ b/Tools/nib2cib/main.j @@ -18,11 +18,11 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ +*/ @import - -@import +@import +@import @import "NSFoundation.j" @import "NSAppKit.j" @@ -30,39 +30,266 @@ @import "Nib2CibKeyedUnarchiver.j" @import "Converter.j" -var FILE = require("file"); -var OS = require("os"); +var FILE = require("file"), + OS = require("os"), + SYS = require("system"), + FileList = require("jake").FileList, + stream = require("narwhal/term").stream, -var parser = new (require("narwhal/args").Parser)(); + DefaultTheme = "Aristo", + BuildTypes = ["Debug", "Release"], + DefaultXibFile = "MainMenu.xib"; -parser.usage("INPUT_FILE [OUTPUT_FILE]"); +var parser = new (require("narwhal/args").Parser)(), + nibInfo = {}; -parser.option("-F", "framework", "frameworks") - .push() - .help("Add a framework to load"); -parser.option("-R", "resources") - .set() - .help("Set the Resources directory"); +function main(args) +{ + try + { + var options = parseOptions(args); -parser.option("--mac", "format") - .set(NibFormatMac) - .def(NibFormatUndetermined) - .help("Set format to Mac"); + if (options.watch) + watch(options); + else + convert(options); + } + catch (anException) + { + CPLog.fatal([anException reason]); + OS.exit(1); + } +} -// parser.option("--iphone", "format") -// .set(NibFormatIPhone) -// .help("Set format to iPhone"); +function convert(options, inputFile) +{ + try + { + inputFile = inputFile || getInputFile(options.args); -parser.option("-v", "--verbose", "verbose") - .inc() - .help("Increase verbosity level"); + var outputFile = getOutputFile(inputFile, options.args), + resourcesPath = ""; -parser.option("-q", "--quiet", "quiet") - .set(true) - .help("No output"); + if (options.resources) + { + resourcesPath = FILE.canonical(options.resources); -parser.helpful(); + if (!FILE.isDirectory(resourcesPath) || !FILE.isReadable(resourcesPath)) + fail("Cannot read resources at: " + resourcesPath); + } + + var configPath = setSystemFontAndSize(options.configFile || "", inputFile), + themeName = "", + themeDir = options.themeDir || ""; + + if (themeDir) + themeName = FILE.basename(themeDir, FILE.extension(themeDir)); + + themeName = themeName || getDefaultThemeName(); + + if (!themeName) + fail("Could not determine the theme name."); + + var theme = loadTheme(themeName, themeDir); + + CPLog.info("\n-------------------------------------------------------------"); + CPLog.info("Input : " + inputFile); + CPLog.info("Output : " + outputFile); + CPLog.info("Format : " + ["Auto", "Mac", "iPhone"][options.format]); + CPLog.info("Resources : " + resourcesPath); + CPLog.info("Frameworks : " + (options.frameworks || "")); + CPLog.info("Theme : " + themeName); + CPLog.info("Config file : " + (configPath || "")); + CPLog.info("System Font : " + [CPFont systemFontSize] + "px " + [CPFont systemFontFace]); + CPLog.info("-------------------------------------------------------------\n"); + + var converter = [[Converter alloc] initWithInputPath:inputFile + format:options.format + theme:theme]; + + [converter setOutputPath:outputFile]; + [converter setResourcesPath:resourcesPath]; + + loadFrameworks(options.frameworks, function() + { + [converter convert]; + }); + + return true; + } + catch (anException) + { + CPLog.fatal([anException reason]); + return false; + } +} + +function watch(options) +{ + var verbosity = options.quiet ? -1 : options.verbosity, + directory = options.args[0]; + + if (!directory) + directory = FILE.isDirectory("Resources") ? "Resources" : "."; + + directory = FILE.canonical(directory); + + if (!FILE.isDirectory(directory)) + fail("Cannot find the directory: " + directory); + + // Turn on info messages + setLogLevel(1); + + CPLog.info("Watching: " + CPLogColorize(directory, "debug")); + CPLog.info("Press Control-C to stop..."); + + while (true) + { + var modifiedNibs = getModifiedNibs(directory); + + for (var i = 0; i < modifiedNibs.length; ++i) + { + var action = modifiedNibs[i][0], + path = modifiedNibs[i][1], + label = action === "add" ? "Added:" : "Modified:", + level = action === "add" ? "info" : "debug"; + + CPLog.info(">> %s %s", CPLogColorize(label, level), path); + + // Let the converter log however the user configured it + setLogLevel(verbosity); + + var success = convert(options, path); + + setLogLevel(1); + + if (success) + { + if (verbosity > 0) + stream.print(); + else + CPLog.warn("Conversion successful"); + } + } + + OS.sleep(1); + } +} + +function parseOptions(args) +{ + parser.usage("[--watch DIRECTORY] [INPUT_FILE [OUTPUT_FILE]]"); + + parser.option("--watch", "watch") + .set(true) + .help("Ask nib2cib to watch a directory for changes"); + + parser.option("-F", "framework", "frameworks") + .push() + .help("Add a framework to load"); + + parser.option("-R", "resources") + .set() + .help("Set the Resources directory"); + + parser.option("--mac", "format") + .set(NibFormatMac) + .def(NibFormatUndetermined) + .help("Set format to Mac"); + + parser.option("-t", "--theme-dir", "themeDir") + .set() + .help("A .build directory to use for theme attribute values"); + + parser.option("--config", "configFile") + .set() + .help("A path to an Info.plist file from which the system font and/or size can be retrieved"); + + // parser.option("--iphone", "format") + // .set(NibFormatIPhone) + // .help("Set format to iPhone"); + + parser.option("-v", "--verbose", "verbosity") + .inc() + .help("Increase verbosity level"); + + parser.option("-q", "--quiet", "quiet") + .set(true) + .help("No output"); + + parser.option("--version", "showVersion") + .action(printVersionAndExit) + .help("Show the version of nib2cib and quit"); + + parser.helpful(); + + var options = parser.parse(args, null, null, true); + + if (options.args.length > 2) + { + parser.printUsage(options); + OS.exit(0); + } + + setLogLevel(options.quiet ? -1 : options.verbosity); + + if (!options.quiet && options.verbosity > 0) + printVersion(); + + return options; +} + +function setLogLevel(level) +{ + CPLogUnregister(CPLogPrint); + + if (level === 0) + CPLogRegister(CPLogPrint, "warn", logFormatter); + else if (level === 1) + CPLogRegister(CPLogPrint, "info", logFormatter); + else if (level > 1) + CPLogRegister(CPLogPrint, null, logFormatter); +} + +function getInputFile(args) +{ + var inputFile = args[0] || DefaultXibFile; + + if (!/^.+\.xib$/.test(inputFile)) + inputFile += ".xib"; + + inputFile = FILE.canonical(inputFile); + + if (!FILE.exists(inputFile) && FILE.basename(FILE.dirname(inputFile)) !== "Resources") + if (FILE.isDirectory("Resources")) + inputFile = FILE.resolve(inputFile, FILE.join("Resources", FILE.basename(inputFile))); + + if (!FILE.isReadable(inputFile)) + fail("Cannot read the input file: " + inputFile); + + return inputFile; +} + +function getOutputFile(inputFile, args) +{ + var outputFile = null; + + if (args.length > 1) + outputFile = args[1]; + else + outputFile = FILE.basename(inputFile, FILE.extension(inputFile)); + + if (!/^.+\.cib$/.test(outputFile)) + outputFile += ".cib"; + + outputFile = FILE.resolve(inputFile, outputFile); + + if (!FILE.isWritable(FILE.dirname(outputFile))) + fail("Cannot write the output file at: " + outputFile); + + return outputFile; +} function loadFrameworks(frameworkPaths, aCallback) { @@ -71,7 +298,7 @@ function loadFrameworks(frameworkPaths, aCallback) frameworkPaths.forEach(function(aFrameworkPath) { - print("Loading " + aFrameworkPath); + CPLog.info("Loading " + aFrameworkPath); var frameworkBundle = [[CPBundle alloc] initWithPath:aFrameworkPath]; @@ -83,44 +310,255 @@ function loadFrameworks(frameworkPaths, aCallback) aCallback(); } -function main(args) +function logFormatter(aString, aLevel, aTitle) { - var options = parser.parse(args, null, null, true); + if (aLevel === "info") + return aString; + else + return CPLogColorize(aString, aLevel); +} - if (options.args.length < 1 || options.args.length > 2) +function getDefaultThemeName() +{ + var themeName = nil, + cappBuild = SYS.env["CAPP_BUILD"]; + + if (cappBuild) { - parser.printUsage(options); - OS.exit(1); + for (var i = 0; i < BuildTypes.length; ++i) + { + var path = FILE.join(cappBuild, BuildTypes[i], "AppKit", "Info.plist"); + themeName = themeNameFromPropertyList(path); + + if (themeName) + break; + } } - if (options.quiet) {} - else if (options.verbose === 0) - CPLogRegister(CPLogPrint, "warn"); - else if (options.verbose === 1) - CPLogRegister(CPLogPrint, "info"); - else - CPLogRegister(CPLogPrint); - - CPLog.debug("Input: " + options.args[0]); - CPLog.debug("Output: " + (options.args[1] || "")); - CPLog.debug("Format: " + ["Auto","Mac","iPhone"][options.format]); - CPLog.debug("Resources: " + (options.resources || "")); - CPLog.debug("Frameworks: " + options.frameworks); - - var converter = [[Converter alloc] init]; - - if (options.resources) - [converter setResourcesPath:options.resources]; - - [converter setFormat:options.format]; - - [converter setInputPath:options.args[0]]; - - if (options.args.length > 1) - [converter setOutputPath:options.args[1]]; - - loadFrameworks(options.frameworks, function() - { - [converter convert]; - }); + return themeName || DefaultTheme; +} + +function themeNameFromPropertyList(path) +{ + if (!FILE.isReadable(path)) + return nil; + + var themeName = nil, + plist = CFPropertyList.readPropertyListFromFile(path); + + if (plist) + themeName = plist.valueForKey("CPDefaultTheme"); + + return themeName; +} + +function loadTheme(themeName, themeDir) +{ + if (!themeDir) + { + cappBuild = SYS.env["CAPP_BUILD"]; + + if (!cappBuild) + fail("$CAPP_BUILD is not set, exiting."); + + if (!FILE.isDirectory(cappBuild)) + fail("$CAPP_BUILD does not exist: " + cappBuild) + + var baseThemeName = themeName, + pos = themeName.indexOf("-"); + + if (pos > 0) + baseThemeName = themeName.substr(0, pos); + + themeDir = FILE.join(cappBuild, baseThemeName + ".build"); + } + + themeDir = FILE.canonical(themeDir); + + if (!FILE.isDirectory(themeDir)) + fail("Cannot find the theme directory: " + themeDir); + + var themePath = null; + + for (var i = 0; i < BuildTypes.length; ++i) + { + var path = FILE.join(themeDir, BuildTypes[i], "Browser.environment/Resources", themeName + ".keyedtheme"); + + if (FILE.isReadable(path)) + { + themePath = path; + break; + } + } + + if (!themePath) + fail("Could not find the keyed theme data for \"" + themeName + "\" in the directory: " + themeDir); + + themePath = FILE.canonical(themePath); + var plist = FILE.read(themePath); + + if (!plist) + fail("Could not read the keyed theme at: " + themePath); + + // The .keyedtheme file has a header that is data I don't need. Strip it off. + var m = plist.match(/^t;\d+;/); + + if (!m || m.length === 0) + fail("Invalid keyed theme data at: " + themePath); + + plist = plist.substr(m[0].length); + plist = CFPropertyList.propertyListFromString(plist); + + var data = [CPData dataWithPlistObject:plist], + theme = [CPKeyedUnarchiver unarchiveObjectWithData:data]; + + if (!theme) + fail("Could not unarchive the theme at: " + themePath); + + CPLog.debug("Loaded theme: " + themePath); + return theme; +} + +function setSystemFontAndSize(configFile, inputFile) +{ + var configPath = null; + + // First see if the user passed a config file path + if (configFile) + { + var path = FILE.canonical(configFile); + + if (!FILE.isReadable(path)) + fail("Cannot find the config file: " + path); + + configPath = path; + } + else + { + // See if we can find an Info.plist in the parent directory of the input file, + // if the input file's directory is "Resources". + var path = FILE.canonical(FILE.dirname(inputFile)); + + if (FILE.basename(path) === "Resources") + { + path = FILE.join(FILE.dirname(path), "Info.plist"); + + if (FILE.isReadable(path)) + configPath = path; + } + } + + if (configPath) + { + var plist = FILE.read(configPath); + + if (!plist) + fail("Could not read the Info.plist at: " + configPath); + + plist = CFPropertyList.propertyListFromString(plist); + + if (!plist) + fail("Could not parse the Info.plist at: " + configPath); + + var systemFontFace = plist.valueForKey("CPSystemFontFace"); + + if (systemFontFace) + [CPFont setSystemFontFace:systemFontFace]; + + var systemFontSize = plist.valueForKey("CPSystemFontSize"); + + if (systemFontSize) + [CPFont setSystemFontSize:parseFloat(systemFontSize, 10)]; + } + + return configPath; +} + +function getModifiedNibs(path) +{ + var nibs = new FileList(FILE.join(path, "*.xib")).items(), + count = nibs.length, + newNibInfo = {}, + modifiedNibs = []; + + while (count--) + { + var nib = nibs[count]; + + newNibInfo[nib] = FILE.mtime(nib); + + if (!nibInfo.hasOwnProperty(nib)) + modifiedNibs.push(["add", nib]); + else + { + if (newNibInfo[nib] - nibInfo[nib] !== 0) + modifiedNibs.push(["mod", nib]); + + // Remove matching nibs so that we leave + // deleted nibs in nibInfo. + delete nibInfo[nib]; + } + } + + for (var nib in nibInfo) + { + if (nibInfo.hasOwnProperty(nib)) + CPLog.info(">> %s %s", CPLogColorize("Deleted:", "warn"), nib); + } + + nibInfo = newNibInfo; + + return modifiedNibs; +} + +function printVersionAndExit() +{ + printVersion(); + OS.exit(0); +} + +function printVersion() +{ + /* + There are two usual possibilities for the location of the nib2cib binary. + If we are executing the installed narwhal binary, the location is: + /packages/cappuccino/bin/nib2cib + If we are executing the built binary, the location is: + /Debug|Release/CommonJS/cappuccino/bin/nib2cib + + Base on these paths we can locate nib2cib's Info.plist. + */ + var path = FILE.dirname(FILE.dirname(FILE.canonical(SYS.args[0]))), + version = null; + + if (FILE.basename(path) === "narwhal") + path = FILE.join(path, "packages", "cappuccino"); + + path = FILE.join(path, "lib", "nib2cib", "Info.plist"); + + if (FILE.isReadable(path)) + { + var plist = FILE.read(path); + + if (!plist) + return; + + plist = CFPropertyList.propertyListFromString(plist); + + if (!plist) + return; + + version = plist.valueForKey("CPBundleVersion"); + + if (version) + stream.print("nib2cib v" + version); + } + + if (!version) + stream.print(""); +} + +function fail(message) +{ + [CPException raise:ConverterConversionException reason:message]; }
JavaScript is required for this site to work correctly but is either disabled or not supported by your browser.
Show me how to enable JavaScript
You may want to upgrade to a newer browser while you're at it: