X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/42dcacf02b163699d4623097c4d04980f11d9040..6f7c5199ed9bc29507d426b13db9346bf1860005:/src/generic/dirctrlg.cpp?ds=sidebyside diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index 2a2bba6bf7..09f07715ee 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -57,8 +57,7 @@ // 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(__GNUWIN32__) || (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) #include #include #include @@ -70,14 +69,20 @@ #define INCL_BASE #include +#ifndef __EMX__ #include +#endif #include #include #endif // __WXPM__ #if defined(__WXMAC__) -# include "MoreFilesExtras.h" +# ifdef __DARWIN__ +# include "MoreFilesX.h" +# else +# include "MoreFilesExtras.h" +# endif #endif #ifdef __BORLANDC__ @@ -312,13 +317,12 @@ static const char * icon8_xpm[] = { " "}; -#define wxID_TREECTRL 7000 -#define wxID_FILTERLISTCTRL 7001 - #if defined(__DOS__) -static bool wxIsDriveAvailable(const wxString dirName) +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()); @@ -329,6 +333,7 @@ static bool wxIsDriveAvailable(const wxString dirName) wxPathExists(dirNameLower)); } else +#endif return TRUE; } @@ -363,7 +368,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); @@ -371,12 +376,11 @@ static bool wxIsDriveAvailable(const wxString dirName) bool success = TRUE; // Check if this is a root directory and if so, - // whether the drive is avaiable. + // whether the drive is available. 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(__GNUWIN32__) && !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) success = wxPathExists(dirNameLower); #else int currentDrive = _getdrive(); @@ -404,7 +408,7 @@ static int LINKAGEMODE wxDirCtrlStringCompareFunction(const void *first, const v { wxString *strFirst = (wxString *)first; wxString *strSecond = (wxString *)second; - + return strFirst->CmpNoCase(*strSecond); } @@ -451,7 +455,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; @@ -502,7 +506,11 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, 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; @@ -547,7 +555,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()) @@ -575,8 +583,10 @@ void wxGenericDirCtrl::Init() void wxGenericDirCtrl::ShowHidden( bool show ) { m_showHidden = show; - - // reparse FIXME + + wxString path = GetPath(); + ReCreateTree(); + SetPath(path); } void wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int imageId) @@ -652,16 +662,81 @@ void wxGenericDirCtrl::SetupSections() #endif // __WIN32__/!__WIN32__ #elif defined(__WXMAC__) +# ifdef __DARWIN__ + FSRef **theVolRefs; + ItemCount theVolCount; + char thePath[FILENAME_MAX]; + + if (FSGetMountedVolumes(&theVolRefs, &theVolCount) == noErr) { + ItemCount index; + ::HLock( (Handle)theVolRefs ) ; + for (index = 0; index < theVolCount; ++index) { + // get the POSIX path associated with the FSRef + if ( FSRefMakePath(&((*theVolRefs)[index]), + (UInt8 *)thePath, sizeof(thePath)) != noErr ) { + continue; + } + // add path separator at end if necessary + wxString path( thePath ) ; + if (path.Last() != wxFILE_SEP_PATH) { + path += wxFILE_SEP_PATH; + } + // get Mac volume name for display + FSVolumeRefNum vRefNum ; + HFSUniStr255 volumeName ; + + if ( FSGetVRefNum(&((*theVolRefs)[index]), &vRefNum) != noErr ) { + continue; + } + if ( FSGetVInfo(vRefNum, &volumeName, NULL, NULL) != noErr ) { + continue; + } + // get C string from Unicode HFS name + // see: http://developer.apple.com/carbon/tipsandtricks.html + CFStringRef cfstr = CFStringCreateWithCharacters( kCFAllocatorDefault, + volumeName.unicode, + volumeName.length ); + // Do something with str + char *cstr = NewPtr(CFStringGetLength(cfstr) + 1); + if (( cstr == NULL ) || + !CFStringGetCString(cfstr, cstr, CFStringGetLength(cfstr) + 1, + kCFStringEncodingMacRoman)) { + CFRelease( cstr ); + continue; + } + wxString name( cstr ) ; + DisposePtr( cstr ) ; + CFRelease( cfstr ); + + GetVolParmsInfoBuffer volParmsInfo; + UInt32 actualSize; + if ( FSGetVolParms(vRefNum, sizeof(volParmsInfo), &volParmsInfo, &actualSize) != noErr ) { + continue; + } + + if ( VolIsEjectable(&volParmsInfo) ) { + AddSection(path, name, 5/*cd-rom*/); + } + else { + AddSection(path, name, 4/*disk*/); + } + } + ::HUnlock( (Handle)theVolRefs ) ; + ::DisposeHandle( (Handle)theVolRefs ) ; + } +# else FSSpec volume ; short index = 1 ; while(1) { short actualCount = 0 ; - if ( OnLine( &volume , 1 , &actualCount , &index ) != noErr || actualCount == 0 ) + if ( OnLine( &volume , 1 , &actualCount , &index ) != noErr || actualCount == 0 ) { break ; - + } + wxString name = wxMacFSSpec2MacFilename( &volume ) ; - AddSection(name + wxFILE_SEP_PATH, name, 0); + AddSection(name + wxFILE_SEP_PATH, name, 4/*disk*/); } +# endif /* __DARWIN__ */ #elif defined(__UNIX__) AddSection(wxT("/"), wxT("/"), 3/*computer icon*/); #else @@ -679,7 +754,7 @@ void wxGenericDirCtrl::OnBeginEditItem(wxTreeEvent &event) } // don't rename the individual sections - if (m_treeCtrl->GetParent( event.GetItem() ) == m_rootId) + if (m_treeCtrl->GetItemParent( event.GetItem() ) == m_rootId) { event.Veto(); return; @@ -742,9 +817,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; @@ -752,13 +832,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); } } @@ -896,6 +976,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. @@ -984,7 +1070,7 @@ bool wxGenericDirCtrl::ExpandPath(const wxString& path) { wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId); - if (data && data->m_path != "" && !data->m_isDir) + if (data && data->m_path != wxT("") && !data->m_isDir) { m_treeCtrl->SelectItem(childId); m_treeCtrl->EnsureVisible(childId); @@ -1173,6 +1259,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); } @@ -1226,8 +1320,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);