check whether mouse was clicked inside NSTableView

321 views Asked by At

I have some mouse click-checking code in a NSTableView subclass that can intercept and modify mouse events to allow for clicking of buttons inside the table but the problem is that these events are also intercepted if the mouse is clicked anywhere else, not just on the table. My question therefore: How can I check if NSPoint.locationInWindow is within ONLY the table's visible bounds?

My code below lets the event through even if clicked somewhere where a table row is scrolled beyond the visible table area.

class ButtonTableView : NSTableView
{
    var isAtForeground:Bool = false;

    override init(frame frameRect:NSRect) {
        super.init(frame: frameRect);
    }

    required init?(coder:NSCoder) {
        super.init(coder: coder);
        addEventInterception();
    }

    func addEventInterception() {
        NSEvent.addLocalMonitorForEventsMatchingMask(.LeftMouseDownMask, handler: {
            (theEvent) -> NSEvent! in

            /* Don't bother if the table view is not in the foreground! */
            if (!self.isAtForeground) { return theEvent; }

            var e:NSEvent? = theEvent;
            let p:NSPoint = theEvent.locationInWindow;

            // Check for click within table bounds
            let tableBoundsInWindowCoords:NSRect = self.convertRect(self.bounds, toView: nil);
            if (CGRectContainsPoint(tableBoundsInWindowCoords, p))
            {
                // This gets through even if clicked on table rows that are scrolled-out and not within the table's visible area!
            }
        });
    }
}
1

There are 1 answers

0
BadmintonCat On BEST ANSWER

Wait! Say nothing! I once again figured it out after thorough contemplation ... I shouldn't check bounds of the table view but of its superview, the NSClipView! Makes total sense but might not be instantly obvious. This fixed the issue.