/** NSButton The button class Copyright (C) 1996 Free Software Foundation, Inc. Author: Scott Christley Ovidiu Predescu Date: 1996 This file is part of the GNUstep GUI Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #import #import "AppKit/NSApplication.h" #import "AppKit/NSButton.h" #import "AppKit/NSButtonCell.h" #import "AppKit/NSEvent.h" #import "AppKit/NSWindow.h" // // class variables // static id buttonCellClass = nil; /** TODO Description */ @implementation NSButton // // Class methods // + (void) initialize { if (self == [NSButton class]) { [self setVersion: 1]; [self setCellClass: [NSButtonCell class]]; } } // // Initializing the NSButton Factory // /** Returns */ + (Class) cellClass { return buttonCellClass; } + (void) setCellClass: (Class)classId { buttonCellClass = classId; } // // Instance methods // - (BOOL) acceptsFirstMouse: (NSEvent *)theEvent { return YES; } - (BOOL) isFlipped { return YES; } /**

Sets the NSButtonCell's type to aType and marks self for display.See NSButtonType for more information.

See Also: [NSButtonCell-setButtonType:]

*/ - (void) setButtonType: (NSButtonType)aType { [_cell setButtonType: aType]; [self setNeedsDisplay: YES]; } - (void)setHighlightsBy:(NSInteger)aType { [_cell setHighlightsBy:aType]; } - (void)setShowsStateBy:(NSInteger)aType { [_cell setShowsStateBy:aType]; } // // Setting the State // - (void) setIntValue: (int)anInt { [self setState: (anInt != 0)]; } - (void) setFloatValue: (float)aFloat { [self setState: (aFloat != 0)]; } - (void) setDoubleValue: (double)aDouble { [self setState: (aDouble != 0)]; } /**

Sets the NSButtonCell's state to value and marks self for display.

See Also: -state [NSButtonCell-setState:]

*/ - (void) setState: (NSInteger)value { [_cell setState: value]; [self setNeedsDisplay: YES]; } /**

Returns the NSButtonCell's state.

See Also: -setState: [NSButtonCell-state]

*/ - (NSInteger) state { return [_cell state]; } - (BOOL) allowsMixedState { return [_cell allowsMixedState]; } - (void) setAllowsMixedState: (BOOL)flag { [_cell setAllowsMixedState: flag]; } /**

Sets the NSButtonCell to the next state and marks self for display.

See Also: [NSButtonCell-setNextState]

*/ - (void)setNextState { [_cell setNextState]; [self setNeedsDisplay: YES]; } /**

Gets the NSButtonCell's delay and the interval parameters used when NSButton sends continouly action messages. By default delay is 0.4 and interval is 0.075.

See Also: [NSButtonCell-getPeriodicDelay:interval:] -setPeriodicDelay:interval: [NSCell-trackMouse:inRect:ofView:untilMouseUp:]

*/ - (void) getPeriodicDelay: (float *)delay interval: (float *)interval { [_cell getPeriodicDelay: delay interval: interval]; } /**

Sets the NSButtonCell's delay and interval parameters used when NSButton sends continouly action messages. By default delay is 0.4 and interval is 0.075.

See Also: [NSButtonCell-setPeriodicDelay:interval:] -getPeriodicDelay:interval: [NSCell-trackMouse:inRect:ofView:untilMouseUp:]

*/ - (void) setPeriodicDelay: (float)delay interval: (float)interval { [_cell setPeriodicDelay: delay interval: interval]; } /**

Returns the NSButtonCell's alternate title.

See Also: -setAlternateTitle: [NSButtonCell-alternateTitle]

*/ - (NSString *) alternateTitle { return [_cell alternateTitle]; } /**

Sets the NSButtonCell's alternateTitle to aString and marks self for display.

See Also: -alternateTitle

*/ - (void) setAlternateTitle: (NSString *)aString { [_cell setAlternateTitle: aString]; [self setNeedsDisplay: YES]; } /**

Sets the NSButtonCell's title to aString and marks self for display.

See Also: -title

*/ - (void) setTitle: (NSString *)aString { [_cell setTitle: aString]; [self setNeedsDisplay: YES]; } /**

Returns the NSButtonCell's title.

See Also: [NSButtonCell-title] -setTitle:

*/ - (NSString *) title { return [_cell title]; } - (NSAttributedString *) attributedAlternateTitle { return [_cell attributedAlternateTitle]; } - (NSAttributedString *) attributedTitle { return [_cell attributedTitle]; } - (void) setAttributedAlternateTitle: (NSAttributedString *)aString { [_cell setAttributedAlternateTitle: aString]; [self setNeedsDisplay: YES]; } - (void) setAttributedTitle: (NSAttributedString *)aString { [_cell setAttributedTitle: aString]; [self setNeedsDisplay: YES]; } - (void) setTitleWithMnemonic: (NSString *)aString { [_cell setTitleWithMnemonic: aString]; [self setNeedsDisplay: YES]; } // // Setting the Images // /**

