X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a449f8407b38dc352eeba091f5d85b692981a087..453091c26978d6da004ab46c78c719d7f9444ae3:/src/mac/carbon/filedlg.cpp diff --git a/src/mac/carbon/filedlg.cpp b/src/mac/carbon/filedlg.cpp index f2cb493f4a..38bce04759 100644 --- a/src/mac/carbon/filedlg.cpp +++ b/src/mac/carbon/filedlg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: filedlg.cpp +// Name: src/mac/carbon/filedlg.cpp // Purpose: wxFileDialog // Author: Stefan Csomor // Modified by: @@ -9,40 +9,30 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "filedlg.h" -#endif +#include "wx/wxprec.h" -#include "wx/defs.h" -#include "wx/app.h" -#include "wx/utils.h" -#include "wx/dialog.h" -#include "wx/filedlg.h" -#include "wx/intl.h" -#include "wx/tokenzr.h" +#if wxUSE_FILEDLG -#ifndef __DARWIN__ - #include "PLStringFuncs.h" -#endif +#include "wx/filedlg.h" -#if !USE_SHARED_LIBRARY -IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase) +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/dialog.h" #endif -// begin wxmac +#include "wx/tokenzr.h" +#include "wx/filename.h" #include "wx/mac/private.h" -#include - -#ifdef __DARWIN__ -# include "MoreFilesX.h" -#else -# include "MoreFiles.h" -# include "MoreFilesExtras.h" +#ifndef __DARWIN__ + #include + #include "PLStringFuncs.h" #endif -extern bool gUseNavServices ; +IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase) // the data we need to pass to our standard file hook routine // includes a pointer to the dialog, a pointer to the standard @@ -50,150 +40,116 @@ extern bool gUseNavServices ; // and a copy of the "previous" file spec of the reply record // so we can see if the selection has changed -struct OpenUserDataRec { +struct OpenUserDataRec +{ int currentfilter ; bool saveMode ; wxArrayString name ; wxArrayString extensions ; wxArrayLong filtermactypes ; wxString defaultLocation; -#if TARGET_CARBON CFArrayRef menuitems ; -#else - NavMenuItemSpecArrayHandle menuitems ; -#endif }; typedef struct OpenUserDataRec OpenUserDataRec, *OpenUserDataRecPtr; -static pascal void NavEventProc( - NavEventCallbackMessage inSelector, - NavCBRecPtr ioParams, - NavCallBackUserData ioUserData); +static pascal void NavEventProc( + NavEventCallbackMessage inSelector, + NavCBRecPtr ioParams, + NavCallBackUserData ioUserData ); -#if TARGET_CARBON - static NavEventUPP sStandardNavEventFilter = NewNavEventUPP(NavEventProc); -#else - static NavEventUPP sStandardNavEventFilter = NewNavEventProc(NavEventProc); -#endif +static NavEventUPP sStandardNavEventFilter = NewNavEventUPP(NavEventProc); -static pascal void -NavEventProc( - NavEventCallbackMessage inSelector, - NavCBRecPtr ioParams, - NavCallBackUserData ioUserData ) +static pascal void NavEventProc( + NavEventCallbackMessage inSelector, + NavCBRecPtr ioParams, + NavCallBackUserData ioUserData ) { OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ; - if (inSelector == kNavCBEvent) { -#if TARGET_CARBON -#else - wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event); -#endif + if (inSelector == kNavCBEvent) + { } else if ( inSelector == kNavCBStart ) { -#if TARGET_CARBON - if (data && !(data->defaultLocation).IsEmpty()) + if (data && !(data->defaultLocation).empty()) { // Set default location for the modern Navigation APIs // Apple Technical Q&A 1151 - FSSpec theFSSpec; - wxMacFilename2FSSpec(data->defaultLocation, &theFSSpec); - AEDesc theLocation = {typeNull, NULL}; - if (noErr == ::AECreateDesc(typeFSS, &theFSSpec, sizeof(FSSpec), &theLocation)) + FSRef theFile; + wxMacPathToFSRef(data->defaultLocation, &theFile); + AEDesc theLocation = { typeNull, NULL }; + if (noErr == ::AECreateDesc(typeFSRef, &theFile, sizeof(FSRef), &theLocation)) ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation); } -#else - if ( data->menuitems ) - NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &(*data->menuitems)[data->currentfilter]); -#endif + + 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); } else if ( inSelector == kNavCBPopupMenuSelect ) { NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ; -#if TARGET_CARBON -#else - if ( menu->menuCreator == 'WXNG' ) -#endif + const size_t numFilters = data->extensions.GetCount(); + + if ( menu->menuType < numFilters ) { data->currentfilter = menu->menuType ; 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 ; -#if TARGET_CARBON wxMacCFStringHolder cfString( NavDialogGetSaveFileName( ioParams->context ) , false ); sfilename = cfString.AsString() ; -#else - Str255 filename ; - // get the current filename - NavCustomControl(ioParams->context, kNavCtlGetEditFileName, &filename); - sfilename = wxMacMakeStringFromPascal( filename ) ; -#endif int pos = sfilename.Find('.', true) ; if ( pos != wxNOT_FOUND ) { sfilename = sfilename.Left(pos+1)+extension ; -#if TARGET_CARBON - cfString = sfilename ; + cfString.Assign( sfilename , wxFONTENCODING_DEFAULT ) ; NavDialogSetSaveFileName( ioParams->context , cfString ) ; -#else - wxMacStringToPascal( sfilename , filename ) ; - NavCustomControl(ioParams->context, kNavCtlSetEditFileName, &filename); -#endif } } } } } -const wxChar * gfilters[] = -{ - wxT("*.TXT") , - wxT("*.TIF") , - wxT("*.JPG") , - - NULL -} ; - -OSType gfiltersmac[] = -{ - 'TEXT' , - 'TIFF' , - 'JPEG' , - - '****' -} ; - - -void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) +void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) { myData->menuitems = NULL ; myData->currentfilter = 0 ; myData->saveMode = false ; - if ( filter && filter[0] ) + if ( !filter.empty() ) { wxString filter2(filter) ; int filterIndex = 0; bool isName = true ; wxString current ; - for( unsigned int i = 0; i < filter2.Len() ; i++ ) + + for ( unsigned int i = 0; i < filter2.length() ; i++ ) { - if( filter2.GetChar(i) == wxT('|') ) + if ( filter2.GetChar(i) == wxT('|') ) { - if( isName ) { + if ( isName ) + { myData->name.Add( current ) ; } - else { - myData->extensions.Add( current.MakeUpper() ) ; + else + { + myData->extensions.Add( current ) ; ++filterIndex ; } + isName = !isName ; current = wxEmptyString ; } @@ -206,31 +162,33 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) // an explanatory text, in that case the first part is name and extension at the same time wxASSERT_MSG( filterIndex == 0 || !isName , wxT("incorrect format of format string") ) ; - if ( current.IsEmpty() ) + 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 ; const size_t extCount = myData->extensions.GetCount(); for ( size_t i = 0 ; i < extCount; i++ ) { - int j ; - for ( j = 0 ; gfilters[j] ; j++ ) - { - if ( myData->extensions[i] == gfilters[j] ) - { - myData->filtermactypes.Add( gfiltersmac[j] ) ; - break ; - } - } - if( gfilters[j] == NULL ) - { - myData->filtermactypes.Add( '****' ) ; - } + wxUint32 fileType, creator; + wxString extension = myData->extensions[i]; + + // Remove leading '*' + if (extension.length() && (extension.GetChar(0) == '*')) + extension = extension.Mid( 1 ); + + // Remove leading '.' + if (extension.length() && (extension.GetChar(0) == '.')) + extension = extension.Mid( 1 ); + + if (wxFileName::MacFindDefaultTypeAndCreator( extension, &fileType, &creator )) + myData->filtermactypes.Add( (OSType)fileType ); + else + myData->filtermactypes.Add( '****' ); // We'll fail safe if it's not recognized } } } @@ -252,22 +210,25 @@ static Boolean CheckFile( const wxString &filename , OSType type , OpenUserDataR return true ; wxStringTokenizer tokenizer( data->extensions[i] , wxT(";") ) ; - while( tokenizer.HasMoreTokens() ) + while ( tokenizer.HasMoreTokens() ) { wxString extension = tokenizer.GetNextToken() ; if ( extension.GetChar(0) == '*' ) extension = extension.Mid(1) ; + extension.MakeUpper(); - if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) ) + if ( file.length() >= extension.length() && extension == file.Right(extension.length() ) ) return true ; } } + return false ; } + return true ; } -#ifndef __DARWIN__ +#if !TARGET_API_MAC_OSX static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr) { OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ; @@ -297,134 +258,140 @@ static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dat // end wxmac -wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, - const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard, - long style, const wxPoint& pos) - :wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos) +wxFileDialog::wxFileDialog( + 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) { wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ; } -pascal Boolean CrossPlatformFilterCallback ( +pascal Boolean CrossPlatformFilterCallback( AEDesc *theItem, void *info, void *callBackUD, - NavFilterModes filterMode -) + 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 ) ; - } - #if TARGET_CARBON - else if ( theItem->descriptorType == typeFSRef ) - { - FSRef fsref ; - memcpy( &fsref , *theItem->dataHandle , sizeof(FSRef) ) ; - wxString file ; - const short maxpath = 1024 ; - FSRefMakePath( &fsref , (UInt8*) file.GetWriteBuf(maxpath+1),maxpath) ; - file.UngetWriteBuf() ; - display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; - } -#endif + // 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() { -#if TARGET_CARBON OSErr err; NavDialogCreationOptions dialogCreateOptions; + // set default options ::NavGetDefaultDialogCreationOptions(&dialogCreateOptions); // this was always unset in the old code dialogCreateOptions.optionFlags &= ~kNavSelectDefaultLocation; -#if wxUSE_UNICODE - // tried using wxMacCFStringHolder in the code below, but it seems - // the CFStrings were being released before the save dialog was called, - // causing a crash - open dialog works fine with or without wxMacCFStringHolder - CFStringRef titleRef = ::CFStringCreateWithCharacters( kCFAllocatorDefault, - (const unsigned short*)m_message.wc_str(), - m_message.Len() ); -#else - CFStringRef titleRef = ::CFStringCreateWithCString(NULL, - m_message.c_str(), - CFStringGetSystemEncoding()); -#endif - dialogCreateOptions.windowTitle = titleRef; -#if wxUSE_UNICODE - CFStringRef defaultFileNameRef = ::CFStringCreateWithCharacters( kCFAllocatorDefault, - (const unsigned short*)m_fileName.wc_str(), - m_fileName.Len() ); -#else - CFStringRef defaultFileNameRef = ::CFStringCreateWithCString(NULL, - m_fileName.c_str(), - CFStringGetSystemEncoding()); -#endif - dialogCreateOptions.saveFileName = defaultFileNameRef; + wxMacCFStringHolder message(m_message, m_font.GetEncoding()); + dialogCreateOptions.windowTitle = message; + + wxMacCFStringHolder defaultFileName(m_fileName, m_font.GetEncoding()); + dialogCreateOptions.saveFileName = defaultFileName; + + NavDialogRef dialog; NavObjectFilterUPP navFilterUPP = NULL; - CFArrayRef cfArray = NULL; // for popupExtension OpenUserDataRec myData; myData.defaultLocation = m_dir; - if (m_dialogStyle & wxSAVE) + MakeUserDataRec(&myData , m_wildCard); + myData.currentfilter = m_filterIndex; + size_t numFilters = myData.extensions.GetCount(); + if (numFilters) + { + CFMutableArrayRef popup = CFArrayCreateMutable( kCFAllocatorDefault , + numFilters , &kCFTypeArrayCallBacks ) ; + dialogCreateOptions.popupExtension = popup ; + myData.menuitems = dialogCreateOptions.popupExtension ; + for ( size_t i = 0 ; i < numFilters ; ++i ) + { + CFArrayAppendValue( popup , (CFStringRef) wxMacCFStringHolder( myData.name[i] , m_font.GetEncoding() ) ) ; + } + } + + if (HasFdFlag(wxFD_SAVE)) { - dialogCreateOptions.optionFlags |= kNavNoTypePopup; + myData.saveMode = true; + dialogCreateOptions.optionFlags |= kNavDontAutoTranslate; dialogCreateOptions.optionFlags |= kNavDontAddTranslateItems; + if (!numFilters) + dialogCreateOptions.optionFlags |= kNavNoTypePopup; // The extension is important - dialogCreateOptions.optionFlags |= kNavPreserveSaveFileExtension; - - err = ::NavCreatePutFileDialog(&dialogCreateOptions, - 'TEXT', - 'TEXT', - sStandardNavEventFilter, - &myData, // for defaultLocation - &dialog); + if (numFilters < 2) + dialogCreateOptions.optionFlags |= kNavPreserveSaveFileExtension; + +#if TARGET_API_MAC_OSX + if (!(m_windowStyle & wxFD_OVERWRITE_PROMPT)) + dialogCreateOptions.optionFlags |= kNavDontConfirmReplacement; +#endif + + err = ::NavCreatePutFileDialog( + &dialogCreateOptions, + kNavGenericSignature, // Suppresses the 'Default' (top) menu item + kNavGenericSignature, + sStandardNavEventFilter, + &myData, // for defaultLocation + &dialog ); } else { - MakeUserDataRec(&myData , m_wildCard); - size_t numfilters = myData.extensions.GetCount(); - if (numfilters > 0) - { - CFMutableArrayRef popup = CFArrayCreateMutable( kCFAllocatorDefault , - numfilters , &kCFTypeArrayCallBacks ) ; - dialogCreateOptions.popupExtension = popup ; - myData.menuitems = dialogCreateOptions.popupExtension ; - for ( size_t i = 0 ; i < numfilters ; ++i ) - { - CFArrayAppendValue( popup , (CFStringRef) wxMacCFStringHolder( myData.name[i] ) ) ; - } - } + // let the user select bundles/programs in dialogs + dialogCreateOptions.optionFlags |= kNavSupportPackages; navFilterUPP = NewNavObjectFilterUPP(CrossPlatformFilterCallback); - err = ::NavCreateGetFileDialog(&dialogCreateOptions, - NULL, // NavTypeListHandle - sStandardNavEventFilter, - NULL, // NavPreviewUPP - navFilterUPP, - (void *) &myData, // inClientData - &dialog); + err = ::NavCreateGetFileDialog( + &dialogCreateOptions, + NULL, // NavTypeListHandle + sStandardNavEventFilter, + NULL, // NavPreviewUPP + navFilterUPP, + (void *) &myData, // inClientData + &dialog ); } if (err == noErr) @@ -433,21 +400,7 @@ int wxFileDialog::ShowModal() // clean up filter related data, etc. if (navFilterUPP) ::DisposeNavObjectFilterUPP(navFilterUPP); - if (cfArray) - { - CFIndex n = ::CFArrayGetCount(cfArray); - for (CFIndex i = 0; i < n; i++) - { - CFStringRef str = (CFStringRef) ::CFArrayGetValueAtIndex(cfArray, i); - if (str) - ::CFRelease(str); - } - ::CFRelease(cfArray); - } - if (titleRef) - ::CFRelease(titleRef); - if (defaultFileNameRef) - ::CFRelease(defaultFileNameRef); + if (err != noErr) return wxID_CANCEL; @@ -461,215 +414,44 @@ int wxFileDialog::ShowModal() FSRef theFSRef; wxString thePath ; long count; - ::AECountItems(&navReply.selection , &count); + + m_filterIndex = myData.currentfilter; + ::AECountItems( &navReply.selection, &count ); for (long i = 1; i <= count; ++i) { - err = ::AEGetNthPtr(&(navReply.selection), 1, typeFSRef, &theKeyword, &actualType, - &theFSRef, sizeof(theFSRef), &actualSize); + err = ::AEGetNthPtr( + &(navReply.selection), i, typeFSRef, &theKeyword, &actualType, + &theFSRef, sizeof(theFSRef), &actualSize ); if (err != noErr) break; - CFURLRef fullURLRef; - if (m_dialogStyle & wxSAVE) - { - CFURLRef parentURLRef = ::CFURLCreateFromFSRef(NULL, &theFSRef); - - if (parentURLRef) - { - fullURLRef = - ::CFURLCreateCopyAppendingPathComponent(NULL, - parentURLRef, - navReply.saveFileName, - false); - ::CFRelease(parentURLRef); - } - } + if (HasFdFlag(wxFD_SAVE)) + thePath = wxMacFSRefToPath( &theFSRef, navReply.saveFileName ); else - { - fullURLRef = ::CFURLCreateFromFSRef(NULL, &theFSRef); - } -#ifdef __UNIX__ - CFURLPathStyle pathstyle = kCFURLPOSIXPathStyle; -#else - CFURLPathStyle pathstyle = kCFURLHFSPathStyle; -#endif - CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, pathstyle); - thePath = wxMacCFStringHolder(cfString).AsString(); + thePath = wxMacFSRefToPath( &theFSRef ); + if (!thePath) { ::NavDisposeReply(&navReply); return wxID_CANCEL; } + m_path = thePath; m_paths.Add(m_path); m_fileName = wxFileNameFromPath(m_path); m_fileNames.Add(m_fileName); } + // set these to the first hit m_path = m_paths[0]; m_fileName = wxFileNameFromPath(m_path); m_dir = wxPathOnly(m_path); } + ::NavDisposeReply(&navReply); return (err == noErr) ? wxID_OK : wxID_CANCEL; -#else // TARGET_CARBON - - NavDialogOptions mNavOptions; - NavObjectFilterUPP mNavFilterUPP = NULL; - NavPreviewUPP mNavPreviewUPP = NULL ; - NavReplyRecord mNavReply; - AEDesc mDefaultLocation ; - bool mSelectDefault = false ; - OSStatus err = noErr ; - // setup dialog - - mNavFilterUPP = nil; - mNavPreviewUPP = nil; - mSelectDefault = false; - mDefaultLocation.descriptorType = typeNull; - mDefaultLocation.dataHandle = nil; - - NavGetDefaultDialogOptions(&mNavOptions); - wxMacStringToPascal( m_message , (StringPtr)mNavOptions.message ) ; - wxMacStringToPascal( m_fileName , (StringPtr)mNavOptions.savedFileName ) ; - - // Set default location, the location - // that's displayed when the dialog - // first appears - - FSSpec location ; - wxMacFilename2FSSpec( m_dir , &location ) ; - - err = ::AECreateDesc(typeFSS, &location, sizeof(FSSpec), &mDefaultLocation ); - - if ( mDefaultLocation.dataHandle ) - { - if (mSelectDefault) - { - mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation; - } else { - mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation; - } - } - - memset( &mNavReply , 0 , sizeof( mNavReply ) ) ; - mNavReply.validRecord = false; - mNavReply.replacing = false; - mNavReply.isStationery = false; - mNavReply.translationNeeded = false; - mNavReply.selection.descriptorType = typeNull; - mNavReply.selection.dataHandle = nil; - mNavReply.keyScript = smSystemScript; - mNavReply.fileTranslation = nil; - mNavReply.version = kNavReplyRecordVersion ; - - // zero all data - - m_path = wxEmptyString ; - m_fileName = wxEmptyString ; - m_paths.Empty(); - m_fileNames.Empty(); - - OpenUserDataRec myData; - MakeUserDataRec( &myData , m_wildCard ) ; - myData.currentfilter = m_filterIndex ; - if ( myData.extensions.GetCount() > 0 ) - { - mNavOptions.popupExtension = (NavMenuItemSpecArrayHandle) NewHandle( sizeof( NavMenuItemSpec ) * myData.extensions.GetCount() ) ; - myData.menuitems = mNavOptions.popupExtension ; - for ( size_t i = 0 ; i < myData.extensions.GetCount() ; ++i ) - { - (*mNavOptions.popupExtension)[i].version = kNavMenuItemSpecVersion ; - (*mNavOptions.popupExtension)[i].menuCreator = 'WXNG' ; - // TODO : according to the new docs -1 to 10 are reserved for the OS - (*mNavOptions.popupExtension)[i].menuType = i ; - wxMacStringToPascal( myData.name[i] , (StringPtr)(*mNavOptions.popupExtension)[i].menuItemName ) ; - } - } - if ( m_dialogStyle & wxSAVE ) - { - myData.saveMode = true ; - - mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ; - mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ; - - err = ::NavPutFile( - &mDefaultLocation, - &mNavReply, - &mNavOptions, - sStandardNavEventFilter , - NULL, - kNavGenericSignature, - &myData); // User Data - m_filterIndex = myData.currentfilter ; - } - else - { - myData.saveMode = false ; - - mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ; - if ( m_dialogStyle & wxMULTIPLE ) - mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ; - else - mNavOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles ; - - err = ::NavGetFile( - &mDefaultLocation, - &mNavReply, - &mNavOptions, - sStandardNavEventFilter , - mNavPreviewUPP, - mNavFilterUPP, - NULL , - &myData); - m_filterIndex = myData.currentfilter ; - } - - DisposeNavObjectFilterUPP(mNavFilterUPP); - if ( mDefaultLocation.dataHandle != nil ) - { - ::AEDisposeDesc(&mDefaultLocation); - } - - if ( (err != noErr) && (err != userCanceledErr) ) { - return wxID_CANCEL ; - } - - if (mNavReply.validRecord) - { - 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, &keyWord , &specDesc); - if ( err != noErr ) - { - m_path = wxT("") ; - return wxID_CANCEL ; - } - outFileSpec = **(FSSpec**) specDesc.dataHandle; - if (specDesc.dataHandle != nil) { - ::AEDisposeDesc(&specDesc); - } - m_path = wxMacFSSpec2MacFilename( &outFileSpec ) ; - - m_paths.Add( m_path ) ; - m_fileName = wxFileNameFromPath(m_path); - m_fileNames.Add(m_fileName); - } - // set these to the first hit - m_path = m_paths[ 0 ] ; - m_fileName = wxFileNameFromPath(m_path); - m_dir = wxPathOnly(m_path); - NavDisposeReply( &mNavReply ) ; - return wxID_OK ; - } - return wxID_CANCEL; -#endif // TARGET_CARBON } +#endif // wxUSE_FILEDLG +