Fixes to auto-enabling of menu items

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@3360 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 1998-12-01 10:24:19 +00:00
parent 5c39f6f65c
commit 0c4d973115
4 changed files with 217 additions and 148 deletions

View file

@ -1,3 +1,9 @@
Tue Dec 1 10:25:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* NSApplication.m: Fixed auto-enable of services menu.
* NSMenu.m: Rewrote auto-enable code to work as specified in docs.
* NSMenuItem.m: Removed bogus implementation of -isEnabled
Mon Nov 30 10:43:09 1998 Adam Fedor <fedor@doc.com>
* Panels/GNUmakefile: Use normal install rules.

View file

@ -605,44 +605,96 @@ extern NSDictionary *GSAllServicesDictionary();
* The cell corresponds to one of our services - so we check to see if
* there is anything that can deal with it.
*/
for (i = 0; i <= es; i++)
if (es == 0)
{
NSString *sendType;
if (er == 0)
{
if ([resp validRequestorForSendType: nil
returnType: nil] != nil)
return YES;
}
else
{
for (j = 0; j < er; j++)
{
NSString *returnType;
sendType = (i < es) ? [sendTypes objectAtIndex: i] : nil;
returnType = [returnTypes objectAtIndex: j];
if ([resp validRequestorForSendType: nil
returnType: returnType] != nil)
return YES;
}
}
}
else
{
for (i = 0; i < es; i++)
{
NSString *sendType;
for (j = 0; j <= er; j++)
{
NSString *returnType;
sendType = [sendTypes objectAtIndex: i];
returnType = (j < er) ? [returnTypes objectAtIndex: j] : nil;
if (er == 0)
{
if ([resp validRequestorForSendType: sendType
returnType: nil] != nil)
return YES;
}
else
{
for (j = 0; j < er; j++)
{
NSString *returnType;
if ([resp validRequestorForSendType: sendType
returnType: returnType] != nil)
{
return YES;
}
}
returnType = [returnTypes objectAtIndex: j];
if ([resp validRequestorForSendType: sendType
returnType: returnType] != nil)
return YES;
}
}
}
}
return NO;
}
- (void) updateServicesMenu
{
if (servicesMenu)
if (servicesMenu && [[application mainMenu] autoenablesItems])
{
NSArray *a = [servicesMenu itemArray];
unsigned i;
NSMenuMatrix *menuCells;
NSArray *a;
unsigned i;
NSMenu *mainMenu = [application mainMenu];
BOOL found = NO;
a = [mainMenu itemArray];
for (i = 0; i < [a count]; i++)
if ([[a objectAtIndex: i] target] == servicesMenu)
found = YES;
if (found == NO)
{
NSLog(@"Services menu not in main menu!\n");
return;
}
menuCells = [servicesMenu menuCells];
a = [menuCells itemArray];
for (i = 0; i < [a count]; i++)
{
NSCell *cell = [a objectAtIndex: i];
BOOL wasEnabled = [cell isEnabled];
BOOL shouldBeEnabled = [self validateMenuItem: cell];
if ([self validateMenuItem: cell] == YES)
if (wasEnabled != shouldBeEnabled)
{
[cell setEnabled: YES];
[cell setEnabled: shouldBeEnabled];
[menuCells setNeedsDisplayInRect: [menuCells cellFrameAtRow: i]];
}
}
/* FIXME - only doing this here 'cos auto-display doesn't work */
if ([menuCells needsDisplay])
[menuCells display];
}
}

View file

