diff --git a/ChangeLog b/ChangeLog index d2a0420e9..3d1512b68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-08-12 Lubos Dolezel + + * Headers/AppKit/NSSavePanel.h, + * Source/NSSavePanel.m: beginSheetModalForWindow: and + beginWithCompletionHander: implementations + 2013-08-08 16:27-EDT Gregory John Casamento * Headers/AppKit/AppKit.h: Add new header for NSStatusItem.h diff --git a/Headers/AppKit/NSSavePanel.h b/Headers/AppKit/NSSavePanel.h index 810db15d1..502f5836d 100644 --- a/Headers/AppKit/NSSavePanel.h +++ b/Headers/AppKit/NSSavePanel.h @@ -34,6 +34,7 @@ #ifndef _GNUstep_H_NSSavePanel #define _GNUstep_H_NSSavePanel #import +#import #import @@ -81,6 +82,7 @@ enum { - (BOOL)panel:(id)sender shouldShowFilename:(NSString*)filename; @end +DEFINE_BLOCK_TYPE(GSSavePanelCompletionHandler, void, NSInteger); @interface NSSavePanel : NSPanel { @@ -117,6 +119,7 @@ enum { BOOL _OKButtonPressed; NSMenu *_showsHiddenFilesMenu; + GSSavePanelCompletionHandler _completionHandler; } /* @@ -206,6 +209,12 @@ enum { contextInfo: (void *)contextInfo; #endif +#if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) +- (void) beginSheetModalForWindow:(NSWindow *)window + completionHandler:(GSSavePanelCompletionHandler)handler; +- (void) beginWithCompletionHandler:(GSSavePanelCompletionHandler)handler; +#endif + /* * Reading Save Information */ diff --git a/Source/NSSavePanel.m b/Source/NSSavePanel.m index fc9a9f578..f8b8dd5f8 100644 --- a/Source/NSSavePanel.m +++ b/Source/NSSavePanel.m @@ -55,6 +55,7 @@ #import "AppKit/NSDragging.h" #import "AppKit/NSSavePanel.h" #import "AppKit/NSTextField.h" +#import "AppKit/NSWindowController.h" #import "AppKit/NSWorkspace.h" #import "GSGuiPrivate.h" @@ -1110,6 +1111,20 @@ selectCellWithString: (NSString*)title return [self runModalForDirectory: [self directory] file: [self filename]]; } +- (void) beginSheetModalForWindow:(NSWindow *)window + completionHandler:(GSSavePanelCompletionHandler)handler +{ + NSInteger result = [NSApp runModalForWindow: self + relativeToWindow: window]; + CALL_BLOCK(handler, result); +} + +- (void) beginWithCompletionHandler:(GSSavePanelCompletionHandler)handler +{ + self->_completionHandler = Block_copy(handler); + [self makeKeyAndOrderFront: self]; +} + /**

Initializes the panel to the directory specified by path and, optionally, the file specified by filename, then displays it and begins its modal event loop; path and filename can be empty @@ -1218,7 +1233,16 @@ selectCellWithString: (NSString*)title { ASSIGN(_directory, pathToColumn(_browser, [_browser lastColumn])); [self _updateDefaultDirectory]; - [NSApp stopModalWithCode: NSCancelButton]; + + if (self->_completionHandler == NULL) + [NSApp stopModalWithCode: NSCancelButton]; + else + { + CALL_BLOCK(self->_completionHandler, NSCancelButton); + Block_release(self->_completionHandler); + self->_completionHandler = NULL; + } + [_okButton setEnabled: NO]; [self close]; } @@ -1389,7 +1413,16 @@ selectCellWithString: (NSString*)title return; [self _updateDefaultDirectory]; - [NSApp stopModalWithCode: NSOKButton]; + + if (self->_completionHandler == NULL) + [NSApp stopModalWithCode: NSOKButton]; + else + { + CALL_BLOCK(self->_completionHandler, NSOKButton); + Block_release(self->_completionHandler); + self->_completionHandler = NULL; + } + [_okButton setEnabled: NO]; [self close]; }