Return button's index for [NSAlert runModalSheetForWindow].

This commit is contained in:
Cheng Zhao 2013-06-07 15:58:36 +08:00
parent b9455a997c
commit a897d5b715

View file

@ -12,54 +12,39 @@
@implementation NSAlert (SynchronousSheet) @implementation NSAlert (SynchronousSheet)
-(NSInteger) runModalSheetForWindow:(NSWindow *)aWindow { -(NSInteger) runModalSheetForWindow:(NSWindow *)aWindow {
// Set ourselves as the target for button clicks // Set ourselves as the target for button clicks
for (NSButton *button in [self buttons]) { for (NSButton *button in [self buttons]) {
[button setTarget:self]; [button setTarget:self];
[button setAction:@selector(BE_stopSynchronousSheet:)]; [button setAction:@selector(BE_stopSynchronousSheet:)];
} }
// Bring up the sheet and wait until stopSynchronousSheet is triggered by a button click // Bring up the sheet and wait until stopSynchronousSheet is triggered by a button click
[self performSelectorOnMainThread:@selector(BE_beginSheetModalForWindow:) withObject:aWindow waitUntilDone:YES]; [self performSelectorOnMainThread:@selector(BE_beginSheetModalForWindow:) withObject:aWindow waitUntilDone:YES];
NSInteger modalCode = [NSApp runModalForWindow:[self window]]; NSInteger modalCode = [NSApp runModalForWindow:[self window]];
// This is called only after stopSynchronousSheet is called (that is, // This is called only after stopSynchronousSheet is called (that is,
// one of the buttons is clicked) // one of the buttons is clicked)
[NSApp performSelectorOnMainThread:@selector(endSheet:) withObject:[self window] waitUntilDone:YES]; [NSApp performSelectorOnMainThread:@selector(endSheet:) withObject:[self window] waitUntilDone:YES];
// Remove the sheet from the screen // Remove the sheet from the screen
[[self window] performSelectorOnMainThread:@selector(orderOut:) withObject:self waitUntilDone:YES]; [[self window] performSelectorOnMainThread:@selector(orderOut:) withObject:self waitUntilDone:YES];
return modalCode; return modalCode;
} }
-(NSInteger) runModalSheet { -(NSInteger) runModalSheet {
return [self runModalSheetForWindow:[NSApp mainWindow]]; return [self runModalSheetForWindow:[NSApp mainWindow]];
} }
#pragma mark Private methods #pragma mark Private methods
-(IBAction) BE_stopSynchronousSheet:(id)sender { -(IBAction) BE_stopSynchronousSheet:(id)sender {
// See which of the buttons was clicked [NSApp stopModalWithCode:[sender tag]];
NSUInteger clickedButtonIndex = [[self buttons] indexOfObject:sender];
// Be consistent with Apple's documentation (see NSAlert's addButtonWithTitle) so that
// the fourth button is numbered NSAlertThirdButtonReturn + 1, and so on
NSInteger modalCode = 0;
if (clickedButtonIndex == NSAlertFirstButtonReturn)
modalCode = NSAlertFirstButtonReturn;
else if (clickedButtonIndex == NSAlertSecondButtonReturn)
modalCode = NSAlertSecondButtonReturn;
else if (clickedButtonIndex == NSAlertThirdButtonReturn)
modalCode = NSAlertThirdButtonReturn;
else
modalCode = NSAlertThirdButtonReturn + (clickedButtonIndex - 2);
[NSApp stopModalWithCode:modalCode];
} }
-(void) BE_beginSheetModalForWindow:(NSWindow *)aWindow { -(void) BE_beginSheetModalForWindow:(NSWindow *)aWindow {
[self beginSheetModalForWindow:aWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; [self beginSheetModalForWindow:aWindow modalDelegate:nil didEndSelector:nil contextInfo:nil];
} }
@end @end