X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e7a3a5a51bdbd57aac569ee19b80bade37db3101..3b96fc2f1b64f78bba7c755a5c14f618962f696b:/src/xrc/xmlres.cpp diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index 5134702c50..37855b675c 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -8,10 +8,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "xmlres.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -84,6 +80,46 @@ wxXmlResource::~wxXmlResource() } +/* static */ +wxString wxXmlResource::ConvertFileNameToURL(const wxString& filename) +{ + wxString fnd(filename); + + // NB: as Load() and Unload() accept both filenames and URLs (should + // probably be changed to filenames only, but embedded resources + // currently rely on its ability to handle URLs - FIXME) we need to + // determine whether found name is filename and not URL and this is the + // fastest/simplest way to do it + if (wxFileName::FileExists(fnd)) + { + // Make the name absolute filename, because the app may + // change working directory later: + wxFileName fn(fnd); + if (fn.IsRelative()) + { + fn.MakeAbsolute(); + fnd = fn.GetFullPath(); + } +#if wxUSE_FILESYSTEM + fnd = wxFileSystem::FileNameToURL(fnd); +#endif + } + + return fnd; +} + +#if wxUSE_FILESYSTEM + +/* static */ +bool wxXmlResource::IsArchive(const wxString& filename) +{ + const wxString fnd = filename.Lower(); + + return fnd.Matches(wxT("*.zip")) || fnd.Matches(wxT("*.xrs")); +} + +#endif // wxUSE_FILESYSTEM + bool wxXmlResource::Load(const wxString& filemask) { wxString fnd; @@ -103,36 +139,17 @@ bool wxXmlResource::Load(const wxString& filemask) fnd = wxXmlFindFirst; else fnd = filemask; - while (!!fnd) + while (!fnd.empty()) { - // NB: Load() accepts both filenames and URLs (should probably be - // changed to filenames only, but embedded resources currently - // rely on its ability to handle URLs - FIXME). This check - // serves as a quick way to determine whether found name is - // filename and not URL: - if (wxFileName::FileExists(fnd)) - { - // Make the name absolute filename, because the app may - // change working directory later: - wxFileName fn(fnd); - if (fn.IsRelative()) - { - fn.MakeAbsolute(); - fnd = fn.GetFullPath(); - } -#if wxUSE_FILESYSTEM - fnd = wxFileSystem::FileNameToURL(fnd); -#endif - } + fnd = ConvertFileNameToURL(fnd); #if wxUSE_FILESYSTEM - if (fnd.Lower().Matches(wxT("*.zip")) || - fnd.Lower().Matches(wxT("*.xrs"))) + if ( IsArchive(fnd) ) { rt = rt && Load(fnd + wxT("#zip:*.xrc")); } - else -#endif + else // a single resource URL +#endif // wxUSE_FILESYSTEM { drec = new wxXmlResourceDataRecord; drec->File = fnd; @@ -149,6 +166,46 @@ bool wxXmlResource::Load(const wxString& filemask) return rt && UpdateResources(); } +bool wxXmlResource::Unload(const wxString& filename) +{ + wxASSERT_MSG( !wxIsWild(filename), + _T("wildcards not supported by wxXmlResource::Unload()") ); + + wxString fnd = ConvertFileNameToURL(filename); +#if wxUSE_FILESYSTEM + const bool isArchive = IsArchive(fnd); + if ( isArchive ) + fnd += _T("#zip:"); +#endif // wxUSE_FILESYSTEM + + bool unloaded = false; + const size_t count = m_data.GetCount(); + for ( size_t i = 0; i < count; i++ ) + { +#if wxUSE_FILESYSTEM + if ( isArchive ) + { + if ( m_data[i].File.StartsWith(fnd) ) + unloaded = true; + // don't break from the loop, we can have other matching files + } + else // a single resource URL +#endif // wxUSE_FILESYSTEM + { + if ( m_data[i].File == fnd ) + { + m_data.RemoveAt(i); + unloaded = true; + + // no sense in continuing, there is only one file with this URL + break; + } + } + } + + return unloaded; +} + IMPLEMENT_ABSTRACT_CLASS(wxXmlResourceHandler, wxObject) @@ -727,9 +784,11 @@ void wxXmlResourceHandler::AddWindowStyles() XRC_ADD_STYLE(wxNO_BORDER); XRC_ADD_STYLE(wxTRANSPARENT_WINDOW); XRC_ADD_STYLE(wxWANTS_CHARS); + XRC_ADD_STYLE(wxTAB_TRAVERSAL); XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE); XRC_ADD_STYLE(wxFULL_REPAINT_ON_RESIZE); XRC_ADD_STYLE(wxWS_EX_BLOCK_EVENTS); + XRC_ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY); } @@ -841,13 +900,11 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) #endif } } - else - { - // If wxXRC_USE_LOCALE is not set, then the string is already in - // system's default encoding in ANSI build, so we don't have to - // do anything special here. - return str2; - } + + // If wxXRC_USE_LOCALE is not set, then the string is already in + // system's default encoding in ANSI build, so we don't have to + // do anything special here. + return str2; } @@ -902,7 +959,8 @@ bool wxXmlResourceHandler::GetBool(const wxString& param, bool defaultv) wxString v = GetParamValue(param); v.MakeLower(); if (!v) return defaultv; - else return (v == wxT("1")); + + return (v == wxT("1")); } @@ -1093,7 +1151,8 @@ wxString wxXmlResourceHandler::GetParamValue(const wxString& param) -wxSize wxXmlResourceHandler::GetSize(const wxString& param) +wxSize wxXmlResourceHandler::GetSize(const wxString& param, + wxWindow *windowToUse) { wxString s = GetParamValue(param); if (s.empty()) s = wxT("-1,-1"); @@ -1112,15 +1171,22 @@ wxSize wxXmlResourceHandler::GetSize(const wxString& param) if (is_dlg) { - if (m_parentAsWindow) + if (windowToUse) + { + return wxDLG_UNIT(windowToUse, wxSize(sx, sy)); + } + else if (m_parentAsWindow) + { return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, sy)); + } else { wxLogError(_("Cannot convert dialog units: dialog unknown.")); return wxDefaultSize; } } - else return wxSize(sx, sy); + + return wxSize(sx, sy); } @@ -1133,7 +1199,9 @@ wxPoint wxXmlResourceHandler::GetPosition(const wxString& param) -wxCoord wxXmlResourceHandler::GetDimension(const wxString& param, wxCoord defaultv) +wxCoord wxXmlResourceHandler::GetDimension(const wxString& param, + wxCoord defaultv, + wxWindow *windowToUse) { wxString s = GetParamValue(param); if (s.empty()) return defaultv; @@ -1151,15 +1219,22 @@ wxCoord wxXmlResourceHandler::GetDimension(const wxString& param, wxCoord defaul if (is_dlg) { - if (m_parentAsWindow) + if (windowToUse) + { + return wxDLG_UNIT(windowToUse, wxSize(sx, 0)).x; + } + else if (m_parentAsWindow) + { return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, 0)).x; + } else { wxLogError(_("Cannot convert dialog units: dialog unknown.")); return defaultv; } } - else return sx; + + return sx; } @@ -1306,12 +1381,10 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) m_node = oldnode; return sysfont; } - else - { - m_node = oldnode; - return wxFont(isize, ifamily, istyle, iweight, - underlined, facename, enc); - } + + m_node = oldnode; + return wxFont(isize, ifamily, istyle, iweight, + underlined, facename, enc); } @@ -1340,6 +1413,8 @@ void wxXmlResourceHandler::SetupWindow(wxWindow *wnd) #endif if (HasParam(wxT("font"))) wnd->SetFont(GetFont()); + if (HasParam(wxT("help"))) + wnd->SetHelpText(GetText(wxT("help"))); } @@ -1439,8 +1514,18 @@ static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = -2) return (*rec_var)->id; } +static void AddStdXRCID_Records(); + /*static*/ int wxXmlResource::GetXRCID(const wxChar *str_id) { + static bool s_stdIDsAdded = false; + + if ( !s_stdIDsAdded ) + { + s_stdIDsAdded = true; + AddStdXRCID_Records(); + } + return XRCID_Lookup(str_id); } @@ -1585,7 +1670,6 @@ public: wxXmlResourceModule() {} bool OnInit() { - AddStdXRCID_Records(); wxXmlResource::AddSubclassFactory(new wxXmlSubclassFactoryCXX); return true; }