X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/427ff66291af2d8dd34ff5ee68c81436997144a1..03a991bc7aae8849871c8215d3732f431f2f6219:/src/mac/filedlg.cpp diff --git a/src/mac/filedlg.cpp b/src/mac/filedlg.cpp index f2b6707baf..6347f87577 100644 --- a/src/mac/filedlg.cpp +++ b/src/mac/filedlg.cpp @@ -26,7 +26,7 @@ #endif #if !USE_SHARED_LIBRARY -IMPLEMENT_CLASS(wxFileDialog, wxDialog) +IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase) #endif // begin wxmac @@ -56,7 +56,11 @@ struct OpenUserDataRec { wxArrayString name ; wxArrayString extensions ; wxArrayLong filtermactypes ; +#if TARGET_CARBON + CFArrayRef menuitems ; +#else NavMenuItemSpecArrayHandle menuitems ; +#endif }; typedef struct OpenUserDataRec @@ -80,20 +84,28 @@ NavEventProc( NavCallBackUserData ioUserData ) { OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ; - if (inSelector == kNavCBEvent) { -#if !TARGET_CARBON + if (inSelector == kNavCBEvent) { +#if TARGET_CARBON +#else wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event); #endif } else if ( inSelector == kNavCBStart ) { +#if TARGET_CARBON + // there is no way to set this in the new API + #else if ( data->menuitems ) NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &(*data->menuitems)[data->currentfilter]); +#endif } else if ( inSelector == kNavCBPopupMenuSelect ) { NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ; +#if TARGET_CARBON +#else if ( menu->menuCreator == 'WXNG' ) +#endif { data->currentfilter = menu->menuType ; if ( data->saveMode ) @@ -101,19 +113,32 @@ NavEventProc( int i = menu->menuType ; wxString extension = data->extensions[i].AfterLast('.') ; extension.MakeLower() ; + 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); - wxString sfilename = wxMacMakeStringFromPascal( 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 ; + NavDialogSetSaveFileName( ioParams->context , cfString ) ; +#else wxMacStringToPascal( sfilename , filename ) ; NavCustomControl(ioParams->context, kNavCtlSetEditFileName, &filename); +#endif } } - } + } } } @@ -202,20 +227,9 @@ void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter ) } } -static Boolean CheckFile( ConstStr255Param name , OSType type , OpenUserDataRecPtr data) +static Boolean CheckFile( const wxString &filename , OSType type , OpenUserDataRecPtr data) { -/* - Str255 filename ; - -#if TARGET_CARBON - p2cstrcpy((char *)filename, name) ; -#else - PLstrcpy( filename , name ) ; - p2cstr( filename ) ; -#endif - wxString file(filename) ; -*/ - wxString file = wxMacMakeStringFromPascal( name ) ; + wxString file = filename ; file.MakeUpper() ; if ( data->extensions.GetCount() > 0 ) @@ -265,7 +279,8 @@ static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dat if ( !folderFlag ) { - return !CheckFile( myCInfoPBPtr->hFileInfo.ioNamePtr , myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdType , data ) ; + wxString file = wxMacMakeStringFromPascal( myCInfoPBPtr->hFileInfo.ioNamePtr ) ; + return !CheckFile( file , myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdType , data ) ; } return false ; @@ -274,78 +289,12 @@ static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dat // end wxmac -wxString wxFileSelector(const wxChar *title, - const wxChar *defaultDir, const wxChar *defaultFileName, - const wxChar *defaultExtension, const wxChar *filter, int flags, - wxWindow *parent, int x, int y) -{ - // If there's a default extension specified but no filter, we create a suitable - // filter. - - wxString filter2; - if ( defaultExtension && !filter ) - filter2 = wxString(wxT("*.")) + wxString(defaultExtension) ; - else if ( filter ) - filter2 = filter; - - wxString defaultDirString; - if (defaultDir) - defaultDirString = defaultDir; - else - defaultDirString = wxEmptyString ; - - wxString defaultFilenameString; - if (defaultFileName) - defaultFilenameString = defaultFileName; - else - defaultFilenameString = wxEmptyString; - - wxFileDialog fileDialog(parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y)); - - if ( fileDialog.ShowModal() == wxID_OK ) - { - return fileDialog.GetPath(); - } - else - return wxGetEmptyString(); -} - -WXDLLEXPORT wxString wxFileSelectorEx(const wxChar *title, - const wxChar *defaultDir, - const wxChar *defaultFileName, - int* defaultFilterIndex, - const wxChar *filter, - int flags, - wxWindow* parent, - int x, - int y) - -{ - wxFileDialog fileDialog(parent, title ? title : wxT(""), defaultDir ? defaultDir : wxT(""), - defaultFileName ? defaultFileName : wxT(""), filter ? filter : wxT(""), flags, wxPoint(x, y)); - - if ( fileDialog.ShowModal() == wxID_OK ) - { - *defaultFilterIndex = fileDialog.GetFilterIndex(); - return fileDialog.GetPath(); - } - else - return wxGetEmptyString(); -} - 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) { wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ; - m_message = message; - m_dialogStyle = style; - m_parent = parent; - m_path = wxT(""); - m_fileName = defaultFileName; - m_dir = defaultDir; - m_wildCard = wildCard; - m_filterIndex = 0; } pascal Boolean CrossPlatformFilterCallback ( @@ -361,11 +310,27 @@ pascal Boolean CrossPlatformFilterCallback ( if (filterMode == kNavFilteringBrowserList) { NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ; - if (theItem->descriptorType == typeFSS && !theInfo->isFolder) + if ( !theInfo->isFolder ) { - FSSpec spec; - memcpy( &spec , *theItem->dataHandle , sizeof(FSSpec) ) ; - display = CheckFile( spec.name , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ; + 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 } } @@ -374,40 +339,46 @@ pascal Boolean CrossPlatformFilterCallback ( int wxFileDialog::ShowModal() { +#if TARGET_CARBON + NavDialogCreationOptions mNavOptions; + NavDialogRef navDialogRef = NULL ; +// since the same field has been renamed ... +#define dialogOptionFlags optionFlags +#else NavDialogOptions mNavOptions; +#endif NavObjectFilterUPP mNavFilterUPP = NULL; NavPreviewUPP mNavPreviewUPP = NULL ; NavReplyRecord mNavReply; AEDesc mDefaultLocation ; bool mSelectDefault = false ; - + OSStatus err = noErr ; // setup dialog - ::NavGetDefaultDialogOptions(&mNavOptions); - mNavFilterUPP = nil; mNavPreviewUPP = nil; mSelectDefault = false; - 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; - + mDefaultLocation.descriptorType = typeNull; + mDefaultLocation.dataHandle = nil; + +#if TARGET_CARBON + NavGetDefaultDialogCreationOptions( &mNavOptions ) ; + wxMacCFStringHolder cfMessage(m_message) ; + wxMacCFStringHolder cfFileName(m_fileName) ; + mNavOptions.saveFileName = cfFileName ; + mNavOptions.message = cfMessage ; +#else + 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 ) ; - OSErr err = noErr ; - mDefaultLocation.descriptorType = typeNull; - mDefaultLocation.dataHandle = nil; - err = ::AECreateDesc(typeFSS, &location, sizeof(FSSpec), &mDefaultLocation ); if ( mDefaultLocation.dataHandle ) { @@ -418,9 +389,19 @@ int wxFileDialog::ShowModal() mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation; } } - wxMacStringToPascal( m_message , (StringPtr)mNavOptions.message ) ; - wxMacStringToPascal( m_fileName , (StringPtr)mNavOptions.savedFileName ) ; +#endif + 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 ; @@ -433,15 +414,27 @@ int wxFileDialog::ShowModal() 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 ) { @@ -450,6 +443,19 @@ int wxFileDialog::ShowModal() 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, @@ -458,6 +464,7 @@ int wxFileDialog::ShowModal() NULL, kNavGenericSignature, &myData); // User Data +#endif m_filterIndex = myData.currentfilter ; } else @@ -470,6 +477,19 @@ int wxFileDialog::ShowModal() 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, @@ -479,6 +499,7 @@ int wxFileDialog::ShowModal() mNavFilterUPP, NULL , &myData); +#endif m_filterIndex = myData.currentfilter ; } @@ -512,6 +533,13 @@ int wxFileDialog::ShowModal() ::AEDisposeDesc(&specDesc); } m_path = wxMacFSSpec2MacFilename( &outFileSpec ) ; +#if TARGET_CARBON + if ( m_dialogStyle & wxSAVE ) + { + wxMacCFStringHolder cfString = NavDialogGetSaveFileName( navDialogRef ) ; + m_path += wxFILE_SEP_PATH + cfString.AsString() ; + } +#endif m_paths.Add( m_path ) ; m_fileName = wxFileNameFromPath(m_path); m_fileNames.Add(m_fileName); @@ -521,45 +549,16 @@ int wxFileDialog::ShowModal() m_fileName = wxFileNameFromPath(m_path); m_dir = wxPathOnly(m_path); NavDisposeReply( &mNavReply ) ; +#if TARGET_CARBON + if ( navDialogRef ) + NavDialogDispose( navDialogRef ) ; +#endif return wxID_OK ; } +#if TARGET_CARBON + if ( navDialogRef ) + NavDialogDispose( navDialogRef ) ; +#endif return wxID_CANCEL; } -// Generic file load/save dialog -static wxString -wxDefaultFileSelector(bool load, const wxChar *what, const wxChar *extension, const wxChar *default_name, wxWindow *parent) -{ - wxString prompt; - - wxString str; - if (load) - str = wxT("Load %s file"); - else - str = wxT("Save %s file"); - prompt.Printf( wxGetTranslation(str), what); - - const wxChar *ext = extension; - if (*ext == wxT('.')) - ext++; - - wxString wild; - wild.Printf(wxT("*.%s"), ext); - - return wxFileSelector (prompt, NULL, default_name, ext, wild, 0, parent); -} - -// Generic file load dialog -wxString -wxLoadFileSelector(const wxChar *what, const wxChar *extension, const wxChar *default_name, wxWindow *parent) -{ - return wxDefaultFileSelector(TRUE, what, extension, default_name, parent); -} - - -// Generic file save dialog -wxString -wxSaveFileSelector(const wxChar *what, const wxChar *extension, const wxChar *default_name, wxWindow *parent) -{ - return wxDefaultFileSelector(FALSE, what, extension, default_name, parent); -}