diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j index 58630f9ab..0cbf4f763 100644 --- a/AppKit/CPMenu/CPMenu.j +++ b/AppKit/CPMenu/CPMenu.j @@ -355,7 +355,7 @@ var _CPMenuBarVisible = NO, while (count--) [_items[count] setMenu:nil]; - _highlightedIndex = CPNotFound; + [self _highlightItemAtIndex:CPNotFound]; // Because we are changing _items directly, be sure to notify KVO [self willChangeValueForKey:@"items"]; @@ -1151,6 +1151,7 @@ var _CPMenuBarVisible = NO, return; [aMenuItem setMenu:self]; + [self _highlightItemAtIndex:CPNotFound]; [_items insertObject:aMenuItem atIndex:anIndex]; [[CPNotificationCenter defaultCenter] @@ -1165,6 +1166,7 @@ var _CPMenuBarVisible = NO, return; [[_items objectAtIndex:anIndex] setMenu:nil]; + [self _highlightItemAtIndex:CPNotFound]; [_items removeObjectAtIndex:anIndex]; [[CPNotificationCenter defaultCenter] diff --git a/AppKit/CPMenuItem/_CPMenuItemStandardView.j b/AppKit/CPMenuItem/_CPMenuItemStandardView.j index 5a71538b2..4eaca118d 100644 --- a/AppKit/CPMenuItem/_CPMenuItemStandardView.j +++ b/AppKit/CPMenuItem/_CPMenuItemStandardView.j @@ -336,6 +336,11 @@ } } +- (BOOL)isHighlighted +{ + return _highlighted; +} + @end @implementation _CPMenuItemSubmenuIndicatorView : CPView diff --git a/AppKit/CPMenuItem/_CPMenuItemView.j b/AppKit/CPMenuItem/_CPMenuItemView.j index 9dc244b44..46d7a62f4 100644 --- a/AppKit/CPMenuItem/_CPMenuItemView.j +++ b/AppKit/CPMenuItem/_CPMenuItemView.j @@ -34,7 +34,7 @@ @implementation _CPMenuItemView : CPView { CPMenuItem _menuItem; - CPView _view; + CPView _view @accessors(property=view, readonly); CPFont _font; CPColor _textColor; diff --git a/Tests/AppKit/CPMenuTest.j b/Tests/AppKit/CPMenuTest.j index 63a7e410a..ad1ef953e 100644 --- a/Tests/AppKit/CPMenuTest.j +++ b/Tests/AppKit/CPMenuTest.j @@ -15,6 +15,8 @@ BOOL saveDocumentWasCalled; BOOL saveDocumentAsWasCalled; BOOL undoWasCalled; + + CPMenuItem anInstantiatedMenuItem; } - (void)setUp @@ -67,6 +69,10 @@ [menu addItem:editMenuItem]; [menu addItem:[CPMenuItem separatorItem]]; + + // Test Issue 1899 + anInstantiatedMenuItem = [[CPMenuItem alloc] initWithTitle:@"Highlight" action:nil keyEquivalent:@""]; + [menu addItem:anInstantiatedMenuItem]; } - (void)_retarget:(CPMenuItem)aMenu @@ -82,6 +88,47 @@ } } +- (void)testRemoveAllItemsHighlighting +{ + // hack it so that this menu item is highlighted + [menu _highlightItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + // test both the public isHighlighted method, as well as the underlying view highlighting + [self assertTrue:[anInstantiatedMenuItem isHighlighted]]; + [self assertTrue:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was not highlighted in removeAll"]; + + [menu removeAllItems]; + + [self assertFalse:[anInstantiatedMenuItem isHighlighted]]; + [self assertFalse:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was still highlighted after removeAll"]; +} + +- (void)testRemoveOneItemHighlighting +{ + [menu _highlightItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + [self assertTrue:[anInstantiatedMenuItem isHighlighted]]; + [self assertTrue:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was not highlighted in removeItem"]; + + [menu removeItem:anInstantiatedMenuItem]; + + [self assertFalse:[anInstantiatedMenuItem isHighlighted]]; + [self assertFalse:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was still highlighted after removeItem"]; +} + +- (void)testRemoveOneItemByIndexHighlighting +{ + [menu _highlightItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + [self assertTrue:[anInstantiatedMenuItem isHighlighted]]; + [self assertTrue:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was not highlighted in removeItemAtIndex"]; + + [menu removeItemAtIndex:[menu indexOfItem:anInstantiatedMenuItem]]; + + [self assertFalse:[anInstantiatedMenuItem isHighlighted]]; + [self assertFalse:[[[anInstantiatedMenuItem _menuItemView] view] isHighlighted] message:@"Underlying view was still highlighted after removeItemAtIndex"]; +} + - (void)testKeyEquivalent { [self _retarget:menu];