X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eae4425db65fd3399aecdc70a8a05cc4f82d1eec..f938940e0935f835ccf38c242ad1469aeb800048:/src/generic/dirctrlg.cpp diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index ad330b9af6..91c38afb43 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -47,7 +47,6 @@ #include "wx/mimetype.h" #include "wx/image.h" #include "wx/choice.h" -#include "wx/filedlg.h" // for wxFileDialogBase::ParseWildcard #if wxUSE_STATLINE #include "wx/statline.h" @@ -73,17 +72,18 @@ #endif -#ifdef __WXPM__ - -#define INCL_BASE -#include -#ifndef __EMX__ -#include -#endif -#include -#include -extern bool wxIsDriveAvailable(const wxString& dirName); -#endif // __WXPM__ +#if defined(__OS2__) || defined(__DOS__) + #ifdef __OS2__ + #define INCL_BASE + #include + #ifndef __EMX__ + #include + #endif + #include + #include + #endif + extern bool wxIsDriveAvailable(const wxString& dirName); +#endif // __OS2__ #if defined(__WXMAC__) # ifdef __DARWIN__ @@ -103,12 +103,12 @@ extern bool wxIsDriveAvailable(const wxString& dirName); #endif // ---------------------------------------------------------------------------- -// wxGetAvailableDrives, for WINDOWS, DOS, WXPM, MAC, UNIX (returns "/") +// wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/") // ---------------------------------------------------------------------------- size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids) { -#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) #ifdef __WXWINCE__ // No logical drives; return "\" @@ -155,7 +155,34 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI if (driveBuffer[i] == wxT('\0')) break; } -#else // !__WIN32__ +#elif defined(__OS2__) + APIRET rc; + ULONG ulDriveNum = 0; + ULONG ulDriveMap = 0; + rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap); + if ( rc == 0){ + size_t i = 0; + while (i < 26) + { + if (ulDriveMap & ( 1 << i )) + { + wxString path, name; + path.Printf(wxT("%c:\\"), 'A' + i); + name.Printf(wxT("%c:"), 'A' + i); + + int imageId; + if (path == wxT("A:\\") || path == wxT("B:\\")) + imageId = wxFileIconsTable::floppy; + else + imageId = wxFileIconsTable::drive; + paths.Add(path); + names.Add(name); + icon_ids.Add(imageId); + } + i ++; + } + } +#else // !__WIN32__, !__OS2__ int drive; /* If we can switch to the drive, it exists. */ @@ -291,7 +318,7 @@ bool wxIsDriveAvailable(const wxString& dirName) return TRUE; } -#elif defined(__WINDOWS__) || defined(__WXPM__) +#elif defined(__WINDOWS__) || defined(__OS2__) int setdrive(int drive) { @@ -301,18 +328,23 @@ int setdrive(int drive) (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) return _chdrive(drive); #else - wxChar newdrive[3]; + wxChar newdrive[4]; if (drive < 1 || drive > 31) return -1; newdrive[0] = (wxChar)(wxT('A') + drive - 1); newdrive[1] = wxT(':'); +#ifdef __OS2__ + newdrive[2] = wxT('\\'); + newdrive[3] = wxT('\0'); +#else newdrive[2] = wxT('\0'); +#endif #if defined(__WXMSW__) if (::SetCurrentDirectory(newdrive)) #else // VA doesn't know what LPSTR is and has its own set - if (DosSetCurrentDir((PSZ)newdrive)) + if (!DosSetCurrentDir((PSZ)newdrive)) #endif return 0; else @@ -338,6 +370,11 @@ bool wxIsDriveAvailable(const wxString& dirName) #if defined(__GNUWIN32__) && !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) success = wxPathExists(dirNameLower); #else + #if defined(__OS2__) + // Avoid changing to drive since no media may be inserted. + if (dirNameLower[(size_t)0] == 'a' || dirNameLower[(size_t)0] == 'b') + return success; + #endif int currentDrive = _getdrive(); int thisDrive = (int) (dirNameLower[(size_t)0] - 'a' + 1) ; int err = setdrive( thisDrive ) ; @@ -356,7 +393,7 @@ bool wxIsDriveAvailable(const wxString& dirName) return success; #endif } -#endif // __WINDOWS__ || __WXPM__ +#endif // __WINDOWS__ || __OS2__ // Function which is called by quick sort. We want to override the default wxArrayString behaviour, @@ -471,9 +508,10 @@ IMPLEMENT_DYNAMIC_CLASS_XTI(wxGenericDirCtrl, wxControl,"wx/dirctrl.h") wxBEGIN_PROPERTIES_TABLE(wxGenericDirCtrl) wxHIDE_PROPERTY( Children ) - wxPROPERTY( DefaultPath , wxString , SetDefaultPath , GetDefaultPath , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY( Filter , wxString , SetFilter , GetFilter ,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) - wxPROPERTY( DefaultFilter , int , SetFilterIndex, GetFilterIndex,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY( DefaultPath , wxString , SetDefaultPath , GetDefaultPath , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Filter , wxString , SetFilter , GetFilter , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY( DefaultFilter , int , SetFilterIndex, GetFilterIndex, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY_FLAGS( WindowStyle, wxGenericDirCtrlStyle, long, SetWindowStyleFlag, GetWindowStyleFlag, EMPTY_MACROVALUE , 0, wxT("Helpstring"), wxT("group") ) wxEND_PROPERTIES_TABLE() wxBEGIN_HANDLERS_TABLE(wxGenericDirCtrl) @@ -486,10 +524,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxGenericDirCtrl, wxControl) #endif BEGIN_EVENT_TABLE(wxGenericDirCtrl, wxControl) - EVT_TREE_ITEM_EXPANDING (-1, wxGenericDirCtrl::OnExpandItem) - EVT_TREE_ITEM_COLLAPSED (-1, wxGenericDirCtrl::OnCollapseItem) - EVT_TREE_BEGIN_LABEL_EDIT (-1, wxGenericDirCtrl::OnBeginEditItem) - EVT_TREE_END_LABEL_EDIT (-1, wxGenericDirCtrl::OnEndEditItem) + EVT_TREE_ITEM_EXPANDING (wxID_TREECTRL, wxGenericDirCtrl::OnExpandItem) + EVT_TREE_ITEM_COLLAPSED (wxID_TREECTRL, wxGenericDirCtrl::OnCollapseItem) + EVT_TREE_BEGIN_LABEL_EDIT (wxID_TREECTRL, wxGenericDirCtrl::OnBeginEditItem) + EVT_TREE_END_LABEL_EDIT (wxID_TREECTRL, wxGenericDirCtrl::OnEndEditItem) EVT_SIZE (wxGenericDirCtrl::OnSize) END_EVENT_TABLE() @@ -551,7 +589,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, wxString rootName; -#if defined(__WINDOWS__) || defined(__WXPM__) || defined(__DOS__) +#if defined(__WINDOWS__) || defined(__OS2__) || defined(__DOS__) rootName = _("Computer"); #else rootName = _("Sections"); @@ -565,6 +603,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, if (!m_defaultPath.IsEmpty()) ExpandPath(m_defaultPath); + SetBestSize(size); DoResize(); return TRUE; @@ -740,7 +779,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) wxString dirName(data->m_path); -#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) // Check if this is a root directory and if so, // whether the drive is avaiable. if (!wxIsDriveAvailable(dirName)) @@ -754,7 +793,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) // This may take a longish time. Go to busy cursor wxBusyCursor busy; -#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) if (dirName.Last() == ':') dirName += wxString(wxFILE_SEP_PATH); #endif @@ -781,7 +820,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) dirs.Add(eachFilename); } } - while (d.GetNext(& eachFilename)); + while (d.GetNext(&eachFilename)); } } dirs.Sort(wxDirCtrlStringCompareFunction); @@ -795,16 +834,26 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) if (d.IsOpened()) { - if (d.GetFirst(& eachFilename, m_currentFilterStr, wxDIR_FILES)) + int style = wxDIR_FILES; + if (m_showHidden) style |= wxDIR_HIDDEN; + // Process each filter (ex: "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg") + wxStringTokenizer strTok; + wxString curFilter; + strTok.SetString(m_currentFilterStr,wxT(";")); + while(strTok.HasMoreTokens()) { - do + curFilter = strTok.GetNextToken(); + if (d.GetFirst(& eachFilename, m_currentFilterStr, style)) { - if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) + do { - filenames.Add(eachFilename); + if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) + { + filenames.Add(eachFilename); + } } + while (d.GetNext(& eachFilename)); } - while (d.GetNext(& eachFilename)); } } filenames.Sort(wxDirCtrlStringCompareFunction); @@ -879,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(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) path2.MakeLower(); #endif @@ -896,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(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) childPath.MakeLower(); #endif @@ -1028,7 +1077,7 @@ void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayStri wxString dirName(data->m_path); -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WXMSW__) || defined(__OS2__) if (dirName.Last() == ':') dirName += wxString(wxFILE_SEP_PATH); #endif @@ -1082,7 +1131,7 @@ void wxGenericDirCtrl::SetFilter(const wxString& filter) bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxString& filter, wxString& description) { wxArrayString filters, descriptions; - int count = ParseFilter(filterStr, filters, descriptions); + int count = wxParseWildcard(filterStr, filters, descriptions); if (count > 0 && n < count) { filter = filters[n]; @@ -1093,14 +1142,15 @@ 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 wxFileDialogBase::ParseWildcard(filterStr, descriptions, filters ); + return wxParseWildcard(filterStr, descriptions, filters ); } +#endif // WXWIN_COMPATIBILITY_2_4 void wxGenericDirCtrl::DoResize() { @@ -1202,7 +1252,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt { Clear(); wxArrayString descriptions, filters; - size_t n = (size_t) m_dirCtrl->ParseFilter(filter, filters, descriptions); + size_t n = (size_t) wxParseWildcard(filter, filters, descriptions); if (n > 0 && defaultFilter < (int) n) { @@ -1479,13 +1529,15 @@ wxImageList *wxFileIconsTable::GetSmallImageList() return m_smallImageList; } -#if wxUSE_MIMETYPE +#if wxUSE_MIMETYPE && wxUSE_IMAGE // VS: we don't need this function w/o wxMimeTypesManager because we'll only have // one icon and we won't resize it static wxBitmap CreateAntialiasedBitmap(const wxImage& img) { - wxImage smallimg (16, 16); + const unsigned int size = 16; + + wxImage smallimg (size, size); unsigned char *p1, *p2, *ps; unsigned char mr = img.GetMaskRed(), mg = img.GetMaskGreen(), @@ -1494,12 +1546,12 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img) unsigned x, y; unsigned sr, sg, sb, smask; - p1 = img.GetData(), p2 = img.GetData() + 3 * 32, ps = smallimg.GetData(); + p1 = img.GetData(), p2 = img.GetData() + 3 * size*2, ps = smallimg.GetData(); smallimg.SetMaskColour(mr, mr, mr); - for (y = 0; y < 16; y++) + for (y = 0; y < size; y++) { - for (x = 0; x < 16; x++) + for (x = 0; x < size; x++) { sr = sg = sb = smask = 0; if (p1[0] != mr || p1[1] != mg || p1[2] != mb) @@ -1525,12 +1577,14 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img) ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2; ps += 3; } - p1 += 32 * 3, p2 += 32 * 3; + p1 += size*2 * 3, p2 += size*2 * 3; } - + return wxBitmap(smallimg); } +// This function is currently not unused anymore +#if 0 // finds empty borders and return non-empty area of image: static wxImage CutEmptyBorders(const wxImage& img) { @@ -1574,6 +1628,8 @@ static wxImage CutEmptyBorders(const wxImage& img) return img.GetSubImage(wxRect(left, top, right - left + 1, bottom - top + 1)); } +#endif // #if 0 + #endif // wxUSE_MIMETYPE int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) @@ -1594,11 +1650,15 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) wxIconLocation iconLoc; wxIcon ic; - if ( ft && ft->GetIcon(&iconLoc) ) + { - ic = wxIcon(iconLoc); + wxLogNull logNull; + if ( ft && ft->GetIcon(&iconLoc) ) + { + ic = wxIcon( iconLoc.GetFileName() ); + } } - + delete ft; if ( !ic.Ok() ) @@ -1608,20 +1668,36 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) return newid; } - wxBitmap tmpBmp; - tmpBmp.CopyFromIcon(ic); - wxImage img = tmpBmp.ConvertToImage(); + wxBitmap bmp; + bmp.CopyFromIcon(ic); + + if ( !bmp.Ok() ) + { + int newid = file; + m_HashTable->Put(extension, new wxFileIconEntry(newid)); + return newid; + } + const unsigned int size = 16; + int id = m_smallImageList->GetImageCount(); - if (img.GetWidth() == 16 && img.GetHeight() == 16) - m_smallImageList->Add(wxBitmap(img)); + if ((bmp.GetWidth() == (int) size) && (bmp.GetHeight() == (int) size)) + { + m_smallImageList->Add(bmp); + } +#if wxUSE_IMAGE else { - if (img.GetWidth() != 32 || img.GetHeight() != 32) - m_smallImageList->Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(32, 32))); + wxImage img = bmp.ConvertToImage(); + + if ((img.GetWidth() != size*2) || (img.GetHeight() != size*2)) +// m_smallImageList->Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(size*2, size*2))); + m_smallImageList->Add(CreateAntialiasedBitmap(img.Rescale(size*2, size*2))); else m_smallImageList->Add(CreateAntialiasedBitmap(img)); } +#endif // wxUSE_IMAGE + m_HashTable->Put(extension, new wxFileIconEntry(id)); return id;