Returns the NSButtonCell's alternate image.

See Also: -setAlternateImage: [NSButtonCell-alternateImage]

*/ - (NSImage *) alternateImage { return [_cell alternateImage]; } /**

Returns the NSButtonCell's image.

See Also: -setImage: [NSButtonCell-image]

*/ - (NSImage *) image { return [_cell image]; } /**

Returns the position of the NSButtonCell's image. See NSCellImagePosition for more information.

See Also: -setImagePosition: [NSButtonCell-imagePosition]

*/ - (NSCellImagePosition) imagePosition { return [_cell imagePosition]; } /**

Sets the NSButtonCell's alternate image to anImage and marks self for display.

See Also: -alternateImage [NSButtonCell-setAlternateImage:]

*/ - (void) setAlternateImage: (NSImage *)anImage { [_cell setAlternateImage: anImage]; [self setNeedsDisplay: YES]; } /**

Sets the NSButtonCell's image to anImage and marks self for display.

See Also: -image [NSButtonCell-setImage:]

*/ - (void) setImage: (NSImage *)anImage { [_cell setImage: anImage]; [self setNeedsDisplay: YES]; } /**

Sets the postion of the NSButtonCell's image to aPosition and marks self for display. See NSCellImagePositionfor more information.

See Also: -imagePosition [NSButtonCell-setImagePosition:]

*/ - (void) setImagePosition: (NSCellImagePosition)aPosition { [_cell setImagePosition: aPosition]; [self setNeedsDisplay: YES]; } // // Modifying Graphic Attributes // /**

Returns whether the NSButton's cell has border.

See Also: -setBordered: [NSButtonCell-isBordered]

*/ - (BOOL) isBordered { return [_cell isBordered]; } /**

Returns whether the NSButton's cell is transparent.

See Also: -setTransparent: [NSButtonCell-isTransparent]

*/ - (BOOL) isTransparent { return [_cell isTransparent]; } /**

Sets whether the NSButton's cell has border and marks self for display.

See Also: -isBordered [NSButtonCell-setBordered:]

*/ - (void) setBordered: (BOOL)flag { [_cell setBordered: flag]; [self setNeedsDisplay: YES]; } /**

Sets whether the NSButton's cell is transparent and marks self for display.

See Also: -isTransparent [NSButtonCell-setTransparent:]

*/ - (void) setTransparent: (BOOL)flag { [_cell setTransparent: flag]; [self setNeedsDisplay: YES]; } /**

Returns the style of the NSButtonCell's bezeled border. See NSBezelStyle for more information.

See Also: -setBezelStyle: [NSButtonCell-bezelStyle]

*/ - (NSBezelStyle)bezelStyle { return [_cell bezelStyle]; } /**

Sets the style of the NSButtonCell's bezeled border and marks self for display. See NSBezelStyle for more information.

See Also: -bezelStyle [NSButtonCell-setBezelStyle:]

*/ - (void)setBezelStyle:(NSBezelStyle)bezelStyle { [_cell setBezelStyle: bezelStyle]; [self setNeedsDisplay: YES]; } - (BOOL)showsBorderOnlyWhileMouseInside { return [_cell showsBorderOnlyWhileMouseInside]; } - (void)setShowsBorderOnlyWhileMouseInside:(BOOL)show { [_cell setShowsBorderOnlyWhileMouseInside: show]; [self setNeedsDisplay: YES]; } // // Displaying // /**

(Un)Highlights the NSButtonCell.

See Also: [NSButtonCell-highlight:withFrame:inView:]

*/ - (void) highlight: (BOOL)flag { [_cell highlight: flag withFrame: _bounds inView: self]; } // // Setting the Key Equivalent // /**

Returns the NSButtonCell's key equivalent. The key equivalent and its modifier mask are used to simulate the click of the button in -performKeyEquivalent:. Returns an empty string if no key equivalent is defined. By default NSButton hasn't key equivalent.

