X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e031f1df56a1595c7ebb4027eb89bf1c9f286bdf..8d1547ef4697a49cf4f4b8f09f662705e064c416:/src/mac/carbon/filedlg.cpp diff --git a/src/mac/carbon/filedlg.cpp b/src/mac/carbon/filedlg.cpp index 5fffa73c60..38bce04759 100644 --- a/src/mac/carbon/filedlg.cpp +++ b/src/mac/carbon/filedlg.cpp @@ -11,6 +11,8 @@ #include "wx/wxprec.h" +#if wxUSE_FILEDLG + #include "wx/filedlg.h" #ifndef WX_PRECOMP @@ -30,12 +32,8 @@ #include "PLStringFuncs.h" #endif -#include "MoreFilesX.h" - IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase) -extern bool gUseNavServices; - // the data we need to pass to our standard file hook routine // includes a pointer to the dialog, a pointer to the standard // file reply record (so we can inspect the current selection) @@ -78,10 +76,10 @@ static pascal void NavEventProc( { // Set default location for the modern Navigation APIs // Apple Technical Q&A 1151 - FSSpec theFSSpec; - wxMacFilename2FSSpec(data->defaultLocation, &theFSSpec); + FSRef theFile; + wxMacPathToFSRef(data->defaultLocation, &theFile); AEDesc theLocation = { typeNull, NULL }; - if (noErr == ::AECreateDesc(typeFSS, &theFSSpec, sizeof(FSSpec), &theLocation)) + if (noErr == ::AECreateDesc(typeFSRef, &theFile, sizeof(FSRef), &theLocation)) ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation); } @@ -103,8 +101,11 @@ static pascal void NavEventProc( if ( data->saveMode ) { int i = menu->menuType ; - wxString extension = data->extensions[i].AfterLast('.') ; - extension.MakeLower() ; + + // isolate the first extension string + wxString firstExtension = data->extensions[i].BeforeFirst('|').BeforeFirst(';'); + + wxString extension = firstExtension.AfterLast('.') ; wxString sfilename ; wxMacCFStringHolder cfString( NavDialogGetSaveFileName( ioParams->context ) , false ); @@ -128,7 +129,7 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) myData->currentfilter = 0 ; myData->saveMode = false ; - if ( filter && filter[0] ) + if ( !filter.empty() ) { wxString filter2(filter) ; int filterIndex = 0; @@ -145,7 +146,7 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) } else { - myData->extensions.Add( current.MakeUpper() ) ; + myData->extensions.Add( current ) ; ++filterIndex ; } @@ -164,9 +165,9 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) if ( current.empty() ) myData->extensions.Add( myData->name[filterIndex] ) ; else - myData->extensions.Add( current.MakeUpper() ) ; + myData->extensions.Add( current ) ; if ( filterIndex == 0 || isName ) - myData->name.Add( current.MakeUpper() ) ; + myData->name.Add( current ) ; ++filterIndex ; @@ -214,6 +215,7 @@ static Boolean CheckFile( const wxString &filename , OSType type , OpenUserDataR wxString extension = tokenizer.GetNextToken() ; if ( extension.GetChar(0) == '*' ) extension = extension.Mid(1) ; + extension.MakeUpper(); if ( file.length() >= extension.length() && extension == file.Right(extension.length() ) ) return true ; @@ -271,32 +273,45 @@ pascal Boolean CrossPlatformFilterCallback( void *callBackUD, NavFilterModes filterMode ) { - bool display = true; OpenUserDataRecPtr data = (OpenUserDataRecPtr) callBackUD ; if (filterMode == kNavFilteringBrowserList) { + // We allow navigation to all folders. For files, we check against the current + // filter string. + // However, packages should be dealt with like files and not like folders. So + // check if a folder is a package before deciding what to do. + FSRef fsref; NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ; - if ( !theInfo->isFolder ) + AECoerceDesc (theItem, typeFSRef, theItem); + if ( AEGetDescData (theItem, &fsref, sizeof (FSRef)) != noErr) + return true; + + if ( theInfo->isFolder ) { - if (theItem->descriptorType == typeFSS) - { - FSSpec spec; - memcpy( &spec , *theItem->dataHandle , sizeof(FSSpec) ) ; - wxString file = wxMacMakeStringFromPascal( spec.name ) ; - display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; - } - else if ( theItem->descriptorType == typeFSRef ) - { - FSRef fsref ; - memcpy( &fsref , *theItem->dataHandle , sizeof(FSRef) ) ; - wxString file = wxMacFSRefToPath( &fsref ) ; - display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; - } + // check bundle bit (using Finder Services - used by OS9 on some bundles) + FSCatalogInfo catalogInfo; + if (FSGetCatalogInfo (&fsref, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL) != noErr) + return true; + + // Check bundle item (using Launch Services - used by OS-X through info.plist or APP) + LSItemInfoRecord lsInfo; + if (LSCopyItemInfoForRef(&fsref, kLSRequestBasicFlagsOnly, &lsInfo ) != noErr) + return true; + + // If it's not a bundle, then it's a normal folder and it passes our filter + FileInfo *fileInfo = (FileInfo *) catalogInfo.finderInfo; + if ( !(fileInfo->finderFlags & kHasBundle) && + !(lsInfo.flags & (kLSItemInfoIsApplication | kLSItemInfoIsPackage)) ) + return true; } + + wxString file = wxMacFSRefToPath( &fsref ) ; + return CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; + } - return display; + return true; } int wxFileDialog::ShowModal() @@ -319,7 +334,6 @@ int wxFileDialog::ShowModal() NavDialogRef dialog; NavObjectFilterUPP navFilterUPP = NULL; - CFArrayRef cfArray = NULL; // for popupExtension OpenUserDataRec myData; myData.defaultLocation = m_dir; @@ -338,7 +352,7 @@ int wxFileDialog::ShowModal() } } - if (HasFlag(wxFD_SAVE)) + if (HasFdFlag(wxFD_SAVE)) { myData.saveMode = true; @@ -386,8 +400,6 @@ int wxFileDialog::ShowModal() // clean up filter related data, etc. if (navFilterUPP) ::DisposeNavObjectFilterUPP(navFilterUPP); - if (cfArray) - ::CFRelease(cfArray); if (err != noErr) return wxID_CANCEL; @@ -413,7 +425,7 @@ int wxFileDialog::ShowModal() if (err != noErr) break; - if (HasFlag(wxFD_SAVE)) + if (HasFdFlag(wxFD_SAVE)) thePath = wxMacFSRefToPath( &theFSRef, navReply.saveFileName ); else thePath = wxMacFSRefToPath( &theFSRef ); @@ -440,3 +452,6 @@ int wxFileDialog::ShowModal() return (err == noErr) ? wxID_OK : wxID_CANCEL; } + +#endif // wxUSE_FILEDLG +