]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirctrlg.cpp
use MoreFilesX instead of MoreFiles when building with Apple Developer Tools
[wxWidgets.git] / src / generic / dirctrlg.cpp
index 26940cd0b552b26cee68009a0b0e892a6d1e4153..d7ae88204d8181981d96a9a05f8df3d6e30f92a3 100644 (file)
 #endif // __WXPM__
 
 #if defined(__WXMAC__)
-#  include "MoreFilesExtras.h"
+#  ifdef __DARWIN__
+#    include "MoreFilesX.h"
+#  else
+#    include "MoreFilesExtras.h"
+#  endif
 #endif
 
 #ifdef __BORLANDC__
@@ -373,7 +377,7 @@ bool wxIsDriveAvailable(const wxString& dirName)
     bool success = TRUE;
 
     // Check if this is a root directory and if so,
-    // whether the drive is avaiable.
+    // whether the drive is available.
     if (dirName.Len() == 3 && dirName[(size_t)1] == wxT(':'))
     {
         wxString dirNameLower(dirName.Lower());
@@ -660,16 +664,81 @@ void wxGenericDirCtrl::SetupSections()
 #endif // __WIN32__/!__WIN32__
 
 #elif defined(__WXMAC__)
+#  ifdef __DARWIN__
+    FSRef     **theVolRefs;
+    ItemCount   theVolCount;
+    char        thePath[FILENAME_MAX];
+    
+    if (FSGetMountedVolumes(&theVolRefs, &theVolCount) == noErr) {
+        ItemCount index;
+        ::HLock( (Handle)theVolRefs ) ;
+        for (index = 0; index < theVolCount; ++index) {
+            // get the POSIX path associated with the FSRef
+            if ( FSRefMakePath(&((*theVolRefs)[index]),
+                                 (UInt8 *)thePath, sizeof(thePath)) != noErr ) {
+                continue;
+            }
+            // add path separator at end if necessary
+            wxString path( thePath ) ;
+            if (path.Last() != wxFILE_SEP_PATH) {
+                path += wxFILE_SEP_PATH;
+            }
+            // get Mac volume name for display
+            FSVolumeRefNum vRefNum ;
+            HFSUniStr255 volumeName ;
+            
+            if ( FSGetVRefNum(&((*theVolRefs)[index]), &vRefNum) != noErr ) {
+                continue;
+            }
+            if ( FSGetVInfo(vRefNum, &volumeName, NULL, NULL) != noErr ) {
+                continue;
+            }
+            // get C string from Unicode HFS name
+            //   see: http://developer.apple.com/carbon/tipsandtricks.html
+            CFStringRef cfstr = CFStringCreateWithCharacters( kCFAllocatorDefault, 
+                                                              volumeName.unicode,
+                                                              volumeName.length );
+            // Do something with str
+            char *cstr = NewPtr(CFStringGetLength(cfstr) + 1);
+            if (( cstr == NULL ) ||
+                !CFStringGetCString(cfstr, cstr, CFStringGetLength(cfstr) + 1, 
+                                    kCFStringEncodingMacRoman)) {
+                CFRelease( cstr );
+                continue;
+            }
+            wxString name( cstr ) ;
+            DisposePtr( cstr ) ;
+            CFRelease( cfstr );
+
+            GetVolParmsInfoBuffer volParmsInfo;
+            UInt32 actualSize;
+            if ( FSGetVolParms(vRefNum, sizeof(volParmsInfo), &volParmsInfo, &actualSize) != noErr ) {
+                continue;
+            }
+
+            if ( VolIsEjectable(&volParmsInfo) ) {
+                AddSection(path, name, 5/*cd-rom*/);
+            }
+            else {
+                AddSection(path, name, 4/*disk*/);
+            }
+        }
+        ::HUnlock( (Handle)theVolRefs ) ;
+        ::DisposeHandle( (Handle)theVolRefs ) ;
+    }
+#  else
     FSSpec volume ;
     short index = 1 ;
     while(1) {
       short actualCount = 0 ;
-      if ( OnLine( &volume , 1 , &actualCount , &index ) != noErr || actualCount == 0 )
+      if ( OnLine( &volume , 1 , &actualCount , &index ) != noErr || actualCount == 0 ) {
         break ;
-
+      }
+      
       wxString name = wxMacFSSpec2MacFilename( &volume ) ;
-      AddSection(name + wxFILE_SEP_PATH, name, 0);
+      AddSection(name + wxFILE_SEP_PATH, name, 4/*disk*/);
     }
+#  endif /* __DARWIN__ */
 #elif defined(__UNIX__)
     AddSection(wxT("/"), wxT("/"), 3/*computer icon*/);
 #else