/* GormNSMenu.m Copyright (C) 2002 Free Software Foundation, Inc. Author: Pierre-Yves Rivaille Date: 2002 This file is part of GNUstep. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "GormNSMenu.h" #include #include @interface NSMenu (GormNSMenuPrivate) - (NSPopUpButtonCell *)popUpButtonCell; @end @implementation NSMenu (GormNSMenuPrivate) - (NSPopUpButtonCell *)popUpButtonCell { return _popUpButtonCell; } @end @interface GormNSMenuWindow : NSPanel { BOOL opened; } @end @implementation GormNSMenuWindow - (BOOL)canBecomeMainWindow { return YES; } - (BOOL)canBecomeKeyWindow { return YES; } - (void)resignMainWindow { [super resignMainWindow]; if ([[self menu] _ownedByPopUp]) { [[NSRunLoop currentRunLoop] performSelector: @selector(close) target: [self menu] argument: nil order: 500000 modes: [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSModalPanelRunLoopMode, NSEventTrackingRunLoopMode, nil]]; opened = NO; } } - (void)becomeMainWindow { [super becomeMainWindow]; if ( [[self menu] _ownedByPopUp] ) { /* if(opened == YES) { [[self menu] close]; opened = NO; } else { opened = YES; } */ } } - (void) sendEvent: (NSEvent*)theEvent { NSEventType type; type = [theEvent type]; if (type == NSLeftMouseDown) { [self makeMainWindow]; [self makeKeyWindow]; } [super sendEvent: theEvent]; } - (void) dealloc { [self setMenu: nil]; [super dealloc]; } @end @implementation GormNSMenu - (BOOL) performKeyEquivalent: (NSEvent*)theEvent { return NO; } - (NSPanel*) _createWindow { NSPanel *win = [[GormNSMenuWindow alloc] initWithContentRect: NSZeroRect styleMask: NSBorderlessWindowMask backing: NSBackingStoreBuffered defer: YES]; [win setMenu: self]; [win setLevel: NSSubmenuWindowLevel]; [win setExcludedFromWindowsMenu: YES]; RETAIN(win); // FIXME: Argh.. this may leak.. temporary fix. return win; } - (NSString *)className { return @"NSMenu"; } #ifdef DEBUG // These methods are purely for debugging purposes... /* - (void) display { NSDebugLog(@"In GormNSMenu display..."); [super display]; } - (id) retain { NSLog(@"Being retained... %d: %@", [self retainCount], self); return [super retain]; } - (oneway void) release { NSLog(@"Being released... %d: %@", [self retainCount], self); [super release]; } - (void) dealloc { NSLog(@"Deallocing %@",self); [super dealloc]; } */ #endif @end @implementation NSMenu (GormNSMenu) + (id) allocSubstitute { return [GormNSMenu alloc]; } @end