X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca65c0440a7163e4e37e48b1c4329709d722db47..052d2fc5818243dadbc1ec54b1120e295304fc55:/src/generic/dirctrlg.cpp?ds=inline diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index 0a129d1b0a..791b3a97a0 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -20,10 +20,9 @@ #pragma hdrstop #endif -#if wxUSE_DIRDLG +#if wxUSE_DIRDLG || wxUSE_FILEDLG #include "wx/generic/dirctrlg.h" - #include "wx/module.h" #include "wx/utils.h" #include "wx/button.h" @@ -86,11 +85,7 @@ #endif // __OS2__ #if defined(__WXMAC__) -# ifdef __DARWIN__ -# include "MoreFilesX.h" -# else -# include "MoreFilesExtras.h" -# endif +# include "MoreFilesX.h" #endif #ifdef __BORLANDC__ @@ -114,7 +109,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI // No logical drives; return "\" paths.Add(wxT("\\")); names.Add(wxT("\\")); - return 1; + icon_ids.Add(wxFileIconsTable::computer); #elif defined(__WIN32__) wxChar driveBuffer[256]; size_t n = (size_t) GetLogicalDriveStrings(255, driveBuffer); @@ -203,87 +198,36 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI #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 , wxConvLocal) ; - 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)) + ItemCount volumeIndex = 1; + OSErr err = noErr ; + + while( noErr == err ) + { + HFSUniStr255 volumeName ; + FSRef fsRef ; + FSVolumeInfo volumeInfo ; + err = FSGetVolumeInfo(0, volumeIndex, NULL, kFSVolInfoFlags , &volumeInfo , &volumeName, &fsRef); + if( noErr == err ) + { + wxString path = wxMacFSRefToPath( &fsRef ) ; + wxString name = wxMacHFSUniStrToString( &volumeName ) ; + + if ( (volumeInfo.flags & kFSVolFlagSoftwareLockedMask) || (volumeInfo.flags & kFSVolFlagHardwareLockedMask) ) { - CFRelease( cstr ); - continue; + icon_ids.Add(wxFileIconsTable::cdrom); } - wxString name( cstr , wxConvLocal ); - DisposePtr( cstr ); - CFRelease( cfstr ); - - GetVolParmsInfoBuffer volParmsInfo; - UInt32 actualSize; - if ( FSGetVolParms(vRefNum, sizeof(volParmsInfo), &volParmsInfo, &actualSize) != noErr ) { - continue; + else + { + icon_ids.Add(wxFileIconsTable::drive); } - + // todo other removable + paths.Add(path); names.Add(name); - - if ( VolIsEjectable(&volParmsInfo) ) - icon_ids.Add(wxFileIconsTable::cdrom); - else - icon_ids.Add(wxFileIconsTable::drive); - } - ::HUnlock( (Handle)theVolRefs ); - ::DisposeHandle( (Handle)theVolRefs ); - } -#else // !__DARWIN__ - FSSpec volume; - short index = 1; - while(1) - { - short actualCount = 0 ; - if (OnLine(&volume, 1, &actualCount, &index ) != noErr || actualCount==0) - { - break; - } - - wxString name = wxMacFSSpec2MacFilename( &volume ); - paths.Add(name + wxFILE_SEP_PATH); - names.Add(name); - icon_ids.Add(wxFileIconsTable::drive); + volumeIndex++ ; + } } -#endif // __DARWIN__ #elif defined(__UNIX__) paths.Add(wxT("/")); @@ -292,6 +236,8 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI #else #error "Unsupported platform in wxGenericDirCtrl!" #endif + wxASSERT_MSG( (paths.GetCount() == names.GetCount()), wxT("The number of paths and their human readable names should be equal in number.")); + wxASSERT_MSG( (paths.GetCount() == icon_ids.GetCount()), wxT("Wrong number of icons for available drives.")); return paths.GetCount(); } @@ -324,6 +270,7 @@ bool wxIsDriveAvailable(const wxString& dirName) int setdrive(int drive) { #ifdef __WXWINCE__ + wxUnusedVar(drive); return 0; #elif defined(__GNUWIN32__) && \ (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) @@ -356,6 +303,7 @@ int setdrive(int drive) bool wxIsDriveAvailable(const wxString& dirName) { #ifdef __WXWINCE__ + wxUnusedVar(dirName); return false; #else #ifdef __WIN32__ @@ -396,12 +344,17 @@ bool wxIsDriveAvailable(const wxString& dirName) } #endif // __WINDOWS__ || __OS2__ +#endif // wxUSE_DIRDLG || wxUSE_FILEDLG + + + +#if wxUSE_DIRDLG // Function which is called by quick sort. We want to override the default wxArrayString behaviour, // and sort regardless of case. -static int wxCMPFUNC_CONV wxDirCtrlStringCompareFunction(wxString* strFirst, wxString* strSecond) +static int wxCMPFUNC_CONV wxDirCtrlStringCompareFunction(const wxString& strFirst, const wxString& strSecond) { - return strFirst->CmpNoCase(*strSecond); + return strFirst.CmpNoCase(strSecond); } //----------------------------------------------------------------------------- @@ -422,10 +375,6 @@ wxDirItemData::wxDirItemData(const wxString& path, const wxString& name, m_isDir = isDir; } -wxDirItemData::~wxDirItemData() -{ -} - void wxDirItemData::SetNewDirName(const wxString& path) { m_path = path; @@ -570,7 +519,8 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, else filterStyle |= wxBORDER_SUNKEN; - m_treeCtrl = new wxTreeCtrl(this, wxID_TREECTRL, pos, size, treeStyle); + m_treeCtrl = new wxTreeCtrl(this, wxID_TREECTRL, + wxPoint(0,0), GetClientSize(), treeStyle); if (!filter.IsEmpty() && (style & wxDIRCTRL_SHOW_FILTERS)) m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL, wxDefaultPosition, wxDefaultSize, filterStyle); @@ -601,8 +551,19 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, ExpandDir(m_rootId); // automatically expand first level // Expand and select the default path - if (!m_defaultPath.IsEmpty()) + if (!m_defaultPath.empty()) + { ExpandPath(m_defaultPath); + } +#ifdef __UNIX__ + else + { + // On Unix, there's only one node under the (hidden) root node. It + // represents the / path, so the user would always have to expand it; + // let's do it ourselves + ExpandPath(wxT("/")); + } +#endif SetBestSize(size); DoResize(); @@ -1132,7 +1093,7 @@ void wxGenericDirCtrl::SetFilter(const wxString& filter) bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxString& filter, wxString& description) { wxArrayString filters, descriptions; - int count = wxParseWildcard(filterStr, filters, descriptions); + int count = wxParseCommonDialogsFilter(filterStr, descriptions, filters); if (count > 0 && n < count) { filter = filters[n]; @@ -1149,7 +1110,7 @@ bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxStrin // filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg" int wxGenericDirCtrl::ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions) { - return wxParseWildcard(filterStr, descriptions, filters ); + return wxParseCommonDialogsFilter(filterStr, descriptions, filters ); } #endif // WXWIN_COMPATIBILITY_2_4 @@ -1167,15 +1128,15 @@ void wxGenericDirCtrl::DoResize() // 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(wxDefaultPosition.x, - wxDefaultPosition.y, + m_filterListCtrl->SetSize(wxDefaultCoord, + wxDefaultCoord, oldSize.x+10, - wxDefaultSize.y, + wxDefaultCoord, wxSIZE_USE_EXISTING); - m_filterListCtrl->SetSize(wxDefaultPosition.x, - wxDefaultPosition.y, + m_filterListCtrl->SetSize(wxDefaultCoord, + wxDefaultCoord, oldSize.x, - wxDefaultSize.y, + wxDefaultCoord, wxSIZE_USE_EXISTING); #endif filterSz = m_filterListCtrl->GetSize(); @@ -1261,7 +1222,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt { Clear(); wxArrayString descriptions, filters; - size_t n = (size_t) wxParseWildcard(filter, filters, descriptions); + size_t n = (size_t) wxParseCommonDialogsFilter(filter, descriptions, filters); if (n > 0 && defaultFilter < (int) n) { @@ -1270,7 +1231,9 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt SetSelection(defaultFilter); } } +#endif // wxUSE_DIRDLG +#if wxUSE_DIRDLG || wxUSE_FILEDLG // ---------------------------------------------------------------------------- // wxFileIconsTable icons @@ -1502,7 +1465,9 @@ void wxFileIconsTable::Create() m_smallImageList = new wxImageList(16, 16); // folder: - m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER, wxART_CMN_DIALOG)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER, + wxART_CMN_DIALOG, + wxSize(16, 16))); // folder_open m_smallImageList->Add(wxIcon(file_icons_tbl_folder_open_xpm)); // computer @@ -1516,11 +1481,15 @@ void wxFileIconsTable::Create() // removeable m_smallImageList->Add(wxIcon(file_icons_tbl_removeable_xpm)); // file - m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_NORMAL_FILE, wxART_CMN_DIALOG)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_NORMAL_FILE, + wxART_CMN_DIALOG, + wxSize(16, 16))); // executable if (GetIconID(wxEmptyString, _T("application/x-executable")) == file) { - m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_CMN_DIALOG)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, + wxART_CMN_DIALOG, + wxSize(16, 16))); delete m_HashTable->Get(_T("exe")); m_HashTable->Delete(_T("exe")); m_HashTable->Put(_T("exe"), new wxFileIconEntry(executable)); @@ -1583,7 +1552,11 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img) if (smask > 2) ps[0] = ps[1] = ps[2] = mr; else - ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2; + { + ps[0] = (unsigned char)(sr >> 2); + ps[1] = (unsigned char)(sg >> 2); + ps[2] = (unsigned char)(sb >> 2); + } ps += 3; } p1 += size*2 * 3, p2 += size*2 * 3; @@ -1712,6 +1685,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) #else // !wxUSE_MIMETYPE + wxUnusedVar(mime); if (extension == wxT("exe")) return executable; else @@ -1719,4 +1693,4 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) #endif // wxUSE_MIMETYPE/!wxUSE_MIMETYPE } -#endif // wxUSE_DIRDLG +#endif // wxUSE_DIRDLG || wxUSE_FILEDLG