diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/NoodleLineNumberView.h | 3 | ||||
-rw-r--r-- | Source/NoodleLineNumberView.m | 47 |
2 files changed, 30 insertions, 20 deletions
diff --git a/Source/NoodleLineNumberView.h b/Source/NoodleLineNumberView.h index 09805a4e..e3e96873 100644 --- a/Source/NoodleLineNumberView.h +++ b/Source/NoodleLineNumberView.h @@ -40,6 +40,7 @@ NSColor *textColor; NSColor *alternateTextColor; NSColor *backgroundColor; + CGFloat maxHeightOfGlyph; CGFloat maxWidthOfGlyph; CGFloat maxWidthOfGlyph1; CGFloat maxWidthOfGlyph2; @@ -67,6 +68,8 @@ NSLayoutManager *layoutManager; NSTextContainer *container; + NSTextView *clientView; + } diff --git a/Source/NoodleLineNumberView.m b/Source/NoodleLineNumberView.m index f86a06e9..5e707f98 100644 --- a/Source/NoodleLineNumberView.m +++ b/Source/NoodleLineNumberView.m @@ -80,7 +80,9 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); [self font], NSFontAttributeName, [self textColor], NSForegroundColorAttributeName, nil] retain]; - maxWidthOfGlyph = [[NSString stringWithString:@"8"] sizeWithAttributes:textAttributes].width; + NSSize s = [[NSString stringWithString:@"8"] sizeWithAttributes:textAttributes]; + maxWidthOfGlyph = s.width; + maxHeightOfGlyph = s.height; [self updateGutterThicknessConstants]; currentRuleThickness = 0.0f; @@ -130,7 +132,9 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); font, NSFontAttributeName, [self textColor], NSForegroundColorAttributeName, nil] retain]; - maxWidthOfGlyph = [[NSString stringWithString:@"8"] sizeWithAttributes:textAttributes].width; + NSSize s = [[NSString stringWithString:@"8"] sizeWithAttributes:textAttributes]; + maxWidthOfGlyph = s.width; + maxHeightOfGlyph = s.height; [self updateGutterThicknessConstants]; } } @@ -154,7 +158,9 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); [self font], NSFontAttributeName, textColor, NSForegroundColorAttributeName, nil] retain]; - maxWidthOfGlyph = [[NSString stringWithString:@"8"] sizeWithAttributes:textAttributes].width; + NSSize s = [[NSString stringWithString:@"8"] sizeWithAttributes:textAttributes]; + maxWidthOfGlyph = s.width; + maxHeightOfGlyph = s.height; [self updateGutterThicknessConstants]; } } @@ -180,8 +186,9 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); { layoutManager = [(NSTextView*)aView layoutManager]; container = [(NSTextView*)aView textContainer]; + clientView = (NSTextView*)[self clientView]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:NSTextStorageDidProcessEditingNotification object:[(NSTextView *)aView textStorage]]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:NSTextStorageDidProcessEditingNotification object:[clientView textStorage]]; [self invalidateLineIndices]; } @@ -192,11 +199,11 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); - (void)textDidChange:(NSNotification *)notification { - if(![self clientView]) return; + if(!clientView) return; // Invalidate the line indices only if text view was changed in length but not if the font was changed. // They will be recalculated and recached on demand. - if([[(NSTextView *)[self clientView] textStorage] editedMask] != 1) + if([[clientView textStorage] editedMask] != 1) [self invalidateLineIndices]; [self setNeedsDisplay:YES]; @@ -280,7 +287,7 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect { - id view; + NSRect bounds; bounds = [self bounds]; @@ -294,9 +301,7 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); // [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMaxX(bounds) - 0.5, NSMinY(bounds)) toPoint:NSMakePoint(NSMaxX(bounds) - 0.5, NSMaxY(bounds))]; // } - view = [self clientView]; - - if ([view isKindOfClass:[NSTextView class]]) + if ([clientView isKindOfClass:[NSTextView class]]) { NSRect visibleRect; NSRange range, nullRange; @@ -304,15 +309,17 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); NSUInteger rectCount, lineIndex, line, count; NSRectArray rects; CGFloat yinset; - NSSize stringSize; NSArray *lines; nullRange = NSMakeRange(NSNotFound, 0); - yinset = [view textContainerInset].height; + yinset = [clientView textContainerInset].height; visibleRect = [[[self scrollView] contentView] bounds]; lines = [self lineIndices]; + count = [lines count]; + + if(!count) return; // Find the characters that are currently visible range = [layoutManager characterRangeForGlyphRange:[layoutManager glyphRangeForBoundingRect:visibleRect inTextContainer:container] actualGlyphRange:NULL]; @@ -321,8 +328,6 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); // It doesn't show up in the glyphs so would not be accounted for. range.length++; - count = [lines count]; - CGFloat boundsRULERMargin2 = NSWidth(bounds) - RULER_MARGIN2; CGFloat boundsWidthRULER = NSWidth(bounds) - RULER_MARGIN; CGFloat yinsetMinY = yinset - NSMinY(visibleRect); @@ -347,13 +352,16 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); // Line numbers are internally stored starting at 0 labelText = [NSString stringWithFormat:@"%lu", (NSUInteger)(line + 1)]; - stringSize = [labelText sizeWithAttributes:textAttributes]; + // How many digits has the current line number? + NSUInteger idx = line + 1; + NSInteger numOfDigits = 0; + while(idx) { numOfDigits++; idx/=10; } rectHeight = NSHeight(rects[0]); // Draw string flush right, centered vertically within the line [labelText drawInRect: - NSMakeRect(boundsWidthRULER - stringSize.width, - yinsetMinY + NSMinY(rects[0]) + ((NSInteger)(rectHeight - stringSize.height) >> 1), + NSMakeRect(boundsWidthRULER - (maxWidthOfGlyph * numOfDigits), + yinsetMinY + NSMinY(rects[0]) + ((NSInteger)(rectHeight - maxHeightOfGlyph) >> 1), boundsRULERMargin2, rectHeight) withAttributes:textAttributes]; } @@ -494,16 +502,15 @@ typedef NSRange (*RangeOfLineIMP)(id object, SEL selector, NSRange range); - (void)calculateLines { - id view = [self clientView]; - if ([view isKindOfClass:[NSTextView class]]) + if ([clientView isKindOfClass:[NSTextView class]]) { NSUInteger anIndex, stringLength, lineEnd, contentEnd; NSString *textString; CGFloat newThickness; - textString = [view string]; + textString = [clientView string]; stringLength = [textString length]; // Switch off line numbering if text larger than 3MB |