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 + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + 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 + + + + + + + + + + + + +
+
+ + + +
+
+ + + 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]; }