+ 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 )
+ {
+#if TARGET_CARBON
+ CFMutableArrayRef popup = CFArrayCreateMutable( kCFAllocatorDefault ,
+ myData.extensions.GetCount() , &kCFTypeArrayCallBacks ) ;
+ mNavOptions.popupExtension = popup ;
+ myData.menuitems = mNavOptions.popupExtension ;
+ for ( size_t i = 0 ; i < myData.extensions.GetCount() ; ++i )
+ {
+ CFArrayAppendValue( popup , (CFStringRef) wxMacCFStringHolder( myData.name[i] ) ) ;
+ }
+#else
+ 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 ) ;
+ }
+#endif
+ }
+ if ( m_dialogStyle & wxSAVE )
+ {
+ myData.saveMode = true ;
+
+ mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ;
+ mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ;
+
+#if TARGET_CARBON
+ err = NavCreatePutFileDialog( &mNavOptions , NULL , kNavGenericSignature , sStandardNavEventFilter ,
+ &myData , &navDialogRef ) ;
+ if ( err == noErr )
+ {
+ err = NavDialogRun( navDialogRef ) ;
+ NavUserAction userAction = NavDialogGetUserAction( navDialogRef ) ;
+ if ( userAction != kNavUserActionCancel && userAction != kNavUserActionNone )
+ {
+ NavDialogGetReply( navDialogRef, &mNavReply ) ;
+ }
+ }
+#else
+ err = ::NavPutFile(
+ &mDefaultLocation,
+ &mNavReply,
+ &mNavOptions,
+ sStandardNavEventFilter ,
+ NULL,
+ kNavGenericSignature,
+ &myData); // User Data
+#endif
+ m_filterIndex = myData.currentfilter ;
+ }
+ else
+ {
+ myData.saveMode = false ;
+
+ mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ;
+ if ( m_dialogStyle & wxMULTIPLE )
+ mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ;
+ else
+ mNavOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles ;
+
+#if TARGET_CARBON
+ err = NavCreateGetFileDialog( &mNavOptions , NULL , sStandardNavEventFilter ,
+ mNavPreviewUPP , mNavFilterUPP , &myData , &navDialogRef ) ;
+ if ( err == noErr )
+ {
+ err = NavDialogRun( navDialogRef ) ;
+ NavUserAction userAction = NavDialogGetUserAction( navDialogRef ) ;
+ if ( userAction != kNavUserActionCancel && userAction != kNavUserActionNone )
+ {
+ NavDialogGetReply( navDialogRef, &mNavReply ) ;
+ }
+ }
+#else
+ err = ::NavGetFile(
+ &mDefaultLocation,
+ &mNavReply,
+ &mNavOptions,
+ sStandardNavEventFilter ,
+ mNavPreviewUPP,
+ mNavFilterUPP,
+ NULL ,
+ &myData);
+#endif
+ m_filterIndex = myData.currentfilter ;
+ }
+
+ DisposeNavObjectFilterUPP(mNavFilterUPP);
+ if ( mDefaultLocation.dataHandle != nil )
+ {
+ ::AEDisposeDesc(&mDefaultLocation);
+ }
+
+ if ( (err != noErr) && (err != userCanceledErr) ) {
+ return wxID_CANCEL ;
+ }