// 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 <direct.h>
#include <stdlib.h>
#include <ctype.h>
#define INCL_BASE
#include <os2.h>
+#ifndef __EMX__
#include <direct.h>
+#endif
#include <stdlib.h>
#include <ctype.h>
#endif // __WXPM__
#if defined(__WXMAC__)
-# include "MoreFilesExtras.h"
+# ifdef __DARWIN__
+# include "MoreFilesX.h"
+# else
+# include "MoreFilesExtras.h"
+# endif
#endif
#ifdef __BORLANDC__
#endif
/* Closed folder */
-static char * icon1_xpm[] = {
+static const char * icon1_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 6 1",
/* colors */
" "};
/* Open folder */
-static char * icon2_xpm[] = {
+static const char * icon2_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 6 1",
/* colors */
" "};
/* File */
-static char * icon3_xpm[] = {
+static const char * icon3_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 3 1",
/* colors */
" "};
/* Computer */
-static char * icon4_xpm[] = {
+static const char * icon4_xpm[] = {
"16 16 7 1",
" s None c None",
". c #808080",
"............o "};
/* Drive */
-static char * icon5_xpm[] = {
+static const char * icon5_xpm[] = {
"16 16 7 1",
" s None c None",
". c #808080",
" "};
/* CD-ROM */
-static char *icon6_xpm[] = {
+static const char *icon6_xpm[] = {
"16 16 10 1",
" s None c None",
". c #808080",
" "};
/* Floppy */
-static char * icon7_xpm[] = {
+static const char * icon7_xpm[] = {
"16 16 7 1",
" s None c None",
". c #808080",
" "};
/* Removeable */
-static char * icon8_xpm[] = {
+static const char * icon8_xpm[] = {
"16 16 7 1",
" s None c None",
". c #808080",
" "};
-#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__) && \
#endif // !GNUWIN32
}
-static bool wxIsDriveAvailable(const wxString dirName)
+bool wxIsDriveAvailable(const wxString& dirName)
{
#ifdef __WIN32__
UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
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();
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.
{
wxString *strFirst = (wxString *)first;
wxString *strSecond = (wxString *)second;
-
+
return strFirst->CmpNoCase(*strSecond);
}
return dir.HasSubDirs();
}
-bool wxDirItemData::HasFiles(const wxString& spec) const
+bool wxDirItemData::HasFiles(const wxString& WXUNUSED(spec)) const
{
if (m_path.IsEmpty())
return FALSE;
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;
wxString rootName;
-#if defined(__WXMSW__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__WXPM__) || defined(__DOS__)
rootName = _("Computer");
#else
rootName = _("Sections");
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())
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);
void wxGenericDirCtrl::SetupSections()
{
-#if defined(__WXMSW__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__)
#ifdef __WIN32__
wxChar driveBuffer[256];
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__)
+# 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*/);
}
-#else
+# endif /* __DARWIN__ */
+#elif defined(__UNIX__)
AddSection(wxT("/"), wxT("/"), 3/*computer icon*/);
+#else
+ #error "Unsupported platform in wxGenericDirCtrl!"
#endif
}
}
// 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;
void wxGenericDirCtrl::OnCollapseItem(wxTreeEvent &event )
{
- wxTreeItemId child, parent = event.GetItem();
+ CollapseDir(event.GetItem());
+}
+
+void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId)
+{
+ wxTreeItemId child;
- wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(event.GetItem());
+ wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId);
if (!data->m_isExpanded)
return;
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);
}
}
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))
// 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
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
{
}
}
+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.
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
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
{
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);
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);
}
// 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);
}
}
-
#endif // wxUSE_DIRDLG