]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirctrlg.cpp
don't dereference NULL parent in wxMDIChildFrame dtor if it hadn't been really created
[wxWidgets.git] / src / generic / dirctrlg.cpp
index cf1e8c5e11e704b8d7e77798d79e471ecd5bd106..34d7a5054b6b0c84d86fdae75ba73900d5d69331 100644 (file)
@@ -37,9 +37,9 @@
     #include "wx/textdlg.h"
     #include "wx/gdicmn.h"
     #include "wx/image.h"
+    #include "wx/module.h"
 #endif
 
-#include "wx/module.h"
 #include "wx/filefn.h"
 #include "wx/imaglist.h"
 #include "wx/tokenzr.h"
@@ -58,6 +58,7 @@
 #ifdef __WXMSW__
 #include <windows.h>
 #include "wx/msw/winundef.h"
+#include "wx/volume.h"
 
 // FIXME - Mingw32 1.0 has both _getdrive() and _chdrive(). For now, let's assume
 //         older releases don't, but it should be verified and the checks modified
@@ -82,7 +83,6 @@
         #include <stdlib.h>
         #include <ctype.h>
     #endif
-    extern bool wxIsDriveAvailable(const wxString& dirName);
 #endif // __OS2__
 
 #if defined(__WXMAC__)
@@ -98,6 +98,8 @@
 #undef GetFirstChild
 #endif
 
+bool wxIsDriveAvailable(const wxString& dirName);
+
 // ----------------------------------------------------------------------------
 // wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/")
 // ----------------------------------------------------------------------------
@@ -111,48 +113,42 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
     paths.Add(wxT("\\"));
     names.Add(wxT("\\"));
     icon_ids.Add(wxFileIconsTable::computer);
-#elif defined(__WIN32__)
-    wxChar driveBuffer[256];
-    size_t n = (size_t) GetLogicalDriveStrings(255, driveBuffer);
-    size_t i = 0;
-    while (i < n)
-    {
-        wxString path, name;
-        path.Printf(wxT("%c:\\"), driveBuffer[i]);
-        name.Printf(wxT("%c:"), driveBuffer[i]);
-
-        // Do not use GetVolumeInformation to further decorate the
-        // name, since it can cause severe delays on network drives.
+#elif defined(__WIN32__) && wxUSE_FSVOLUME
+    // TODO: this code (using wxFSVolumeBase) should be used for all platforms
+    //       but unfortunately wxFSVolumeBase is not implemented everywhere
+    const wxArrayString as = wxFSVolumeBase::GetVolumes();
 
+    for (size_t i = 0; i < as.GetCount(); i++)
+    {
+        wxString path = as[i];
+        wxFSVolume vol(path);
         int imageId;
-        int driveType = ::GetDriveType(path);
-        switch (driveType)
+        switch (vol.GetKind())
         {
-            case DRIVE_REMOVABLE:
-                if (path == wxT("a:\\") || path == wxT("b:\\"))
+            case wxFS_VOL_FLOPPY:
+                if ( (path == wxT("a:\\")) || (path == wxT("b:\\")) )
                     imageId = wxFileIconsTable::floppy;
                 else
                     imageId = wxFileIconsTable::removeable;
                 break;
-            case DRIVE_CDROM:
+            case wxFS_VOL_DVDROM:
+            case wxFS_VOL_CDROM:
                 imageId = wxFileIconsTable::cdrom;
                 break;
-            case DRIVE_REMOTE:
-            case DRIVE_FIXED:
+            case wxFS_VOL_NETWORK:
+                if (path[0] == wxT('\\'))
+                    continue; // skip "\\computer\folder"
+                imageId = wxFileIconsTable::drive;
+                break;
+            case wxFS_VOL_DISK:
+            case wxFS_VOL_OTHER:
             default:
                 imageId = wxFileIconsTable::drive;
                 break;
         }
-
         paths.Add(path);
-        names.Add(name);
+        names.Add(vol.GetDisplayName());
         icon_ids.Add(imageId);
-
-        while (driveBuffer[i] != wxT('\0'))
-            i ++;
-        i ++;
-        if (driveBuffer[i] == wxT('\0'))
-            break;
     }
 #elif defined(__OS2__)
     APIRET rc;
@@ -544,6 +540,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
         return false;
 
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
+    SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
 
     Init();
 
@@ -612,7 +609,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
 
     ExpandRoot();
 
-    SetBestSize(size);
+    SetInitialSize(size);
     DoResize();
 
     return true;
@@ -638,6 +635,9 @@ wxTreeCtrl* wxGenericDirCtrl::CreateTreeCtrl(wxWindow *parent, wxWindowID id, co
 
 void wxGenericDirCtrl::ShowHidden( bool show )
 {
+    if ( m_showHidden == show )
+        return;
+
     m_showHidden = show;
 
     wxString path = GetPath();
@@ -698,8 +698,8 @@ void wxGenericDirCtrl::OnEndEditItem(wxTreeEvent &event)
         return;
 
     if ((event.GetLabel().empty()) ||
-        (event.GetLabel() == _(".")) ||
-        (event.GetLabel() == _("..")) ||
+        (event.GetLabel() == wxT(".")) ||
+        (event.GetLabel() == wxT("..")) ||
         (event.GetLabel().Find(wxT('/')) != wxNOT_FOUND) ||
         (event.GetLabel().Find(wxT('\\')) != wxNOT_FOUND) ||
         (event.GetLabel().Find(wxT('|')) != wxNOT_FOUND))
@@ -883,7 +883,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
 
     // Add the sorted dirs
     size_t i;
-    for (i = 0; i < dirs.Count(); i++)
+    for (i = 0; i < dirs.GetCount(); i++)
     {
         eachFilename = dirs[i];
         path = dirName;
@@ -912,7 +912,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
     // Add the sorted filenames
     if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0)
     {
-        for (i = 0; i < filenames.Count(); i++)
+        for (i = 0; i < filenames.GetCount(); i++)
         {
             eachFilename = filenames[i];
             path = dirName;
@@ -1208,15 +1208,6 @@ bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxStrin
     return false;
 }
 
-#if WXWIN_COMPATIBILITY_2_4
-// Parses the global filter, returning the number of filters.
-// Returns 0 if none or if there's a problem.
-// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg"
-int wxGenericDirCtrl::ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions)
-{
-    return wxParseCommonDialogsFilter(filterStr, descriptions, filters );
-}
-#endif // WXWIN_COMPATIBILITY_2_4
 
 void wxGenericDirCtrl::DoResize()
 {