diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj index 67b152a26..c45efff2e 100644 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj +++ b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj @@ -75,6 +75,7 @@ E164FE2D1721A34900263CE3 /* icon-inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-inactive.png"; path = "Resources/icon-inactive.png"; sourceTree = ""; }; E164FE2E1721A34900263CE3 /* icon-working.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-working.png"; path = "Resources/icon-working.png"; sourceTree = ""; }; E17A822C172700B90095CD83 /* XcodeCapp.iconset */ = {isa = PBXFileReference; lastKnownFileType = folder.iconset; name = XcodeCapp.iconset; path = Resources/XcodeCapp.iconset; sourceTree = ""; }; + E1DD4DF517282BFC0063C0D7 /* UserDefaults.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserDefaults.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -139,6 +140,7 @@ E132ED941724B64C00D870AE /* FSEventCallback.m */, E132ED961724B6C400D870AE /* FSEventCallback.h */, E164FDFD1720EC5B00263CE3 /* UserDefaults.m */, + E1DD4DF517282BFC0063C0D7 /* UserDefaults.h */, E164FDEF1720E7FA00263CE3 /* Debug.xcconfig */, E164FDF01720E7FA00263CE3 /* Release.xcconfig */, E164FE121720F3E100263CE3 /* Scripts */, diff --git a/Tools/XcodeCapp/XcodeCapp/AppController.m b/Tools/XcodeCapp/XcodeCapp/AppController.m index ee8f9d6c0..35edb85d4 100644 --- a/Tools/XcodeCapp/XcodeCapp/AppController.m +++ b/Tools/XcodeCapp/XcodeCapp/AppController.m @@ -100,10 +100,18 @@ AppController *SharedAppControllerInstance = nil; kDefaultXCCReactMode: @YES, kDefaultXCCReopenLastProject: @YES, kDefaultXCCAutoOpenErrorsPanel: @YES, - kDefaultXCCProjectHistory: [NSArray new] + kDefaultXCCProjectHistory: [NSArray new], + kDefaultMaxRecentProjects: @20 }; - [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + [defaults registerDefaults:appDefaults]; + + [defaults addObserver:self + forKeyPath:kDefaultMaxRecentProjects + options:NSKeyValueObservingOptionNew + context:NULL]; } - (void)pruneProjectHistory @@ -118,11 +126,15 @@ AppController *SharedAppControllerInstance = nil; [projectHistory removeObjectAtIndex:i]; } + NSInteger maxProjects = [defaults integerForKey:kDefaultMaxRecentProjects]; + + if (projectHistory.count > maxProjects) + [projectHistory removeObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(maxProjects, projectHistory.count - maxProjects)]]; + [defaults setObject:projectHistory forKey:kDefaultXCCProjectHistory]; } -#pragma mark - -#pragma mark Properties +#pragma mark - Properties - (NSImage *)iconActive { @@ -160,8 +172,8 @@ AppController *SharedAppControllerInstance = nil; return _menuHistory; } -#pragma mark - -#pragma mark Notification handlers + +#pragma mark - Notification handlers /*! Clean up when the application stops. @@ -196,9 +208,13 @@ AppController *SharedAppControllerInstance = nil; self.menuItemListen.action = @selector(stopListening:); } +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if ([keyPath isEqualToString:kDefaultMaxRecentProjects]) + [self pruneProjectHistory]; +} -#pragma mark - -#pragma mark Utilities +#pragma mark - Utilities - (void)updateHistoryMenu { @@ -219,8 +235,7 @@ AppController *SharedAppControllerInstance = nil; } -#pragma mark - -#pragma mark Actions +#pragma mark - Actions - (IBAction)listenToProject:(id)aSender { @@ -250,6 +265,7 @@ AppController *SharedAppControllerInstance = nil; [projectHistory insertObject:path atIndex:0]; [defaults setObject:projectHistory forKey:kDefaultXCCProjectHistory]; + [self pruneProjectHistory]; [self updateHistoryMenu]; [self stopListening:self]; diff --git a/Tools/XcodeCapp/XcodeCapp/UserDefaults.h b/Tools/XcodeCapp/XcodeCapp/UserDefaults.h index 4697b1e45..c299e8163 100644 --- a/Tools/XcodeCapp/XcodeCapp/UserDefaults.h +++ b/Tools/XcodeCapp/XcodeCapp/UserDefaults.h @@ -20,5 +20,6 @@ extern NSString * const kDefaultXCCAutoOpenErrorsPanel; extern NSString * const kDefaultXCCProjectHistory; extern NSString * const kDefaultLastOpenedPath; extern NSString * const kDefaultPathModificationDates; +extern NSString * const kDefaultMaxRecentProjects; #endif diff --git a/Tools/XcodeCapp/XcodeCapp/UserDefaults.m b/Tools/XcodeCapp/XcodeCapp/UserDefaults.m index 9b79c934d..a78ac65cc 100644 --- a/Tools/XcodeCapp/XcodeCapp/UserDefaults.m +++ b/Tools/XcodeCapp/XcodeCapp/UserDefaults.m @@ -18,3 +18,4 @@ NSString * const kDefaultXCCAutoOpenErrorsPanel = @"XCCAutoOpenErrorsPanel"; NSString * const kDefaultXCCProjectHistory = @"XCCProjectHistory"; NSString * const kDefaultLastOpenedPath = @"LastOpenedPath"; NSString * const kDefaultPathModificationDates = @"pathModificationDates"; +NSString * const kDefaultMaxRecentProjects = @"maxRecentProjects"; diff --git a/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib index ea6f85446..0e16fc8ae 100644 --- a/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib +++ b/Tools/XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib @@ -20,6 +20,8 @@ NSImageView NSMenu NSMenuItem + NSPopUpButton + NSPopUpButtonCell NSScrollView NSScroller NSTableColumn @@ -194,7 +196,7 @@ YXJhaml0YS5jb20 3100 - + 6 System textBackgroundColor @@ -203,7 +205,7 @@ YXJhaml0YS5jb20 MQA - + 6 System textColor @@ -242,11 +244,11 @@ YXJhaml0YS5jb20 MC42NjY2NjY2NjY3AA - + NO - + 268 @@ -263,7 +265,7 @@ YXJhaml0YS5jb20 _NS:9 YES - + 134217728 33554432 @@ -283,7 +285,7 @@ YXJhaml0YS5jb20 {362, 185} - + {{0, 0}, {2560, 1418}} {10000000000000, 10000000000000} @@ -362,7 +364,7 @@ YXJhaml0YS5jb20 controlBackgroundColor - + 6 System controlTextColor @@ -528,21 +530,22 @@ YXJhaml0YS5jb20 3 2 - {{529, 541}, {336, 159}} + {{529, 541}, {336, 198}} 1685586944 Preferences NSWindow - + 256 268 - {{18, 39}, {282, 18}} + {{18, 43}, {282, 18}} + YES @@ -574,8 +577,10 @@ YXJhaml0YS5jb20 268 - {{18, 16}, {284, 17}} + {{18, 20}, {284, 17}} + + YES 68157504 @@ -598,8 +603,9 @@ YXJhaml0YS5jb20 268 - {{18, 123}, {295, 18}} + {{18, 162}, {295, 18}} + YES @@ -622,9 +628,10 @@ YXJhaml0YS5jb20 268 - {{18, 93}, {300, 18}} + {{18, 132}, {300, 18}} - + + YES -2080374784 @@ -646,8 +653,9 @@ YXJhaml0YS5jb20 10 - {{20, 72}, {296, 5}} + {{18, 76}, {300, 5}} + _NS:9 {0, 0} @@ -656,7 +664,7 @@ YXJhaml0YS5jb20 0 Box - + 3 MCAwLjgwMDAwMDAxMTkAA @@ -667,8 +675,102 @@ YXJhaml0YS5jb20 0 NO + + + 268 + {{17, 101}, {106, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Recent projects: + + _NS:1535 + + + + + NO + + + + 268 + {{126, 95}, {51, 26}} + + + + _NS:9 + YES + + -2076180416 + 2048 + + _NS:9 + + 109199360 + 129 + + + 400 + 75 + + + 30 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + 10 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 20 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + + 2 + 1 + YES + YES + 2 + + NO + - {336, 159} + {336, 198} + + {{0, 0}, {2560, 1418}} @@ -1289,6 +1391,22 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA 793 + + + selectedValue: values.maxRecentProjects + + + + + + selectedValue: values.maxRecentProjects + selectedValue + values.maxRecentProjects + 2 + + + 810 + @@ -1429,6 +1547,8 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA + + @@ -1555,7 +1675,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA - + @@ -1679,16 +1799,70 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA 797 - + - + 798 - - + + + + + 801 + + + + + + + + 802 + + + + + 803 + + + + + + + + 804 + + + + + + + + 805 + + + + + + + + + + 806 + + + + + 807 + + + + + 808 + + @@ -1769,12 +1943,20 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin - 800 + 810