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!
}
});
}
}
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.