diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j index 961f2a421..cf9eb933a 100644 --- a/AppKit/CPMenu/CPMenu.j +++ b/AppKit/CPMenu/CPMenu.j @@ -711,10 +711,7 @@ var _CPMenuBarVisible = NO, if (aView && !theWindow) throw "In call to popUpMenuPositioningItem:atLocation:inView:callback:, view is not in any window."; - var delegate = [self delegate]; - - if ([delegate respondsToSelector:@selector(menuWillOpen:)]) - [delegate menuWillOpen:self]; + [self _menuWillOpen]; // Convert location to global coordinates if not already in them. if (aView) @@ -802,10 +799,7 @@ var _CPMenuBarVisible = NO, + (void)popUpContextMenu:(CPMenu)aMenu withEvent:(CPEvent)anEvent forView:(CPView)aView withFont:(CPFont)aFont { - var delegate = [aMenu delegate]; - - if ([delegate respondsToSelector:@selector(menuWillOpen:)]) - [delegate menuWillOpen:aMenu]; + [aMenu _menuWillOpen]; if (!aFont) aFont = [CPFont systemFontOfSize:12.0]; @@ -875,7 +869,15 @@ var _CPMenuBarVisible = NO, */ - (CPMenuItem)highlightedItem { - return _highlightedIndex >= 0 ? _items[_highlightedIndex] : nil; + if (_highlightedIndex < 0) + return nil; + + var highlightedItem = _items[_highlightedIndex]; + + if ([highlightedItem isSeparatorItem]) + return nil; + + return highlightedItem; } // Managing the Delegate @@ -890,6 +892,22 @@ var _CPMenuBarVisible = NO, return _delegate; } +- (void)_menuWillOpen +{ + var delegate = [self delegate]; + + if ([delegate respondsToSelector:@selector(menuWillOpen:)]) + [delegate menuWillOpen:self]; +} + +- (void)_menuDidClose +{ + var delegate = [self delegate]; + + if ([delegate respondsToSelector:@selector(menuDidClose:)]) + [delegate menuDidClose:self]; +} + // Handling Tracking /*! Cancels tracking. diff --git a/AppKit/CPMenu/_CPMenuManager.j b/AppKit/CPMenu/_CPMenuManager.j index 1aec30b9d..57f253a65 100644 --- a/AppKit/CPMenu/_CPMenuManager.j +++ b/AppKit/CPMenu/_CPMenuManager.j @@ -11,6 +11,7 @@ var STICKY_TIME_INTERVAL = 500, @implementation _CPMenuManager: CPObject { CPTimeInterval _startTime; + BOOL _hasMouseGoneUpAfterStartedTracking; int _scrollingState; CGPoint _lastGlobalLocation; @@ -87,6 +88,8 @@ var STICKY_TIME_INTERVAL = 500, return [self trackMenuBarButtonEvent:anEvent]; } + _hasMouseGoneUpAfterStartedTracking = NO; + [self trackEvent:anEvent]; } @@ -221,8 +224,13 @@ var STICKY_TIME_INTERVAL = 500, [CPEvent startPeriodicEventsAfterDelay:0.0 withPeriod:0.04]; } } - else if (type === CPLeftMouseUp && ([anEvent timestamp] - _startTime > (STICKY_TIME_INTERVAL + [activeMenu numberOfItems] * 5))) - [trackingMenu cancelTracking]; + else if (type === CPLeftMouseUp) + { + if (_hasMouseGoneUpAfterStartedTracking) + [trackingMenu cancelTracking]; + else + _hasMouseGoneUpAfterStartedTracking = YES; + } } // Prevent previous selected menu items from opening by stopping the timer if a @@ -306,11 +314,7 @@ var STICKY_TIME_INTERVAL = 500, // Hide all submenus. [self showMenu:nil fromMenu:trackingMenu atPoint:nil]; - - var delegate = [trackingMenu delegate]; - - if ([delegate respondsToSelector:@selector(menuDidClose:)]) - [delegate menuDidClose:trackingMenu]; + [trackingMenu _menuDidClose]; if (_trackingCallback) _trackingCallback([self trackingMenuContainer], trackingMenu); @@ -379,6 +383,8 @@ var STICKY_TIME_INTERVAL = 500, var count = _menuContainerStack.length, index = count; + [newMenu _menuWillOpen]; + // Hide all menus up to the base menu... while (index--) { @@ -398,6 +404,8 @@ var STICKY_TIME_INTERVAL = 500, [_CPMenuWindow poolMenuWindow:menuContainer]; [_menuContainerStack removeObjectAtIndex:index]; + + [menu _menuDidClose]; } if (!newMenu) diff --git a/AppKit/CPMenuItem/CPMenuItem.j b/AppKit/CPMenuItem/CPMenuItem.j index 0cff6177a..e8e39a15f 100644 --- a/AppKit/CPMenuItem/CPMenuItem.j +++ b/AppKit/CPMenuItem/CPMenuItem.j @@ -496,6 +496,7 @@ CPOffState if (_submenu) { [_submenu setSupermenu:_menu]; + [_submenu setTitle:[self title]] [self setTarget:_menu]; [self setAction:@selector(submenuAction:)];