From 0ec218a59999b13d8d0b361b233b9966e07c60d3 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Wed, 24 Apr 2013 11:38:57 -0400 Subject: [PATCH] New: XcodeCapp preference to set maximum recent projects. Previously the number of recent projects was unbounded, which made the recent menu unwieldy. Now the recent projects list is pruned to the maximum set in the preferences, which defaults to 20. --- .../XcodeCapp.xcodeproj/project.pbxproj | 2 + Tools/XcodeCapp/XcodeCapp/AppController.m | 36 ++- Tools/XcodeCapp/XcodeCapp/UserDefaults.h | 1 + Tools/XcodeCapp/XcodeCapp/UserDefaults.m | 1 + .../XcodeCapp/XcodeCapp/en.lproj/MainMenu.xib | 228 ++++++++++++++++-- 5 files changed, 235 insertions(+), 33 deletions(-) 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