]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dirdlg.cpp
applied patch 923858 (fixes crash in zlib streams)
[wxWidgets.git] / src / mac / carbon / dirdlg.cpp
index 095621b978ebe12a862622298ae8d5f1f48db38d..0b4c7df19566e52d9da444682f494bada976329b 100644 (file)
@@ -1,12 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        dirdlg.cpp
 // Purpose:     wxDirDialog
-// Author:      AUTHOR
+// Author:      Stefan Csomor
 // Modified by:
-// Created:     ??/??/98
+// Created:     1998-01-01
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) Stefan Csomor
+// Licence:       wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 
 #include "wx/cmndata.h"
 
+#include "wx/mac/private.h"
+
+#ifdef __DARWIN__
+  #include <Carbon/Carbon.h>
+#else
+  #include <Navigation.h>
+#endif
+
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_CLASS(wxDirDialog, wxDialog)
 #endif
 
-wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
-        const wxString& defaultPath,
-        long style, const wxPoint& pos)
+wxDirDialog::wxDirDialog(wxWindow *parent,
+                         const wxString& message,
+                         const wxString& defaultPath,
+                         long 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_dialogStyle = style;
     m_parent = parent;
-       m_path = defaultPath;
+    m_path = defaultPath;
 }
 
 int wxDirDialog::ShowModal()
 {
-    // TODO
-       return wxID_CANCEL;
+    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;
+        }
+    }
+    
+    OSErr err = ::NavChooseFolder(
+                        mDefaultLocation,
+                        &mNavReply,
+                        &mNavOptions,
+                        NULL,
+                        mNavFilterUPP,
+                        0L);                            // User Data
+    
+    if ( (err != noErr) && (err != userCanceledErr) ) {
+        m_path = wxT("") ;
+        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 = wxT("") ;
+            return wxID_CANCEL ;
+        }            
+        folderInfo = **(FSSpec**) specDesc.dataHandle;
+        if (specDesc.dataHandle != nil) {
+            ::AEDisposeDesc(&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 = wxT("")  ;
+            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 ;
+    }
+    return wxID_CANCEL;
 }