@ -454,138 +454,156 @@ static Class menuCellClass = nil;
/* Temporary disable automatic displaying of menu */
[self setMenuChangedMessagesEnabled:NO];
for (i = 0; i < count; i++) {
id<NSMenuItem> cell = [cells objectAtIndex:i];
SEL action = [cell action];
id target;
NSWindow* keyWindow;
NSWindow* mainWindow;
id responder;
id delegate;
BOOL found = NO;
for (i = 0; i < count; i++)
{
id<NSMenuItem> cell = [cells objectAtIndex: i];
SEL action = [cell action];
id target;
NSWindow* keyWindow;
NSWindow* mainWindow;
id responder;
id delegate;
id validator = nil;
BOOL wasEnabled = [cell isEnabled];
BOOL shouldBeEnabled;
/* Update the submenu items if any */
if ([cell hasSubmenu]) {
[[cell target] update];
continue;
}
/* Update the submenu items if any */
if ([cell hasSubmenu])
[[cell target] update];
if (!action) {
[cell setEnabled:NO];
continue;
}
/* Search the target */
if ((target = [cell target])) {
if ([target respondsToSelector:action]) {
if ([target respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[target validateMenuItem:cell]];
else
[cell setEnabled:YES];
continue;
}
}
/* Search the key window's responder chain */
keyWindow = [theApp keyWindow];
responder = [keyWindow firstResponder];
while (responder && !found) {
if ([responder respondsToSelector:action]) {
if ([responder respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[responder validateMenuItem:cell]];
else
[cell setEnabled:YES];
found = YES;
}
responder = [responder nextResponder];
}
if (found)
continue;
/* Search the key window */
if ([keyWindow respondsToSelector:action]) {
if ([keyWindow respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[keyWindow validateMenuItem:cell]];
else
[cell setEnabled:YES];
continue;
}
/* Search the key window's delegate */
delegate = [keyWindow delegate];
if ([delegate respondsToSelector:action]) {
if ([delegate respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[delegate validateMenuItem:cell]];
else
[cell setEnabled:YES];
continue;
}
mainWindow = [theApp mainWindow];
if (mainWindow != keyWindow) {
/* Search the main window's responder chain */
responder = [mainWindow firstResponder];
while (responder && !found) {
if ([responder respondsToSelector:action]) {
if ([responder respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[responder validateMenuItem:cell]];
/* If there is no action - there can be no validator for the cell */
if (action)
{
/* If there is a target use that for validation (or nil). */
if ((target = [cell target]))
{
if ([target respondsToSelector: action])
{
validator = target;
}
}
else
[cell setEnabled:YES];
found = YES;
{
/* Search the key window's responder chain */
keyWindow = [theApp keyWindow];
responder = [keyWindow firstResponder];
while (responder)
{
if ([responder respondsToSelector: action])
{
validator = responder;
break;
}
responder = [responder nextResponder];
}
if (validator == nil)
{
/* Search the key window */
if ([keyWindow respondsToSelector: action])
{
validator = keyWindow;
}
}
if (validator == nil)
{
/* Search the key window's delegate */
delegate = [keyWindow delegate];
if ([delegate respondsToSelector: action])
{
validator = delegate;
}
}
if (validator == nil)
{
mainWindow = [theApp mainWindow];
if (mainWindow != keyWindow)
{
/* Search the main window's responder chain */
responder = [mainWindow firstResponder];
while (responder)
{
if ([responder respondsToSelector: action])
{
validator = responder;
break;
}
responder = [responder nextResponder];
}
if (validator == nil)
{
/* Search the main window */
if ([mainWindow respondsToSelector: action])
{
validator = mainWindow;
}
}
if (validator == nil)
{
/* Search the main window's delegate */
delegate = [mainWindow delegate];
if ([delegate respondsToSelector: action])
{
validator = delegate;
}
}
}
}
if (validator == nil)
{
/* Search the NSApplication object */
if ([theApp respondsToSelector: action])
{
validator = theApp;
}
}
if (validator == nil)
{
/* Search the NSApplication object's delegate */
delegate = [theApp delegate];
if ([delegate respondsToSelector: action])
{
validator = theApp;
}
}
}
}
responder = [responder nextResponder];
}
if (found)
continue;
/* Search the main window */
if ([mainWindow respondsToSelector:action]) {
if ([mainWindow respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[mainWindow validateMenuItem:cell]];
else
[cell setEnabled:YES];
continue;
}
/* Search the main window's delegate */
delegate = [mainWindow delegate];
if ([delegate respondsToSelector:action]) {
if ([delegate respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[delegate validateMenuItem:cell]];
else
[cell setEnabled:YES];
continue;
}
}
/* Search the NSApplication object */
if ([theApp respondsToSelector:action]) {
if ([theApp respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[theApp validateMenuItem:cell]];
if (validator == nil)
{
shouldBeEnabled = NO;
}
else if ([validator respondsToSelector: @selector(validateMenuItem:)])
{
shouldBeEnabled = [validator validateMenuItem: cell];
}
else
[cell setEnabled:YES];
continue;
}
{
shouldBeEnabled = YES;
}
/* Search the NSApplication object's delegate */
delegate = [theApp delegate];
if ([delegate respondsToSelector:action]) {
if ([delegate respondsToSelector:@selector(validateMenuItem:)])
[cell setEnabled:[delegate validateMenuItem:cell]];
else
[cell setEnabled:YES];
continue;
if (shouldBeEnabled != wasEnabled)
{
[cell setEnabled: shouldBeEnabled];
[menuCells setNeedsDisplayInRect: [menuCells cellFrameAtRow: i]];
}
}
[cell setEnabled:NO];
}
/* Reenable displaying of menus */
[self setMenuChangedMessagesEnabled:YES];
if(menuHasChanged) // resize if menu
[self sizeToFit]; // has been changed
if (menuHasChanged)
[self sizeToFit];
/* FIXME - only doing this here 'cos auto-display doesn't work */
if ([menuCells needsDisplay])
[menuCells display];
}
- (void)performActionForItem:(id <NSMenuItem>)cell

View file

@ -89,11 +89,12 @@ static BOOL usesUserKeyEquivalents = YES;
- (void)setTarget:(id)anObject
{
BOOL hadSubmenu = hasSubmenu;
hasSubmenu = anObject && [anObject isKindOfClass:[NSMenu class]];
if (hasSubmenu) {
if (hasSubmenu)
[anObject retain];
if (hadSubmenu)
[target release];
}
[super setTarget:anObject];
}
@ -112,14 +113,6 @@ static BOOL usesUserKeyEquivalents = YES;
return hasSubmenu;
}
- (BOOL)isEnabled
{
if (hasSubmenu)
return YES;
else
return [super isEnabled];
}
- (NSString*)keyEquivalent
{
if (usesUserKeyEquivalents)