X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/748fcded3c795db266076aac381aa335cc4aa42d..7948c0c24401c496c04da3c28f1f1f2f282ba327:/src/generic/dirctrlg.cpp?ds=sidebyside diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index e35d2487c5..0572945ee1 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -57,8 +57,8 @@ // 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 // accordingly. -#if !defined(__GNUWIN32__) || \ - (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) +#if !defined(__WXWINE__) && (!defined(__GNUWIN32__) || \ + (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1)) #include #include #include @@ -90,7 +90,7 @@ #endif /* Closed folder */ -static char * icon1_xpm[] = { +static const char * icon1_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 6 1", /* colors */ @@ -119,7 +119,7 @@ static char * icon1_xpm[] = { " "}; /* Open folder */ -static char * icon2_xpm[] = { +static const char * icon2_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 6 1", /* colors */ @@ -148,7 +148,7 @@ static char * icon2_xpm[] = { " "}; /* File */ -static char * icon3_xpm[] = { +static const char * icon3_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ @@ -174,7 +174,7 @@ static char * icon3_xpm[] = { " "}; /* Computer */ -static char * icon4_xpm[] = { +static const char * icon4_xpm[] = { "16 16 7 1", " s None c None", ". c #808080", @@ -201,7 +201,7 @@ static char * icon4_xpm[] = { "............o "}; /* Drive */ -static char * icon5_xpm[] = { +static const char * icon5_xpm[] = { "16 16 7 1", " s None c None", ". c #808080", @@ -228,7 +228,7 @@ static char * icon5_xpm[] = { " "}; /* CD-ROM */ -static char *icon6_xpm[] = { +static const char *icon6_xpm[] = { "16 16 10 1", " s None c None", ". c #808080", @@ -258,7 +258,7 @@ static char *icon6_xpm[] = { " "}; /* Floppy */ -static char * icon7_xpm[] = { +static const char * icon7_xpm[] = { "16 16 7 1", " s None c None", ". c #808080", @@ -285,7 +285,7 @@ static char * icon7_xpm[] = { " "}; /* Removeable */ -static char * icon8_xpm[] = { +static const char * icon8_xpm[] = { "16 16 7 1", " s None c None", ". c #808080", @@ -312,14 +312,28 @@ static char * icon8_xpm[] = { " "}; -#define wxID_TREECTRL 7000 -#define wxID_FILTERLISTCTRL 7001 - #if defined(__DOS__) - #ifdef __DJGPP__ - #define setdrive(drive) setdisk(drive) - #endif -#elif defined(__WXMSW__) || defined(__WXPM__) + +bool wxIsDriveAvailable(const wxString& dirName) +{ + // FIXME_MGL - this method leads to hang up under Watcom for some reason +#ifndef __WATCOMC__ + if ( dirName.Len() == 3 && dirName[1u] == wxT(':') ) + { + wxString dirNameLower(dirName.Lower()); + // VS: always return TRUE for removable media, since Win95 doesn't + // like it when MS-DOS app accesses empty floppy drive + return (dirNameLower[0u] == wxT('a') || + dirNameLower[0u] == wxT('b') || + wxPathExists(dirNameLower)); + } + else +#endif + return TRUE; +} + +#elif defined(__WINDOWS__) || defined(__WXPM__) + int setdrive(int drive) { #if defined(__GNUWIN32__) && \ @@ -349,7 +363,7 @@ int setdrive(int drive) #endif // !GNUWIN32 } -static bool wxIsDriveAvailable(const wxString dirName) +bool wxIsDriveAvailable(const wxString& dirName) { #ifdef __WIN32__ UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); @@ -361,8 +375,8 @@ static bool wxIsDriveAvailable(const wxString dirName) if (dirName.Len() == 3 && dirName[(size_t)1] == wxT(':')) { wxString dirNameLower(dirName.Lower()); -#if defined(__GNUWIN32__) && \ - !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) +#if defined(__WXWINE__) || (defined(__GNUWIN32__) && \ + !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1)) success = wxPathExists(dirNameLower); #else int currentDrive = _getdrive(); @@ -382,7 +396,7 @@ static bool wxIsDriveAvailable(const wxString dirName) return success; } -#endif +#endif // __WINDOWS__ || __WXPM__ // Function which is called by quick sort. We want to override the default wxArrayString behaviour, // and sort regardless of case. @@ -390,7 +404,7 @@ static int LINKAGEMODE wxDirCtrlStringCompareFunction(const void *first, const v { wxString *strFirst = (wxString *)first; wxString *strSecond = (wxString *)second; - + return strFirst->CmpNoCase(*strSecond); } @@ -437,7 +451,7 @@ bool wxDirItemData::HasSubDirs() const return dir.HasSubDirs(); } -bool wxDirItemData::HasFiles(const wxString& spec) const +bool wxDirItemData::HasFiles(const wxString& WXUNUSED(spec)) const { if (m_path.IsEmpty()) return FALSE; @@ -484,11 +498,15 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, if (!wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name)) return FALSE; - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); Init(); - long treeStyle = wxTR_HAS_BUTTONS | wxTR_EDIT_LABELS | wxTR_HIDE_ROOT; + long treeStyle = wxTR_HAS_BUTTONS | wxTR_HIDE_ROOT; + + if (style & wxDIRCTRL_EDIT_LABELS) + treeStyle |= wxTR_EDIT_LABELS; + if ((style & wxDIRCTRL_3D_INTERNAL) == 0) treeStyle |= wxNO_BORDER; @@ -525,7 +543,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, wxString rootName; -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__WXPM__) || defined(__DOS__) rootName = _("Computer"); #else rootName = _("Sections"); @@ -533,7 +551,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, m_rootId = m_treeCtrl->AddRoot( rootName, 3, -1, rootData); m_treeCtrl->SetItemHasChildren(m_rootId); - m_treeCtrl->Expand(m_rootId); // automatically expand first level + ExpandDir(m_rootId); // automatically expand first level // Expand and select the default path if (!m_defaultPath.IsEmpty()) @@ -558,6 +576,15 @@ void wxGenericDirCtrl::Init() m_filterListCtrl = NULL; } +void wxGenericDirCtrl::ShowHidden( bool show ) +{ + m_showHidden = show; + + wxString path = GetPath(); + ReCreateTree(); + SetPath(path); +} + void wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int imageId) { wxDirItemData *dir_item = new wxDirItemData(path,name,TRUE); @@ -569,7 +596,7 @@ void wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, in void wxGenericDirCtrl::SetupSections() { -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) #ifdef __WIN32__ wxChar driveBuffer[256]; @@ -613,24 +640,23 @@ void wxGenericDirCtrl::SetupSections() if (driveBuffer[i] == wxT('\0')) break; } -# else +#else // !__WIN32__ int drive; - int currentDrive; /* If we can switch to the drive, it exists. */ for( drive = 1; drive <= 26; drive++ ) { wxString path, name; path.Printf(wxT("%c:\\"), (char) (drive + 'a' - 1)); - name.Printf(wxT("(%c:)"), (char) (drive + 'a' - 1)); + name.Printf(wxT("(%c:)"), (char) (drive + 'A' - 1)); if (wxIsDriveAvailable(path)) { - - AddSection(path, name); + AddSection(path, name, (drive <= 2) ? 6/*floppy*/ : 4/*disk*/); } } -# endif +#endif // __WIN32__/!__WIN32__ + #elif defined(__WXMAC__) FSSpec volume ; short index = 1 ; @@ -642,8 +668,10 @@ void wxGenericDirCtrl::SetupSections() wxString name = wxMacFSSpec2MacFilename( &volume ) ; AddSection(name + wxFILE_SEP_PATH, name, 0); } -#else +#elif defined(__UNIX__) AddSection(wxT("/"), wxT("/"), 3/*computer icon*/); +#else + #error "Unsupported platform in wxGenericDirCtrl!" #endif } @@ -720,9 +748,14 @@ void wxGenericDirCtrl::OnExpandItem(wxTreeEvent &event) void wxGenericDirCtrl::OnCollapseItem(wxTreeEvent &event ) { - wxTreeItemId child, parent = event.GetItem(); + CollapseDir(event.GetItem()); +} - wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(event.GetItem()); +void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId) +{ + wxTreeItemId child; + + wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId); if (!data->m_isExpanded) return; @@ -730,13 +763,13 @@ void wxGenericDirCtrl::OnCollapseItem(wxTreeEvent &event ) long cookie; /* Workaround because DeleteChildren has disapeared (why?) and * CollapseAndReset doesn't work as advertised (deletes parent too) */ - child = m_treeCtrl->GetFirstChild(parent, cookie); + child = m_treeCtrl->GetFirstChild(parentId, cookie); while (child.IsOk()) { m_treeCtrl->Delete(child); /* Not GetNextChild below, because the cookie mechanism can't * handle disappearing children! */ - child = m_treeCtrl->GetFirstChild(parent, cookie); + child = m_treeCtrl->GetFirstChild(parentId, cookie); } } @@ -761,7 +794,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) wxString dirName(data->m_path); -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) // Check if this is a root directory and if so, // whether the drive is avaiable. if (!wxIsDriveAvailable(dirName)) @@ -775,7 +808,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) // This may take a longish time. Go to busy cursor wxBusyCursor busy; -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) if (dirName.Last() == ':') dirName += wxString(wxFILE_SEP_PATH); #endif @@ -791,7 +824,9 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) if (d.IsOpened()) { - if (d.GetFirst(& eachFilename, wxEmptyString, wxDIR_DIRS | wxDIR_HIDDEN)) + int style = wxDIR_DIRS; + if (m_showHidden) style |= wxDIR_HIDDEN; + if (d.GetFirst(& eachFilename, wxEmptyString, style)) { do { @@ -872,6 +907,12 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) } } +void wxGenericDirCtrl::ReCreateTree() +{ + CollapseDir(m_treeCtrl->GetRootItem()); + ExpandDir(m_treeCtrl->GetRootItem()); +} + // Find the child that matches the first part of 'path'. // E.g. if a child path is "/usr" and 'path' is "/usr/include" // then the child for /usr is returned. @@ -887,7 +928,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& path2 += wxString(wxFILE_SEP_PATH); // In MSW or PM, case is not significant -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) path2.MakeLower(); #endif @@ -904,7 +945,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& childPath += wxString(wxFILE_SEP_PATH); // In MSW and PM, case is not significant -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) childPath.MakeLower(); #endif @@ -1149,6 +1190,14 @@ void wxGenericDirCtrl::DoResize() wxSize filterSz ; if (m_filterListCtrl) { +#ifdef __WXMSW__ + // For some reason, this is required in order for the + // correct control height to always be returned, rather + // than the drop-down list height which is sometimes returned. + wxSize oldSize = m_filterListCtrl->GetSize(); + m_filterListCtrl->SetSize(-1, -1, oldSize.x+10, -1, wxSIZE_USE_EXISTING); + m_filterListCtrl->SetSize(-1, -1, oldSize.x, -1, wxSIZE_USE_EXISTING); +#endif filterSz = m_filterListCtrl->GetSize(); sz.y -= (filterSz.y + verticalSpacing); } @@ -1202,8 +1251,7 @@ void wxDirFilterListCtrl::OnSelFilter(wxCommandEvent& WXUNUSED(event)) // If the filter has changed, the view is out of date, so // collapse the tree. - m_dirCtrl->GetTreeCtrl()->Collapse(m_dirCtrl->GetRootId()); - m_dirCtrl->GetTreeCtrl()->Expand(m_dirCtrl->GetRootId()); + m_dirCtrl->ReCreateTree(); // Try to restore the selection, or at least the directory m_dirCtrl->ExpandPath(currentPath); @@ -1224,5 +1272,4 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt } } - #endif // wxUSE_DIRDLG