void WXDLLIMPEXP_CORE wxOSXCocoaClassAddWXMethods(Class c);
+ /*
+ We need this for ShowModal, as the sheet just disables the parent window and
+ returns control to the app, whereas we don't want to return from ShowModal
+ until the sheet has been dismissed.
+ */
+ @interface ModalDialogDelegate : NSObject
+ {
+ BOOL sheetFinished;
+ int resultCode;
+ }
+
+ - (BOOL)finished;
+ - (int)code;
+ - (void)waitForSheetToFinish;
+ - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
+ @end
+
+
#endif // __OBJC__
// NSCursor
{
}
-
NSArray* GetTypesFromFilter( const wxString filter )
{
NSMutableArray* types = nil;
m_path = wxEmptyString;
m_fileNames.Clear();
+
+ wxNonOwnedWindow* parentWindow = NULL;
+ int returnCode = -1;
+
+ if (GetParent())
+ {
+ parentWindow = dynamic_cast<wxNonOwnedWindow*>(wxGetTopLevelParent(GetParent()));
+ }
if (HasFlag(wxFD_SAVE))
{
if ( HasFlag(wxFD_OVERWRITE_PROMPT) )
{
}
-
- if ( [sPanel runModalForDirectory:dir.AsNSString() file:file.AsNSString() ] == NSOKButton )
+
+ if (parentWindow)
+ {
+ NSWindow* nativeParent = parentWindow->GetWXWindow();
+ ModalDialogDelegate* sheetDelegate = [[ModalDialogDelegate alloc] init];
+ [sPanel beginSheetForDirectory:dir.AsNSString() file:file.AsNSString()
+ modalForWindow: nativeParent modalDelegate: sheetDelegate
+ didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
+ contextInfo: nil];
+ [sheetDelegate waitForSheetToFinish];
+ result = [sheetDelegate code];
+ [sheetDelegate release];
+ }
+ else
+ {
+ result = [sPanel runModalForDirectory:dir.AsNSString() file:file.AsNSString() ];
+ }
+
+ if (result == NSOKButton )
{
panel = sPanel;
result = wxID_OK;
[oPanel setCanChooseFiles:YES];
[oPanel setMessage:cf.AsNSString()];
- if ( [oPanel runModalForDirectory:dir.AsNSString() file:file.AsNSString() types:types] == NSOKButton )
+ if (parentWindow)
+ {
+ NSWindow* nativeParent = parentWindow->GetWXWindow();
+ ModalDialogDelegate* sheetDelegate = [[ModalDialogDelegate alloc] init];
+ [oPanel beginSheetForDirectory:dir.AsNSString() file:file.AsNSString()
+ types: types modalForWindow: nativeParent
+ modalDelegate: sheetDelegate
+ didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
+ contextInfo: nil];
+ [sheetDelegate waitForSheetToFinish];
+ result = [sheetDelegate code];
+ [sheetDelegate release];
+ }
+ else
+ {
+ result = [oPanel runModalForDirectory:dir.AsNSString()
+ file:file.AsNSString() types:types];
+ }
+ if (result == NSOKButton )
{
panel = oPanel;
result = wxID_OK;
}
@end
+/*
+ allows ShowModal to work when using sheets.
+ see include/wx/osx/cocoa/private.h for more info
+*/
+@implementation ModalDialogDelegate
+- (id)init
+{
+ [super init];
+ sheetFinished = NO;
+ resultCode = -1;
+ return self;
+}
+
+- (BOOL)finished
+{
+ return sheetFinished;
+}
+
+- (int)code
+{
+ return resultCode;
+}
+
+- (void)waitForSheetToFinish
+{
+ while (!sheetFinished)
+ {
+ wxSafeYield();
+ }
+}
+
+- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
+{
+ resultCode = returnCode;
+ sheetFinished = YES;
+ [sheet orderOut: self];
+}
+@end
+
bool wxApp::DoInitGui()
{
[NSApplication sharedApplication];