X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..947ea04d016852aa293291069d5c91ce4c6dde60:/src/mac/carbon/filedlg.cpp diff --git a/src/mac/carbon/filedlg.cpp b/src/mac/carbon/filedlg.cpp index ee50e2e6bd..406ce43b19 100644 --- a/src/mac/carbon/filedlg.cpp +++ b/src/mac/carbon/filedlg.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: filedlg.cpp -// Purpose: wxFileDialog +// Purpose: wxFileDialog // Author: AUTHOR // Modified by: // Created: ??/??/98 @@ -14,20 +14,69 @@ #endif #include "wx/defs.h" +#include "wx/app.h" #include "wx/utils.h" #include "wx/dialog.h" #include "wx/filedlg.h" #include "wx/intl.h" +#if !defined(__UNIX__) + #include "PLStringFuncs.h" +#endif + +#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxFileDialog, wxDialog) +#endif // begin wxmac -#include "morefile.h" -#include "moreextr.h" -#include "fullpath.h" -#include "fspcompa.h" -#include "PLStringFuncs.h" +#if defined(__UNIX__) + #include +#else + #include +#endif + +#ifndef __UNIX__ + #include "morefile.h" + #include "moreextr.h" + #include "fullpath.h" + #include "fspcompa.h" + #include "PLStringFuncs.h" +#endif + +extern bool gUseNavServices ; + +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 pascal void +NavEventProc( + NavEventCallbackMessage inSelector, + NavCBRecPtr ioParams, + NavCallBackUserData /* ioUserData */) +{ + if (inSelector == kNavCBEvent) { + // In Universal Headers 3.2, Apple changed the definition of + /* + #if UNIVERSAL_INTERFACES_VERSION >= 0x0320 // Universal Headers 3.2 + UModalAlerts::ProcessModalEvent(*(ioParams->eventData.eventDataParms.event)); + + #else + UModalAlerts::ProcessModalEvent(*(ioParams->eventData.event)); + #endif + */ + + wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event); + } +} char * gfilters[] = { @@ -43,6 +92,27 @@ OSType gfiltersmac[] = '****' } ; +// 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) +// and a copy of the "previous" file spec of the reply record +// so we can see if the selection has changed + +const int kwxMacFileTypes = 10 ; + +struct OpenUserDataRec { + StandardFileReply *sfrPtr; + FSSpec oldSelectionFSSpec; + char filter[kwxMacFileTypes][10] ; + OSType filtermactypes[kwxMacFileTypes] ; + int numfilters ; + DialogPtr theDlgPtr; +}; +typedef struct OpenUserDataRec + OpenUserDataRec, *OpenUserDataRecPtr; + +#if !TARGET_CARBON + static void wxMacSetupStandardFile(short newVRefNum, long newDirID) { enum @@ -97,25 +167,6 @@ enum { kDontUseQuotes = false }; -// 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) -// and a copy of the "previous" file spec of the reply record -// so we can see if the selection has changed - -const int kwxMacFileTypes = 10 ; - -struct OpenUserDataRec { - StandardFileReply *sfrPtr; - FSSpec oldSelectionFSSpec; - char filter[kwxMacFileTypes][10] ; - OSType filtermactypes[kwxMacFileTypes] ; - int numfilters ; - DialogPtr theDlgPtr; -}; -typedef struct OpenUserDataRec - OpenUserDataRec, *OpenUserDataRecPtr; - static void GetLabelString(StringPtr theStr, short stringNum) { GetIndString(theStr, kStrListID, stringNum); @@ -161,7 +212,7 @@ static Boolean SameFSSpec(FSSpecPtr spec1, FSSpecPtr spec2) // flashing of the button when the key is hit static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRecord *eventRec, - short *item, Ptr dataPtr) + short *item, void *dataPtr) { #pragma unused (dataPtr) @@ -185,6 +236,7 @@ static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRec return false; } +#endif !TARGET_CARBON void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR) { @@ -204,7 +256,7 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const // set initial contents of Select button to a space - CopyPStr("\p ", theSFR->sfFile.name); + memcpy( theSFR->sfFile.name , "\p " , 2 ) ; // point the user data parameter at the reply record so we can get to it later @@ -240,6 +292,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const myData.numfilters = 0 ; } // display the dialog + +#if !TARGET_CARBON dlgHookUPP = NULL ; // dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook); @@ -263,7 +317,8 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const DisposeRoutineDescriptor(dlgHookUPP); DisposeRoutineDescriptor(myModalFilterUPP); - +#else +#endif // if cancel wasn't pressed and no fatal error occurred... if (theSFR->sfGood) @@ -318,7 +373,7 @@ void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const } } -static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, Ptr dataPtr) +static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr) { Str255 filename ; OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ; @@ -443,19 +498,34 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, int wxFileDialog::ShowModal() { + #if !TARGET_CARBON + if ( !gUseNavServices ) + { if ( m_dialogStyle & wxSAVE ) { StandardFileReply reply ; Str255 prompt ; Str255 filename ; +#if TARGET_CARBON + c2pstrcpy((StringPtr)prompt, m_message) ; +#else strcpy((char *)prompt, m_message) ; c2pstr((char *)prompt ) ; - +#endif +#if TARGET_CARBON + c2pstrcpy((StringPtr)filename, m_fileName) ; +#else strcpy((char *)filename, m_fileName) ; c2pstr((char *)filename ) ; +#endif + + #if !TARGET_CARBON StandardPutFile( prompt , filename , &reply ) ; + + #else + #endif if ( reply.sfGood == false ) { m_path = "" ; @@ -473,20 +543,30 @@ int wxFileDialog::ShowModal() Str255 prompt ; Str255 path ; +#if TARGET_CARBON + c2pstrcpy((StringPtr)prompt, m_message) ; +#else strcpy((char *)prompt, m_message) ; c2pstr((char *)prompt ) ; - - strcpy((char *)path, m_path ) ; +#endif +#if TARGET_CARBON + c2pstrcpy((StringPtr)path, m_dir ) ; +#else + strcpy((char *)path, m_dir ) ; c2pstr((char *)path ) ; +#endif - FileFilterYDUPP crossPlatformFileFilterUPP; StandardFileReply reply ; + FileFilterYDUPP crossPlatformFileFilterUPP = 0 ; + #if !TARGET_CARBON crossPlatformFileFilterUPP = NewFileFilterYDProc(CrossPlatformFileFilter); + #endif ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply); - - DisposeRoutineDescriptor(crossPlatformFileFilterUPP); + #if !TARGET_CARBON + DisposeFileFilterYDUPP(crossPlatformFileFilterUPP); + #endif if ( reply.sfGood == false ) { m_path = "" ; @@ -500,6 +580,144 @@ int wxFileDialog::ShowModal() } return wxID_CANCEL; } + else +#endif + { + NavDialogOptions mNavOptions; + NavObjectFilterUPP mNavFilterUPP = NULL; + NavPreviewUPP mNavPreviewUPP = NULL ; + NavReplyRecord mNavReply; + AEDesc mDefaultLocation ; + bool mSelectDefault = false ; + + ::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; + + // Set default location, the location + // that's displayed when the dialog + // first appears + + FSSpec location ; + wxUnixFilename2FSSpec( m_dir , &location ) ; + OSErr err = noErr ; + + mDefaultLocation.descriptorType = typeNull; + mDefaultLocation.dataHandle = nil; + + err = ::AECreateDesc(typeFSS, &location, sizeof(FSSpec), &mDefaultLocation ); + + if ( mDefaultLocation.dataHandle ) { + + if (mSelectDefault) { + mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation; + } else { + mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation; + } + } + +#if TARGET_CARBON + c2pstrcpy((StringPtr)mNavOptions.message, m_message) ; +#else + strcpy((char *)mNavOptions.message, m_message) ; + c2pstr((char *)mNavOptions.message ) ; +#endif +#if TARGET_CARBON + c2pstrcpy((StringPtr)mNavOptions.savedFileName, m_fileName) ; +#else + strcpy((char *)mNavOptions.savedFileName, m_fileName) ; + c2pstr((char *)mNavOptions.savedFileName ) ; +#endif + + if ( m_dialogStyle & wxSAVE ) + { + + mNavOptions.dialogOptionFlags |= kNavNoTypePopup ; + mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ; + mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ; + + err = ::NavPutFile( + &mDefaultLocation, + &mNavReply, + &mNavOptions, + sStandardNavEventFilter , + 'TEXT', + 'TEXT', + 0L); // User Data + } + else + { + if ( m_dialogStyle & wxMULTIPLE ) + mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ; + else + mNavOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles ; + + err = ::NavGetFile( + &mDefaultLocation, + &mNavReply, + &mNavOptions, + sStandardNavEventFilter , + mNavPreviewUPP, + mNavFilterUPP, + 0L /*inFileTypes.TypeListHandle() */, + 0L); // User Data + } + + if ( mDefaultLocation.dataHandle != nil ) + { + ::AEDisposeDesc(&mDefaultLocation); + } + + if ( (err != noErr) && (err != userCanceledErr) ) { + m_path = "" ; + return wxID_CANCEL ; + } + + if (mNavReply.validRecord) { + + FSSpec outFileSpec ; + AEDesc specDesc ; + + long count ; + ::AECountItems( &mNavReply.selection , &count ) ; + for ( long i = 1 ; i <= count ; ++i ) + { + OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, NULL , &specDesc); + if ( err != noErr ) { + m_path = "" ; + return wxID_CANCEL ; + } + outFileSpec = **(FSSpec**) specDesc.dataHandle; + if (specDesc.dataHandle != nil) { + ::AEDisposeDesc(&specDesc); + } + + + // outFolderDirID = thePB.dirInfo.ioDrDirID; + m_path = wxMacFSSpec2UnixFilename( &outFileSpec ) ; + m_paths.Add( 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); + + return wxID_OK ; + } + return wxID_CANCEL; + } +} // Generic file load/save dialog static wxString