]> git.saurik.com Git - wxWidgets.git/commitdiff
Use sheets for native file dialogs if the dialog has its parent set.
authorKevin Ollivier <kevino@theolliviers.com>
Thu, 5 Mar 2009 19:19:28 +0000 (19:19 +0000)
committerKevin Ollivier <kevino@theolliviers.com>
Thu, 5 Mar 2009 19:19:28 +0000 (19:19 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59346 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/cocoa/private.h
src/osx/cocoa/filedlg.mm
src/osx/cocoa/utils.mm

index 80845cfd8c3972f4bfb8c18ebb93027cf4feb570..2e7de760b982026526c8233163fdb64a0089dbc7 100644 (file)
@@ -277,6 +277,24 @@ protected :
     
     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
index 462ee154e477e7d604f7fcb7e385642a0cf11f63..a509c1bb63e53f9d8075e825830a6a187e648946 100644 (file)
@@ -51,7 +51,6 @@ wxFileDialog::wxFileDialog(
 {
 }
 
-
 NSArray* GetTypesFromFilter( const wxString filter )
 {
     NSMutableArray* types = nil;
@@ -149,6 +148,14 @@ int wxFileDialog::ShowModal()
 
     m_path = wxEmptyString;
     m_fileNames.Clear();
+    
+    wxNonOwnedWindow* parentWindow = NULL;
+    int returnCode = -1;
+    
+    if (GetParent()) 
+    {
+        parentWindow = dynamic_cast<wxNonOwnedWindow*>(wxGetTopLevelParent(GetParent()));
+    }
 
     if (HasFlag(wxFD_SAVE))
     {
@@ -164,8 +171,25 @@ int wxFileDialog::ShowModal()
         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;
@@ -187,7 +211,25 @@ int wxFileDialog::ShowModal()
         [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;
index 48bc5c9a96732c2ff631ea075b5bb4ee4e22dc50..39d2287aa283461c546fe07264c228c08daa83f4 100644 (file)
@@ -138,6 +138,45 @@ void wxMacWakeUp()
 }
 @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];