]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirctrlg.cpp
adapting init sequence for different osx platforms
[wxWidgets.git] / src / generic / dirctrlg.cpp
index f75a5979885bd8bc3deec8a168b58e3b1ad989ef..ee55328f7bc2d3382807b781114f20d83576b010 100644 (file)
@@ -40,6 +40,7 @@
     #include "wx/module.h"
 #endif
 
+#include "wx/filename.h"
 #include "wx/filefn.h"
 #include "wx/imaglist.h"
 #include "wx/tokenzr.h"
@@ -108,7 +109,7 @@ bool wxIsDriveAvailable(const wxString& dirName);
 
 size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids)
 {
-#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
+#ifdef wxHAS_FILESYSTEM_VOLUMES
 
 #ifdef __WXWINCE__
     // No logical drives; return "\"
@@ -164,9 +165,10 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
         {
             if (ulDriveMap & ( 1 << i ))
             {
-                wxString path, name;
-                path.Printf(wxT("%c:\\"), 'A' + i);
-                name.Printf(wxT("%c:"), 'A' + i);
+                const wxString path = wxFileName::GetVolumeString(
+                                        'A' + i, wxPATH_GET_SEPARATOR);
+                const wxString name = wxFileName::GetVolumeString(
+                                        'A' + i, wxPATH_NO_SEPARATOR);
 
                 // Note: If _filesys is unsupported by some compilers,
                 //       we can always replace it by DosQueryFSAttach
@@ -201,20 +203,18 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
         }
     }
 #else // !__WIN32__, !__OS2__
-    int drive;
-
     /* If we can switch to the drive, it exists. */
-    for( drive = 1; drive <= 26; drive++ )
+    for ( char drive = 'A'; drive <= 'Z'; drive++ )
     {
-        wxString path, name;
-        path.Printf(wxT("%c:\\"), (char) (drive + 'a' - 1));
-        name.Printf(wxT("%c:"), (char) (drive + 'A' - 1));
+        const wxString
+            path = wxFileName::GetVolumeString(drive, wxPATH_GET_SEPARATOR);
 
         if (wxIsDriveAvailable(path))
         {
             paths.Add(path);
-            names.Add(name);
-            icon_ids.Add((drive <= 2) ? wxFileIconsTable::floppy : wxFileIconsTable::drive);
+            names.Add(wxFileName::GetVolumeString(drive, wxPATH_NO_SEPARATOR));
+            icon_ids.Add(drive <= 2 ? wxFileIconsTable::floppy
+                                    : wxFileIconsTable::drive);
         }
     }
 #endif // __WIN32__/!__WIN32__
@@ -472,6 +472,7 @@ wxBEGIN_FLAGS( wxGenericDirCtrlStyle )
     wxFLAGS_MEMBER(wxDIRCTRL_DIR_ONLY)
     wxFLAGS_MEMBER(wxDIRCTRL_3D_INTERNAL)
     wxFLAGS_MEMBER(wxDIRCTRL_SELECT_FIRST)
+    wxFLAGS_MEMBER(wxDIRCTRL_MULTIPLE)
 
 wxEND_FLAGS( wxGenericDirCtrlStyle )
 
@@ -560,6 +561,9 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
     if (style & wxDIRCTRL_EDIT_LABELS)
         treeStyle |= wxTR_EDIT_LABELS;
 
+    if (style & wxDIRCTRL_MULTIPLE)
+        treeStyle |= wxTR_MULTIPLE;
+
     if ((style & wxDIRCTRL_3D_INTERNAL) == 0)
         treeStyle |= wxNO_BORDER;
 
@@ -629,9 +633,22 @@ void wxGenericDirCtrl::ShowHidden( bool show )
 
     m_showHidden = show;
 
-    wxString path = GetPath();
-    ReCreateTree();
-    SetPath(path);
+    if ( HasFlag(wxDIRCTRL_MULTIPLE) )
+    {
+        wxArrayString paths;
+        GetPaths(paths);
+        ReCreateTree();
+        for ( unsigned n = 0; n < paths.size(); n++ )
+        {
+            ExpandPath(paths[n]);
+        }
+    }
+    else
+    {
+        wxString path = GetPath();
+        ReCreateTree();
+        SetPath(path);
+    }
 }
 
 const wxTreeItemId
@@ -1095,6 +1112,20 @@ wxString wxGenericDirCtrl::GetPath() const
         return wxEmptyString;
 }
 
+void wxGenericDirCtrl::GetPaths(wxArrayString& paths) const
+{
+    paths.clear();
+
+    wxArrayTreeItemIds items;
+    m_treeCtrl->GetSelections(items);
+    for ( unsigned n = 0; n < items.size(); n++ )
+    {
+        wxTreeItemId id = items[n];
+        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
+        paths.Add(data->m_path);
+    }
+}
+
 wxString wxGenericDirCtrl::GetFilePath() const
 {
     wxTreeItemId id = m_treeCtrl->GetSelection();
@@ -1110,6 +1141,21 @@ wxString wxGenericDirCtrl::GetFilePath() const
         return wxEmptyString;
 }
 
+void wxGenericDirCtrl::GetFilePaths(wxArrayString& paths) const
+{
+    paths.clear();
+
+    wxArrayTreeItemIds items;
+    m_treeCtrl->GetSelections(items);
+    for ( unsigned n = 0; n < items.size(); n++ )
+    {
+        wxTreeItemId id = items[n];
+        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
+        if ( !data->m_isDir )
+            paths.Add(data->m_path);
+    }
+}
+
 void wxGenericDirCtrl::SetPath(const wxString& path)
 {
     m_defaultPath = path;
@@ -1117,6 +1163,43 @@ void wxGenericDirCtrl::SetPath(const wxString& path)
         ExpandPath(path);
 }
 
+void wxGenericDirCtrl::SelectPath(const wxString& path, bool select)
+{
+    bool done = false;
+    wxTreeItemId id = FindChild(m_rootId, path, done);
+    wxTreeItemId lastId = id; // The last non-zero id
+    while ( id.IsOk() && !done )
+    {
+        id = FindChild(id, path, done);
+        if ( id.IsOk() )
+            lastId = id;
+    }
+    if ( !lastId.IsOk() )
+        return;
+
+    if ( done )
+    {
+        m_treeCtrl->SelectItem(id, select);
+    }
+}
+
+void wxGenericDirCtrl::SelectPaths(const wxArrayString& paths)
+{
+    if ( HasFlag(wxDIRCTRL_MULTIPLE) )
+    {
+        UnselectAll();
+        for ( unsigned n = 0; n < paths.size(); n++ )
+        {
+            SelectPath(paths[n]);
+        }
+    }
+}
+
+void wxGenericDirCtrl::UnselectAll()
+{
+    m_treeCtrl->UnselectAll();
+}
+
 // Not used
 #if 0
 void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames)
@@ -1408,7 +1491,7 @@ static const char * file_icons_tbl_computer_xpm[] = {
 // ----------------------------------------------------------------------------
 
 // global instance of a wxFileIconsTable
-wxFileIconsTable* wxTheFileIconsTable = (wxFileIconsTable *)NULL;
+wxFileIconsTable* wxTheFileIconsTable = NULL;
 
 // A module to allow icons table cleanup