Skip to content

Commit 74c626b

Browse files
committed
Merge pull request #3 from JegnuX/master
Navigation Support
2 parents 643f924 + b6b8847 commit 74c626b

File tree

5 files changed

+105
-4
lines changed

5 files changed

+105
-4
lines changed

SCXcodeMinimap.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
18D2B13117244C0A0026D09F /* SCSelectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D2B13017244C0A0026D09F /* SCSelectionView.m */; };
1111
18FE09B61707639E00118FEB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18FE09B51707639E00118FEB /* Cocoa.framework */; };
1212
18FE09C9170764E400118FEB /* SCXcodeMinimap.m in Sources */ = {isa = PBXBuildFile; fileRef = 18FE09C8170764E400118FEB /* SCXcodeMinimap.m */; };
13+
B2A3E44A172E714F004A56C1 /* SCTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = B2A3E449172E714F004A56C1 /* SCTextView.m */; };
1314
/* End PBXBuildFile section */
1415

1516
/* Begin PBXFileReference section */
@@ -24,6 +25,8 @@
2425
18FE09C11707639E00118FEB /* SCXcodeMinimap-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SCXcodeMinimap-Prefix.pch"; sourceTree = "<group>"; };
2526
18FE09C7170764E400118FEB /* SCXcodeMinimap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SCXcodeMinimap.h; sourceTree = "<group>"; };
2627
18FE09C8170764E400118FEB /* SCXcodeMinimap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SCXcodeMinimap.m; sourceTree = "<group>"; };
28+
B2A3E448172E714F004A56C1 /* SCTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SCTextView.h; sourceTree = "<group>"; };
29+
B2A3E449172E714F004A56C1 /* SCTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SCTextView.m; sourceTree = "<group>"; };
2730
/* End PBXFileReference section */
2831

2932
/* Begin PBXFrameworksBuildPhase section */
@@ -81,6 +84,8 @@
8184
18FE09C8170764E400118FEB /* SCXcodeMinimap.m */,
8285
18D2B12F17244C0A0026D09F /* SCSelectionView.h */,
8386
18D2B13017244C0A0026D09F /* SCSelectionView.m */,
87+
B2A3E448172E714F004A56C1 /* SCTextView.h */,
88+
B2A3E449172E714F004A56C1 /* SCTextView.m */,
8489
18FE09BC1707639E00118FEB /* Supporting Files */,
8590
);
8691
path = SCXcodeMinimap;
@@ -158,6 +163,7 @@
158163
files = (
159164
18FE09C9170764E400118FEB /* SCXcodeMinimap.m in Sources */,
160165
18D2B13117244C0A0026D09F /* SCSelectionView.m in Sources */,
166+
B2A3E44A172E714F004A56C1 /* SCTextView.m in Sources */,
161167
);
162168
runOnlyForDeploymentPostprocessing = 0;
163169
};

SCXcodeMinimap/SCTextView.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// SCTextView.h
3+
// SCXcodeMinimap
4+
//
5+
// Created by Jérôme ALVES on 29/04/13.
6+
// Copyright (c) 2013 Stefan Ceriu. All rights reserved.
7+
//
8+
9+
#import <Cocoa/Cocoa.h>
10+
11+
@class SCTextView;
12+
13+
@protocol SCTextViewDelegate <NSTextViewDelegate>
14+
15+
- (void)textView:(SCTextView *)textView goAtRelativePosition:(NSPoint)position;
16+
17+
@end
18+
19+
@interface SCTextView : NSTextView
20+
21+
- (void)setDelegate:(id<SCTextViewDelegate>)anObject;
22+
- (id<SCTextViewDelegate>)delegate;
23+
24+
@end

SCXcodeMinimap/SCTextView.m

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//
2+
// SCTextView.m
3+
// SCXcodeMinimap
4+
//
5+
// Created by Jérôme ALVES on 29/04/13.
6+
// Copyright (c) 2013 Stefan Ceriu. All rights reserved.
7+
//
8+
9+
#import "SCTextView.h"
10+
11+
@implementation SCTextView
12+
13+
- (void)mouseDown:(NSEvent *)theEvent
14+
{
15+
[super mouseDown:theEvent];
16+
[self handleMouseEvent:theEvent];
17+
}
18+
19+
- (void)mouseDragged:(NSEvent *)theEvent
20+
{
21+
[super mouseDragged:theEvent];
22+
[self handleMouseEvent:theEvent];
23+
}
24+
25+
- (void) handleMouseEvent:(NSEvent *)theEvent
26+
{
27+
if ([self.delegate respondsToSelector:@selector(textView:goAtRelativePosition:)])
28+
{
29+
NSPoint locationInSelf = [self convertPoint:theEvent.locationInWindow fromView:nil];
30+
NSSize size = [self.layoutManager usedRectForTextContainer:self.textContainer].size;
31+
NSPoint point = NSMakePoint(locationInSelf.x / size.width, locationInSelf.y / size.height);
32+
33+
[self.delegate textView:self goAtRelativePosition:point];
34+
}
35+
}
36+
37+
- (void)setDelegate:(id<SCTextViewDelegate>)anObject
38+
{
39+
[super setDelegate:anObject];
40+
}
41+
42+
- (id<SCTextViewDelegate>)delegate
43+
{
44+
return (id<SCTextViewDelegate>)[super delegate];
45+
}
46+
47+
@end

