Files
wxWidgets/src/osx/carbon/dirdlg.cpp
Stefan Csomor 1f0c8f31f4 fixing file paths after renaming
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54129 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2008-06-11 19:30:52 +00:00

146 lines
4.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// 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
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#if wxUSE_DIRDLG
#include "wx/dirdlg.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/osx/private.h"
#ifdef __DARWIN__
#include <Carbon/Carbon.h>
#else
#include <Navigation.h>
#endif
IMPLEMENT_CLASS(wxDirDialog, wxDialog)
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 WXUNUSED(style),
const wxPoint& WXUNUSED(pos),
const wxSize& WXUNUSED(size),
const wxString& WXUNUSED(name))
{
wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ;
m_message = message;
m_parent = parent;
m_path = defaultPath;
}
int wxDirDialog::ShowModal()
{
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, GetFont().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 ;
}
}
}
if ( err == noErr )
{
if ( reply.validRecord )
{
FSRef folderInfo;
AEDesc specDesc ;
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
}
}
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