X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..e45080c10b11190028e843b617564caec95e82dd:/src/mac/carbon/dirdlg.cpp diff --git a/src/mac/carbon/dirdlg.cpp b/src/mac/carbon/dirdlg.cpp index 6864054234..57e384eaff 100644 --- a/src/mac/carbon/dirdlg.cpp +++ b/src/mac/carbon/dirdlg.cpp @@ -1,146 +1,145 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dirdlg.cpp +// Name: src/mac/carbon/dirdlg.cpp // Purpose: wxDirDialog // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "dirdlg.h" -#endif +#include "wx/wxprec.h" + +#if wxUSE_DIRDLG -#include "wx/defs.h" -#include "wx/utils.h" -#include "wx/dialog.h" #include "wx/dirdlg.h" -#include "wx/cmndata.h" +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/cmndata.h" +#endif // WX_PRECOMP + +#include "wx/filename.h" #include "wx/mac/private.h" #ifdef __DARWIN__ - #include + #include #else - #include + #include #endif -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxDirDialog, wxDialog) -#endif + +static pascal void NavEventProc( + NavEventCallbackMessage inSelector, + NavCBRecPtr ioParams, + NavCallBackUserData ioUserData ); + +static NavEventUPP sStandardNavEventFilter = NewNavEventUPP(NavEventProc); + +static pascal void NavEventProc( + NavEventCallbackMessage inSelector, + NavCBRecPtr ioParams, + NavCallBackUserData ioUserData ) +{ + wxDirDialog * data = ( wxDirDialog *) ioUserData ; + if ( inSelector == kNavCBStart ) + { + if (data && !data->GetPath().empty() ) + { + // Set default location for the modern Navigation APIs + // Apple Technical Q&A 1151 + FSRef theFile; + wxMacPathToFSRef(data->GetPath(), &theFile); + AEDesc theLocation = { typeNull, NULL }; + if (noErr == ::AECreateDesc(typeFSRef, &theFile, sizeof(FSRef), &theLocation)) + ::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation); + } + } +} wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, const wxString& defaultPath, - long style, + long WXUNUSED(style), const wxPoint& WXUNUSED(pos), const wxSize& WXUNUSED(size), const wxString& WXUNUSED(name)) { - wxASSERT_MSG( NavServicesAvailable() , "Navigation Services are not running" ) ; + wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ; m_message = message; - m_dialogStyle = style; m_parent = parent; m_path = defaultPath; } int wxDirDialog::ShowModal() { - NavDialogOptions mNavOptions; - NavObjectFilterUPP mNavFilterUPP = NULL; - NavPreviewUPP mNavPreviewUPP = NULL ; - NavReplyRecord mNavReply; - AEDesc* mDefaultLocation = NULL ; - 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 - - if ( mDefaultLocation ) { - - if (mSelectDefault) { - mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation; - } else { - mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation; + NavDialogRef dialog = NULL; + NavDialogCreationOptions options; + NavReplyRecord reply ; + bool disposeReply = false ; + OSStatus err = noErr; + + err = NavGetDefaultDialogCreationOptions(&options); + options.optionFlags &= ~kNavAllowMultipleFiles; + if (err == noErr) + { + wxCFStringRef message(m_message, m_font.GetEncoding()); + options.message = message; + err = NavCreateChooseFolderDialog(&options, sStandardNavEventFilter , NULL, this , &dialog); + if (err == noErr) + { + err = NavDialogRun(dialog); + if ( err == noErr ) + { + err = NavDialogGetReply(dialog, &reply); + disposeReply = true ; + } } } - - OSErr err = ::NavChooseFolder( - mDefaultLocation, - &mNavReply, - &mNavOptions, - NULL, - mNavFilterUPP, - 0L); // User Data - - if ( (err != noErr) && (err != userCanceledErr) ) { - m_path = "" ; - return wxID_CANCEL ; - } - if (mNavReply.validRecord) { // User chose a folder - - FSSpec folderInfo; - FSSpec outFileSpec ; - AEDesc specDesc ; - - OSErr err = ::AECoerceDesc( &mNavReply.selection , typeFSS, &specDesc); - if ( err != noErr ) { - m_path = "" ; - return wxID_CANCEL ; - } - folderInfo = **(FSSpec**) specDesc.dataHandle; - if (specDesc.dataHandle != nil) { - ::AEDisposeDesc(&specDesc); - } + if ( err == noErr ) + { + if ( reply.validRecord ) + { + FSRef folderInfo; + AEDesc specDesc ; -// mNavReply.GetFileSpec(folderInfo); - - // The FSSpec from NavChooseFolder is NOT the file spec - // for the folder. The parID field is actually the DirID - // of the folder itself, not the folder's parent, and - // the name field is empty. We must call PBGetCatInfo - // to get the parent DirID and folder name - - Str255 name; - CInfoPBRec thePB; // Directory Info Parameter Block - thePB.dirInfo.ioCompletion = nil; - thePB.dirInfo.ioVRefNum = folderInfo.vRefNum; // Volume is right - thePB.dirInfo.ioDrDirID = folderInfo.parID; // Folder's DirID - thePB.dirInfo.ioNamePtr = name; - thePB.dirInfo.ioFDirIndex = -1; // Lookup using Volume and DirID - - err = ::PBGetCatInfoSync(&thePB); - if ( err != noErr ) { - m_path = "" ; - return wxID_CANCEL ; - } - // Create cannonical FSSpec - ::FSMakeFSSpec(thePB.dirInfo.ioVRefNum, thePB.dirInfo.ioDrParID, - name, &outFileSpec); - - // outFolderDirID = thePB.dirInfo.ioDrDirID; - m_path = wxMacFSSpec2MacFilename( &outFileSpec ) ; - return wxID_OK ; + OSErr err = ::AECoerceDesc( &reply.selection , typeFSRef, &specDesc); + if ( err != noErr ) + { + m_path = wxEmptyString ; + } + else + { + folderInfo = **(FSRef**) specDesc.dataHandle; + m_path = wxMacFSRefToPath( &folderInfo ) ; + if (specDesc.dataHandle != nil) + { + ::AEDisposeDesc(&specDesc); + } + } + } + else + { + err = paramErr ; // could be any error, only used for giving back wxID_CANCEL + } } - return wxID_CANCEL; + + if ( disposeReply ) + ::NavDisposeReply(&reply); + + // apparently cancelling shouldn't change m_path + if ( err != noErr && err != userCanceledErr ) + m_path = wxEmptyString ; + + if ( dialog ) + ::NavDialogDispose(dialog); + + return (err == noErr) ? wxID_OK : wxID_CANCEL ; } +#endif