SCXcodeMinimap/SCXcodeMinimap.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
//
88

99
#import <Cocoa/Cocoa.h>
10+
#import "SCTextView.h"
1011

11-
@interface SCXcodeMinimap : NSObject
12+
@interface SCXcodeMinimap : NSObject <SCTextViewDelegate>
1213

1314
@end

SCXcodeMinimap/SCXcodeMinimap.m

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
static NSString * const DVTFontAndColorSourceTextSettingsChangedNotification = @"DVTFontAndColorSourceTextSettingsChangedNotification";//Unused
2424

2525
#define kDefaultZoomLevel 0.1f
26-
#define kRightSidePadding 15.0f
26+
#define kRightSidePadding 10.0f
2727
#define kDefaultShadowLevel 0.1f
2828

2929
@implementation SCXcodeMinimap
@@ -167,24 +167,27 @@ - (void)onDidFinishSetup:(NSNotification*)sender
167167
CGFloat width = editorTextView.bounds.size.width * kDefaultZoomLevel;
168168

169169
NSRect frame = editorTextView.frame;
170-
frame.size.width -= width;
170+
frame.size.width -= (width + kRightSidePadding);
171171
[editorTextView setFrame:frame];
172172

173173
NSRect miniMapScrollViewFrame = NSMakeRect(editorContainerView.bounds.size.width - width - kRightSidePadding, 0, width, editorScrollView.bounds.size.height);
174174
NSScrollView *miniMapScrollView = [[NSScrollView alloc] initWithFrame:miniMapScrollViewFrame];
175175
[miniMapScrollView setWantsLayer:YES];
176176
[miniMapScrollView setAutoresizingMask: NSViewMinXMargin | NSViewWidthSizable | NSViewHeightSizable];
177177
[miniMapScrollView setDrawsBackground:NO];
178+
[miniMapScrollView setHorizontalScrollElasticity:NSScrollElasticityNone];
179+
[miniMapScrollView setVerticalScrollElasticity:NSScrollElasticityNone];
178180
[editorContainerView addSubview:miniMapScrollView];
179181
[miniMapScrollView release];
180182

181183
objc_setAssociatedObject(editorScrollView, &kKeyMiniMapScrollView, miniMapScrollView, OBJC_ASSOCIATION_ASSIGN);
182184

183-
NSTextView *miniMapTextView = [[NSTextView alloc] initWithFrame:miniMapScrollView.bounds];
185+
SCTextView *miniMapTextView = [[SCTextView alloc] initWithFrame:miniMapScrollView.bounds];
184186
[miniMapTextView setAutoresizingMask: NSViewMinXMargin | NSViewMaxXMargin | NSViewWidthSizable | NSViewHeightSizable];
185187
[miniMapTextView.textContainer setLineFragmentPadding:0.0f];
186188
[miniMapTextView setSelectable:NO];
187189
[miniMapTextView.layoutManager setDelegate:(id<NSLayoutManagerDelegate>)self];
190+
[miniMapTextView setDelegate:self];
188191

189192
objc_setAssociatedObject(miniMapTextView.layoutManager, &kKeyEditorTextView, editorTextView, OBJC_ASSOCIATION_ASSIGN);
190193

@@ -226,4 +229,24 @@ - (NSDictionary *)layoutManager:(NSLayoutManager *)layoutManager shouldUseTempor
226229
return [(id<NSLayoutManagerDelegate>)editorTextView layoutManager:layoutManager shouldUseTemporaryAttributes:attrs forDrawingToScreen:toScreen atCharacterIndex:charIndex effectiveRange:effectiveCharRange];
227230
}
228231

232+
#pragma mark - SCTextViewDelegate
233+
234+
- (void)textView:(SCTextView *)textView goAtRelativePosition:(NSPoint)position
235+
{
236+
NSScrollView *editorScrollView = objc_getAssociatedObject(textView.textContainer, &kKeyEditorScrollView);
237+
238+
CGFloat documentHeight = [editorScrollView.documentView frame].size.height;
239+
CGSize boundsSize = editorScrollView.bounds.size;
240+
CGFloat maxOffset = documentHeight - boundsSize.height;
241+
242+
CGFloat offset = floor(documentHeight * position.y - boundsSize.height/2);
243+
244+
offset = MIN(MAX(0, offset), maxOffset);
245+
246+
NSTextView *editorTextView = objc_getAssociatedObject(textView.layoutManager, &kKeyEditorTextView);
247+
248+
[editorTextView scrollRectToVisible:NSMakeRect(0, offset, boundsSize.width, boundsSize.height)];
249+
}
250+
251+
229252
@end

0 commit comments

Comments
 (0)