New: XcodeCapp 3 tweaks...

- Renamed XcodeSupport to .XcodeSupport.
- Added "Reset Project" to menu, it closes the project in Xcode if necessary, removes .XcodeSupport and .xcodeproj, then reloads.
- Added separate preferences for showing errors panel on warnings/errors. You may not want to see the panel if there are category warnings.
- New status icons (again).
- If an error occurs, the status icon turns red when all processing is done.
- Reworked notifications. Objective-J parsing is notified when done. Xib conversion notifies at beginning and end, because it typically takes a few seconds. Individual file notifications are suppressed if a project is being loaded.
This commit is contained in:
Aparajita Fishman
2013-04-25 13:11:22 -04:00
parent 949af39041
commit bf6ce64209
19 changed files with 388 additions and 278 deletions
@@ -40,7 +40,6 @@
+ (AppController *)sharedAppController;
- (IBAction)listenToProject:(id)aSender;
- (IBAction)openInXcode:(id)aSender;
- (IBAction)openHelp:(id)aSender;
- (IBAction)openAbout:(id)aSender;
+21 -20
View File
@@ -37,6 +37,7 @@ AppController *SharedAppControllerInstance = nil;
@property (nonatomic) NSImage *iconActive;
@property (nonatomic) NSImage *iconInactive;
@property (nonatomic) NSImage *iconWorking;
@property (nonatomic) NSImage *iconError;
@property (nonatomic) NSMenu *menuHistory;
@property NSStatusItem *statusItem;
@@ -104,15 +105,16 @@ AppController *SharedAppControllerInstance = nil;
- (void)registerDefaults
{
NSDictionary *appDefaults = @{
kDefaultLastEventId: [NSNumber numberWithUnsignedLongLong:kFSEventStreamEventIdSinceNow],
kDefaultFirstLaunch: @YES,
kDefaultFirstLaunchVersion: @2.0,
kDefaultXCCAPIMode: [NSNumber numberWithInt:kXCCAPIModeAuto],
kDefaultXCCReactMode: @YES,
kDefaultXCCReopenLastProject: @YES,
kDefaultXCCAutoOpenErrorsPanel: @YES,
kDefaultXCCProjectHistory: [NSArray new],
kDefaultMaxRecentProjects: @20
kDefaultLastEventId: [NSNumber numberWithUnsignedLongLong:kFSEventStreamEventIdSinceNow],
kDefaultFirstLaunch: @YES,
kDefaultFirstLaunchVersion: @2.0,
kDefaultXCCAPIMode: [NSNumber numberWithInt:kXCCAPIModeAuto],
kDefaultXCCReactMode: @YES,
kDefaultXCCReopenLastProject: @YES,
kDefaultXCCAutoOpenErrorsPanelOnWarnings: @YES,
kDefaultXCCAutoOpenErrorsPanelOnErrors: @YES,
kDefaultXCCProjectHistory: [NSArray new],
kDefaultMaxRecentProjects: @20
};
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
@@ -171,6 +173,14 @@ AppController *SharedAppControllerInstance = nil;
return _iconWorking;
}
- (NSImage *)iconError
{
if (!_iconError)
_iconError = [NSImage imageNamed:@"icon-error"];
return _iconError;
}
- (NSMenu *)menuHistory
{
if (!_menuHistory)
@@ -205,7 +215,7 @@ AppController *SharedAppControllerInstance = nil;
- (void)XcodeCappConversionDidStop:(NSNotification *)aNotification
{
if (!self.xcc.isLoadingProject)
self.statusItem.image = self.iconActive;
self.statusItem.image = self.xcc.hasErrors ? self.iconError : self.iconActive;
}
- (void)XcodeCappDidPopulateProject:(NSNotification *)aNotification
@@ -214,7 +224,7 @@ AppController *SharedAppControllerInstance = nil;
- (void)XcodeCappListeningDidStart:(NSNotification *)aNotification
{
self.statusItem.image = self.iconActive;
self.statusItem.image = self.xcc.hasErrors ? self.iconError : self.iconActive;
self.menuItemListen.title = [NSString stringWithFormat:@"Close “%@”", self.xcc.currentProjectPath.lastPathComponent];
self.menuItemListen.action = @selector(stopListening:);
}
@@ -308,15 +318,6 @@ AppController *SharedAppControllerInstance = nil;
[self updateHistoryMenu];
}
- (IBAction)openInXcode:(id)aSender
{
if (!self.xcc.currentProjectPath)
return;
DLog(@"Opening Xcode project at: %@", self.xcc.XcodeSupportProjectURL.path);
system([[NSString stringWithFormat:@"open \"%@\"", self.xcc.XcodeSupportProjectURL.path] UTF8String]);
}
- (IBAction)openHelp:(id)aSender
{
[self.helpTextView readRTFDFromFile:[[NSBundle mainBundle] pathForResource:@"help" ofType:@"rtfd"]];
Binary file not shown.

Before

Width:  |  Height:  |  Size: 612 B

After

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

After

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

After

Width:  |  Height:  |  Size: 759 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

+9 -5
View File
@@ -41,8 +41,7 @@ function raise(pos, message)
throw syntaxError;
}
var hasWarnings = false,
errors = [],
var errors = [],
xcc = ObjectiveJ.acorn.walk.make(
{
ClassDeclarationStatement: function(node, st, c)
@@ -54,7 +53,7 @@ var hasWarnings = false,
@"path": node.loc.source,
@"line": node.loc.start.line
}];
hasWarnings = true;
return;
}
@@ -159,7 +158,8 @@ function main(args)
tokens = ObjectiveJ.acorn.parse(source, { locations:true, sourceFile:sourceFile }),
classesInformation = [],
ObjectiveCSource = "",
ObjectiveCHeader = "";
ObjectiveCHeader = "",
hasErrors = NO;
compile(tokens, classesInformation, xcc);
@@ -218,6 +218,8 @@ function main(args)
@"path": sourceFile,
@"line": e.line
}];
hasErrors = YES;
}
if ([errors count])
@@ -225,7 +227,9 @@ function main(args)
var plist = [CPPropertyListSerialization dataFromPropertyList:errors format:CPPropertyListXMLFormat_v1_0];
print([plist rawString]);
OS.exit(1);
// If there were category warnings, hasErrors is NO, so return a warning status
OS.exit(hasErrors ? 1 : 2);
}
}
@@ -4,7 +4,7 @@ import re
import sys
from mod_pbxproj import XcodeProject
XCODE_SUPPORT_FOLDER = "XcodeSupport"
XCODE_SUPPORT_FOLDER = ".XcodeSupport"
SLASH_REPLACEMENT = u"" # DIVISION SLASH Unicode U+2215
STRING_RE = re.compile(ur"^\s*<string>(.*)</string>\s*$", re.MULTILINE)
FRAMEWORKS_RE = re.compile(ur"^(.+/Frameworks/(?:Debug|Source)/([^/]+))/.+$")
+4
View File
@@ -51,6 +51,9 @@ extern NSString * const XCCListeningDidStartNotification;
- (IBAction)openErrorsPanel:(id)sender;
- (IBAction)clearErrors:(id)sender;
- (IBAction)openErrorInEditor:(id)sender;
- (IBAction)openInXcode:(id)aSender;
- (IBAction)resetProject:(id)aSender;
- (void)start;
- (void)stop;
- (void)listenToProjectAtPath:(NSString *)path;
@@ -63,6 +66,7 @@ extern NSString * const XCCListeningDidStartNotification;
- (void)handleFileModificationAtPath:(NSString*)path notify:(BOOL)shouldNotify;
- (void)handleFileRemovalAtPath:(NSString*)path;
- (void)updateUserDefaultsWithLastEventId;
- (BOOL)hasErrors;
@end
+116 -54
View File
@@ -39,6 +39,27 @@ enum XCCLineSpecifier {
};
typedef enum XCCLineSpecifier XCCLineSpecifier;
enum {
XCCStatusCodeError = 1,
XCCStatusCodeWarning = 2
};
const char *XCCCloseProjectScript =
"tell application \"Xcode\"\n"
"set docs to (document of every window)\n"
"repeat with doc in docs\n"
"if class of doc is workspace document then\n"
"set docURL to file of doc\n"
"set docPath to docURL as text\n"
"set docPath to POSIX path of docPath\n"
"if docPath begins with \"%@\" then\n"
"close doc\n"
"return\n"
"end if\n"
"end if\n"
"end repeat\n"
"end tell";
NSString * const XCCDidPopulateProjectNotification = @"XCCDidPopulateProjectNotification";
NSString * const XCCConversionDidStartNotification = @"XCCConversionDidStartNotification";
NSString * const XCCConversionDidStopNotification = @"XCCConversionDidStopNotification";
@@ -67,6 +88,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
@property NSString *profilePath;
@property NSString *shellPath;
@property NSString *PBXModifierScriptPath;
@property NSString *closeProjectScriptSource;
@property NSString *supportPath;
@property NSDate *appStartedTimestamp;
@property NSMutableDictionary *pathModificationDates;
@@ -115,7 +137,8 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
self.errorList = [NSMutableArray arrayWithCapacity:10];
self.fm = [NSFileManager defaultManager];
self.ignoredPathRegexes = [NSMutableArray new];
self.parserPath = [[NSBundle mainBundle] pathForResource:@"parser" ofType:@"j"];
self.parserPath = [[[NSBundle mainBundle] sharedSupportPath] stringByAppendingPathComponent:@"parser.j"];
self.closeProjectScriptSource = [NSString stringWithUTF8String:XCCCloseProjectScript];
self.lastEventId = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultLastEventId];
self.appStartedTimestamp = [NSDate date];
self.projectPathsForSourcePaths = [NSMutableDictionary new];
@@ -192,24 +215,24 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
NSURL *projectURL = [NSURL fileURLWithPath:self.currentProjectPath];
self.XcodeSupportProjectURL = [NSURL URLWithString:self.XcodeSupportProjectName relativeToURL:projectURL];
self.supportPath = [[NSURL URLWithString:@"XcodeSupport" relativeToURL:projectURL] path];
self.supportPath = [[NSURL URLWithString:@".XcodeSupport" relativeToURL:projectURL] path];
self.XcodeSupportPBXPath = [self.XcodeSupportProjectURL.path stringByAppendingPathComponent:@"project.pbxproj"];
self.PBXModifierScriptPath = [[NSBundle mainBundle] pathForResource:@"pbxprojModifier" ofType:@"py"];
self.PBXModifierScriptPath = [[[NSBundle mainBundle] sharedSupportPath] stringByAppendingPathComponent:@"pbxprojModifier.py"];
// Create the template project if it doesn't exist
if (![self.fm fileExistsAtPath:self.supportPath])
{
NSLog(@"%@ Xcode support folder created at: %@", NSStringFromSelector(_cmd), self.XcodeSupportProjectURL.path);
NSLog(@"Xcode support folder created at: %@", self.XcodeSupportProjectURL.path);
[self.fm createDirectoryAtPath:self.XcodeSupportProjectURL.path withIntermediateDirectories:YES attributes:nil error:nil];
DLog(@"%@ Copying project.pbxproj from %@ to %@", NSStringFromSelector(_cmd), self.XcodeTemplatePBXPath, self.XcodeSupportProjectURL.path);
DLog(@"Copying project.pbxproj from %@ to %@", self.XcodeTemplatePBXPath, self.XcodeSupportProjectURL.path);
[self.fm copyItemAtPath:self.XcodeTemplatePBXPath toPath:self.XcodeSupportPBXPath error:nil];
DLog(@"%@ Reading the content of the project.pbxproj", NSStringFromSelector(_cmd));
DLog(@"Reading the content of the project.pbxproj");
NSMutableString *PBXContent = [NSMutableString stringWithContentsOfFile:self.XcodeSupportPBXPath encoding:NSUTF8StringEncoding error:nil];
[PBXContent writeToFile:self.XcodeSupportPBXPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
DLog(@"%@ PBX file adapted to the project", NSStringFromSelector(_cmd));
DLog(@"PBX file adapted to the project");
[self.fm createDirectoryAtPath:self.supportPath withIntermediateDirectories:YES attributes:nil error:nil];
@@ -226,9 +249,6 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
*/
- (void)populateXcodeProject:(BOOL)shouldNotify
{
if (shouldNotify)
[self notifyUserWithTitle:@"Loading project" message:self.currentProjectPath.lastPathComponent];
// First populate with all non-framework code
[self populateXcodeProjectWithProjectRelativePath:@""];
@@ -242,10 +262,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
[self populateXcodeProjectWithProjectRelativePath:@"Resources"];
if (shouldNotify)
{
[[NSNotificationCenter defaultCenter] postNotificationName:XCCDidPopulateProjectNotification object:self userInfo:nil];
[self notifyUserWithTitle:@"Project loaded" message:self.currentProjectPath.lastPathComponent];
}
}
- (void)populateXcodeProjectWithProjectRelativePath:(NSString *)aProjectPath
@@ -329,6 +346,8 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
- (void)listenToProjectAtPath:(NSString *)path
{
self.isLoadingProject = YES;
[self notifyUserWithTitle:@"Loading project…" message:path.lastPathComponent];
[self clearErrors:self];
self.currentProjectPath = path;
@@ -348,9 +367,36 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
[[NSUserDefaults standardUserDefaults] setObject:self.currentProjectPath forKey:kDefaultLastOpenedPath];
[self notifyUserWithTitle:@"Listening to project" message:self.currentProjectPath.lastPathComponent];
[self notifyUserWithTitle:@"Project loaded" message:self.currentProjectPath.lastPathComponent];
}
- (IBAction)openInXcode:(id)aSender
{
if (!self.currentProjectPath)
return;
DLog(@"Opening Xcode project at: %@", self.XcodeSupportProjectURL.path);
system([[NSString stringWithFormat:@"open \"%@\"", self.XcodeSupportProjectURL.path] UTF8String]);
}
- (IBAction)resetProject:(id)aSender
{
NSString *projectPath = self.currentProjectPath;
[self stop];
// Close the project in Xcode if it's open
NSString *source = [NSString stringWithFormat:self.closeProjectScriptSource, projectPath];
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:source];
NSAppleEventDescriptor *descriptor;
descriptor = [script executeAndReturnError:nil];
[self.fm removeItemAtURL:self.XcodeSupportProjectURL error:nil];
[self.fm removeItemAtPath:self.supportPath error:nil];
[self listenToProjectAtPath:projectPath];
}
#pragma mark - Event Stream
@@ -371,7 +417,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
if (self.supportsFileBasedListening)
{
DLog(@"%@ Initializing the FSEventStream at file level (clean)", NSStringFromSelector(_cmd));
DLog(@"Initializing the FSEventStream at file level (clean)");
flags = kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents;
}
else
@@ -464,7 +510,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
if (!self.supportsFileLevelAPI)
{
DLog(@"%@ System doesn't support file level API", NSStringFromSelector(_cmd));
DLog(@"System doesn't support file level API");
[defaults setObject:[NSNumber numberWithInt:kXCCAPIModeFolder] forKey:kDefaultXCCAPIMode];
}
@@ -485,7 +531,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
if (self.supportsFileBasedListening)
{
DLog(@"%@ using 10.7+ mode listening (clean)", NSStringFromSelector(_cmd));
DLog(@"using 10.7+ mode listening (clean)");
self.currentAPIMode = @"File level (Lion)";
self.isUsingFileLevelAPI = YES;
@@ -493,7 +539,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
}
else
{
DLog(@"%@ using 10.6 mode listening (dirty)", NSStringFromSelector(_cmd));
DLog(@"using 10.6 mode listening (dirty)");
self.reactToInodeModification = NO;
self.currentAPIMode = @"Folder level (Snow Leopard)";
self.isUsingFileLevelAPI = NO;
@@ -615,10 +661,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
return;
NSString *projectPath = [self projectPathForSourcePath:path];
BOOL success = [self processModifiedFileAtPath:path projectSourcePath:projectPath notify:shouldNotify];
if (success)
[self notifyUserWithTitle:@"File successfully processed" message:path.lastPathComponent];
[self processModifiedFileAtPath:path projectSourcePath:projectPath notify:shouldNotify];
}
- (BOOL)processModifiedFileAtPath:(NSString *)realSourcePath projectSourcePath:(NSString *)projectSourcePath notify:(BOOL)shouldNotify
@@ -629,35 +672,33 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
NSArray *arguments = nil;
NSArray *pbxArguments = nil;
NSString *growlTitle = nil;
NSString *growlMessage = nil;
NSString *response = nil;
NSString *projectRelativePath = [projectSourcePath substringFromIndex:self.currentProjectPath.length + 1];
NSString *notificationTitle = nil;
NSString *notificationMessage = projectRelativePath.lastPathComponent;
[[NSNotificationCenter defaultCenter] postNotificationName:XCCConversionDidStartNotification object:self];
// Remove all errors for the path being processed
BOOL (^pathMatcher)(id obj, NSUInteger idx, BOOL *stop);
pathMatcher = ^(id obj, NSUInteger idx, BOOL *stop)
{
return [[obj valueForKey:@"path"] isEqualToString:realSourcePath];
};
NSIndexSet *matchingErrors = [self.errorList indexesOfObjectsPassingTest:pathMatcher];
NSIndexSet *matchingErrors = [self.errorList indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)
{
return [[obj valueForKey:@"path"] isEqualToString:realSourcePath];
}];
[self.errorListController removeObjectsAtArrangedObjectIndexes:matchingErrors];
if ([self isXibFile:realSourcePath])
{
// nib2cib can take a while to run, show a message while the conversion is happening
[self notifyUserWithTitle:@"Converting xib…" message:projectRelativePath.lastPathComponent];
arguments = @[
@"-c",
[NSString stringWithFormat:@"source '%@'; nib2cib --no-colors '%@'", self.profilePath, realSourcePath],
@""
];
growlTitle = @"Converting xib...";
growlMessage = projectRelativePath.lastPathComponent;
notificationTitle = @"Xib converted";
}
else if ([self isObjjFile:realSourcePath])
{
@@ -679,23 +720,20 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
projectSourcePath]
];
growlTitle = @"Processing Objective-J source...";
growlMessage = projectRelativePath.lastPathComponent;
notificationTitle = @"Objective-J source processed";
}
else if ([self isXCCIgnoreFile:realSourcePath])
{
[self computeIgnoredPaths];
growlTitle = @"Parsing .xcodecapp-ignore...";
growlMessage = @"Updating ignored paths";
notificationTitle = @"Parsed .xcodecapp-ignore";
notificationMessage = @"Ignored paths updated";
arguments = nil;
}
// Run the task and get the response if needed
if (arguments)
{
DLog(@"%@ Running conversion task...", NSStringFromSelector(_cmd));
[self notifyUserWithTitle:growlTitle message:growlMessage];
DLog(@"Running conversion task...");
NSDictionary *taskResult = [self runTaskWithLaunchPath:self.shellPath
arguments:arguments
@@ -704,7 +742,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
NSInteger status = [taskResult[@"status"] intValue];
response = taskResult[@"response"];
DLog(@"%@ Conversion task result/response: %ld/%@", NSStringFromSelector(_cmd), status, response);
DLog(@"Conversion task result/response: %ld/%@", status, response);
if (status != 0)
{
@@ -715,40 +753,54 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
if ([self isXibFile:realSourcePath])
{
notificationTitle = @"Error converting xib";
NSString *message = [NSString stringWithFormat:@"%@\n%@", realSourcePath.lastPathComponent, response];
[self.errorListController addObject:@{ @"message":message, @"path":realSourcePath }];
[self.errorListController addObject:@{ @"message":message, @"path":realSourcePath, @"status":taskResult[@"status"] }];
}
else
{
notificationTitle = [(XCCStatusCodeError ? @"Error" : @"Warning") stringByAppendingString:@" parsing Objective-J source"];
NSArray *errors = [response propertyList];
for (NSDictionary *error in errors)
{
NSMutableDictionary *newError = [error mutableCopy];
newError[@"message"] = [NSString stringWithFormat:@"%@, line %d\n%@", [error[@"path"] lastPathComponent], [error[@"line"] intValue], error[@"message"]];
newError[@"status"] = taskResult[@"status"];
[self.errorListController addObject:newError];
}
}
if ([[NSUserDefaults standardUserDefaults] boolForKey:kDefaultXCCAutoOpenErrorsPanel])
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ((status == XCCStatusCodeError && [defaults boolForKey:kDefaultXCCAutoOpenErrorsPanelOnErrors]) ||
(status == XCCStatusCodeWarning && [defaults boolForKey:kDefaultXCCAutoOpenErrorsPanelOnWarnings]))
{
[self openErrorsPanel:self];
}
[self notifyUserWithTitle:@"Error processing file" message:projectRelativePath.lastPathComponent];
[self notifyUserWithTitle:notificationTitle message:notificationMessage];
}
else if (!self.isLoadingProject)
{
[self notifyUserWithTitle:notificationTitle message:notificationMessage];
}
}
if (pbxArguments)
{
DLog(@"%@ Running update PBX task...", NSStringFromSelector(_cmd));
DLog(@"Running update PBX task...");
NSDictionary *taskResult;
taskResult = [self runTaskWithLaunchPath:self.shellPath arguments:pbxArguments returnType:kTaskReturnTypeStdOut];
DLog(@"%@ Update PBX Task result/response: %@/%@", NSStringFromSelector(_cmd), taskResult[@"status"], taskResult[@"response"]);
DLog(@"Update PBX Task result/response: %@/%@", taskResult[@"status"], taskResult[@"response"]);
}
[[NSNotificationCenter defaultCenter] postNotificationName:XCCConversionDidStopNotification object:self];
DLog(@"%@ Processed: %@", NSStringFromSelector(_cmd), realSourcePath);
DLog(@"Processed: %@", realSourcePath);
return success;
}
@@ -823,13 +875,13 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
NSString *shadowHeaderPath = [shadowBasePath stringByAppendingPathExtension:@"h"];
NSString *shadowImplementationPath = [shadowBasePath stringByAppendingPathExtension:@"m"];
DLog(@"%@ Removing shadow header file: %@", NSStringFromSelector(_cmd), shadowHeaderPath);
DLog(@"Removing shadow header file: %@", shadowHeaderPath);
[self.fm removeItemAtPath:shadowHeaderPath error:nil];
DLog(@"%@ Removing shadow implementation file: %@", NSStringFromSelector(_cmd), shadowImplementationPath);
DLog(@"Removing shadow implementation file: %@", shadowImplementationPath);
[self.fm removeItemAtPath:shadowImplementationPath error:nil];
DLog(@"%@ Removing PBX reference", NSStringFromSelector(_cmd));
DLog(@"Removing PBX reference");
NSString *projectSourcePath = [self projectPathForSourcePath:sourcePath];
NSArray *pbxArguments = @[
@@ -845,7 +897,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
taskResult = [self runTaskWithLaunchPath:self.shellPath arguments:pbxArguments returnType:kTaskReturnTypeStdOut];
DLog(@"%@ PBX Reference removal status/response: %@/%@", NSStringFromSelector(_cmd), taskResult[@"status"], taskResult[@"response"]);
DLog(@"PBX Reference removal status/response: %@/%@", taskResult[@"status"], taskResult[@"response"]);
}
/*!
@@ -951,7 +1003,7 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
return ignore;
}
#pragma mark - Errors panel
#pragma mark - Errors
- (IBAction)openErrorsPanel:(id)aSender
{
@@ -1082,6 +1134,16 @@ NSArray *XCCDefaultIgnoredPathRegexes = nil;
self.errorListController.content = self.errorList;
}
- (BOOL)hasErrors
{
NSInteger index = [self.errorList indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)
{
return [[obj valueForKey:@"status"] intValue] == XCCStatusCodeError;
}];
return index != NSNotFound;
}
#pragma mark - User notifications
- (NSString *)applicationNameForGrowl
+2 -1
View File
@@ -17,7 +17,8 @@ extern NSString * const kDefaultFirstLaunchVersion;
extern NSString * const kDefaultXCCAPIMode;
extern NSString * const kDefaultXCCReactMode;
extern NSString * const kDefaultXCCReopenLastProject;
extern NSString * const kDefaultXCCAutoOpenErrorsPanel;
extern NSString * const kDefaultXCCAutoOpenErrorsPanelOnWarnings;
extern NSString * const kDefaultXCCAutoOpenErrorsPanelOnErrors;
extern NSString * const kDefaultXCCProjectHistory;
extern NSString * const kDefaultLastOpenedPath;
extern NSString * const kDefaultPathModificationDates;
+2 -1
View File
@@ -15,7 +15,8 @@ NSString * const kDefaultFirstLaunchVersion = @"firstLaunchVersion";
NSString * const kDefaultXCCAPIMode = @"XCCAPIMode";
NSString * const kDefaultXCCReactMode = @"XCCReactMode";
NSString * const kDefaultXCCReopenLastProject = @"XCCReopenLastProject";
NSString * const kDefaultXCCAutoOpenErrorsPanel = @"XCCAutoOpenErrorsPanel";
NSString * const kDefaultXCCAutoOpenErrorsPanelOnWarnings = @"XCCAutoOpenErrorsPanelOnWarnings";
NSString * const kDefaultXCCAutoOpenErrorsPanelOnErrors = @"XCCAutoOpenErrorsPanelOnErrors";
NSString * const kDefaultXCCProjectHistory = @"XCCProjectHistory";
NSString * const kDefaultLastOpenedPath = @"LastOpenedPath";
NSString * const kDefaultPathModificationDates = @"pathModificationDates";
+193 -175
View File
@@ -12,7 +12,6 @@
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSArrayController</string>
<string>NSBox</string>
<string>NSButton</string>
<string>NSButtonCell</string>
<string>NSCustomObject</string>
@@ -86,6 +85,14 @@
<reference key="NSOnImage" ref="457724053"/>
<reference key="NSMixedImage" ref="103460472"/>
</object>
<object class="NSMenuItem" id="854121054">
<reference key="NSMenu" ref="280310327"/>
<string key="NSTitle">Reset Project</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="457724053"/>
<reference key="NSMixedImage" ref="103460472"/>
</object>
<object class="NSMenuItem" id="261599420">
<reference key="NSMenu" ref="280310327"/>
<bool key="NSIsDisabled">YES</bool>
@@ -181,7 +188,7 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{164, 23}, {172, 98}}</string>
<reference key="NSSuperview" ref="694242143"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="987022105">
<int key="NSCellFlags">68157504</int>
@@ -195,7 +202,7 @@ Y29tA</string>
<int key="NSfFlags">3100</int>
</object>
<reference key="NSControlView" ref="1002122285"/>
<object class="NSColor" key="NSBackgroundColor" id="490108544">
<object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textBackgroundColor</string>
@@ -221,7 +228,6 @@ Y29tA</string>
<int key="NSvFlags">266</int>
<string key="NSFrame">{{164, 140}, {160, 14}}</string>
<reference key="NSSuperview" ref="694242143"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1002122285"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1043848996">
@@ -260,7 +266,6 @@ Y29tA</string>
</set>
<string key="NSFrame">{{17, 46}, {128, 128}}</string>
<reference key="NSSuperview" ref="694242143"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="547689164"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@@ -283,7 +288,6 @@ Y29tA</string>
</array>
<string key="NSFrameSize">{358, 185}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="953620552"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
@@ -518,36 +522,37 @@ Y29tA</string>
<object class="NSWindowTemplate" id="817657916">
<int key="NSWindowStyleMask">3</int>
<int key="NSWindowBacking">2</int>
<string key="NSWindowRect">{{529, 541}, {336, 198}}</string>
<string key="NSWindowRect">{{529, 541}, {341, 155}}</string>
<int key="NSWTFlags">1685586944</int>
<string key="NSWindowTitle">Preferences</string>
<string key="NSWindowClass">NSWindow</string>
<nil key="NSViewClass"/>
<nil key="NSUserInterfaceItemIdentifier"/>
<object class="NSView" key="NSWindowView" id="145921208">
<nil key="NSNextResponder"/>
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="745745556">
<object class="NSButton" id="527635531">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 43}, {282, 18}}</string>
<string key="NSFrame">{{18, 119}, {295, 18}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSNextKeyView" ref="911700242"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="91964537"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="534768275">
<object class="NSButtonCell" key="NSCell" id="332414041">
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">React to inode meta information changes</string>
<string key="NSContents">Listen to the most recent project on launch</string>
<object class="NSFont" key="NSSupport" id="22344846">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">13</double>
<int key="NSfFlags">1044</int>
</object>
<reference key="NSControlView" ref="745745556"/>
<reference key="NSControlView" ref="527635531"/>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<object class="NSCustomResource" key="NSNormalImage" id="844111305">
<object class="NSCustomResource" key="NSNormalImage" id="123219516">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSSwitch</string>
</object>
@@ -561,70 +566,23 @@ Y29tA</string>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="911700242">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 20}, {284, 17}}</string>
<reference key="NSSuperview" ref="145921208"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="783098791">
<int key="NSCellFlags">68157504</int>
<int key="NSCellFlags2">272630784</int>
<string key="NSContents">In "File level" API mode, react to touch, chown, etc.</string>
<object class="NSFont" key="NSSupport">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">11</double>
<int key="NSfFlags">16</int>
</object>
<reference key="NSControlView" ref="911700242"/>
<reference key="NSBackgroundColor" ref="2058410"/>
<object class="NSColor" key="NSTextColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4zNDU1Mjg0ODM0IDAuMzQ1NTI4NDgzNCAwLjM0NTUyODQ4MzQAA</bytes>
</object>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="527635531">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 162}, {295, 18}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSNextKeyView" ref="529575548"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="332414041">
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Listen to the most recent project on launch</string>
<reference key="NSSupport" ref="22344846"/>
<reference key="NSControlView" ref="527635531"/>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="844111305"/>
<reference key="NSAlternateImage" ref="978619751"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="529575548">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 132}, {300, 18}}</string>
<string key="NSFrame">{{37, 58}, {81, 18}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSNextKeyView" ref="624731292"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="774318108"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="503199239">
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Automatically open Errors &amp; Warnings panel</string>
<string key="NSContents">Warnings</string>
<reference key="NSSupport" ref="22344846"/>
<reference key="NSControlView" ref="529575548"/>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="844111305"/>
<reference key="NSNormalImage" ref="123219516"/>
<reference key="NSAlternateImage" ref="978619751"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
@@ -633,35 +591,37 @@ Y29tA</string>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSBox" id="941049068">
<object class="NSButton" id="774318108">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">10</int>
<string key="NSFrame">{{18, 76}, {300, 5}}</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{139, 58}, {60, 18}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSNextKeyView" ref="745745556"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="624731292"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="368407823">
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Box</string>
<string key="NSContents">Errors</string>
<reference key="NSSupport" ref="22344846"/>
<reference key="NSBackgroundColor" ref="490108544"/>
<object class="NSColor" key="NSTextColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes>
</object>
<reference key="NSControlView" ref="774318108"/>
<int key="NSButtonFlags">1211912448</int>
<int key="NSButtonFlags2">2</int>
<reference key="NSNormalImage" ref="123219516"/>
<reference key="NSAlternateImage" ref="978619751"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<int key="NSBorderType">3</int>
<int key="NSBoxType">2</int>
<int key="NSTitlePosition">0</int>
<bool key="NSTransparent">NO</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="624731292">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 101}, {106, 17}}</string>
<string key="NSFrame">{{17, 21}, {106, 17}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1001907295"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -680,9 +640,10 @@ Y29tA</string>
<object class="NSPopUpButton" id="1001907295">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{126, 95}, {56, 26}}</string>
<string key="NSFrame">{{126, 15}, {56, 26}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSNextKeyView" ref="941049068"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="404840621">
@@ -747,8 +708,31 @@ Y29tA</string>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="91964537">
<reference key="NSNextResponder" ref="145921208"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 84}, {306, 17}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="529575548"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="346990638">
<int key="NSCellFlags">68157504</int>
<int key="NSCellFlags2">272630784</int>
<string key="NSContents">Automatically open Errors &amp; Warnings panel on:</string>
<reference key="NSSupport" ref="22344846"/>
<string key="NSCellIdentifier">_NS:1535</string>
<reference key="NSControlView" ref="91964537"/>
<reference key="NSBackgroundColor" ref="2058410"/>
<reference key="NSTextColor" ref="824548534"/>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</array>
<string key="NSFrameSize">{336, 198}</string>
<string key="NSFrameSize">{341, 155}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="527635531"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
@@ -1024,14 +1008,6 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
</object>
<int key="connectionID">619</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">openInXcode:</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="798304033"/>
</object>
<int key="connectionID">620</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">menuItemHistory</string>
@@ -1096,6 +1072,14 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
</object>
<int key="connectionID">792</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">save:</string>
<reference key="source" ref="942006162"/>
<reference key="destination" ref="774318108"/>
</object>
<int key="connectionID">821</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">errorTable</string>
@@ -1153,40 +1137,20 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<int key="connectionID">786</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: values.XCCReactMode</string>
<reference key="source" ref="745745556"/>
<reference key="destination" ref="942006162"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="745745556"/>
<reference key="NSDestination" ref="942006162"/>
<string key="NSLabel">value: values.XCCReactMode</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">values.XCCReactMode</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSValidatesImmediately</string>
<boolean value="YES" key="NS.object.0"/>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
<object class="IBActionConnection" key="connection">
<string key="label">openInXcode:</string>
<reference key="source" ref="1027936551"/>
<reference key="destination" ref="798304033"/>
</object>
<int key="connectionID">629</int>
<int key="connectionID">815</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: isUsingFileLevelAPI</string>
<reference key="source" ref="745745556"/>
<reference key="destination" ref="1027936551"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="745745556"/>
<reference key="NSDestination" ref="1027936551"/>
<string key="NSLabel">enabled: isUsingFileLevelAPI</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">isUsingFileLevelAPI</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
<object class="IBActionConnection" key="connection">
<string key="label">resetProject:</string>
<reference key="source" ref="1027936551"/>
<reference key="destination" ref="854121054"/>
</object>
<int key="connectionID">630</int>
<int key="connectionID">816</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
@@ -1351,15 +1315,15 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: values.XCCAutoOpenErrorsPanel</string>
<string key="label">value: values.XCCAutoOpenErrorsPanelOnWarnings</string>
<reference key="source" ref="529575548"/>
<reference key="destination" ref="942006162"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="529575548"/>
<reference key="NSDestination" ref="942006162"/>
<string key="NSLabel">value: values.XCCAutoOpenErrorsPanel</string>
<string key="NSLabel">value: values.XCCAutoOpenErrorsPanelOnWarnings</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">values.XCCAutoOpenErrorsPanel</string>
<string key="NSKeyPath">values.XCCAutoOpenErrorsPanelOnWarnings</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSValidatesImmediately</string>
<boolean value="YES" key="NS.object.0"/>
@@ -1367,7 +1331,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">793</int>
<int key="connectionID">823</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
@@ -1385,6 +1349,42 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
</object>
<int key="connectionID">810</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: currentProjectPath.length</string>
<reference key="source" ref="854121054"/>
<reference key="destination" ref="1027936551"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="854121054"/>
<reference key="NSDestination" ref="1027936551"/>
<string key="NSLabel">enabled: currentProjectPath.length</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">currentProjectPath.length</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">812</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: values.XCCAutoOpenErrorsPanelOnErrors</string>
<reference key="source" ref="774318108"/>
<reference key="destination" ref="942006162"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="774318108"/>
<reference key="NSDestination" ref="942006162"/>
<string key="NSLabel">value: values.XCCAutoOpenErrorsPanelOnErrors</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">values.XCCAutoOpenErrorsPanelOnErrors</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSValidatesImmediately</string>
<boolean value="YES" key="NS.object.0"/>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">824</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
@@ -1432,6 +1432,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<reference ref="768182782"/>
<reference ref="798304033"/>
<reference ref="413460646"/>
<reference ref="854121054"/>
</array>
<reference key="parent" ref="0"/>
</object>
@@ -1521,31 +1522,14 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<reference key="object" ref="145921208"/>
<array class="NSMutableArray" key="children">
<reference ref="527635531"/>
<reference ref="529575548"/>
<reference ref="941049068"/>
<reference ref="745745556"/>
<reference ref="911700242"/>
<reference ref="624731292"/>
<reference ref="1001907295"/>
<reference ref="91964537"/>
<reference ref="529575548"/>
<reference ref="774318108"/>
</array>
<reference key="parent" ref="817657916"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">559</int>
<reference key="object" ref="911700242"/>
<array class="NSMutableArray" key="children">
<reference ref="783098791"/>
</array>
<reference key="parent" ref="145921208"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">561</int>
<reference key="object" ref="745745556"/>
<array class="NSMutableArray" key="children">
<reference ref="534768275"/>
</array>
<reference key="parent" ref="145921208"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">563</int>
<reference key="object" ref="527635531"/>
@@ -1559,16 +1543,6 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<reference key="object" ref="332414041"/>
<reference key="parent" ref="527635531"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">578</int>
<reference key="object" ref="534768275"/>
<reference key="parent" ref="745745556"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">580</int>
<reference key="object" ref="783098791"/>
<reference key="parent" ref="911700242"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">581</int>
<reference key="object" ref="348787045"/>
@@ -1770,11 +1744,6 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<reference key="object" ref="503199239"/>
<reference key="parent" ref="529575548"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">794</int>
<reference key="object" ref="941049068"/>
<reference key="parent" ref="145921208"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">797</int>
<reference key="object" ref="953620552"/>
@@ -1842,6 +1811,37 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<reference key="object" ref="653444688"/>
<reference key="parent" ref="929273598"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">811</int>
<reference key="object" ref="854121054"/>
<reference key="parent" ref="280310327"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">817</int>
<reference key="object" ref="91964537"/>
<array class="NSMutableArray" key="children">
<reference ref="346990638"/>
</array>
<reference key="parent" ref="145921208"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">818</int>
<reference key="object" ref="346990638"/>
<reference key="parent" ref="91964537"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">819</int>
<reference key="object" ref="774318108"/>
<array class="NSMutableArray" key="children">
<reference ref="368407823"/>
</array>
<reference key="parent" ref="145921208"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">820</int>
<reference key="object" ref="368407823"/>
<reference key="parent" ref="774318108"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -1873,12 +1873,8 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<dictionary class="NSMutableDictionary" key="557.IBAttributePlaceholdersKey"/>
<string key="557.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="558.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="559.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="561.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="563.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="576.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="578.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="580.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="581.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="582.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="583.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1918,7 +1914,6 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
</object>
<string key="789.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="790.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="794.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="797.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="798.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="801.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1929,12 +1924,25 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<string key="806.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="807.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="808.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="811.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="817.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="818.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSMutableDictionary" key="819.IBAttributePlaceholdersKey">
<string key="NS.key.0">ToolTip</string>
<object class="IBToolTipAttribute" key="NS.object.0">
<string key="name">ToolTip</string>
<reference key="object" ref="774318108"/>
<string key="toolTip">When an error or warning occurs, automatically open the Errors &amp; Warnings panel</string>
</object>
</object>
<string key="819.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="820.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">810</int>
<int key="maxID">824</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1945,7 +1953,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<string key="listenToProject:">id</string>
<string key="openAbout:">id</string>
<string key="openHelp:">id</string>
<string key="openInXcode:">id</string>
<string key="openPreferences:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="listenToProject:">
@@ -1960,8 +1968,8 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<string key="name">openHelp:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="openInXcode:">
<string key="name">openInXcode:</string>
<object class="IBActionInfo" key="openPreferences:">
<string key="name">openPreferences:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
@@ -2052,6 +2060,8 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<string key="clearErrors:">id</string>
<string key="openErrorInEditor:">id</string>
<string key="openErrorsPanel:">id</string>
<string key="openInXcode:">id</string>
<string key="resetProject:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="clearErrors:">
@@ -2066,6 +2076,14 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
<string key="name">openErrorsPanel:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="openInXcode:">
<string key="name">openInXcode:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="resetProject:">
<string key="name">resetProject:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="errorListController">NSArrayController</string>