mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-22 13:10:59 +00:00
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:
parent
5c39f6f65c
commit
0c4d973115
4 changed files with 217 additions and 148 deletions
|
@ -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.
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
258
Source/NSMenu.m
258
Source/NSMenu.m
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue