tags:

views:

205

answers:

2

I have an NSCell subclass that I do all kinds of custom drawing in. The only time things seem to be entirely out of my control is when right clicking a cell to show the associated context menu. While showing it's context menu, the table (or cell - not sure which exactly is doing this) draws a focus rect. I would like to get rid of this, or at least find a way to draw my own version of it that better fits within my interface.

I have tried about 15 different methods that seem like they could give me control over this focus rect drawing itself (various first responder methods, various drawing methods, various highlight color methods, etc.), but I have yet to find something that changes anything about it.

Screenshot of the problem: http://twitpic.com/3zx2t

I am almost annoyed enough to class-dump AppKit and try to find whatever private method it's using to draw this annoying focus rect. Nothing else I do has any effect on it. Any help here would really save both my sanity and lots of future hair pulling.

Thanks so much!

A: 

On 10.5 and later, NSTableView allows you to bring up a contextual menu on any item in the table (that is, without having the side effect of changing the selection.)

It draws that 'focus rect' to indicate which item(s) are being acted on by the contextual menu.

Jim Correia
I understand - now how do I remove/control the drawing of it?
Joel Levin
There is no API to control this behavior, only SPI with the standard caveats.The default indicator provides valuable feedback to the user as to which items are going to be affected by the contextual menu choice. If you remove it, you should provide some alternate feedback to the users knows which items will be targeted.
Jim Correia
+2  A: 

Without completely overriding your table view's -drawRect: this is the only other way I know to get rid of the context menu highlight rect.

- (void)_drawContextMenuHighlightForIndexes:(NSIndexSet *)rowIndexes clipRect:(NSRect)rect {
    return;
}

This is the method, used in Leopard at least, to draw the highlight around cells that will be activated upon by a context menu. It is unfortunately called directly by NSTableView's -drawRect: method and as far as I know there is no other way to signal your disinterest in having those highlights drawn.

Of course this is private API, it may stop working in Snow Leopard, or some other release. But at worst that means that somewhere along the way the context menu highlight may start up again in your programs on newer releases or some other functionality using this method may not work later. You have been warned.

Ashley Clark