New: added "Show in Finder" item to XcodeCapp.

Shows the Cappuccino project folder. If Path Finder is installed, it says "Show in Path Finder" and that is used.

Reorganized the menu a bit and updated the help.
This commit is contained in:
Aparajita Fishman
2013-05-09 09:26:44 -04:00
parent a63bb155c2
commit 86d7ec4180
10 changed files with 261 additions and 199 deletions
+2 -2
View File
@@ -26,8 +26,8 @@
@property (strong) IBOutlet NSMenu *statusMenu;
@property (assign) IBOutlet NSMenuItem *menuItemHistory;
@property (assign) IBOutlet NSMenuItem *menuItemOpenInXcode;
@property (assign) IBOutlet NSMenuItem *menuItemListen;
@property (assign) IBOutlet NSMenuItem *menuItemOpenProject;
@property (assign) IBOutlet NSMenuItem *menuItemShowInFinder;
@property (strong) IBOutlet NSPanel *aboutWindow;
@property (strong) IBOutlet NSWindow *preferencesWindow;
+67 -35
View File
@@ -36,6 +36,7 @@ AppController *SharedAppControllerInstance = nil;
@property (nonatomic) NSImage *iconError;
@property (nonatomic) NSMenu *recentMenu;
@property NSStatusItem *statusItem;
@property NSString *finderName;
@end
@@ -58,39 +59,13 @@ AppController *SharedAppControllerInstance = nil;
DDLogVerbose(@"\n******************************\n** XcodeCapp started **\n******************************\n");
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
self.statusItem.menu = self.statusMenu;
self.statusItem.image = self.iconInactive;
self.statusItem.highlightMode = YES;
self.statusItem.length = self.iconInactive.size.width + 12; // Add some space around the icon
self.statusMenu.delegate = self;
self.aboutWindow.backgroundColor = [NSColor whiteColor];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
double firstLaunchVersion = [defaults doubleForKey:kDefaultFirstLaunchVersion];
// Note: the scanner will only get the major.minor version numbers, which is what we want.
NSScanner *scanner = [NSScanner scannerWithString:[self bundleVersion]];
double appVersion = 0.0;
[scanner scanDouble:&appVersion];
if ([defaults boolForKey:kDefaultFirstLaunch] || appVersion > firstLaunchVersion)
{
[defaults setBool:NO forKey:kDefaultFirstLaunch];
[defaults setDouble:appVersion forKey:kDefaultFirstLaunchVersion];
[self openHelp:self];
}
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(batchDidStart:) name:XCCBatchDidStartNotification object:nil];
[defaultCenter addObserver:self selector:@selector(batchDidEnd:) name:XCCBatchDidEndNotification object:nil];
[defaultCenter addObserver:self selector:@selector(projectDidFinishLoading:) name:XCCProjectDidFinishLoadingNotification object:nil];
[self initStatusItem];
[self initObservers];
[self initShowInFinderItem];
[self pruneProjectHistory];
[self updateHistoryMenu];
[self checkFirstLaunch];
}
- (void)applicationDidFinishLaunching:(NSNotification *)notification
@@ -167,6 +142,39 @@ AppController *SharedAppControllerInstance = nil;
#endif
}
- (void)initStatusItem
{
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
self.statusItem.menu = self.statusMenu;
self.statusItem.image = self.iconInactive;
self.statusItem.highlightMode = YES;
self.statusItem.length = self.iconInactive.size.width + 12; // Add some space around the icon
self.statusMenu.delegate = self;
}
- (void)initObservers
{
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(batchDidStart:) name:XCCBatchDidStartNotification object:nil];
[defaultCenter addObserver:self selector:@selector(batchDidEnd:) name:XCCBatchDidEndNotification object:nil];
[defaultCenter addObserver:self selector:@selector(projectDidFinishLoading:) name:XCCProjectDidFinishLoadingNotification object:nil];
}
- (void)initShowInFinderItem
{
// See if PathFinder is available
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
NSString *path = [workspace absolutePathForAppBundleWithIdentifier:@"com.cocoatech.PathFinder"];
if (path)
self.finderName = path.lastPathComponent.stringByDeletingPathExtension;
else
self.finderName = @"Finder";
self.menuItemShowInFinder.title = [NSString stringWithFormat:self.menuItemShowInFinder.title, self.finderName];
}
- (void)pruneProjectHistory
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
@@ -187,6 +195,25 @@ AppController *SharedAppControllerInstance = nil;
[defaults setObject:projectHistory forKey:kDefaultXCCProjectHistory];
}
- (void)checkFirstLaunch
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
double firstLaunchVersion = [defaults doubleForKey:kDefaultFirstLaunchVersion];
// Note: the scanner will only get the major.minor version numbers, which is what we want.
NSScanner *scanner = [NSScanner scannerWithString:[self bundleVersion]];
double appVersion = 0.0;
[scanner scanDouble:&appVersion];
if ([defaults boolForKey:kDefaultFirstLaunch] || appVersion > firstLaunchVersion)
{
[defaults setBool:NO forKey:kDefaultFirstLaunch];
[defaults setDouble:appVersion forKey:kDefaultFirstLaunchVersion];
[self openHelp:self];
}
}
#pragma mark - Properties
- (NSImage *)iconActive
@@ -253,8 +280,8 @@ AppController *SharedAppControllerInstance = nil;
- (void)projectDidFinishLoading:(NSNotification *)note
{
self.statusItem.image = self.xcc.hasErrors ? self.iconError : self.iconActive;
self.menuItemListen.title = [NSString stringWithFormat:@"Close “%@”", self.xcc.projectPath.lastPathComponent];
self.menuItemListen.action = @selector(closeProject:);
self.menuItemOpenProject.title = [NSString stringWithFormat:@"Close “%@”", self.xcc.projectPath.lastPathComponent];
self.menuItemOpenProject.action = @selector(closeProject:);
}
// Watch changes to the max recent projects preference
@@ -288,8 +315,8 @@ AppController *SharedAppControllerInstance = nil;
[self.xcc stop];
self.statusItem.image = self.iconInactive;
self.menuItemListen.title = @"Open Project…";
self.menuItemListen.action = @selector(loadProject:);
self.menuItemOpenProject.title = @"Open Project…";
self.menuItemOpenProject.action = @selector(loadProject:);
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kDefaultLastOpenedPath];
}
@@ -305,6 +332,11 @@ AppController *SharedAppControllerInstance = nil;
[self updateHistoryMenu];
}
- (IBAction)showInFinder:(id)aSender
{
[[NSWorkspace sharedWorkspace] openFile:self.xcc.projectPath withApplication:self.finderName];
}
- (IBAction)openHelp:(id)aSender
{
if (!self.helpView.document)
@@ -340,7 +372,7 @@ AppController *SharedAppControllerInstance = nil;
{
NSMenu *menu = aMenuItem.menu;
if (aMenuItem == self.menuItemListen)
if (aMenuItem == self.menuItemOpenProject)
{
return !!self.xcc.projectPath;
}
+2 -2
View File
@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>3.0.1</string>
<string>3.0.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>3.0.1</string>
<string>3.0.2</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSUIElement</key>
Binary file not shown.
@@ -176,15 +176,15 @@ class PBXFileReference(PBXType):
}
trees = [
'<absolute>',
'<group>',
'BUILT_PRODUCTS_DIR',
'DEVELOPER_DIR',
'SDKROOT',
'SOURCE_ROOT',
]
'<absolute>',
'<group>',
'BUILT_PRODUCTS_DIR',
'DEVELOPER_DIR',
'SDKROOT',
'SOURCE_ROOT',
]
def guess_file_type(self, ignore_unknown_type=True):
def guess_file_type(self, ignore_unknown_type=False):
self.remove('explicitFileType')
self.remove('lastKnownFileType')
@@ -212,7 +212,7 @@ class PBXFileReference(PBXType):
self['explicitFileType'] = ft
@classmethod
def Create(cls, os_path, tree='SOURCE_ROOT', ignore_unknown_type=True):
def Create(cls, os_path, tree='SOURCE_ROOT', ignore_unknown_type=False):
if tree not in cls.trees:
print 'Not a valid sourceTree type: %s' % tree
return None
@@ -608,7 +608,7 @@ class XcodeProject(PBXDict):
if b.add_library_search_paths(paths, recursive):
self.modified = True
# TODO: need to return value if project has been modified
# TODO: need to return value if project has been modified
def get_obj(self, id):
return self.objects.get(id)
@@ -618,36 +618,36 @@ class XcodeProject(PBXDict):
def get_files_by_os_path(self, os_path, tree='SOURCE_ROOT'):
files = [f for f in self.objects.values() if f.get('isa') == 'PBXFileReference'
and f.get('path') == os_path
and f.get('sourceTree') == tree]
and f.get('path') == os_path
and f.get('sourceTree') == tree]
return files
def get_files_by_name(self, name, parent=None):
if parent:
files = [f for f in self.objects.values() if f.get('isa') == 'PBXFileReference'
and f.get(name) == name
and parent.has_child(f)]
and f.get(name) == name
and parent.has_child(f)]
else:
files = [f for f in self.objects.values() if f.get('isa') == 'PBXFileReference'
and f.get(name) == name]
and f.get(name) == name]
return files
def get_build_files(self, id):
files = [f for f in self.objects.values() if f.get('isa') == 'PBXBuildFile'
and f.get('fileRef') == id]
and f.get('fileRef') == id]
return files
def get_groups_by_name(self, name, parent=None):
if parent:
groups = [g for g in self.objects.values() if g.get('isa') == 'PBXGroup'
and g.get_name() == name
and parent.has_child(g)]
and g.get_name() == name
and parent.has_child(g)]
else:
groups = [g for g in self.objects.values() if g.get('isa') == 'PBXGroup'
and g.get_name() == name]
and g.get_name() == name]
return groups
@@ -680,7 +680,7 @@ class XcodeProject(PBXDict):
path = os.path.abspath(path)
groups = [g for g in self.objects.values() if g.get('isa') == 'PBXGroup'
and os.path.abspath(g.get('path', '/dev/null')) == path]
and os.path.abspath(g.get('path', '/dev/null')) == path]
return groups
@@ -786,7 +786,7 @@ class XcodeProject(PBXDict):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
def add_file_if_doesnt_exist(self, f_path, parent=None, tree='SOURCE_ROOT', create_build_files=True, weak=False, ignore_unknown_type=True):
def add_file_if_doesnt_exist(self, f_path, parent=None, tree='SOURCE_ROOT', create_build_files=True, weak=False, ignore_unknown_type=False):
for obj in self.objects.values():
if 'path' in obj:
if self.path_leaf(f_path) == self.path_leaf(obj.get('path')):
@@ -794,7 +794,7 @@ class XcodeProject(PBXDict):
return self.add_file(f_path, parent, tree, create_build_files, weak, ignore_unknown_type=ignore_unknown_type)
def add_file(self, f_path, parent=None, tree='SOURCE_ROOT', create_build_files=True, weak=False, ignore_unknown_type=True):
def add_file(self, f_path, parent=None, tree='SOURCE_ROOT', create_build_files=True, weak=False, ignore_unknown_type=False):
results = []
abs_path = ''
@@ -829,16 +829,16 @@ class XcodeProject(PBXDict):
results.append(build_file)
if abs_path and tree == 'SOURCE_ROOT' \
and os.path.isfile(abs_path) \
and file_ref.build_phase == 'PBXFrameworksBuildPhase':
library_path = os.path.join('$(SRCROOT)', os.path.split(f_path)[0])
self.add_library_search_paths([library_path], recursive=False)
and os.path.isfile(abs_path) \
and file_ref.build_phase == 'PBXFrameworksBuildPhase':
library_path = os.path.join('$(SRCROOT)', os.path.split(f_path)[0])
self.add_library_search_paths([library_path], recursive=False)
if abs_path and tree == 'SOURCE_ROOT' \
and not os.path.isfile(abs_path) \
and file_ref.build_phase == 'PBXFrameworksBuildPhase':
framework_path = os.path.join('$(SRCROOT)', os.path.split(f_path)[0])
self.add_framework_search_paths([framework_path, '$(inherited)'], recursive=False)
and not os.path.isfile(abs_path) \
and file_ref.build_phase == 'PBXFrameworksBuildPhase':
framework_path = os.path.join('$(SRCROOT)', os.path.split(f_path)[0])
self.add_framework_search_paths([framework_path, '$(inherited)'], recursive=False)
for r in results:
self.objects[r.id] = r
@@ -1051,10 +1051,10 @@ class XcodeProject(PBXDict):
for f in v:
filerefs.extend([fr.id for fr in self.objects.values() if fr.get('isa') == 'PBXFileReference'
and fr.get('name') == f])
and fr.get('name') == f])
buildfiles = [bf for bf in self.objects.values() if bf.get('isa') == 'PBXBuildFile'
and bf.get('fileRef') in filerefs]
and bf.get('fileRef') in filerefs]
for bf in buildfiles:
if bf.add_compiler_flag(k):
@@ -1173,25 +1173,25 @@ class XcodeProject(PBXDict):
if enters:
out.write('\n')
#root.remove('objects') # remove it to avoid problems
#root.remove('objects') # remove it to avoid problems
sections = [
('PBXBuildFile', False),
('PBXCopyFilesBuildPhase', True),
('PBXFileReference', False),
('PBXFrameworksBuildPhase', True),
('PBXGroup', True),
('PBXNativeTarget', True),
('PBXProject', True),
('PBXResourcesBuildPhase', True),
('PBXShellScriptBuildPhase', True),
('PBXSourcesBuildPhase', True),
('XCBuildConfiguration', True),
('XCConfigurationList', True),
('PBXTargetDependency', True),
('PBXVariantGroup', True),
('PBXReferenceProxy', True),
('PBXContainerItemProxy', True)]
('PBXBuildFile', False),
('PBXCopyFilesBuildPhase', True),
('PBXFileReference', False),
('PBXFrameworksBuildPhase', True),
('PBXGroup', True),
('PBXNativeTarget', True),
('PBXProject', True),
('PBXResourcesBuildPhase', True),
('PBXShellScriptBuildPhase', True),
('PBXSourcesBuildPhase', True),
('XCBuildConfiguration', True),
('XCConfigurationList', True),
('PBXTargetDependency', True),
('PBXVariantGroup', True),
('PBXReferenceProxy', True),
('PBXContainerItemProxy', True)]
for section in sections: # iterate over the sections
if self.sections.get(section[0]) is None:
@@ -1252,37 +1252,37 @@ class XcodeProject(PBXDict):
if enters:
out.write('\n')
if enters:
out.write(deep)
out.write(')')
else:
if len(root) > 0 and re.match(regex, root).group(0) == root:
out.write(root.encode("utf-8"))
else:
out.write('"' + XcodeProject.addslashes(root.encode("utf-8")) + '"')
if root in self.uuids:
out.write(" /* " + self.uuids[root].encode("utf-8") + " */")
@classmethod
def Load(cls, path):
cls.plutil_path = os.path.join(os.path.split(__file__)[0], 'plutil')
if not os.path.isfile(XcodeProject.plutil_path):
cls.plutil_path = 'plutil'
# load project by converting to xml and then convert that using plistlib
p = subprocess.Popen([XcodeProject.plutil_path, '-convert', 'xml1', '-o', '-', path], stdout=subprocess.PIPE)
stdout, stderr = p.communicate()
# If the plist was malformed, returncode will be non-zero
if p.returncode != 0:
print stdout
return None
tree = plistlib.readPlistFromString(stdout)
return XcodeProject(tree, path)
@@ -1295,12 +1295,12 @@ class PBXWriter(plistlib.PlistWriter):
plistlib.PlistWriter.writeValue(self, value.data)
else:
plistlib.PlistWriter.writeValue(self, value)
def simpleElement(self, element, value=None):
"""
We have to override this method to deal with Unicode text correctly.
Non-ascii characters have to get encoded as character references.
"""
We have to override this method to deal with Unicode text correctly.
Non-ascii characters have to get encoded as character references.
"""
if value is not None:
value = _escapeAndEncode(value)
self.writeln("<%s>%s</%s>" % (element, value, element))
@@ -1310,8 +1310,8 @@ class PBXWriter(plistlib.PlistWriter):
# Regex to find any control chars, except for \t \n and \r
_controlCharPat = re.compile(
r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f"
r"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]")
r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f"
r"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]")
def _escapeAndEncode(text):
+2 -2
View File
@@ -101,8 +101,8 @@ extern NSString * const XCCProjectDidFinishLoadingNotification;
- (IBAction)openErrorsPanel:(id)sender;
- (IBAction)clearErrors:(id)sender;
- (IBAction)openErrorInEditor:(id)sender;
- (IBAction)openProjectInXcode:(id)aSender;
- (IBAction)resetProject:(id)aSender;
- (IBAction)openXcodeProject:(id)aSender;
- (IBAction)synchronizeProject:(id)aSender;
- (BOOL)executablesAreAccessible;
- (void)stop;
+5 -5
View File
@@ -401,7 +401,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef,
[self.operationQueue addOperation:op];
}
- (IBAction)openProjectInXcode:(id)aSender
- (IBAction)openXcodeProject:(id)aSender
{
BOOL isDirectory, opened = YES;
BOOL exists = [self.fm fileExistsAtPath:self.xcodeProjectPath isDirectory:&isDirectory];
@@ -426,11 +426,11 @@ void fsevents_callback(ConstFSEventStreamRef streamRef,
NSInteger response = NSRunAlertPanel(@"The project could not be opened.", @"%@\n\nWould you like to regenerate the project?", @"Yes", @"No", nil, text);
if (response == NSAlertDefaultReturn)
[self resetProject:self];
[self synchronizeProject:self];
}
}
- (IBAction)resetProject:(id)aSender
- (IBAction)synchronizeProject:(id)aSender
{
NSString *projectPath = self.projectPath;
@@ -571,7 +571,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef,
[self startEventStream];
if ([[NSUserDefaults standardUserDefaults] boolForKey:kDefaultAutoOpenXcodeProject])
[self openProjectInXcode:self];
[self openXcodeProject:self];
}
#pragma mark - Notification handlers
@@ -1158,7 +1158,7 @@ void fsevents_callback(ConstFSEventStreamRef streamRef,
}
}
[self resetProject:self];
[self synchronizeProject:self];
}
/*!
+118 -88
View File
@@ -81,13 +81,23 @@
</object>
<object class="NSMenuItem" id="798304033">
<reference key="NSMenu" ref="280310327"/>
<string key="NSTitle">Open Project in Xcode</string>
<string key="NSTitle">Open Xcode Project</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="457724053"/>
<reference key="NSMixedImage" ref="103460472"/>
<int key="NSTag">1</int>
</object>
<object class="NSMenuItem" id="506958448">
<reference key="NSMenu" ref="280310327"/>
<bool key="NSIsDisabled">YES</bool>
<bool key="NSIsSeparator">YES</bool>
<string key="NSTitle"/>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="457724053"/>
<reference key="NSMixedImage" ref="103460472"/>
</object>
<object class="NSMenuItem" id="854121054">
<reference key="NSMenu" ref="280310327"/>
<string key="NSTitle">Synchronize Project</string>
@@ -96,6 +106,14 @@
<reference key="NSOnImage" ref="457724053"/>
<reference key="NSMixedImage" ref="103460472"/>
</object>
<object class="NSMenuItem" id="830014144">
<reference key="NSMenu" ref="280310327"/>
<string key="NSTitle">Show in %@</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>
@@ -183,7 +201,7 @@
<nil key="NSViewClass"/>
<nil key="NSUserInterfaceItemIdentifier"/>
<object class="NSView" key="NSWindowView" id="694242143">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSTextField" id="1002122285">
@@ -191,8 +209,6 @@
<int key="NSvFlags">268</int>
<string key="NSFrame">{{164, 20}, {203, 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>
@@ -227,7 +243,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">266</int>
<string key="NSFrame">{{164, 126}, {221, 74}}</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">
@@ -274,7 +289,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</set>
<string key="NSFrame">{{17, 63}, {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>
@@ -296,8 +310,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
</array>
<string key="NSFrameSize">{402, 202}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="953620552"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
@@ -315,7 +327,7 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<nil key="NSUserInterfaceItemIdentifier"/>
<string key="NSWindowContentMinSize">{315, 77}</string>
<object class="NSView" key="NSWindowView" id="348787045">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSScrollView" id="437659618">
@@ -332,7 +344,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<array class="NSMutableArray" key="NSSubviews"/>
<string key="NSFrameSize">{550, 201}</string>
<reference key="NSSuperview" ref="894869502"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="859792698"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
@@ -410,7 +421,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</array>
<string key="NSFrame">{{1, 1}, {550, 201}}</string>
<reference key="NSSuperview" ref="437659618"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="646266235"/>
<reference key="NSDocView" ref="646266235"/>
<reference key="NSBGColor" ref="1049650271"/>
@@ -421,7 +431,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{535, 1}, {16, 45}}</string>
<reference key="NSSuperview" ref="437659618"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="323448938"/>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<reference key="NSTarget" ref="437659618"/>
@@ -433,7 +442,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{1, 273}, {512, 16}}</string>
<reference key="NSSuperview" ref="437659618"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="511285374"/>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSsFlags">1</int>
@@ -444,7 +452,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</array>
<string key="NSFrame">{{-1, 35}, {552, 203}}</string>
<reference key="NSSuperview" ref="348787045"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="894869502"/>
<int key="NSsFlags">133682</int>
<reference key="NSVScroller" ref="859792698"/>
@@ -460,7 +467,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{352, 8}, {85, 19}}</string>
<reference key="NSSuperview" ref="348787045"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="533310373"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="218840323">
@@ -487,7 +493,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{20, 8}, {85, 19}}</string>
<reference key="NSSuperview" ref="348787045"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="301554957"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="983166281">
@@ -510,8 +515,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{445, 8}, {85, 19}}</string>
<reference key="NSSuperview" ref="348787045"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="950035407">
<int key="NSCellFlags">-2080374784</int>
@@ -530,8 +533,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
</array>
<string key="NSFrameSize">{550, 237}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="437659618"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
@@ -550,7 +551,7 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<nil key="NSViewClass"/>
<nil key="NSUserInterfaceItemIdentifier"/>
<object class="NSView" key="NSWindowView" id="145921208">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSBox" id="98274870">
@@ -566,7 +567,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 81}, {271, 18}}</string>
<reference key="NSSuperview" ref="63476664"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="808034234"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="332414041">
@@ -600,7 +600,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 51}, {241, 18}}</string>
<reference key="NSSuperview" ref="63476664"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="624731292"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="630050563">
@@ -625,7 +624,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 20}, {106, 17}}</string>
<reference key="NSSuperview" ref="63476664"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1001907295"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -646,7 +644,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{124, 14}, {56, 26}}</string>
<reference key="NSSuperview" ref="63476664"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="991797832"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@@ -715,14 +712,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</array>
<string key="NSFrame">{{1, 1}, {395, 112}}</string>
<reference key="NSSuperview" ref="98274870"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="527635531"/>
<string key="NSReuseIdentifierKey">_NS:11</string>
</object>
</array>
<string key="NSFrame">{{17, 149}, {397, 128}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="63476664"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSOffsets">{0, 0}</string>
@@ -756,7 +751,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 73}, {363, 18}}</string>
<reference key="NSSuperview" ref="732728607"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="91964537"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="979906600">
@@ -781,7 +775,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{35, 17}, {81, 18}}</string>
<reference key="NSSuperview" ref="732728607"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="774318108"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="503199239">
@@ -806,8 +799,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{137, 17}, {60, 18}}</string>
<reference key="NSSuperview" ref="732728607"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="368407823">
<int key="NSCellFlags">-2080374784</int>
@@ -831,7 +822,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 43}, {306, 17}}</string>
<reference key="NSSuperview" ref="732728607"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="529575548"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
@@ -850,14 +840,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</array>
<string key="NSFrame">{{1, 1}, {395, 104}}</string>
<reference key="NSSuperview" ref="991797832"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="81268510"/>
<string key="NSReuseIdentifierKey">_NS:11</string>
</object>
</array>
<string key="NSFrame">{{17, 16}, {397, 120}}</string>
<reference key="NSSuperview" ref="145921208"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="732728607"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSOffsets">{0, 0}</string>
@@ -880,8 +868,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
</array>
<string key="NSFrameSize">{431, 292}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="98274870"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
@@ -899,7 +885,7 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<nil key="NSViewClass"/>
<nil key="NSUserInterfaceItemIdentifier"/>
<object class="NSView" key="NSWindowView" id="537816561">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="PDFView" id="91132672">
@@ -911,8 +897,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</set>
<string key="NSFrameSize">{716, 654}</string>
<reference key="NSSuperview" ref="537816561"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<int key="DisplayMode">1</int>
<bool key="PageBreaks">NO</bool>
@@ -921,8 +905,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
</array>
<string key="NSFrameSize">{716, 654}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="91132672"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
@@ -1029,22 +1011,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
<int key="connectionID">621</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">menuItemListen</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="395897870"/>
</object>
<int key="connectionID">622</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">menuItemOpenInXcode</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="798304033"/>
</object>
<int key="connectionID">623</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">preferencesWindow</string>
@@ -1061,14 +1027,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
<int key="connectionID">796</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">loadProject:</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="395897870"/>
</object>
<int key="connectionID">832</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">helpView</string>
@@ -1077,6 +1035,38 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
<int key="connectionID">858</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">loadProject:</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="395897870"/>
</object>
<int key="connectionID">864</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">menuItemOpenProject</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="395897870"/>
</object>
<int key="connectionID">869</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">menuItemShowInFinder</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="830014144"/>
</object>
<int key="connectionID">871</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">showInFinder:</string>
<reference key="source" ref="993249905"/>
<reference key="destination" ref="830014144"/>
</object>
<int key="connectionID">872</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">performClose:</string>
@@ -1191,19 +1181,19 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">resetProject:</string>
<reference key="source" ref="1027936551"/>
<reference key="destination" ref="854121054"/>
</object>
<int key="connectionID">816</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">openProjectInXcode:</string>
<string key="label">openXcodeProject:</string>
<reference key="source" ref="1027936551"/>
<reference key="destination" ref="798304033"/>
</object>
<int key="connectionID">831</int>
<int key="connectionID">866</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">synchronizeProject:</string>
<reference key="source" ref="1027936551"/>
<reference key="destination" ref="854121054"/>
</object>
<int key="connectionID">867</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
@@ -1519,6 +1509,22 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
</object>
<int key="connectionID">856</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: projectPath.length</string>
<reference key="source" ref="830014144"/>
<reference key="destination" ref="1027936551"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="830014144"/>
<reference key="NSDestination" ref="1027936551"/>
<string key="NSLabel">enabled: projectPath.length</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">projectPath.length</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">861</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
@@ -1567,6 +1573,8 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<reference ref="798304033"/>
<reference ref="413460646"/>
<reference ref="854121054"/>
<reference ref="506958448"/>
<reference ref="830014144"/>
</array>
<reference key="parent" ref="0"/>
</object>
@@ -2000,6 +2008,16 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<reference key="object" ref="91132672"/>
<reference key="parent" ref="537816561"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">859</int>
<reference key="object" ref="506958448"/>
<reference key="parent" ref="280310327"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">860</int>
<reference key="object" ref="830014144"/>
<reference key="parent" ref="280310327"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -2118,12 +2136,14 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<string key="847.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="848.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="857.IBPluginDependency">com.apple.pdfkit.ibplugin</string>
<string key="859.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="860.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">858</int>
<int key="maxID">872</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -2134,6 +2154,8 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<string key="loadProject:">id</string>
<string key="openAbout:">id</string>
<string key="openHelp:">id</string>
<string key="openPreferences:">id</string>
<string key="showInFinder:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="loadProject:">
@@ -2148,14 +2170,22 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<string key="name">openHelp:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="openPreferences:">
<string key="name">openPreferences:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="showInFinder:">
<string key="name">showInFinder:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="aboutWindow">NSPanel</string>
<string key="helpView">PDFView</string>
<string key="helpWindow">NSWindow</string>
<string key="menuItemHistory">NSMenuItem</string>
<string key="menuItemListen">NSMenuItem</string>
<string key="menuItemOpenInXcode">NSMenuItem</string>
<string key="menuItemOpenProject">NSMenuItem</string>
<string key="menuItemShowInFinder">NSMenuItem</string>
<string key="preferencesController">NSUserDefaultsController</string>
<string key="preferencesWindow">NSWindow</string>
<string key="statusMenu">NSMenu</string>
@@ -2178,12 +2208,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<string key="name">menuItemHistory</string>
<string key="candidateClassName">NSMenuItem</string>
</object>
<object class="IBToOneOutletInfo" key="menuItemListen">
<string key="name">menuItemListen</string>
<object class="IBToOneOutletInfo" key="menuItemOpenProject">
<string key="name">menuItemOpenProject</string>
<string key="candidateClassName">NSMenuItem</string>
</object>
<object class="IBToOneOutletInfo" key="menuItemOpenInXcode">
<string key="name">menuItemOpenInXcode</string>
<object class="IBToOneOutletInfo" key="menuItemShowInFinder">
<string key="name">menuItemShowInFinder</string>
<string key="candidateClassName">NSMenuItem</string>
</object>
<object class="IBToOneOutletInfo" key="preferencesController">
@@ -2215,8 +2245,8 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<string key="clearErrors:">id</string>
<string key="openErrorInEditor:">id</string>
<string key="openErrorsPanel:">id</string>
<string key="openProjectInXcode:">id</string>
<string key="resetProject:">id</string>
<string key="openXcodeProject:">id</string>
<string key="synchronizeProject:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="clearErrors:">
@@ -2231,12 +2261,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA</string>
<string key="name">openErrorsPanel:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="openProjectInXcode:">
<string key="name">openProjectInXcode:</string>
<object class="IBActionInfo" key="openXcodeProject:">
<string key="name">openXcodeProject:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="resetProject:">
<string key="name">resetProject:</string>
<object class="IBActionInfo" key="synchronizeProject:">
<string key="name">synchronizeProject:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>