diff --git a/AppKit/CPMenu/_CPMenuManager.j b/AppKit/CPMenu/_CPMenuManager.j index 85ddee116..e022f8ddc 100644 --- a/AppKit/CPMenu/_CPMenuManager.j +++ b/AppKit/CPMenu/_CPMenuManager.j @@ -57,14 +57,34 @@ var SharedMenuManager = nil; constraintRect:(CGRect)aRect callback:(Function)aCallback { - CPApp._activeMenu = [aMenuContainer menu]; + var menu = [aMenuContainer menu]; + + CPApp._activeMenu = menu; _startTime = [anEvent timestamp];//new Date(); _scrollingState = _CPMenuManagerScrollingStateNone; _constraintRect = aRect; - _trackingCallback = aCallback; _menuContainerStack = [aMenuContainer]; + _trackingCallback = aCallback; + + if (menu === [CPApp mainMenu]) + { + var globalLocation = [anEvent globalLocation]; + + // Find which menu window the mouse is currently on top of + var menuLocation = [aMenuContainer convertGlobalToBase:globalLocation]; + + // Find out the item the mouse is currently on top of + var activeItemIndex = [aMenuContainer itemIndexAtPoint:menuLocation], + activeItem = activeItemIndex !== CPNotFound ? [menu itemAtIndex:activeItemIndex] : nil; + + _menuBarButtonItemIndex = activeItemIndex; + _menuBarButtonMenuContainer = aMenuContainer; + + if ([activeItem _isMenuBarButton]) + return [self trackMenuBarButtonEvent:anEvent]; + } [self trackEvent:anEvent]; } @@ -76,32 +96,7 @@ var SharedMenuManager = nil; // Close Menu Event. if (type === CPAppKitDefined) - { - // Stop all periodic events at this point. - [CPEvent stopPeriodicEvents]; - - // Get the highlighted item from the original menu. - var highlightedItem = [trackingMenu highlightedItem]; - - // Hide all submenus. - [self showMenu:nil fromMenu:trackingMenu atPoint:nil]; - - var delegate = [trackingMenu delegate]; - - if ([delegate respondsToSelector:@selector(menuDidClose:)]) - [delegate menuDidClose:trackingMenu]; - - if (_trackingCallback) - _trackingCallback([self trackingMenuContainer], trackingMenu); - - [[CPNotificationCenter defaultCenter] - postNotificationName:CPMenuDidEndTrackingNotification - object:trackingMenu]; - - CPApp._activeMenu = nil; - - return; - } + return [self completeTracking] [CPApp setTarget:self selector:@selector(trackEvent:) forNextEventMatchingMask:CPPeriodicMask | CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPAppKitDefinedMask untilDate:nil inMode:nil dequeue:YES]; @@ -121,7 +116,7 @@ var SharedMenuManager = nil; activeItem = activeItemIndex !== CPNotFound ? [activeMenu itemAtIndex:activeItemIndex] : nil; // If the item isn't enabled its as if we clicked on nothing. - if (![activeItem isEnabled]) + if (![activeItem isEnabled] || [activeItem _isMenuBarButton]) { activeItemIndex = CPNotFound; activeItem = nil; @@ -217,6 +212,59 @@ var SharedMenuManager = nil; [self showMenu:nil fromMenu:activeMenu atPoint:CGPointMakeZero()]; } +- (void)trackMenuBarButtonEvent:(CPEvent)anEvent +{ + var type = [anEvent type]; + + if (type === CPAppKitDefined) + return [self completeTracking]; + + var globalLocation = [anEvent globalLocation]; + + // Find which menu window the mouse is currently on top of + var menu = [self trackingMenu], + trackingMenuContainer = [self trackingMenuContainer], + menuLocation = [trackingMenuContainer convertGlobalToBase:globalLocation]; + + if ([trackingMenuContainer itemIndexAtPoint:menuLocation] === _menuBarButtonItemIndex) + [menu _highlightItemAtIndex:_menuBarButtonItemIndex]; + + else + [menu _highlightItemAtIndex:CPNotFound]; + + [CPApp setTarget:self selector:@selector(trackMenuBarButtonEvent:) forNextEventMatchingMask:CPPeriodicMask | CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPAppKitDefinedMask untilDate:nil inMode:nil dequeue:YES]; + + if (type === CPLeftMouseUp) + [menu cancelTracking]; +} + +- (void)completeTracking +{ + var trackingMenu = [self trackingMenu]; + + // Stop all periodic events at this point. + [CPEvent stopPeriodicEvents]; + + // Get the highlighted item from the original menu. + var highlightedItem = [trackingMenu highlightedItem]; + + // Hide all submenus. + [self showMenu:nil fromMenu:trackingMenu atPoint:nil]; + + var delegate = [trackingMenu delegate]; + + if ([delegate respondsToSelector:@selector(menuDidClose:)]) + [delegate menuDidClose:trackingMenu]; + + if (_trackingCallback) + _trackingCallback([self trackingMenuContainer], trackingMenu); + + [[CPNotificationCenter defaultCenter] + postNotificationName:CPMenuDidEndTrackingNotification + object:trackingMenu]; + + CPApp._activeMenu = nil; +} - (id)menuContainerForPoint:(float)aGlobalLocation { diff --git a/AppKit/CPMenuItem/CPMenuItem.j b/AppKit/CPMenuItem/CPMenuItem.j index 000aa12d7..c8d84026e 100644 --- a/AppKit/CPMenuItem/CPMenuItem.j +++ b/AppKit/CPMenuItem/CPMenuItem.j @@ -799,6 +799,11 @@ CPControlKeyMask return ![self submenu] || [self action] !== @selector(submenuAction:) || [self target] !== [self menu]; } +- (BOOL)_isMenuBarButton +{ + return ![self submenu] && [self menu] === [CPApp mainMenu]; +} + @end var CPMenuItemIsSeparatorKey = @"CPMenuItemIsSeparatorKey", diff --git a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j index d10a239e7..6e232fef8 100644 --- a/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j +++ b/AppKit/CPMenuItem/_CPMenuItemMenuBarView.j @@ -159,8 +159,10 @@ var SelectionColor = nil, if (shouldHighlight) { - [self setBackgroundColor:SelectionColor]; + if (![_menuItem _isMenuBarButton]) + [self setBackgroundColor:SelectionColor]; + [_imageAndTextView setImage:[_menuItem alternateImage] || [_menuItem image]]; [_imageAndTextView setTextColor:[CPColor whiteColor]]; [_imageAndTextView setTextShadowColor:_CPMenuItemTextShadowColor]; @@ -171,6 +173,7 @@ var SelectionColor = nil, { [self setBackgroundColor:nil]; + [_imageAndTextView setImage:[_menuItem image]]; [_imageAndTextView setTextColor:[self textColor]]; [_imageAndTextView setTextShadowColor:[self textShadowColor]]; diff --git a/AppKit/CPMenuItem/_CPMenuItemStandardView.j b/AppKit/CPMenuItem/_CPMenuItemStandardView.j index bc010b24b..db15e5417 100644 --- a/AppKit/CPMenuItem/_CPMenuItemStandardView.j +++ b/AppKit/CPMenuItem/_CPMenuItemStandardView.j @@ -236,6 +236,7 @@ var SUBMENU_INDICATOR_COLOR = nil, { [self setBackgroundColor:_CPMenuItemSelectionColor]; + [_imageAndTextView setImage:[_menuItem alternateImage] || [_menuItem image]]; [_imageAndTextView setTextColor:[CPColor whiteColor]]; [_keyEquivalentView setTextColor:[CPColor whiteColor]]; [_submenuIndicatorView setColor:[CPColor whiteColor]]; @@ -246,7 +247,8 @@ var SUBMENU_INDICATOR_COLOR = nil, else { [self setBackgroundColor:nil]; - + + [_imageAndTextView setImage:[_menuItem image]]; [_imageAndTextView setTextColor:[self textColor]]; [_keyEquivalentView setTextColor:[self textColor]]; [_submenuIndicatorView setColor:SUBMENU_INDICATOR_COLOR]; diff --git a/AppKit/CPMenuItem/_CPMenuItemView.j b/AppKit/CPMenuItem/_CPMenuItemView.j index cd00ff2ff..d4ef798f0 100644 --- a/AppKit/CPMenuItem/_CPMenuItemView.j +++ b/AppKit/CPMenuItem/_CPMenuItemView.j @@ -155,24 +155,6 @@ var _CPMenuItemSelectionColor = nil, [_view highlight:shouldHighlight]; } -- (void)activate:(BOOL)shouldActivate -{ - [_imageAndTextView setImage:[_menuItem image]]; - - if (shouldActivate) - { - [_imageAndTextView setTextColor:[self activateColor] || [CPColor whiteColor]]; - [_imageAndTextView setTextShadowColor:[self activateShadowColor] || [CPColor blackColor]]; - [_submenuView setColor:[self activateColor] || [CPColor whiteColor]]; - } - else - { - [_imageAndTextView setTextColor:[self textColor]]; - [_imageAndTextView setTextShadowColor:[self textShadowColor]]; - [_submenuView setColor:[self textColor]]; - } -} - - (BOOL)eventOnSubmenu:(CPEvent)anEvent { if (![_menuItem hasSubmenu])