X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0f9b48d1e1535f8b92a73031be8cceff39123d27..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/osx/cocoa/dirdlg.mm diff --git a/src/osx/cocoa/dirdlg.mm b/src/osx/cocoa/dirdlg.mm index 6094f86e03..7d7dc66a21 100644 --- a/src/osx/cocoa/dirdlg.mm +++ b/src/osx/cocoa/dirdlg.mm @@ -1,10 +1,10 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/osx/cocoa/dirdlg.mm -// Purpose: wxDirDialog +// Purpose: wxDirDialog // Author: Stefan Csomor -// Modified by: +// Modified by: // Created: 2008-08-30 -// RCS-ID: $Id: dirdlg.mm 40007 2006-07-05 13:10:46Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -31,50 +31,105 @@ #endif #include "wx/filename.h" +#include "wx/evtloop.h" #include "wx/osx/private.h" IMPLEMENT_CLASS(wxDirDialog, wxDialog) wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, - const wxString& defaultPath, long style, const wxPoint& pos, - const wxSize& size, const wxString& name) + const wxString& defaultPath, long style, const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(size), const wxString& WXUNUSED(name)) { m_parent = parent; SetMessage( message ); SetWindowStyle(style); SetPath(defaultPath); + m_sheetDelegate = [[ModalDialogDelegate alloc] init]; + [(ModalDialogDelegate*)m_sheetDelegate setImplementation: this]; } +wxDirDialog::~wxDirDialog() +{ + [m_sheetDelegate release]; +} -int wxDirDialog::ShowModal() +void wxDirDialog::ShowWindowModal() { - int result = wxID_CANCEL; + wxCFStringRef dir( m_path ); + + m_modality = wxDIALOG_MODALITY_WINDOW_MODAL; NSOpenPanel *oPanel = [NSOpenPanel openPanel]; [oPanel setCanChooseDirectories:YES]; [oPanel setResolvesAliases:YES]; [oPanel setCanChooseFiles:NO]; + + wxCFStringRef cf( m_message ); + [oPanel setMessage:cf.AsNSString()]; + + if ( HasFlag(wxDD_NEW_DIR_BUTTON) ) + [oPanel setCanCreateDirectories:YES]; + + wxNonOwnedWindow* parentWindow = NULL; + + if (GetParent()) + parentWindow = dynamic_cast(wxGetTopLevelParent(GetParent())); + wxASSERT_MSG(parentWindow, "Window modal display requires parent."); + + if (parentWindow) + { + NSWindow* nativeParent = parentWindow->GetWXWindow(); + [oPanel beginSheetForDirectory:dir.AsNSString() file:nil types: nil + modalForWindow: nativeParent modalDelegate: m_sheetDelegate + didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) + contextInfo: nil]; + } +} + +int wxDirDialog::ShowModal() +{ + wxCFEventLoopPauseIdleEvents pause; + + NSOpenPanel *oPanel = [NSOpenPanel openPanel]; + [oPanel setCanChooseDirectories:YES]; + [oPanel setResolvesAliases:YES]; + [oPanel setCanChooseFiles:NO]; + wxCFStringRef cf( m_message ); [oPanel setMessage:cf.AsNSString()]; - - if ( HasFlag(wxDD_NEW_DIR_BUTTON) ) + + if ( HasFlag(wxDD_NEW_DIR_BUTTON) ) [oPanel setCanCreateDirectories:YES]; wxCFStringRef dir( m_path ); - + m_path = wxEmptyString; - - if ( [oPanel runModalForDirectory:dir.AsNSString() file:nil types:nil] == NSOKButton ) + + int returnCode = -1; + + returnCode = (NSInteger)[oPanel runModalForDirectory:dir.AsNSString() file:nil types:nil]; + ModalFinishedCallback(oPanel, returnCode); + + return GetReturnCode(); +} + +void wxDirDialog::ModalFinishedCallback(void* panel, int returnCode) +{ + int result = wxID_CANCEL; + + if (returnCode == NSOKButton ) { - wxCFStringRef resultpath( [[[oPanel filenames] objectAtIndex:0] retain] ); - - SetPath( resultpath.AsString() ); + NSOpenPanel* oPanel = (NSOpenPanel*)panel; + SetPath( wxCFStringRef::AsString([[oPanel filenames] objectAtIndex:0])); result = wxID_OK; } - return result; + SetReturnCode(result); + + if (GetModality() == wxDIALOG_MODALITY_WINDOW_MODAL) + SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); } #endif // wxUSE_DIRDLG