X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/632e5093093c6bcc8f791001e8d93436e712c1aa..b0ae60498d2a1cab6cff09d425d235a0847135e8:/src/osx/cocoa/filedlg.mm diff --git a/src/osx/cocoa/filedlg.mm b/src/osx/cocoa/filedlg.mm index 0ab62f5bfa..85ac597d3f 100644 --- a/src/osx/cocoa/filedlg.mm +++ b/src/osx/cocoa/filedlg.mm @@ -34,9 +34,11 @@ #include "wx/filename.h" #include "wx/tokenzr.h" +#include "wx/evtloop.h" #include "wx/osx/private.h" #include "wx/sysopt.h" +#include "wx/modalhook.h" #include @@ -70,10 +72,8 @@ bool HasAppKit_10_6() // case above. version = NSVersionOfRunTimeLibrary("AppKit"); } - if (version == -1) - { - return false; - } + + // Notice that this still works correctly even if version is -1. return version >= 0x40e2400 /* version of 10.6 AppKit */; } @@ -187,13 +187,20 @@ bool HasAppKit_10_6() IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase) -wxFileDialog::wxFileDialog( +void wxFileDialog::Init() +{ + m_filterIndex = -1; + m_delegate = nil; + m_sheetDelegate = nil; +} + +void wxFileDialog::Create( wxWindow *parent, const wxString& message, const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard, long style, const wxPoint& pos, const wxSize& sz, const wxString& name) - : wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name) { - m_filterIndex = -1; + wxFileDialogBase::Create(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name); + m_sheetDelegate = [[ModalDialogDelegate alloc] init]; [(ModalDialogDelegate*)m_sheetDelegate setImplementation: this]; } @@ -397,7 +404,7 @@ wxWindow* wxFileDialog::CreateFilterPanel(wxWindow *extracontrol) if ( m_firstFileTypeFilter >= 0 ) m_filterChoice->SetSelection(m_firstFileTypeFilter); } - m_filterChoice->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(wxFileDialog::OnFilterSelected), NULL, this); + m_filterChoice->Connect(wxEVT_CHOICE, wxCommandEventHandler(wxFileDialog::OnFilterSelected), NULL, this); } if(extracontrol) @@ -448,6 +455,11 @@ bool wxFileDialog::CheckFile( const wxString& filename ) void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) { NSSavePanel* panel = (NSSavePanel*) nativeWindow; + // for sandboxed app we cannot access the outer structures + // this leads to problems with extra controls, so as a temporary + // workaround for crashes we don't support those yet + if ( [panel contentView] == nil ) + return; wxNonOwnedWindow::Create( GetParent(), nativeWindow ); wxWindow* extracontrol = NULL; @@ -458,7 +470,6 @@ void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) } NSView* accView = nil; - m_delegate = nil; if ( m_useFileTypeFilter ) { @@ -496,6 +507,10 @@ void wxFileDialog::SetupExtraControls(WXWindow nativeWindow) int wxFileDialog::ShowModal() { + WX_HOOK_MODAL_DIALOG(); + + wxCFEventLoopPauseIdleEvents pause; + wxMacAutoreleasePool autoreleasepool; wxCFStringRef cf( m_message ); @@ -647,7 +662,7 @@ void wxFileDialog::ModalFinishedCallback(void* panel, int returnCode) NSSavePanel* sPanel = (NSSavePanel*)panel; result = wxID_OK; - m_path = wxCFStringRef::AsString([sPanel filename]); + m_path = wxCFStringRef::AsStringWithNormalizationFormC([sPanel filename]); m_fileName = wxFileNameFromPath(m_path); m_dir = wxPathOnly( m_path ); if (m_filterChoice) @@ -666,7 +681,7 @@ void wxFileDialog::ModalFinishedCallback(void* panel, int returnCode) NSArray* filenames = [oPanel filenames]; for ( size_t i = 0 ; i < [filenames count] ; ++ i ) { - wxString fnstr = wxCFStringRef::AsString([filenames objectAtIndex:i]); + wxString fnstr = wxCFStringRef::AsStringWithNormalizationFormC([filenames objectAtIndex:i]); m_paths.Add( fnstr ); m_fileNames.Add( wxFileNameFromPath(fnstr) ); if ( i == 0 ) @@ -689,7 +704,9 @@ void wxFileDialog::ModalFinishedCallback(void* panel, int returnCode) if (GetModality() == wxDIALOG_MODALITY_WINDOW_MODAL) SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); - UnsubclassWin(); + // workaround for sandboxed app, see above + if ( m_isNativeWindowWrapper ) + UnsubclassWin(); [(NSSavePanel*) panel setAccessoryView:nil]; }