X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d0bc78e2bf750babe62ea4af7df1d0252293e7d8..9d5cfd0e64a2c09d957517405758de680806e674:/src/generic/dirctrlg.cpp diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index a41fdba627..b50262b473 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -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" @@ -52,7 +53,7 @@ #endif #if defined(__WXMAC__) - #include "wx/mac/private.h" // includes mac headers + #include "wx/osx/private.h" // includes mac headers #endif #ifdef __WXMSW__ @@ -86,13 +87,15 @@ #endif // __OS2__ #if defined(__WXMAC__) - #include "MoreFilesX.h" +// #include "MoreFilesX.h" #endif #ifdef __BORLANDC__ #include "dos.h" #endif +extern WXDLLEXPORT_DATA(const char) wxFileSelectorDefaultWildcardStr[]; + // If compiled under Windows, this macro can cause problems #ifdef GetFirstChild #undef GetFirstChild @@ -106,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 "\" @@ -162,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 @@ -199,25 +203,23 @@ 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__ -#elif defined(__WXMAC__) +#elif defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON ItemCount volumeIndex = 1; OSErr err = noErr ; @@ -249,7 +251,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI } } -#elif defined(__UNIX__) +#elif defined(__UNIX__) || defined(__WXPALMOS__) paths.Add(wxT("/")); names.Add(wxT("/")); icon_ids.Add(wxFileIconsTable::computer); @@ -560,8 +562,6 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, if ((style & wxDIRCTRL_3D_INTERNAL) == 0) treeStyle |= wxNO_BORDER; - else - treeStyle |= wxBORDER_SUNKEN; m_treeCtrl = CreateTreeCtrl(this, wxID_TREECTRL, wxPoint(0,0), GetClientSize(), treeStyle); @@ -664,6 +664,14 @@ void wxGenericDirCtrl::SetupSections() AddSection(paths[n], names[n], icons[n]); } +void wxGenericDirCtrl::SetFocus() +{ + // we don't need focus ourselves, give it to the tree so that the user + // could navigate it + if (m_treeCtrl) + m_treeCtrl->SetFocus(); +} + void wxGenericDirCtrl::OnBeginEditItem(wxTreeEvent &event) { // don't rename the main entry "Sections" @@ -740,6 +748,10 @@ void wxGenericDirCtrl::OnExpandItem(wxTreeEvent &event) m_rootId = m_treeCtrl->GetRootItem(); ExpandDir(parentId); + if ( m_treeCtrl->GetChildrenCount(parentId, false) == 0 ) + { + m_treeCtrl->SetItemHasChildren(parentId, false); + } } void wxGenericDirCtrl::OnCollapseItem(wxTreeEvent &event ) @@ -839,7 +851,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) dirs.Sort(wxDirCtrlStringCompareFunction); // Now do the filenames -- but only if we're allowed to - if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) + if (!HasFlag(wxDIRCTRL_DIR_ONLY)) { d.Open(dirName); @@ -886,20 +898,16 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) m_treeCtrl->SetItemImage( id, wxFileIconsTable::folder_open, wxTreeItemIcon_Expanded ); - // Has this got any children? If so, make it expandable. - // (There are two situations when a dir has children: either it - // has subdirectories or it contains files that weren't filtered - // out. The latter only applies to dirctrl with files.) - if ( dir_item->HasSubDirs() || - (((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) && - dir_item->HasFiles(m_currentFilterStr)) ) - { - m_treeCtrl->SetItemHasChildren(id); - } + // assume that it does have children by default as it can take a long + // time to really check for this (think remote drives...) + // + // and if we're wrong, we'll correct it later in OnExpandItem() if + // the user really tries to open this item + m_treeCtrl->SetItemHasChildren(id); } // Add the sorted filenames - if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) + if (!HasFlag(wxDIRCTRL_DIR_ONLY)) { for (i = 0; i < filenames.GetCount(); i++) { @@ -1014,7 +1022,7 @@ bool wxGenericDirCtrl::ExpandPath(const wxString& path) { m_treeCtrl->Expand(lastId); } - if ((GetWindowStyle() & wxDIRCTRL_SELECT_FIRST) && data->m_isDir) + if (HasFlag(wxDIRCTRL_SELECT_FIRST) && data->m_isDir) { // Find the first file in this directory wxTreeItemIdValue cookie; @@ -1328,7 +1336,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt // wxFileIconsTable icons // ---------------------------------------------------------------------------- -#ifndef __WXGTK24__ +#ifndef __WXGTK20__ /* Computer (c) Julian Smart */ static const char * file_icons_tbl_computer_xpm[] = { /* columns rows colors chars-per-pixel */ @@ -1393,14 +1401,14 @@ static const char * file_icons_tbl_computer_xpm[] = { " dfffffffffffffd", " " }; -#endif // GTK+ < 2.4 +#endif // !GTK+ 2 // ---------------------------------------------------------------------------- // wxFileIconsTable & friends // ---------------------------------------------------------------------------- // global instance of a wxFileIconsTable -wxFileIconsTable* wxTheFileIconsTable = (wxFileIconsTable *)NULL; +wxFileIconsTable* wxTheFileIconsTable = NULL; // A module to allow icons table cleanup @@ -1462,7 +1470,7 @@ void wxFileIconsTable::Create() wxART_CMN_DIALOG, wxSize(16, 16))); // computer -#ifdef __WXGTK24__ +#ifdef __WXGTK20__ // GTK24 uses this icon in the file open dialog m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_HARDDISK, wxART_CMN_DIALOG,