Implement |-mouseDown:| in BSLineNumberRulerView to get breakpoints working again
authorRobert Sesek <rsesek@bluestatic.org>
Fri, 14 Jan 2011 14:22:14 +0000 (09:22 -0500)
committerRobert Sesek <rsesek@bluestatic.org>
Sun, 16 Jan 2011 04:45:10 +0000 (23:45 -0500)
Source/BSLineNumberRulerView.h
Source/BSLineNumberRulerView.mm

index 9b1fd3833132b09934ad319fd75b106094dd6711..80b36bcd41f3a55e61308e49346103350096478a 100644 (file)
 // Designated initializer.
 - (id)initWithSourceView:(BSSourceView*)sourceView;
 
+// Performs layout and redraws the line number view.
 - (void)performLayout;
 
+// Returns the line number (1-based) at the given point. |point| should be in
+// the receiver's coordinate system.
+- (NSUInteger)lineNumberAtPoint:(NSPoint)point;
+
 @end
index aad921bc36bda043d160f10cc18224bbe23725fd..d4b102ac09b92de0dc4cde3fd8cc6bafb45c3162 100644 (file)
@@ -90,7 +90,7 @@ const CGFloat kRulerRightPadding = 2.5;
   const NSRange kNullRange = NSMakeRange(NSNotFound, 0);
   const CGFloat yOffset = [textView textContainerInset].height;
 
-  size_t lineCount = lineIndex_.size();
+  const size_t lineCount = lineIndex_.size();
   std::vector<NSUInteger>::iterator element =
       std::lower_bound(lineIndex_.begin(),
                        lineIndex_.end(),
@@ -149,6 +149,45 @@ const CGFloat kRulerRightPadding = 2.5;
   [self setNeedsDisplay:YES];
 }
 
+- (NSUInteger)lineNumberAtPoint:(NSPoint)point
+{
+  // Get some common elements of the source view.
+  NSTextView* textView = [sourceView_ textView];
+  NSLayoutManager* layoutManager = [textView layoutManager];
+  NSTextContainer* textContainer = [textView textContainer];
+  NSRect visibleRect = [[[self scrollView] contentView] bounds];
+  point.y += NSMinY(visibleRect);  // Adjust for scroll offset.
+
+  const CGFloat kWidth = NSWidth([self bounds]);
+  const NSRange kNullRange = NSMakeRange(NSNotFound, 0);
+  const size_t lineCount = lineIndex_.size();
+  for (NSUInteger line = 0; line < lineCount; ++line) {
+    NSUInteger firstCharacterIndex = lineIndex_[line];
+
+    NSUInteger rectCount;
+    NSRectArray frameRects =
+        [layoutManager rectArrayForCharacterRange:NSMakeRange(firstCharacterIndex, 0)
+                     withinSelectedCharacterRange:kNullRange
+                                  inTextContainer:textContainer
+                                        rectCount:&rectCount];
+    for (NSUInteger i = 0; i < rectCount; ++i) {
+      frameRects[i].size.width = kWidth;
+      if (NSPointInRect(point, frameRects[i])) {
+        return line + 1;
+      }
+    }
+  }
+  return NSNotFound;
+}
+
+- (void)mouseDown:(NSEvent*)theEvent
+{
+  NSPoint point = [theEvent locationInWindow];
+  point = [self convertPoint:point fromView:nil];
+  NSUInteger line = [self lineNumberAtPoint:point];
+  [sourceView_.delegate gutterClickedAtLine:line forFile:sourceView_.file];
+}
+
 // Private /////////////////////////////////////////////////////////////////////
 
 /**