3 * Copyright (c) 2007 - 2010, Blue Static <http://www.bluestatic.org>
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.
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.
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
17 #import "BSLineNumberView.h"
18 #import "Breakpoint.h"
19 #import "BSSourceView.h"
21 @interface BSLineNumberView (Private
)
22 - (void)drawMarkerInRect
:(NSRect
)rect
;
25 @implementation BSLineNumberView
27 @synthesize sourceView
, lineNumberRange
, markers
;
30 * Initializer for the line number view
32 - (id)initWithFrame
:(NSRect
)frame
34 if (self = [super initWithFrame
:frame
])
36 lineNumberRange
= NSMakeRange(0, 0);
42 * Flip the coordinates
50 * Draws the line numbers whenever necessary
52 - (void)drawRect
:(NSRect
)rect
55 [[NSColor colorWithDeviceRed
:0.871 green
:0.871 blue
:0.871 alpha
:1] set
];
56 [NSBezierPath fillRect
:rect
];
58 [[NSColor blackColor
] set
];
59 [NSBezierPath strokeLineFromPoint
:NSMakePoint(rect.origin.x
, rect.origin.y
) toPoint
:NSMakePoint(rect.origin.x
+ rect.size.width
, rect.origin.y
)];
61 [[NSColor grayColor
] set
];
62 [NSBezierPath strokeLineFromPoint
:NSMakePoint(rect.origin.x
, rect.size.height
) toPoint
:NSMakePoint(rect.origin.x
+ rect.size.width
, rect.size.height
)];
64 // font attributes for the line number
65 NSDictionary
* attrs
= [NSDictionary dictionaryWithObjectsAndKeys
:[NSFont fontWithName
:@
"Monaco" size
:9.0], NSFontAttributeName
, [NSColor grayColor
], NSForegroundColorAttributeName
, nil];
67 lineNumberRange
= NSMakeRange(0, 0);
69 unsigned i
= 0, line
= 1;
70 while (i
< [[[sourceView textView
] layoutManager
] numberOfGlyphs
])
73 NSRect fragRect
= [self convertRect
:[[[sourceView textView
] layoutManager
] lineFragmentRectForGlyphAtIndex
:i effectiveRange
:&fragRange
] fromView
:[sourceView textView
]];
74 fragRect.origin.x
= rect.origin.x
; // horizontal scrolling matters not
75 fragRect.size.width
= [self bounds
].size.width
;
77 // we want to paint the top and bottom line number even if they're cut off
78 NSRect testRect
= rect
;
79 testRect.origin.y
-= fragRect.size.height
- 1;
80 testRect.size.height
+= fragRect.size.height
- 1;
81 if (NSPointInRect(fragRect.origin
, testRect
))
83 lineNumberRange.location
= (lineNumberRange.length
== 0 ? line
: lineNumberRange.location
);
84 lineNumberRange.length
++;
85 NSString
* num
= [NSString stringWithFormat
:@
"%u", line
];
86 NSSize strSize
= [num sizeWithAttributes
:attrs
];
87 [num drawAtPoint
:NSMakePoint([self frame
].size.width
- strSize.width
- 3, fragRect.origin.y
+ ((fragRect.size.height
- strSize.height
) / 2)) withAttributes
:attrs
];
88 Breakpoint
* test
= [[Breakpoint alloc
] initWithLine
:line inFile
:[sourceView file
]];
89 if ([markers containsObject
:test
])
91 [self drawMarkerInRect
:fragRect
];
96 i
+= fragRange.length
;
102 * Handles the mouse down event (which is adding, deleting, and toggling breakpoints)
104 - (void)mouseDown
:(NSEvent
*)event
106 NSTextView
* textView
= [sourceView textView
];
108 NSPoint clickLoc
= [self convertPoint
:[event locationInWindow
] fromView
:nil];
112 while (i
< [[textView layoutManager
] numberOfGlyphs
])
115 NSRect fragRect
= [[textView layoutManager
] lineFragmentRectForGlyphAtIndex
:i effectiveRange
:&fragRange
];
116 fragRect.size.width
= [self bounds
].size.width
;
117 if (NSPointInRect(clickLoc
, fragRect
))
119 [[sourceView delegate
] gutterClickedAtLine
:(line
+ lineNumberRange.location
- 1) forFile
:[sourceView file
]];
123 i
+= fragRange.length
;
131 * Draws a marker in a given rectangle
133 - (void)drawMarkerInRect
:(NSRect
)rect
135 NSBezierPath
* path
= [NSBezierPath bezierPath
];
137 [path moveToPoint
:NSMakePoint(rect.origin.x
+ 2, rect.origin.y
+ 2)]; // initial origin
138 [path lineToPoint
:NSMakePoint(rect.size.width
- 7, rect.origin.y
+ 2)]; // upper right
139 [path lineToPoint
:NSMakePoint(rect.size.width
- 2, rect.origin.y
+ (rect.size.height
/ 2))]; // point
140 [path lineToPoint
:NSMakePoint(rect.size.width
- 7, rect.origin.y
+ rect.size.height
- 2)]; // lower right
141 [path lineToPoint
:NSMakePoint(rect.origin.x
+ 2, rect.origin.y
+ rect.size.height
- 2)]; // lower left
142 [path lineToPoint
:NSMakePoint(rect.origin.x
+ 2, rect.origin.y
+ 1)]; // upper left
144 [[NSColor colorWithDeviceRed
:0.004 green
:0.557 blue
:0.851 alpha
:1.0] set
];
147 [[NSColor colorWithDeviceRed
:0.0 green
:0.404 blue
:0.804 alpha
:1.0] set
];
148 [path setLineWidth
:2];