X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ded51f2fa07a060f5212a8957db5ce356775866..5db8d758b8da4140ba727c51638a69b2700c751d:/src/generic/dirctrlg.cpp diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index b42f9d6d9e..273dd24afe 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dirctrlg.h" #endif @@ -47,6 +47,7 @@ #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" @@ -63,7 +64,9 @@ // 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(__WXWINCE__) #include +#endif #include #include #endif @@ -107,7 +110,12 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI { #if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__) -#ifdef __WIN32__ +#ifdef __WXWINCE__ + // No logical drives; return "\" + paths.Add(wxT("\\")); + names.Add(wxT("\\")); + return 1; +#elif defined(__WIN32__) wxChar driveBuffer[256]; size_t n = (size_t) GetLogicalDriveStrings(255, driveBuffer); size_t i = 0; @@ -182,7 +190,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI continue; } // add path separator at end if necessary - wxString path( thePath ) ; + wxString path( thePath , wxConvLocal) ; if (path.Last() != wxFILE_SEP_PATH) { path += wxFILE_SEP_PATH; } @@ -210,7 +218,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI CFRelease( cstr ); continue; } - wxString name( cstr ); + wxString name( cstr , wxConvLocal ); DisposePtr( cstr ); CFRelease( cfstr ); @@ -287,7 +295,9 @@ bool wxIsDriveAvailable(const wxString& dirName) int setdrive(int drive) { -#if defined(__GNUWIN32__) && \ +#ifdef __WXWINCE__ + return 0; +#elif defined(__GNUWIN32__) && \ (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) return _chdrive(drive); #else @@ -299,11 +309,7 @@ int setdrive(int drive) newdrive[1] = wxT(':'); newdrive[2] = wxT('\0'); #if defined(__WXMSW__) -#ifdef __WIN16__ - if (wxSetWorkingDirectory(newdrive)) -#else if (::SetCurrentDirectory(newdrive)) -#endif #else // VA doesn't know what LPSTR is and has its own set if (DosSetCurrentDir((PSZ)newdrive)) @@ -316,6 +322,9 @@ int setdrive(int drive) bool wxIsDriveAvailable(const wxString& dirName) { +#ifdef __WXWINCE__ + return FALSE; +#else #ifdef __WIN32__ UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); #endif @@ -345,16 +354,15 @@ bool wxIsDriveAvailable(const wxString& dirName) #endif 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. -static int LINKAGEMODE wxDirCtrlStringCompareFunction(const void *first, const void *second) +static int LINKAGEMODE wxDirCtrlStringCompareFunction(wxString* strFirst, wxString* strSecond) { - wxString *strFirst = (wxString *)first; - wxString *strSecond = (wxString *)second; - return strFirst->CmpNoCase(*strSecond); } @@ -420,7 +428,62 @@ bool wxDirItemData::HasFiles(const wxString& WXUNUSED(spec)) const // wxGenericDirCtrl //----------------------------------------------------------------------------- + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxGenericDirCtrlStyle ) + +wxBEGIN_FLAGS( wxGenericDirCtrlStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxNO_BORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxNO_FULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxDIRCTRL_DIR_ONLY) + wxFLAGS_MEMBER(wxDIRCTRL_3D_INTERNAL) + wxFLAGS_MEMBER(wxDIRCTRL_SELECT_FIRST) + wxFLAGS_MEMBER(wxDIRCTRL_SHOW_FILTERS) + +wxEND_FLAGS( wxGenericDirCtrlStyle ) + +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") ) +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxGenericDirCtrl) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_8( wxGenericDirCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , DefaultPath , + wxPoint , Position , wxSize , Size , long , WindowStyle , wxString , Filter , int , DefaultFilter ) +#else IMPLEMENT_DYNAMIC_CLASS(wxGenericDirCtrl, wxControl) +#endif BEGIN_EVENT_TABLE(wxGenericDirCtrl, wxControl) EVT_TREE_ITEM_EXPANDING (-1, wxGenericDirCtrl::OnExpandItem) @@ -459,10 +522,14 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, if ((style & wxDIRCTRL_3D_INTERNAL) == 0) treeStyle |= wxNO_BORDER; + else + treeStyle |= wxBORDER_SUNKEN; long filterStyle = 0; if ((style & wxDIRCTRL_3D_INTERNAL) == 0) filterStyle |= wxNO_BORDER; + else + filterStyle |= wxBORDER_SUNKEN; m_treeCtrl = new wxTreeCtrl(this, wxID_TREECTRL, pos, size, treeStyle); @@ -525,13 +592,16 @@ void wxGenericDirCtrl::ShowHidden( bool show ) SetPath(path); } -void wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int imageId) +const wxTreeItemId +wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int imageId) { wxDirItemData *dir_item = new wxDirItemData(path,name,TRUE); - wxTreeItemId id = m_treeCtrl->AppendItem( m_rootId, name, imageId, -1, dir_item); + wxTreeItemId id = AppendItem( m_rootId, name, imageId, -1, dir_item); m_treeCtrl->SetItemHasChildren(id); + + return id; } void wxGenericDirCtrl::SetupSections() @@ -636,7 +706,7 @@ void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId) return; data->m_isExpanded = FALSE; - long cookie; + wxTreeItemIdValue cookie; /* Workaround because DeleteChildren has disapeared (why?) and * CollapseAndReset doesn't work as advertised (deletes parent too) */ child = m_treeCtrl->GetFirstChild(parentId, cookie); @@ -714,7 +784,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) while (d.GetNext(& eachFilename)); } } - dirs.Sort((wxArrayString::CompareFunction) wxDirCtrlStringCompareFunction); + dirs.Sort(wxDirCtrlStringCompareFunction); // Now do the filenames -- but only if we're allowed to if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) @@ -737,7 +807,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) while (d.GetNext(& eachFilename)); } } - filenames.Sort((wxArrayString::CompareFunction) wxDirCtrlStringCompareFunction); + filenames.Sort(wxDirCtrlStringCompareFunction); } // Add the sorted dirs @@ -751,7 +821,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) path += eachFilename; wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,TRUE); - wxTreeItemId id = m_treeCtrl->AppendItem( parentId, eachFilename, + wxTreeItemId id = AppendItem( parentId, eachFilename, wxFileIconsTable::folder, -1, dir_item); m_treeCtrl->SetItemImage( id, wxFileIconsTable::folder_open, wxTreeItemIcon_Expanded ); @@ -783,7 +853,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) int image_id = wxFileIconsTable::file; if (eachFilename.Find(wxT('.')) != wxNOT_FOUND) image_id = wxTheFileIconsTable->GetIconID(eachFilename.AfterLast(wxT('.'))); - (void)m_treeCtrl->AppendItem( parentId, eachFilename, image_id, -1, dir_item); + (void) AppendItem( parentId, eachFilename, image_id, -1, dir_item); } } } @@ -813,7 +883,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& path2.MakeLower(); #endif - long cookie; + wxTreeItemIdValue cookie; wxTreeItemId childId = m_treeCtrl->GetFirstChild(parentId, cookie); while (childId.IsOk()) { @@ -875,7 +945,7 @@ bool wxGenericDirCtrl::ExpandPath(const wxString& path) if ((GetWindowStyle() & wxDIRCTRL_SELECT_FIRST) && data->m_isDir) { // Find the first file in this directory - long cookie; + wxTreeItemIdValue cookie; wxTreeItemId childId = m_treeCtrl->GetFirstChild(lastId, cookie); bool selectedChild = FALSE; while (childId.IsOk()) @@ -1025,41 +1095,11 @@ bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxStrin // 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" +// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg" int wxGenericDirCtrl::ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions) { - wxString str(filterStr); - - wxString description, filter; - int pos; - bool finished = FALSE; - do - { - pos = str.Find(wxT('|')); - if (pos == -1) - return 0; // Problem - description = str.Left(pos); - str = str.Mid(pos+1); - pos = str.Find(wxT('|')); - if (pos == -1) - { - filter = str; - finished = TRUE; - } - else - { - filter = str.Left(pos); - str = str.Mid(pos+1); - } - descriptions.Add(description); - filters.Add(filter); - } - while (!finished) ; - - return filters.Count(); + return wxFileDialogBase::ParseWildcard(filterStr, descriptions, filters ); } void wxGenericDirCtrl::DoResize() @@ -1098,6 +1138,26 @@ void wxGenericDirCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) DoResize(); } +wxTreeItemId wxGenericDirCtrl::AppendItem (const wxTreeItemId & parent, + const wxString & text, + int image, int selectedImage, + wxTreeItemData * data) +{ + wxTreeCtrl *treeCtrl = GetTreeCtrl (); + + wxASSERT (treeCtrl); + + if (treeCtrl) + { + return treeCtrl->AppendItem (parent, text, image, selectedImage, data); + } + else + { + return wxTreeItemId(); + } +} + + //----------------------------------------------------------------------------- // wxDirFilterListCtrl //----------------------------------------------------------------------------- @@ -1153,6 +1213,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt } } + // ---------------------------------------------------------------------------- // wxFileIconsTable icons // ---------------------------------------------------------------------------- @@ -1367,7 +1428,11 @@ wxFileIconsTable::wxFileIconsTable() wxFileIconsTable::~wxFileIconsTable() { - if (m_HashTable) delete m_HashTable; + if (m_HashTable) + { + WX_CLEAR_HASH_TABLE(*m_HashTable); + delete m_HashTable; + } if (m_smallImageList) delete m_smallImageList; } @@ -1375,11 +1440,9 @@ wxFileIconsTable::~wxFileIconsTable() void wxFileIconsTable::Create() { wxCHECK_RET(!m_smallImageList && !m_HashTable, wxT("creating icons twice")); -printf("creating \n"); fflush(stdout); m_HashTable = new wxHashTable(wxKEY_STRING); m_smallImageList = new wxImageList(16, 16); - m_HashTable->DeleteContents(TRUE); // folder: m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER, wxART_CMN_DIALOG)); // folder_open @@ -1400,6 +1463,7 @@ printf("creating \n"); fflush(stdout); if (GetIconID(wxEmptyString, _T("application/x-executable")) == file) { m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_CMN_DIALOG)); + delete m_HashTable->Get(_T("exe")); m_HashTable->Delete(_T("exe")); m_HashTable->Put(_T("exe"), new wxFileIconEntry(executable)); } @@ -1528,8 +1592,17 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) wxFileType *ft = (mime.IsEmpty()) ? wxTheMimeTypesManager -> GetFileTypeFromExtension(extension) : wxTheMimeTypesManager -> GetFileTypeFromMimeType(mime); + + wxIconLocation iconLoc; wxIcon ic; - if (ft == NULL || (!ft->GetIcon(&ic)) || (!ic.Ok())) + if ( ft && ft->GetIcon(&iconLoc) ) + { + ic = wxIcon(iconLoc); + } + + delete ft; + + if ( !ic.Ok() ) { int newid = file; m_HashTable->Put(extension, new wxFileIconEntry(newid)); @@ -1540,8 +1613,6 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) tmpBmp.CopyFromIcon(ic); wxImage img = tmpBmp.ConvertToImage(); - delete ft; - int id = m_smallImageList->GetImageCount(); if (img.GetWidth() == 16 && img.GetHeight() == 16) m_smallImageList->Add(wxBitmap(img));