]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dirdlg.cpp
make sure we always restore the passed in cg in a paint event
[wxWidgets.git] / src / mac / carbon / dirdlg.cpp
index 686405423442d2f944726f597cb2fe81a25d904a..49ae77655e9c4356930757b1925a31db8d61628c 100644 (file)
@@ -1,36 +1,65 @@
 /////////////////////////////////////////////////////////////////////////////
-// 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 <Carbon/Carbon.h>
+    #include <Carbon/Carbon.h>
 #else
-  #include <Navigation.h>
+    #include <Navigation.h>
 #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,
@@ -40,107 +69,73 @@ wxDirDialog::wxDirDialog(wxWindow *parent,
                          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;
+    NavDialogCreationOptions options;
+    NavReplyRecord reply ;
+    bool disposeReply = false ;
+    OSStatus err = noErr;
+
+    err = NavGetDefaultDialogCreationOptions(&options);
+    if (err == noErr)
+    {
+        wxMacCFStringHolder 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 ;
+
+    return (err == noErr) ? wxID_OK : wxID_CANCEL ;
 }
 
+#endif