On 18/08/2009, at 9:07 PM, I. Savant wrote:

It's not quite the same because a menu is another view and the table view is merely holding a reference to it. This is more an encapsulation problem.

 Sorry for being so quick to "play the MVC card". ;-)


In a way though, I think you're right. MVC can be applied at many different levels, and within the microcosm of the table view in isolation, the menu and the table's current selection are part of its "model". In this case the menu is a data structure that supplies the relevant commands that the table can respond to at this moment in time. While there's not much you can do with it except display it or not, in theory that information could be presented quite differently.

Taking a slightly bigger view, it is an encapsulation problem too. It's unexpected, and a surprise to me, for sure, that -menuForEvent: is doing this drawing. So surprising that I had to carefully check my results before I really believed it.

Here's a fun little method I wrote to explore this - it just fakes an event that gradually tracks from the top of the table to the bottom. As you can see, you wouldn't really expect it to draw anything, but it does highlight each row in turn. The call to the window's - displayIfNeeded is required to flush the drawing out during the loop. <mLayersTable> is the ivar for the tableview (in fact an outline view - I haven't tested this against a table view).

- (void)                        showMenuHighlightSideEffect
{
        NSEvent*        fakeMouseDown;
        NSPoint         mp;
        NSRect          tableFrame = [mLayersTable bounds];
        int             en = 12345;
        
        mp.x = NSMidX( tableFrame );
        mp.y = NSMinY( tableFrame );
        
        while( mp.y <= NSMaxY( tableFrame ))
        {
                NSPoint windowLocation = [mLayersTable convertPoint:mp 
toView:nil];
                
                fakeMouseDown = [NSEvent mouseEventWithType:NSRightMouseDown
                                        location:windowLocation
                                        modifierFlags:0
                                        timestamp:GetCurrentEventTime()
                                        windowNumber:[[mLayersTable window] 
windowNumber]
                                        context:[NSGraphicsContext 
currentContext]
                                        eventNumber:en++
                                        clickCount:1
                                        pressure:1.0];
                
                NSMenu* menu = [mLayersTable menuForEvent:fakeMouseDown];
                [[mLayersTable window] displayIfNeeded];
                
                NSLog(@"menu = %@", menu );
                
                mp.y++;
        }
}

--Graham



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to