Merge branch 'master' into breakpoints
[macgdbp.git] / Source / BSLineNumberView.m
1 /*
2 * MacGDBp
3 * Copyright (c) 2007 - 2008, Blue Static <http://www.bluestatic.org>
4 *
5 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
6 * General Public License as published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
10 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along with this program; if not,
14 * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
15 */
16
17 #import "BSLineNumberView.h"
18
19
20 @implementation BSLineNumberView
21
22 @synthesize sourceView;
23
24 /**
25 * Initializer for the line number view
26 */
27 - (id)initWithFrame:(NSRect)frame
28 {
29 if (self = [super initWithFrame:frame])
30 {
31
32 }
33 return self;
34 }
35
36 /**
37 * Flip the coordinates
38 */
39 - (BOOL)isFlipped
40 {
41 return YES;
42 }
43
44 /**
45 * Draws the line numbers whenever necessary
46 */
47 - (void)drawRect:(NSRect)rect
48 {
49 // background color
50 [[NSColor colorWithDeviceRed:0.871 green:0.871 blue:0.871 alpha:1] set];
51 [NSBezierPath fillRect:rect];
52
53 [[NSColor blackColor] set];
54 [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x, rect.origin.y) toPoint:NSMakePoint(rect.origin.x + rect.size.width, rect.origin.y)];
55
56 [[NSColor grayColor] set];
57 [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x, rect.size.height) toPoint:NSMakePoint(rect.origin.x + rect.size.width, rect.size.height)];
58
59 // font attributes for the line number
60 NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:@"Monaco" size:9.0], NSFontAttributeName, [NSColor grayColor], NSForegroundColorAttributeName, nil];
61
62 unsigned i = 0, line = 1;
63 while (i < [[[sourceView textView] layoutManager] numberOfGlyphs])
64 {
65 NSRange fragRange;
66 NSRect fragRect = [self convertRect:[[[sourceView textView] layoutManager] lineFragmentRectForGlyphAtIndex:i effectiveRange:&fragRange] fromView:[sourceView textView]];
67 fragRect.origin.x = rect.origin.x; // horizontal scrolling matters not
68
69 // we want to paint the top and bottom line number even if they're cut off
70 NSRect testRect = rect;
71 testRect.origin.y -= fragRect.size.height - 1;
72 testRect.size.height += fragRect.size.height - 1;
73 if (NSPointInRect(fragRect.origin, testRect))
74 {
75 NSString *num = [NSString stringWithFormat:@"%u", line];
76 NSSize strSize = [num sizeWithAttributes:attrs];
77 [num drawAtPoint:NSMakePoint([self frame].size.width - strSize.width - 3, fragRect.origin.y + ((fragRect.size.height - strSize.height) / 2)) withAttributes:attrs];
78 }
79
80 i += fragRange.length;
81 line++;
82 }
83 }
84
85 /**
86 * Handles the mouse down event (which is adding, deleting, and toggling breakpoints)
87 */
88 - (void)mouseDown:(NSEvent *)event
89 {
90 // simplify our code a bit
91 NSScrollView *scrollView = [sourceView scrollView];
92 NSTextView *textView = [sourceView textView];
93
94 NSPoint clickLoc = [self convertPoint:[event locationInWindow] fromView:nil];
95
96 // calculate the relative difference between height of the line number view and the document view
97 float adjust = (int)([scrollView documentVisibleRect].size.height + [scrollView documentVisibleRect].origin.y) % (int)[self bounds].size.height;
98 adjust += [[textView layoutManager] lineFragmentRectForGlyphAtIndex:0 effectiveRange:NULL].size.height;
99 clickLoc.y += adjust; // apply that to the click location to make it seem like we're clicking in an unclipped region
100
101 unsigned line = 1;
102 unsigned i = 0;
103 while (i < [[textView layoutManager] numberOfGlyphs])
104 {
105 NSRange fragRange;
106 NSRect fragRect = [[textView layoutManager] lineFragmentRectForGlyphAtIndex:i effectiveRange:&fragRange];
107 fragRect.size.width = [self bounds].size.width;
108 //fragRect.origin.y += adjust;
109 if (NSPointInRect(clickLoc, fragRect))
110 {
111 NSLog(@"clicked in %i", line);
112 break;
113 }
114
115 i += fragRange.length;
116 //p.y += fragRect.size.height;
117 line++;
118 }
119 }
120
121 @end