2020
2121NSString *const IDESourceCodeEditorDidFinishSetupNotification = @" IDESourceCodeEditorDidFinishSetup" ;
2222
23- NSString *const SCXodeMinimapShowNotification = @" SCXodeMinimapShowNotification " ;
24- NSString *const SCXodeMinimapHideNotification = @" SCXodeMinimapHideNotification " ;
23+ NSString *const SCXcodeMinimapShouldDisplayChangeNotification = @" SCXcodeMinimapShouldDisplayChangeNotification " ;
24+ NSString *const SCXcodeMinimapShouldDisplay = @" SCXcodeMinimapShouldDisplay " ;
2525
26- NSString *const SCXodeMinimapThemeChangeNotification = @" SCXodeMinimapThemeChangeNotification" ;
26+ NSString *const SCXcodeMinimapThemeChangeNotification = @" SCXcodeMinimapThemeChangeNotification" ;
27+ NSString *const SCXcodeMinimapTheme = @" SCXcodeMinimapTheme" ;
2728
28- NSString *const SCXodeMinimapIsInitiallyHidden = @" SCXodeMinimapIsInitiallyHidden" ;
29- NSString *const SCXodeMinimapTheme = @" SCXodeMinimapTheme" ;
29+ NSString *const SCXcodeMinimapHighlightCommentsChangeNotification = @" SCXcodeMinimapHighlightCommentsChangeNotification" ;
30+ NSString *const SCXcodeMinimapShouldHighlightComments = @" SCXcodeMinimapShouldHighlightComments" ;
31+
32+ NSString *const SCXcodeMinimapHighlightPreprocessorChangeNotification = @" SCXcodeMinimapHighlightPreprocessorChangeNotification" ;
33+ NSString *const SCXcodeMinimapShouldHighlightPreprocessor = @" SCXcodeMinimapShouldHighlightPreprocessor" ;
34+
35+ NSString *const SCXcodeMinimapHideEditorScrollerChangeNotification = @" SCXcodeMinimapHideEditorScrollerChangeNotification" ;
36+ NSString *const SCXcodeMinimapShouldHideEditorScroller = @" SCXcodeMinimapShouldHideEditorScroller" ;
37+
38+ NSString *const kViewMenuItemTitle = @" View" ;
39+
40+ NSString *const kMinimapMenuItemTitle = @" Minimap" ;
41+ NSString *const kShowMinimapMenuItemTitle = @" Show Minimap" ;
42+ NSString *const kHideMinimapMenuItemTitle = @" Hide Minimap" ;
43+
44+ NSString *const kHighlightCommentsMenuItemTitle = @" Highlight comments" ;
45+ NSString *const kHighlightPreprocessorMenuItemTitle = @" Highlight preprocessor" ;
46+ NSString *const kHideEditorScrollerMenuItemTitle = @" Hide editor scroller" ;
47+
48+ NSString *const kThemeMenuItemTitle = @" Theme" ;
49+ NSString *const kEditorThemeMenuItemTitle = @" Editor Theme" ;
3050
3151@implementation SCXcodeMinimap
3252
@@ -43,55 +63,98 @@ - (id)init
4363{
4464 if (self = [super init ]) {
4565
66+ [self registerUserDefaults ];
4667 [self createMenuItem ];
4768
4869 [[NSNotificationCenter defaultCenter ] addObserver: self selector: @selector (onDidFinishSetup: ) name: IDESourceCodeEditorDidFinishSetupNotification object: nil ];
4970 }
5071 return self;
5172}
5273
74+ - (void )registerUserDefaults
75+ {
76+ NSDictionary *userDefaults = @{SCXcodeMinimapShouldDisplay : @(YES ),
77+ SCXcodeMinimapShouldHighlightComments : @(YES ),
78+ SCXcodeMinimapShouldHighlightPreprocessor :@(YES )};
79+
80+ [[NSUserDefaults standardUserDefaults ] registerDefaults: userDefaults];
81+ }
82+
5383#pragma mark - Menu Items and Actions
5484
5585- (void )createMenuItem
5686{
57- NSMenuItem *editMenuItem = [[NSApp mainMenu ] itemWithTitle: @" View " ];
87+ NSMenuItem *editMenuItem = [[NSApp mainMenu ] itemWithTitle: kViewMenuItemTitle ];
5888
5989 if (editMenuItem == nil ) {
6090 return ;
6191 }
6292
6393 [editMenuItem.submenu addItem: [NSMenuItem separatorItem ]];
6494
65- NSMenuItem *minimapMenuItem = [[NSMenuItem alloc ] initWithTitle: @" Minimap " action: nil keyEquivalent: @" " ];
95+ NSMenuItem *minimapMenuItem = [[NSMenuItem alloc ] initWithTitle: kMinimapMenuItemTitle action: nil keyEquivalent: @" " ];
6696 [editMenuItem.submenu addItem: minimapMenuItem];
6797
6898 NSMenu *minimapMenu = [[NSMenu alloc ] init ];
6999 {
70- NSMenuItem *showHideMinimapItem = [[NSMenuItem alloc ] initWithTitle: @" " action: nil keyEquivalent: @" M" ];
100+ NSMenuItem *showHideMinimapItem = [[NSMenuItem alloc ] initWithTitle: @" " action: @selector ( toggleMinimap: ) keyEquivalent: @" M" ];
71101 [showHideMinimapItem setKeyEquivalentModifierMask: NSControlKeyMask | NSShiftKeyMask ];
72102 [showHideMinimapItem setTarget: self ];
73103 [minimapMenu addItem: showHideMinimapItem];
74104
75- if ([[NSUserDefaults standardUserDefaults ] boolForKey: SCXodeMinimapIsInitiallyHidden]) {
76- [self hideMiniMap: showHideMinimapItem];
77- }
78- else {
79- [self showMiniMap: showHideMinimapItem];
80- }
105+ BOOL shouldDisplayMinimap = [[[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldDisplay] boolValue ];
106+ [showHideMinimapItem setTitle: (shouldDisplayMinimap ? kHideMinimapMenuItemTitle : kShowMinimapMenuItemTitle )];
81107
82108 [minimapMenu addItem: [NSMenuItem separatorItem ]];
83109 }
84110
85111 {
86- NSMenuItem *themesMenuItem = [[NSMenuItem alloc ] initWithTitle: @" Theme" action: nil keyEquivalent: @" " ];
112+ NSMenuItem *highlightCommentsMenuItem = [[NSMenuItem alloc ] initWithTitle: kHighlightCommentsMenuItemTitle
113+ action: @selector (toggleCommentsHighlighting: ) keyEquivalent: @" " ];
114+ [highlightCommentsMenuItem setTarget: self ];
115+ [minimapMenu addItem: highlightCommentsMenuItem];
116+
117+ BOOL commentsHighlightingEnabled = [[[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldHighlightComments] boolValue ];
118+ [highlightCommentsMenuItem setState: (commentsHighlightingEnabled ? NSOnState : NSOffState )];
119+
120+
121+ NSMenuItem *highlightPreprocessorMenuItem = [[NSMenuItem alloc ] initWithTitle: kHighlightPreprocessorMenuItemTitle
122+ action: @selector (togglePreprocessorHighlighting: ) keyEquivalent: @" " ];
123+ [highlightPreprocessorMenuItem setTarget: self ];
124+ [minimapMenu addItem: highlightPreprocessorMenuItem];
125+
126+ BOOL preprocessorHighlightingEnabled = [[[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldHighlightPreprocessor] boolValue ];
127+ [highlightPreprocessorMenuItem setState: (preprocessorHighlightingEnabled ? NSOnState : NSOffState )];
128+
129+
130+ NSMenuItem *hideEditorScrollerMenuItem = [[NSMenuItem alloc ] initWithTitle: kHideEditorScrollerMenuItemTitle
131+ action: @selector (toggleEditorScrollerHiding: ) keyEquivalent: @" " ];
132+ [hideEditorScrollerMenuItem setTarget: self ];
133+ [minimapMenu addItem: hideEditorScrollerMenuItem];
134+
135+ BOOL shouldHideEditorScroller = [[[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldHideEditorScroller] boolValue ];
136+ [hideEditorScrollerMenuItem setState: (shouldHideEditorScroller ? NSOnState : NSOffState )];
137+
138+
139+ [minimapMenu addItem: [NSMenuItem separatorItem ]];
140+ }
141+
142+ {
143+ NSMenuItem *themesMenuItem = [[NSMenuItem alloc ] initWithTitle: kThemeMenuItemTitle action: nil keyEquivalent: @" " ];
87144 [minimapMenu addItem: themesMenuItem];
88145
89146 NSMenu *themesMenu = [[NSMenu alloc ] init ];
90147 {
91- NSMenuItem *editorThemeMenuItem = [[NSMenuItem alloc ] initWithTitle: @" Editor Theme" action: @selector (setMinimapTheme: ) keyEquivalent: @" " ];
148+ NSString *currentThemeName = [[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapTheme];
149+
150+ NSMenuItem *editorThemeMenuItem = [[NSMenuItem alloc ] initWithTitle: kEditorThemeMenuItemTitle action: @selector (setMinimapTheme: ) keyEquivalent: @" " ];
92151 [editorThemeMenuItem setTarget: self ];
93152 [themesMenu addItem: editorThemeMenuItem];
94153
154+ if (currentThemeName == nil ) {
155+ [editorThemeMenuItem setState: NSOnState ];
156+ }
157+
95158 [themesMenu addItem: [NSMenuItem separatorItem ]];
96159
97160 NSArray *themes = [[DVTFontAndColorTheme preferenceSetsManager ] availablePreferenceSets ];
@@ -102,6 +165,10 @@ - (void)createMenuItem
102165 NSMenuItem *themeMenuItem = [[NSMenuItem alloc ] initWithTitle: theme.localizedName action: @selector (setMinimapTheme: ) keyEquivalent: @" " ];
103166 [themeMenuItem setTarget: self ];
104167 [themesMenu addItem: themeMenuItem];
168+
169+ if ([theme.localizedName isEqualToString: currentThemeName]) {
170+ [themeMenuItem setState: NSOnState ];
171+ }
105172 }
106173
107174 [themesMenu addItem: [NSMenuItem separatorItem ]];
@@ -110,6 +177,10 @@ - (void)createMenuItem
110177 NSMenuItem *themeMenuItem = [[NSMenuItem alloc ] initWithTitle: theme.localizedName action: @selector (setMinimapTheme: ) keyEquivalent: @" " ];
111178 [themeMenuItem setTarget: self ];
112179 [themesMenu addItem: themeMenuItem];
180+
181+ if ([theme.localizedName isEqualToString: currentThemeName]) {
182+ [themeMenuItem setState: NSOnState ];
183+ }
113184 }
114185 }
115186 [themesMenuItem setSubmenu: themesMenu];
@@ -118,35 +189,64 @@ - (void)createMenuItem
118189 [minimapMenuItem setSubmenu: minimapMenu];
119190}
120191
121- - (void )hideMiniMap : (NSMenuItem *)sender
192+ - (void )toggleMinimap : (NSMenuItem *)sender
122193{
123- [[ NSUserDefaults standardUserDefaults ] setBool: YES forKey: SCXodeMinimapIsInitiallyHidden ];
194+ BOOL shouldDisplayMinimap = [[[ NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldDisplay] boolValue ];
124195
125- [sender setTitle: @" Show Minimap" ];
126- [sender setAction: @selector (showMiniMap: )];
196+ [sender setTitle: (shouldDisplayMinimap ? kHideMinimapMenuItemTitle : kShowMinimapMenuItemTitle )];
197+ [[NSUserDefaults standardUserDefaults ] setObject: @(!shouldDisplayMinimap) forKey: SCXcodeMinimapShouldDisplay];
198+ [[NSNotificationCenter defaultCenter ] postNotificationName: SCXcodeMinimapShouldDisplayChangeNotification object: nil ];
199+ }
200+
201+ - (void )toggleCommentsHighlighting : (NSMenuItem *)sender
202+ {
203+ BOOL commentsHighlightingEnabled = [[[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldHighlightComments] boolValue ];
127204
128- [[NSNotificationCenter defaultCenter ] postNotificationName: SCXodeMinimapHideNotification object: nil ];
205+ [sender setState: (commentsHighlightingEnabled ? NSOffState : NSOnState )];
206+ [[NSUserDefaults standardUserDefaults ] setObject: @(!commentsHighlightingEnabled) forKey: SCXcodeMinimapShouldHighlightComments];
207+ [[NSNotificationCenter defaultCenter ] postNotificationName: SCXcodeMinimapHighlightCommentsChangeNotification object: nil ];
129208}
130209
131- - (void )showMiniMap : (NSMenuItem *)sender
210+ - (void )togglePreprocessorHighlighting : (NSMenuItem *)sender
132211{
133- [[ NSUserDefaults standardUserDefaults ] setBool: NO forKey: SCXodeMinimapIsInitiallyHidden ];
212+ BOOL preprocessorHighlightingEnabled = [[[ NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldHighlightPreprocessor] boolValue ];
134213
135- [sender setTitle: @" Hide Minimap" ];
136- [sender setAction: @selector (hideMiniMap: )];
214+ [sender setState: (preprocessorHighlightingEnabled ? NSOffState : NSOnState )];
215+ [[NSUserDefaults standardUserDefaults ] setObject: @(!preprocessorHighlightingEnabled) forKey: SCXcodeMinimapShouldHighlightPreprocessor];
216+ [[NSNotificationCenter defaultCenter ] postNotificationName: SCXcodeMinimapHighlightPreprocessorChangeNotification object: nil ];
217+ }
218+
219+ - (void )toggleEditorScrollerHiding : (NSMenuItem *)sender
220+ {
221+ BOOL shouldHideEditorScroller = [[[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldHideEditorScroller] boolValue ];
137222
138- [[NSNotificationCenter defaultCenter ] postNotificationName: SCXodeMinimapShowNotification object: nil ];
223+ [sender setState: (shouldHideEditorScroller ? NSOffState : NSOnState )];
224+ [[NSUserDefaults standardUserDefaults ] setObject: @(!shouldHideEditorScroller) forKey: SCXcodeMinimapShouldHideEditorScroller];
225+ [[NSNotificationCenter defaultCenter ] postNotificationName: SCXcodeMinimapHideEditorScrollerChangeNotification object: nil ];
139226}
140227
141228- (void )setMinimapTheme : (NSMenuItem *)sender
142229{
230+ NSString *currentThemeName = [[NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapTheme];
231+
232+ if (currentThemeName == sender.title || [currentThemeName isEqualToString: sender.title]) {
233+ return ;
234+ }
235+
236+ NSMenu *themesSubmenu = [[[[NSApp mainMenu ] itemWithTitle: kViewMenuItemTitle ].submenu itemWithTitle: kMinimapMenuItemTitle ].submenu itemWithTitle: kThemeMenuItemTitle ].submenu ;
237+ for (NSMenuItem *item in themesSubmenu.itemArray ) {
238+ [item setState: NSOffState ];
239+ }
240+
241+ [sender setState: NSOnState ];
242+
143243 if ([sender.menu indexOfItem: sender] == 0 ) {
144- [[NSUserDefaults standardUserDefaults ] removeObjectForKey: SCXodeMinimapTheme ];
244+ [[NSUserDefaults standardUserDefaults ] removeObjectForKey: SCXcodeMinimapTheme ];
145245 } else {
146- [[NSUserDefaults standardUserDefaults ] setObject: sender.title forKey: SCXodeMinimapTheme ];
246+ [[NSUserDefaults standardUserDefaults ] setObject: sender.title forKey: SCXcodeMinimapTheme ];
147247 }
148248
149- [[NSNotificationCenter defaultCenter ] postNotificationName: SCXodeMinimapThemeChangeNotification object: nil ];
249+ [[NSNotificationCenter defaultCenter ] postNotificationName: SCXcodeMinimapThemeChangeNotification object: nil ];
150250}
151251
152252#pragma mark - Xcode Notification
@@ -167,7 +267,7 @@ - (void)onDidFinishSetup:(NSNotification*)sender
167267 SCXcodeMinimapView *miniMapView = [[SCXcodeMinimapView alloc ] initWithFrame: miniMapScrollViewFrame editor: editor];
168268 [editor.containerView addSubview: miniMapView];
169269
170- [miniMapView setVisible: ![[ NSUserDefaults standardUserDefaults ] boolForKey: SCXodeMinimapIsInitiallyHidden ]];
270+ [miniMapView setVisible: [[[ NSUserDefaults standardUserDefaults ] objectForKey: SCXcodeMinimapShouldDisplay] boolValue ]];
171271}
172272
173273@end
0 commit comments