X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c3b8bf3fb5c59e1f044e3a4f7a2da3c477df4bff..9d5507f7a2701395e1d5c121bd877bb9066ee6ea:/src/mac/carbon/filedlg.cpp diff --git a/src/mac/carbon/filedlg.cpp b/src/mac/carbon/filedlg.cpp index e3a810a505..81845d173e 100644 --- a/src/mac/carbon/filedlg.cpp +++ b/src/mac/carbon/filedlg.cpp @@ -83,12 +83,14 @@ static pascal void NavEventProc( ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation); } - NavMenuItemSpec menuItem; - menuItem.version = kNavMenuItemSpecVersion; - menuItem.menuCreator = 'WXNG'; - menuItem.menuType = data->currentfilter; - wxMacStringToPascal( data->name[data->currentfilter] , (StringPtr)(menuItem.menuItemName) ) ; - ::NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &menuItem); + if( data->extensions.GetCount() > 0 ) + { + NavMenuItemSpec menuItem; + memset( &menuItem, 0, sizeof(menuItem) ); + menuItem.version = kNavMenuItemSpecVersion; + menuItem.menuType = data->currentfilter; + ::NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &menuItem); + } } else if ( inSelector == kNavCBPopupMenuSelect ) { @@ -101,15 +103,18 @@ 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 ); sfilename = cfString.AsString() ; int pos = sfilename.Find('.', true) ; - if ( pos != wxNOT_FOUND ) + if ( pos != wxNOT_FOUND && extension != wxT("*") ) { sfilename = sfilename.Left(pos+1)+extension ; cfString.Assign( sfilename , wxFONTENCODING_DEFAULT ) ; @@ -143,7 +148,7 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) } else { - myData->extensions.Add( current.MakeUpper() ) ; + myData->extensions.Add( current ) ; ++filterIndex ; } @@ -162,9 +167,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 ; @@ -212,6 +217,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 ; @@ -224,34 +230,6 @@ static Boolean CheckFile( const wxString &filename , OSType type , OpenUserDataR return true ; } -#if !TARGET_API_MAC_OSX -static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr) -{ - OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ; - // return true if this item is invisible or a file - - Boolean visibleFlag; - Boolean folderFlag; - - visibleFlag = ! (myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible); - folderFlag = (myCInfoPBPtr->hFileInfo.ioFlAttrib & 0x10); - - // because the semantics of the filter proc are "true means don't show - // it" we need to invert the result that we return - - if ( !visibleFlag ) - return true ; - - if ( !folderFlag ) - { - wxString file = wxMacMakeStringFromPascal( myCInfoPBPtr->hFileInfo.ioNamePtr ) ; - return !CheckFile( file , myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdType , data ) ; - } - - return false ; -} -#endif - // end wxmac wxFileDialog::wxFileDialog( @@ -269,27 +247,47 @@ 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. NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ; - if ( !theInfo->isFolder ) + FSRef fsref; + + if ( theInfo->isFolder ) { - AECoerceDesc (theItem, typeFSRef, theItem); - - FSRef fsref ; - if ( AEGetDescData (theItem, &fsref, sizeof (FSRef)) == noErr ) + // 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; + } + else + { + AECoerceDesc (theItem, typeFSRef, theItem); + if ( AEGetDescData (theItem, &fsref, sizeof (FSRef)) == noErr) { - memcpy( &fsref , *theItem->dataHandle , sizeof(FSRef) ) ; wxString file = wxMacFSRefToPath( &fsref ) ; - display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; + return CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; } } } - return display; + return true; } int wxFileDialog::ShowModal() @@ -343,10 +341,8 @@ int wxFileDialog::ShowModal() if (numFilters < 2) dialogCreateOptions.optionFlags |= kNavPreserveSaveFileExtension; -#if TARGET_API_MAC_OSX if (!(m_windowStyle & wxFD_OVERWRITE_PROMPT)) dialogCreateOptions.optionFlags |= kNavDontConfirmReplacement; -#endif err = ::NavCreatePutFileDialog( &dialogCreateOptions, @@ -380,7 +376,10 @@ int wxFileDialog::ShowModal() ::DisposeNavObjectFilterUPP(navFilterUPP); if (err != noErr) + { + ::NavDialogDispose(dialog); return wxID_CANCEL; + } NavReplyRecord navReply; err = ::NavDialogGetReply(dialog, &navReply); @@ -411,6 +410,7 @@ int wxFileDialog::ShowModal() if (!thePath) { ::NavDisposeReply(&navReply); + ::NavDialogDispose(dialog); return wxID_CANCEL; } @@ -427,6 +427,7 @@ int wxFileDialog::ShowModal() } ::NavDisposeReply(&navReply); + ::NavDialogDispose(dialog); return (err == noErr) ? wxID_OK : wxID_CANCEL; }