diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj index 0c5b9c08d..702fc3676 100644 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj +++ b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj @@ -182,6 +182,7 @@ E164FDD81720E77100263CE3 /* XcodeCapp */ = { isa = PBXGroup; children = ( + E1E90C60173B42D0005C6D5B /* MainMenu.xib */, E164FDF41720EBC100263CE3 /* AppController.m */, E1E90C371735D82B005C6D5B /* AppController.h */, E164FDFB1720EC5B00263CE3 /* XcodeCapp.m */, @@ -217,7 +218,6 @@ E164FE071720F25400263CE3 /* Resources */ = { isa = PBXGroup; children = ( - E1E90C60173B42D0005C6D5B /* MainMenu.xib */, E1ED6B6F173414E100641628 /* icon_128x128.png */, E1ED6B70173414E100641628 /* icon_128x128@2x.png */, E164FE2D1721A34900263CE3 /* icon-inactive.png */, diff --git a/Tools/XcodeCapp/XcodeCapp/AppController.h b/Tools/XcodeCapp/XcodeCapp/AppController.h index 96cea4703..b90190ae5 100644 --- a/Tools/XcodeCapp/XcodeCapp/AppController.h +++ b/Tools/XcodeCapp/XcodeCapp/AppController.h @@ -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; diff --git a/Tools/XcodeCapp/XcodeCapp/AppController.m b/Tools/XcodeCapp/XcodeCapp/AppController.m index 507c561a7..cfe32157f 100644 --- a/Tools/XcodeCapp/XcodeCapp/AppController.m +++ b/Tools/XcodeCapp/XcodeCapp/AppController.m @@ -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; } diff --git a/Tools/XcodeCapp/XcodeCapp/Info.plist b/Tools/XcodeCapp/XcodeCapp/Info.plist index 29816d948..09736b23d 100644 --- a/Tools/XcodeCapp/XcodeCapp/Info.plist +++ b/Tools/XcodeCapp/XcodeCapp/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.1 + 3.0.2 CFBundleSignature ???? CFBundleVersion - 3.0.1 + 3.0.2 LSApplicationCategoryType public.app-category.developer-tools LSUIElement diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp help.pages b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp help.pages index 6e417ba1c..f397df57a 100644 Binary files a/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp help.pages and b/Tools/XcodeCapp/XcodeCapp/Resources/XcodeCapp help.pages differ diff --git a/Tools/XcodeCapp/XcodeCapp/Resources/help.pdf b/Tools/XcodeCapp/XcodeCapp/Resources/help.pdf index f408520bf..753e4b1e7 100644 Binary files a/Tools/XcodeCapp/XcodeCapp/Resources/help.pdf and b/Tools/XcodeCapp/XcodeCapp/Resources/help.pdf differ diff --git a/Tools/XcodeCapp/XcodeCapp/Scripts/mod_pbxproj.py b/Tools/XcodeCapp/XcodeCapp/Scripts/mod_pbxproj.py index 82eabb686..f5c8d4a77 100755 --- a/Tools/XcodeCapp/XcodeCapp/Scripts/mod_pbxproj.py +++ b/Tools/XcodeCapp/XcodeCapp/Scripts/mod_pbxproj.py @@ -176,15 +176,15 @@ class PBXFileReference(PBXType): } trees = [ - '', - '', - 'BUILT_PRODUCTS_DIR', - 'DEVELOPER_DIR', - 'SDKROOT', - 'SOURCE_ROOT', - ] + '', + '', + '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" % (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): diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.h b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.h index 4f70ca1fd..373479452 100644 --- a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.h +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.h @@ -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; diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m index d51e4ef35..f0b194f37 100644 --- a/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m +++ b/Tools/XcodeCapp/XcodeCapp/XcodeCapp.m @@ -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]; } /*! diff --git a/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib index c94992e3a..255eca73d 100644 --- a/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib +++ b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib @@ -81,13 +81,23 @@ - Open Project in Xcode + Open Xcode Project 2147483647 1 + + + YES + YES + + + 2147483647 + + + Synchronize Project @@ -96,6 +106,14 @@ + + + Show in %@ + + 2147483647 + + + YES @@ -183,7 +201,7 @@ - + 256 @@ -191,8 +209,6 @@ 268 {{164, 20}, {203, 98}} - - YES 68157504 @@ -227,7 +243,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 266 {{164, 126}, {221, 74}} - YES @@ -274,7 +289,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {{17, 63}, {128, 128}} - _NS:9 YES @@ -296,8 +310,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {402, 202} - - {{0, 0}, {2560, 1418}} @@ -315,7 +327,7 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {315, 77} - + 256 @@ -332,7 +344,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {550, 201} - YES NO @@ -410,7 +421,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {{1, 1}, {550, 201}} - @@ -421,7 +431,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA -2147483392 {{535, 1}, {16, 45}} - NO @@ -433,7 +442,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA -2147483392 {{1, 273}, {512, 16}} - NO 1 @@ -444,7 +452,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {{-1, 35}, {552, 203}} - 133682 @@ -460,7 +467,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 289 {{352, 8}, {85, 19}} - YES @@ -487,7 +493,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 292 {{20, 8}, {85, 19}} - YES @@ -510,8 +515,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 289 {{445, 8}, {85, 19}} - - YES -2080374784 @@ -530,8 +533,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {550, 237} - - {{0, 0}, {2560, 1418}} @@ -550,7 +551,7 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA - + 256 @@ -566,7 +567,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{16, 81}, {271, 18}} - YES @@ -600,7 +600,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{16, 51}, {241, 18}} - YES @@ -625,7 +624,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{15, 20}, {106, 17}} - _NS:1535 YES @@ -646,7 +644,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{124, 14}, {56, 26}} - _NS:9 YES @@ -715,14 +712,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {{1, 1}, {395, 112}} - _NS:11 {{17, 149}, {397, 128}} - _NS:9 {0, 0} @@ -756,7 +751,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{16, 73}, {363, 18}} - YES @@ -781,7 +775,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{35, 17}, {81, 18}} - YES @@ -806,8 +799,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{137, 17}, {60, 18}} - - YES -2080374784 @@ -831,7 +822,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 268 {{16, 43}, {306, 17}} - _NS:1535 YES @@ -850,14 +840,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {{1, 1}, {395, 104}} - _NS:11 {{17, 16}, {397, 120}} - _NS:9 {0, 0} @@ -880,8 +868,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {431, 292} - - {{0, 0}, {2560, 1418}} @@ -899,7 +885,7 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA - + 256 @@ -911,8 +897,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {716, 654} - - _NS:9 1 NO @@ -921,8 +905,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA {716, 654} - - {{0, 0}, {2560, 1418}} @@ -1029,22 +1011,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 621 - - - menuItemListen - - - - 622 - - - - menuItemOpenInXcode - - - - 623 - preferencesWindow @@ -1061,14 +1027,6 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 796 - - - loadProject: - - - - 832 - helpView @@ -1077,6 +1035,38 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 858 + + + loadProject: + + + + 864 + + + + menuItemOpenProject + + + + 869 + + + + menuItemShowInFinder + + + + 871 + + + + showInFinder: + + + + 872 + performClose: @@ -1191,19 +1181,19 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA - resetProject: - - - - 816 - - - - openProjectInXcode: + openXcodeProject: - 831 + 866 + + + + synchronizeProject: + + + + 867 @@ -1519,6 +1509,22 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA 856 + + + enabled: projectPath.length + + + + + + enabled: projectPath.length + enabled + projectPath.length + 2 + + + 861 + @@ -1567,6 +1573,8 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA + + @@ -2000,6 +2008,16 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA + + 859 + + + + + 860 + + + @@ -2118,12 +2136,14 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.pdfkit.ibplugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin - 858 + 872 @@ -2134,6 +2154,8 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA id id id + id + id @@ -2148,14 +2170,22 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA openHelp: id + + openPreferences: + id + + + showInFinder: + id + NSPanel PDFView NSWindow NSMenuItem - NSMenuItem - NSMenuItem + NSMenuItem + NSMenuItem NSUserDefaultsController NSWindow NSMenu @@ -2178,12 +2208,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA menuItemHistory NSMenuItem - - menuItemListen + + menuItemOpenProject NSMenuItem - - menuItemOpenInXcode + + menuItemShowInFinder NSMenuItem @@ -2215,8 +2245,8 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA id id id - id - id + id + id @@ -2231,12 +2261,12 @@ dG9pbmUgTWVyY2FkYWwKICAgIGFudG9pbmUubWVyY2FkYWxAZ21haWwuY29tA openErrorsPanel: id - - openProjectInXcode: + + openXcodeProject: id - - resetProject: + + synchronizeProject: id