X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ed2fbeb835854c97d176f8bdfd6f06a84273f5d7..3cb6eaec797ebbe20a0e05e5c9ba625909845e72:/src/generic/dirctrlg.cpp?ds=sidebyside diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index 16093c563c..8e0994cf03 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -34,18 +34,18 @@ #include "wx/textctrl.h" #include "wx/layout.h" #include "wx/sizer.h" + #include "wx/textdlg.h" + #include "wx/gdicmn.h" + #include "wx/image.h" + #include "wx/module.h" #endif -#include "wx/module.h" -#include "wx/textdlg.h" #include "wx/filefn.h" -#include "wx/gdicmn.h" #include "wx/imaglist.h" #include "wx/tokenzr.h" #include "wx/dir.h" #include "wx/artprov.h" #include "wx/mimetype.h" -#include "wx/image.h" #if wxUSE_STATLINE #include "wx/statline.h" @@ -58,6 +58,7 @@ #ifdef __WXMSW__ #include #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 #include #endif - extern bool wxIsDriveAvailable(const wxString& dirName); #endif // __OS2__ #if defined(__WXMAC__) @@ -93,11 +93,15 @@ #include "dos.h" #endif +extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorDefaultWildcardStr[]; + // If compiled under Windows, this macro can cause problems #ifdef GetFirstChild #undef GetFirstChild #endif +bool wxIsDriveAvailable(const wxString& dirName); + // ---------------------------------------------------------------------------- // wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/") // ---------------------------------------------------------------------------- @@ -111,54 +115,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]); - -#if !defined(__WXWINCE__) - wxChar pname[52]; // FIXME: why 52 and not MAX_PATH or whatever? - if ( GetVolumeInformation(path, pname, WXSIZEOF(pname), - NULL, NULL, NULL, NULL, 0) ) - { - name << _T(' ') << pname; - } -#endif // __WXWINCE__ +#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; @@ -480,7 +472,6 @@ wxBEGIN_FLAGS( wxGenericDirCtrlStyle ) wxFLAGS_MEMBER(wxDIRCTRL_DIR_ONLY) wxFLAGS_MEMBER(wxDIRCTRL_3D_INTERNAL) wxFLAGS_MEMBER(wxDIRCTRL_SELECT_FIRST) - wxFLAGS_MEMBER(wxDIRCTRL_SHOW_FILTERS) wxEND_FLAGS( wxGenericDirCtrlStyle ) @@ -550,6 +541,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, return false; SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); Init(); @@ -573,27 +565,17 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, else treeStyle |= wxBORDER_SUNKEN; - long filterStyle = 0; - if ((style & wxDIRCTRL_3D_INTERNAL) == 0) - filterStyle |= wxNO_BORDER; - else - filterStyle |= wxBORDER_SUNKEN; - m_treeCtrl = CreateTreeCtrl(this, wxID_TREECTRL, wxPoint(0,0), GetClientSize(), treeStyle); - if (!filter.empty() && (style & wxDIRCTRL_SHOW_FILTERS)) - m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL, wxDefaultPosition, wxDefaultSize, filterStyle); + if (!filter.empty()) + m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL); m_defaultPath = dir; m_filter = filter; if (m_filter.empty()) -#ifdef __UNIX__ - m_filter = wxT("*"); -#else - m_filter = wxT("*.*"); -#endif + m_filter = wxFileSelectorDefaultWildcardStr; SetFilterIndex(defaultFilter); @@ -618,7 +600,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, ExpandRoot(); - SetBestSize(size); + SetInitialSize(size); DoResize(); return true; @@ -644,6 +626,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(); @@ -704,8 +689,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)) @@ -889,7 +874,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; @@ -918,7 +903,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; @@ -1188,6 +1173,14 @@ void wxGenericDirCtrl::SetFilter(const wxString& filter) { m_filter = filter; + if (!filter.empty() && !m_filterListCtrl) + m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL); + else if (filter.empty() && m_filterListCtrl) + { + m_filterListCtrl->Destroy(); + m_filterListCtrl = NULL; + } + wxString f, d; if (ExtractWildcard(m_filter, m_currentFilter, f, d)) m_currentFilterStr = f; @@ -1197,6 +1190,10 @@ void wxGenericDirCtrl::SetFilter(const wxString& filter) #else m_currentFilterStr = wxT("*.*"); #endif + // current filter index is meaningless after filter change, set it to zero + SetFilterIndex(0); + if (m_filterListCtrl) + m_filterListCtrl->FillFilterList(m_filter, 0); } // Extract description and actual filter from overall filter string @@ -1214,15 +1211,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() { @@ -1282,12 +1270,21 @@ BEGIN_EVENT_TABLE(wxDirFilterListCtrl, wxChoice) EVT_CHOICE(wxID_ANY, wxDirFilterListCtrl::OnSelFilter) END_EVENT_TABLE() -bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent, const wxWindowID id, - const wxPoint& pos, - const wxSize& size, - long style) +bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent, + const wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) { m_dirCtrl = parent; + + // by default our border style is determined by the style of our parent + if ( !(style & wxBORDER_MASK) ) + { + style |= parent->HasFlag(wxDIRCTRL_3D_INTERNAL) ? wxBORDER_SUNKEN + : wxBORDER_NONE; + } + return wxChoice::Create(parent, id, pos, size, 0, NULL, style); }