diff --git a/AppKit/CPAlert.j b/AppKit/CPAlert.j index 28edbe53d..38aeef5d8 100644 --- a/AppKit/CPAlert.j +++ b/AppKit/CPAlert.j @@ -41,6 +41,9 @@ @global CPApp +var CPAlertDelegate_alertShowHelp_ = 1 << 0, + CPAlertDelegate_alertDidEnd_returnCode_ = 1 << 1; + /* @global @group CPAlertStyle @@ -59,6 +62,14 @@ CPCriticalAlertStyle = 2; var bottomHeight = 71; +@protocol CPAlertDelegate + +@optional +- (BOOL)alertShowHelp:(CPAlert)alert; +- (void)alertDidEnd:(CPAlert)theAlert returnCode:(int)returnCode; + +@end + /*! @ingroup appkit @@ -83,32 +94,33 @@ var bottomHeight = 71; */ @implementation CPAlert : CPObject { - BOOL _showHelp @accessors(property=showsHelp); - BOOL _showSuppressionButton @accessors(property=showsSuppressionButton); + BOOL _showHelp @accessors(property=showsHelp); + BOOL _showSuppressionButton @accessors(property=showsSuppressionButton); - CPAlertStyle _alertStyle @accessors(property=alertStyle); - CPString _title @accessors(property=title); - CPView _accessoryView @accessors(property=accessoryView); - CPImage _icon @accessors(property=icon); + CPAlertStyle _alertStyle @accessors(property=alertStyle); + CPString _title @accessors(property=title); + CPView _accessoryView @accessors(property=accessoryView); + CPImage _icon @accessors(property=icon); - CPArray _buttons @accessors(property=buttons, readonly); - CPCheckBox _suppressionButton @accessors(property=suppressionButton, readonly); + CPArray _buttons @accessors(property=buttons, readonly); + CPCheckBox _suppressionButton @accessors(property=suppressionButton, readonly); - id _delegate @accessors(property=delegate); - id _modalDelegate; - SEL _didEndSelector @accessors(property=didEndSelector); - Function _didEndBlock; + id _delegate @accessors(property=delegate); + id _modalDelegate; + SEL _didEndSelector @accessors(property=didEndSelector); + Function _didEndBlock; + unsigned _implementedDelegateMethods; - _CPAlertThemeView _themeView @accessors(property=themeView, readonly); - CPWindow _window @accessors(property=window, readonly); - int _defaultWindowStyle; + _CPAlertThemeView _themeView @accessors(property=themeView, readonly); + CPWindow _window @accessors(property=window, readonly); + int _defaultWindowStyle; - CPImageView _alertImageView; - CPTextField _informativeLabel; - CPTextField _messageLabel; - CPButton _alertHelpButton; + CPImageView _alertImageView; + CPTextField _informativeLabel; + CPTextField _messageLabel; + CPButton _alertHelpButton; - BOOL _needsLayout; + BOOL _needsLayout; } #pragma mark Creating Alerts @@ -187,6 +199,30 @@ var bottomHeight = 71; return self; } + +#pragma mark - +#pragma mark Delegate + +/*! + Set the delegate of the receiver + @param aDelegate the delegate object for the alert. +*/ +- (void)setDelegate:(id )aDelegate +{ + if (_delegate === aDelegate) + return; + + _delegate = aDelegate; + _implementedDelegateMethods = 0; + + if ([_delegate respondsToSelector:@selector(alertShowHelp:)]) + _implementedDelegateMethods |= CPAlertDelegate_alertShowHelp_; + + if ([_delegate respondsToSelector:@selector(alertDidEnd:returnCode:)]) + _implementedDelegateMethods |= CPAlertDelegate_alertDidEnd_returnCode_; +} + + #pragma mark Accessors - (CPTheme)theme @@ -696,8 +732,7 @@ var bottomHeight = 71; */ - (@action)_showHelp:(id)aSender { - if ([_delegate respondsToSelector:@selector(alertShowHelp:)]) - [_delegate alertShowHelp:self]; + [self _sendDelegateAlertShowHelp]; } /* @@ -743,13 +778,43 @@ var bottomHeight = 71; { if (_didEndSelector) objj_msgSend(_delegate, _didEndSelector, self, returnCode); - else if ([_delegate respondsToSelector:@selector(alertDidEnd:returnCode:)]) - [_delegate alertDidEnd:self returnCode:returnCode]; + else + [self _sendDelegateAlertDidEndReturnCode:returnCode]; } } @end + +@implementation CPAlert (CPAlertDelegate) + +/*! + @ignore + Call the delegate alertDidEnd:returnCode +*/ +- (void)_sendDelegateAlertDidEndReturnCode:(int)returnCode +{ + if (!(_implementedDelegateMethods & CPAlertDelegate_alertDidEnd_returnCode_)) + return; + + [_delegate alertDidEnd:self returnCode:returnCode]; +} + +/*! + @ignore + Call the delegate alertShowHelp: +*/ +- (BOOL)_sendDelegateAlertShowHelp +{ + if (!(_implementedDelegateMethods & CPAlertDelegate_alertShowHelp_)) + return YES; + + return [_delegate alertShowHelp:self]; +} + +@end + + @implementation _CPAlertThemeView : CPView + (CPString)defaultThemeClass