See Also: -setKeyEquivalent: -performKeyEquivalent: -keyEquivalentModifierMask [NSButtonCell-keyEquivalent]

*/ - (NSString*) keyEquivalent { return [_cell keyEquivalent]; } /**

Returns the modifier mask of the NSButtonCell's key equivalent. The key equivalent and its modifier mask are used to simulate the click of the button in -performKeyEquivalent: . The default mask is NSCommandKeyMask.

See Also: -setKeyEquivalentModifierMask: -keyEquivalent [NSButtonCell-setKeyEquivalentModifierMask:]

*/ - (NSUInteger) keyEquivalentModifierMask { return [_cell keyEquivalentModifierMask]; } /**

Sets the NSButtonCell's key equivalent to aKeyEquivalent. The key equivalent and its modifier mask are used to simulate the click of the button in -performKeyEquivalent:. By default NSButton hasn't key equivalent.

See Also: -keyEquivalent -setKeyEquivalentModifierMask: -performKeyEquivalent: [NSButtonCell-setKeyEquivalent:]

*/ - (void) setKeyEquivalent: (NSString*)aKeyEquivalent { [_cell setKeyEquivalent: aKeyEquivalent]; } /**

Sets the modifier mask of the NSButtonCell's key equivalent to mask. The key equivalent and its modifier mask are used to simulate the click of the button in -performKeyEquivalent:. By default the mask is NSCommandKeyMask.

See Also: -keyEquivalentModifierMask -setKeyEquivalent: -performKeyEquivalent: [NSButtonCell-setKeyEquivalentModifierMask:]

*/ - (void) setKeyEquivalentModifierMask: (NSUInteger)mask { [_cell setKeyEquivalentModifierMask: mask]; } // // Determining the first responder // - (BOOL) becomeFirstResponder { [_window disableKeyEquivalentForDefaultButtonCell]; [_cell setShowsFirstResponder: YES]; [self setNeedsDisplay: YES]; return YES; } - (BOOL) resignFirstResponder { [_window enableKeyEquivalentForDefaultButtonCell]; [_cell setShowsFirstResponder: NO]; [self setNeedsDisplay: YES]; return YES; } - (void) becomeKeyWindow { [_cell setShowsFirstResponder: YES]; [self setNeedsDisplay: YES]; } - (void) resignKeyWindow { [_cell setShowsFirstResponder: NO]; [self setNeedsDisplay: YES]; } - (void) keyDown: (NSEvent*)theEvent { if ([self isEnabled]) { NSString *characters = [theEvent characters]; /* Handle SPACE to perform a click */ if ([characters isEqualToString: @" "]) { [self performClick: self]; return; } } [super keyDown: theEvent]; } // // Handling Events and Action Messages // /**

Simulates the click of the button if the key equivalent and its modifier mask match the event anEvent. By default the key modifier mask is NSCommandKeyMask and there is no key equivalent

See Also: -keyEquivalent -keyEquivalentModifierMask [NSControl-performClick:] [NSEvent-charactersIgnoringModifiers] [NSEvent-modifierFlags]

Does nothing and returns NO if the receiver is disabled or if it is blocked by a modal window being run. */ - (BOOL) performKeyEquivalent: (NSEvent *)anEvent { NSWindow *w = [self window]; NSWindow *mw = [NSApp modalWindow]; if ([self isEnabled] && (mw == nil || [w worksWhenModal] || mw == w)) { NSString *keyEquivalent = [self keyEquivalent]; if ([keyEquivalent length] > 0 && [keyEquivalent isEqualToString: [anEvent charactersIgnoringModifiers]]) { NSUInteger mask = [self keyEquivalentModifierMask]; NSUInteger modifiers = [anEvent modifierFlags]; NSUInteger relevantModifiersMask = NSCommandKeyMask | NSAlternateKeyMask | NSControlKeyMask; /* Take shift key into account only for control keys and arrow and function keys */ if ((modifiers & NSFunctionKeyMask) || [[NSCharacterSet controlCharacterSet] characterIsMember:[keyEquivalent characterAtIndex:0]]) relevantModifiersMask |= NSShiftKeyMask; if ((modifiers & relevantModifiersMask) == (mask & relevantModifiersMask)) { [self performClick: self]; return YES; } } } return NO; } - (void) setSound: (NSSound *)aSound { [_cell setSound: aSound]; } - (NSSound *) sound { return [_cell sound]; } @end