X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/daf3246330c8ae7b4536cd1f6deef733a405cecd..09d350c0bc105653e7cd59a8290684a3c4e70d7e:/src/generic/dirctrlg.cpp diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index 32c1cdc692..ab912cea50 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -85,11 +85,7 @@ #endif // __OS2__ #if defined(__WXMAC__) -# ifdef __DARWIN__ -# include "MoreFilesX.h" -# else -# include "MoreFilesExtras.h" -# endif +# include "MoreFilesX.h" #endif #ifdef __BORLANDC__ @@ -113,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); @@ -202,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); + volumeIndex++ ; } - ::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); - } -#endif // __DARWIN__ #elif defined(__UNIX__) paths.Add(wxT("/")); @@ -291,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(); } @@ -323,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) @@ -355,6 +303,7 @@ int setdrive(int drive) bool wxIsDriveAvailable(const wxString& dirName) { #ifdef __WXWINCE__ + wxUnusedVar(dirName); return false; #else #ifdef __WIN32__ @@ -403,9 +352,9 @@ bool wxIsDriveAvailable(const wxString& dirName) // 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); } //----------------------------------------------------------------------------- @@ -426,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; @@ -438,7 +383,7 @@ void wxDirItemData::SetNewDirName(const wxString& path) bool wxDirItemData::HasSubDirs() const { - if (m_path.IsEmpty()) + if (m_path.empty()) return false; wxDir dir; @@ -453,7 +398,7 @@ bool wxDirItemData::HasSubDirs() const bool wxDirItemData::HasFiles(const wxString& WXUNUSED(spec)) const { - if (m_path.IsEmpty()) + if (m_path.empty()) return false; wxDir dir; @@ -560,6 +505,10 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, long treeStyle = wxTR_HAS_BUTTONS | wxTR_HIDE_ROOT; +#ifdef __WXGTK20__ + treeStyle |= wxTR_NO_LINES; +#endif + if (style & wxDIRCTRL_EDIT_LABELS) treeStyle |= wxTR_EDIT_LABELS; @@ -574,10 +523,10 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, else filterStyle |= wxBORDER_SUNKEN; - m_treeCtrl = new wxTreeCtrl(this, wxID_TREECTRL, + m_treeCtrl = CreateTreeCtrl(this, wxID_TREECTRL, wxPoint(0,0), GetClientSize(), treeStyle); - if (!filter.IsEmpty() && (style & wxDIRCTRL_SHOW_FILTERS)) + if (!filter.empty() && (style & wxDIRCTRL_SHOW_FILTERS)) m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL, wxDefaultPosition, wxDefaultSize, filterStyle); m_defaultPath = dir; @@ -606,8 +555,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(); @@ -628,6 +588,11 @@ void wxGenericDirCtrl::Init() m_filterListCtrl = NULL; } +wxTreeCtrl* wxGenericDirCtrl::CreateTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long treeStyle) +{ + return new wxTreeCtrl(parent, id, pos, size, treeStyle); +} + void wxGenericDirCtrl::ShowHidden( bool show ) { m_showHidden = show; @@ -656,10 +621,15 @@ void wxGenericDirCtrl::SetupSections() size_t n, count = wxGetAvailableDrives(paths, names, icons); +#ifdef __WXGTK20__ + wxString home = wxGetHomeDir(); + AddSection( home, _("Home directory"), 1); + home += wxT("/Desktop"); + AddSection( home, _("Desktop"), 1); +#endif + for (n = 0; n < count; n++) - { AddSection(paths[n], names[n], icons[n]); - } } void wxGenericDirCtrl::OnBeginEditItem(wxTreeEvent &event) @@ -681,7 +651,7 @@ void wxGenericDirCtrl::OnBeginEditItem(wxTreeEvent &event) void wxGenericDirCtrl::OnEndEditItem(wxTreeEvent &event) { - if ((event.GetLabel().IsEmpty()) || + if ((event.GetLabel().empty()) || (event.GetLabel() == _(".")) || (event.GetLabel() == _("..")) || (event.GetLabel().Find(wxT('/')) != wxNOT_FOUND) || @@ -944,7 +914,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& { wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId); - if (data && !data->m_path.IsEmpty()) + if (data && !data->m_path.empty()) { wxString childPath(data->m_path); if (!wxEndsWithPathSeparator(childPath)) @@ -1172,15 +1142,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(); @@ -1266,7 +1236,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt { Clear(); wxArrayString descriptions, filters; - size_t n = (size_t) wxParseCommonDialogsFilter(filter, filters, descriptions); + size_t n = (size_t) wxParseCommonDialogsFilter(filter, descriptions, filters); if (n > 0 && defaultFilter < (int) n) { @@ -1283,35 +1253,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt // wxFileIconsTable icons // ---------------------------------------------------------------------------- -/* Open folder */ -static const char * file_icons_tbl_folder_open_xpm[] = { -/* width height ncolors chars_per_pixel */ -"16 16 6 1", -/* colors */ -" s None c None", -". c #000000", -"+ c #c0c0c0", -"@ c #808080", -"# c #ffff00", -"$ c #ffffff", -/* pixels */ -" ", -" @@@@@ ", -" @$$$$$@ ", -" @$#+#+#$@@@@@@ ", -" @$+#+#+$$$$$$@.", -" @$#+#+#+#+#+#@.", -"@@@@@@@@@@@@@#@.", -"@$$$$$$$$$$@@+@.", -"@$#+#+#+#+##.@@.", -" @$#+#+#+#+#+.@.", -" @$+#+#+#+#+#.@.", -" @$+#+#+#+##@..", -" @@@@@@@@@@@@@.", -" .............", -" ", -" "}; - +#ifndef __WXGTK24__ /* Computer */ static const char * file_icons_tbl_computer_xpm[] = { "16 16 7 1", @@ -1338,117 +1280,7 @@ static const char * file_icons_tbl_computer_xpm[] = { " .oXoXoXoXoXo.o ", ".XOXXXXXXXXX.o ", "............o "}; - -/* Drive */ -static const char * file_icons_tbl_drive_xpm[] = { -"16 16 7 1", -" s None c None", -". c #808080", -"X c #c0c0c0", -"o c Black", -"O c Gray100", -"+ c Green", -"@ c #008000", -" ", -" ", -" ", -" ", -" ............. ", -" .XXXXXXXXXXXX.o", -".OOOOOOOOOOOO..o", -".XXXXXXXXX+@X..o", -".XXXXXXXXXXXX..o", -".X..........X..o", -".XOOOOOOOOOOX..o", -"..............o ", -" ooooooooooooo ", -" ", -" ", -" "}; - -/* CD-ROM */ -static const char *file_icons_tbl_cdrom_xpm[] = { -"16 16 10 1", -" s None c None", -". c #808080", -"X c #c0c0c0", -"o c Yellow", -"O c Blue", -"+ c Black", -"@ c Gray100", -"# c #008080", -"$ c Green", -"% c #008000", -" ... ", -" ..XoX.. ", -" .O.XoXXX+ ", -" ...O.oXXXX+ ", -" .O..X.XXXX+ ", -" ....X.+..XXX+", -" .XXX.+@+.XXX+", -" .X@XX.+.X@@X+", -" .....X...#XX@+ ", -".@@@...XXo.O@X+ ", -".@XXX..XXoXOO+ ", -".@++++..XoX+++ ", -".@$%@@XX+++X.+ ", -".............+ ", -" ++++++++++++ ", -" "}; - -/* Floppy */ -static const char * file_icons_tbl_floppy_xpm[] = { -"16 16 7 1", -" s None c None", -". c #808080", -"X c Gray100", -"o c #c0c0c0", -"O c Black", -"+ c Cyan", -"@ c Red", -" ......X", -" .ooooooO", -" .+++++OO", -" .++++++O", -" .++++++O", -" .ooooooO", -" .......o....oO", -" .oooooo.o.O.XoO", -".XXXXXXXXOOOOOO ", -".ooooooooo@o..O ", -".ooo....oooo..O ", -".o..OOOO...o..O ", -".oooXXXXoooo..O ", -".............O ", -" OOOOOOOOOOOO ", -" "}; - -/* Removeable */ -static const char * file_icons_tbl_removeable_xpm[] = { -"16 16 7 1", -" s None c None", -". c #808080", -"X c #c0c0c0", -"o c Black", -"O c Gray100", -"+ c Red", -"@ c #800000", -" ", -" ", -" ", -" ............. ", -" .XXXXXXXXXXXX.o", -".OOOOOOOOOOOO..o", -".OXXXXXXXXXXX..o", -".O+@.oooooo.X..o", -".OXXOooooooOX..o", -".OXXXOOOOOOXX..o", -".OXXXXXXXXXXX..o", -".O............o ", -" ooooooooooooo ", -" ", -" ", -" "}; +#endif // GTK+ < 2.4 // ---------------------------------------------------------------------------- // wxFileIconsTable & friends @@ -1509,25 +1341,48 @@ 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)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER_OPEN, + wxART_CMN_DIALOG, + wxSize(16, 16))); // computer +#ifdef __WXGTK24__ + // GTK24 uses this icon in the file open dialog + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_HARDDISK, + wxART_CMN_DIALOG, + wxSize(16, 16))); +#else m_smallImageList->Add(wxIcon(file_icons_tbl_computer_xpm)); +#endif // drive - m_smallImageList->Add(wxIcon(file_icons_tbl_drive_xpm)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_HARDDISK, + wxART_CMN_DIALOG, + wxSize(16, 16))); // cdrom - m_smallImageList->Add(wxIcon(file_icons_tbl_cdrom_xpm)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_CDROM, + wxART_CMN_DIALOG, + wxSize(16, 16))); // floppy - m_smallImageList->Add(wxIcon(file_icons_tbl_floppy_xpm)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FLOPPY, + wxART_CMN_DIALOG, + wxSize(16, 16))); // removeable - m_smallImageList->Add(wxIcon(file_icons_tbl_removeable_xpm)); + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_REMOVABLE, + wxART_CMN_DIALOG, + wxSize(16, 16))); // 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)); @@ -1590,7 +1445,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; @@ -1654,13 +1513,13 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) Create(); #if wxUSE_MIMETYPE - if (!extension.IsEmpty()) + if (!extension.empty()) { wxFileIconEntry *entry = (wxFileIconEntry*) m_HashTable->Get(extension); if (entry) return (entry -> id); } - wxFileType *ft = (mime.IsEmpty()) ? + wxFileType *ft = (mime.empty()) ? wxTheMimeTypesManager -> GetFileTypeFromExtension(extension) : wxTheMimeTypesManager -> GetFileTypeFromMimeType(mime); @@ -1671,7 +1530,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) wxLogNull logNull; if ( ft && ft->GetIcon(&iconLoc) ) { - ic = wxIcon( iconLoc.GetFileName() ); + ic = wxIcon( iconLoc ); } } @@ -1719,6 +1578,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) #else // !wxUSE_MIMETYPE + wxUnusedVar(mime); if (extension == wxT("exe")) return executable; else