Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Updated NoodleLineNumbers for Lion / 64Bit / Xcode 4.1 #2

Open
wants to merge 1 commit into from

1 participant

@scottharwell

Your NoodleLineNumbers code has been great! I made some updates for Lion so that the code will work and the compiler will not throw any errors. I'm not sure if you would like to create a new branch for updated code so that the people still coding for older versions of OS X can still use what's there. But, I thought you may want to integrate this into your repository since I have seen some questions about it on Stack Overflow.

Thanks!

-Scott

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
This page is out of date. Refresh to see the latest.
Showing with 55 additions and 29 deletions.
  1. +3 −0  NoodleLineNumberView.h
  2. +52 −29 NoodleLineNumberView.m
View
3  NoodleLineNumberView.h
@@ -47,10 +47,13 @@
NSColor *_textColor;
NSColor *_alternateTextColor;
NSColor *_backgroundColor;
+ float value;
}
- (id)initWithScrollView:(NSScrollView *)aScrollView;
+- (id)initWithScrollView:(NSScrollView *)scrollView orientation:(NSRulerOrientation)orientation;
+
- (void)setFont:(NSFont *)aFont;
- (NSFont *)font;
View
81 NoodleLineNumberView.m
@@ -47,7 +47,13 @@ - (NSDictionary *)markerTextAttributes;
@implementation NoodleLineNumberView
-- (id)initWithScrollView:(NSScrollView *)aScrollView
+- (id)initWithScrollView: (NSScrollView *)aScrollView
+{
+ return [self initWithScrollView:aScrollView orientation:NSVerticalRuler];
+
+}
+
+- (id)initWithScrollView:(NSScrollView *)aScrollView orientation: (NSRulerOrientation)orientation
{
if ((self = [super initWithScrollView:aScrollView orientation:NSVerticalRuler]) != nil)
{
@@ -58,6 +64,7 @@ - (id)initWithScrollView:(NSScrollView *)aScrollView
return self;
}
+
- (void)awakeFromNib
{
_linesToMarkers = [[NSMutableDictionary alloc] init];
@@ -157,7 +164,7 @@ - (void)setClientView:(NSView *)aView
if ((aView != nil) && [aView isKindOfClass:[NSTextView class]])
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:NSTextStorageDidProcessEditingNotification object:[(NSTextView *)aView textStorage]];
-
+
[self invalidateLineIndices];
}
}
@@ -195,12 +202,12 @@ - (NSUInteger)lineNumberForLocation:(CGFloat)location
NSRange nullRange;
NSMutableArray *lines;
id view;
-
+
view = [self clientView];
visibleRect = [[[self scrollView] contentView] bounds];
lines = [self lineIndices];
-
+
location += NSMinY(visibleRect);
if ([view isKindOfClass:[NSTextView class]])
@@ -240,7 +247,7 @@ - (NoodleLineNumberMarker *)markerAtLine:(NSUInteger)line
- (void)calculateLines
{
id view;
-
+
view = [self clientView];
if ([view isKindOfClass:[NSTextView class]])
@@ -265,14 +272,14 @@ - (void)calculateLines
numberOfLines++;
}
while (index < stringLength);
-
+
// Check if text ends with a new line.
[text getLineStart:NULL end:&lineEnd contentsEnd:&contentEnd forRange:NSMakeRange([[_lineIndices lastObject] unsignedIntegerValue], 0)];
if (contentEnd < lineEnd)
{
[_lineIndices addObject:[NSNumber numberWithUnsignedInteger:index]];
}
-
+
oldThickness = [self ruleThickness];
newThickness = [self requiredThickness];
if (fabs(oldThickness - newThickness) > 1)
@@ -295,13 +302,13 @@ - (NSUInteger)lineNumberForCharacterIndex:(NSUInteger)index inText:(NSString *)t
{
NSUInteger left, right, mid, lineStart;
NSMutableArray *lines;
-
+
lines = [self lineIndices];
// Binary search
left = 0;
right = [lines count];
-
+
while ((right - left) > 1)
{
mid = (right + left) / 2;
@@ -333,10 +340,10 @@ - (NSDictionary *)textAttributes
- (NSDictionary *)markerTextAttributes
{
- return [NSDictionary dictionaryWithObjectsAndKeys:
+ return [NSDictionary dictionaryWithObjectsAndKeys:
[self font], NSFontAttributeName,
[self alternateTextColor], NSForegroundColorAttributeName,
- nil];
+ nil];
}
- (CGFloat)requiredThickness
@@ -357,7 +364,7 @@ - (CGFloat)requiredThickness
}
stringSize = [sampleString sizeWithAttributes:[self textAttributes]];
-
+
// Round up the value. There is a bug on 10.4 where the display gets all wonky when scrolling if you don't
// return an integral value here.
return ceil(MAX(DEFAULT_THICKNESS, stringSize.width + RULER_MARGIN * 2));
@@ -367,14 +374,27 @@ - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect
{
id view;
NSRect bounds;
-
- bounds = [self bounds];
-
+
+
+ bounds = [self bounds];
+
+ /*
+ if (value > 10.0) {
+
+ [[NSColor colorWithDeviceRed: 1.0 green: 0.5 blue: 0.5 alpha: 0.5] set];
+ NSRectFill(aRect);
+ }
+
+ value = value + 0.1;
+ */
+
+
+
if (_backgroundColor != nil)
{
[_backgroundColor set];
NSRectFill(bounds);
-
+
[[NSColor colorWithCalibratedWhite:0.58 alpha:1.0] set];
[NSBezierPath strokeLineFromPoint:NSMakePoint(NSMaxX(bounds) - 0/5, NSMinY(bounds)) toPoint:NSMakePoint(NSMaxX(bounds) - 0.5, NSMaxY(bounds))];
}
@@ -390,13 +410,13 @@ - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect
NSString *text, *labelText;
NSUInteger rectCount, index, line, count;
NSRectArray rects;
- CGFloat ypos, yinset;
+ CGFloat ypos, yinset, x;
NSDictionary *textAttributes, *currentTextAttributes;
NSSize stringSize, markerSize;
NoodleLineNumberMarker *marker;
NSImage *markerImage;
NSMutableArray *lines;
-
+
layoutManager = [view layoutManager];
container = [view textContainer];
text = [view string];
@@ -404,11 +424,11 @@ - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect
yinset = [view textContainerInset].height;
visibleRect = [[[self scrollView] contentView] bounds];
-
+
textAttributes = [self textAttributes];
lines = [self lineIndices];
-
+
// Find the characters that are currently visible
glyphRange = [layoutManager glyphRangeForBoundingRect:visibleRect inTextContainer:container];
range = [layoutManager characterRangeForGlyphRange:glyphRange actualGlyphRange:NULL];
@@ -419,6 +439,7 @@ - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect
count = [lines count];
+
for (line = [self lineNumberForCharacterIndex:range.location inText:text]; line < count; line++)
{
index = [[lines objectAtIndex:line] unsignedIntegerValue];
@@ -440,22 +461,23 @@ - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect
if (marker != nil)
{
- markerImage = [marker image];
+
+ markerImage = [marker image];
markerSize = [markerImage size];
markerRect = NSMakeRect(0.0, 0.0, markerSize.width, markerSize.height);
-
+
// Marker is flush right and centered vertically within the line.
markerRect.origin.x = NSWidth(bounds) - [markerImage size].width - 1.0;
markerRect.origin.y = ypos + NSHeight(rects[0]) / 2.0 - [marker imageOrigin].y;
-
- [markerImage drawInRect:markerRect fromRect:NSMakeRect(0, 0, markerSize.width, markerSize.height) operation:NSCompositeSourceOver fraction:1.0];
+
+ [markerImage drawInRect:markerRect fromRect:NSMakeRect(0, 0, markerSize.width, markerSize.height) operation:NSCompositeSourceOver fraction:1.0];
}
// Line numbers are internally stored starting at 0
labelText = [NSString stringWithFormat:@"%jd", (intmax_t)line + 1];
stringSize = [labelText sizeWithAttributes:textAttributes];
-
+
if (marker == nil)
{
currentTextAttributes = textAttributes;
@@ -466,10 +488,11 @@ - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect
}
// Draw string flush right, centered vertically within the line
+ x = ypos + (NSHeight(rects[0]) - stringSize.height) / 2.0;
[labelText drawInRect:
- NSMakeRect(NSWidth(bounds) - stringSize.width - RULER_MARGIN,
- ypos + (NSHeight(rects[0]) - stringSize.height) / 2.0,
- NSWidth(bounds) - RULER_MARGIN * 2.0, NSHeight(rects[0]))
+ NSMakeRect(NSWidth(bounds) - stringSize.width - RULER_MARGIN,
+ ypos + (NSHeight(rects[0]) - stringSize.height) / 2.0,
+ NSWidth(bounds) - RULER_MARGIN * 2.0, NSHeight(rects[0]))
withAttributes:currentTextAttributes];
}
}
@@ -488,7 +511,7 @@ - (void)setMarkers:(NSArray *)markers
[_linesToMarkers removeAllObjects];
[super setMarkers:nil];
-
+
enumerator = [markers objectEnumerator];
while ((marker = [enumerator nextObject]) != nil)
{
Something went wrong with that request. Please try again.