X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da2b4b7a57f816723ed26dbbeca0549b9ce6735a..ba723d98a83bb51137ae926000d1da1cc583cc9a:/src/mac/filedlg.cpp diff --git a/src/mac/filedlg.cpp b/src/mac/filedlg.cpp index 6abb80c8d7..6ca66d390f 100644 --- a/src/mac/filedlg.cpp +++ b/src/mac/filedlg.cpp @@ -19,6 +19,7 @@ #include "wx/dialog.h" #include "wx/filedlg.h" #include "wx/intl.h" +#include "wx/tokenzr.h" #ifndef __DARWIN__ #include "PLStringFuncs.h" @@ -30,9 +31,7 @@ IMPLEMENT_CLASS(wxFileDialog, wxDialog) // begin wxmac -#ifndef __DARWIN__ - #include -#endif +#include #include "MoreFiles.h" #include "MoreFilesExtras.h" @@ -94,7 +93,7 @@ NavEventProc( } } -char * gfilters[] = +const char * gfilters[] = { "*.TXT" , "*.TIF" , @@ -269,7 +268,7 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) current += filter2.GetChar(i) ; } } - if ( filterIndex > 0 ) +// if ( filterIndex > 0 ) { wxASSERT_MSG( !isName , "incorrect format of format string" ) ; myData->extensions[filterIndex] = current.MakeUpper() ; @@ -301,7 +300,7 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) } -#if !TARGET_CARBON +#ifndef __DARWIN__ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR ) { Point thePt; @@ -314,6 +313,7 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const OSErr err; SFTypeList types ; + // presumably we're running System 7 or later so CustomGetFile is // available @@ -326,6 +326,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const MakeUserDataRec( &myData , filter ) ; // display the dialog +#if !TARGET_CARBON + dlgHookUPP = NULL ; // dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook); myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter); @@ -348,7 +350,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const DisposeRoutineDescriptor(dlgHookUPP); DisposeRoutineDescriptor(myModalFilterUPP); - +#else +#endif // if cancel wasn't pressed and no fatal error occurred... if (theSFR->sfGood) @@ -420,27 +423,31 @@ static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecP if ( data->numfilters > 0 ) { //for ( int i = 0 ; i < data->numfilters ; ++i ) - int i = data->currentfilter ; - if ( data->extensions[i].Right(2) == ".*" ) - return true ; + int i = data->currentfilter ; + if ( data->extensions[i].Right(2) == ".*" ) + return true ; - { - if ( type == data->filtermactypes[i] ) - return true ; - - wxString extension = data->extensions[i] ; - if ( extension.GetChar(0) == '*' ) - extension = extension.Mid(1) ; + { + if ( type == data->filtermactypes[i] ) + return true ; - if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) ) - return true ; - } - return false ; + wxStringTokenizer tokenizer( data->extensions[i] , ";" ) ; + while( tokenizer.HasMoreTokens() ) + { + wxString extension = tokenizer.GetNextToken() ; + if ( extension.GetChar(0) == '*' ) + extension = extension.Mid(1) ; + + if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) ) + return true ; + } + } + return false ; } return true ; } -#if !TARGET_CARBON +#ifndef __DARWIN__ static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr) { OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ; @@ -561,11 +568,7 @@ pascal Boolean CrossPlatformFilterCallback ( if (theItem->descriptorType == typeFSS && !theInfo->isFolder) { FSSpec spec; -#if TARGET_CARBON - ::AEGetDescData(theItem, &spec, sizeof(FSSpec) ) ; -#else - memcpy( &spec , (*theItem->dataHandle) , sizeof(FSSpec) ) ; -#endif + memcpy( &spec , *theItem->dataHandle , sizeof(FSSpec) ) ; display = CheckFile( spec.name , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; } } @@ -614,10 +617,15 @@ int wxFileDialog::ShowModal() StandardFileReply reply ; FileFilterYDUPP crossPlatformFileFilterUPP = 0 ; + #if !TARGET_CARBON crossPlatformFileFilterUPP = NewFileFilterYDProc(CrossPlatformFileFilter); + #endif + ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply); + #if !TARGET_CARBON DisposeFileFilterYDUPP(crossPlatformFileFilterUPP); + #endif if ( reply.sfGood == false ) { m_path = "" ; @@ -625,7 +633,7 @@ int wxFileDialog::ShowModal() } else { - m_path = wxMacFSSpec2MacFilename( &reply.sfFile ) ; + m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ; return wxID_OK ; } } @@ -762,12 +770,13 @@ int wxFileDialog::ShowModal() FSSpec outFileSpec ; AEDesc specDesc ; + AEKeyword keyWord ; long count ; ::AECountItems( &mNavReply.selection , &count ) ; for ( long i = 1 ; i <= count ; ++i ) { - OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, NULL , &specDesc); + OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, &keyWord , &specDesc); if ( err != noErr ) { m_path = "" ; return wxID_CANCEL ; @@ -787,7 +796,7 @@ int wxFileDialog::ShowModal() m_path = m_paths[ 0 ] ; m_fileName = wxFileNameFromPath(m_path); m_dir = wxPathOnly(m_path); - + NavDisposeReply( &mNavReply ) ; return wxID_OK ; } return wxID_CANCEL;