X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d0b50ad93942338301a318eda78f7d3999a93fab..232ba4c3329127a3ae57e37dc088513d06fe436f:/src/xrc/xmlres.cpp diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index f7355536ee..197ea98480 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -19,6 +19,8 @@ #pragma hdrstop #endif +#if wxUSE_XRC + #include "wx/dialog.h" #include "wx/panel.h" #include "wx/frame.h" @@ -35,7 +37,7 @@ #include "wx/fontmap.h" #include "wx/artprov.h" -#include "wx/xrc/xml.h" +#include "wx/xml/xml.h" #include "wx/xrc/xmlres.h" #include "wx/arrimpl.cpp" @@ -60,7 +62,6 @@ wxXmlResource *wxXmlResource::ms_instance = NULL; wxXmlResource::wxXmlResource(int flags) { - m_handlers.DeleteContents(TRUE); m_flags = flags; m_version = -1; } @@ -69,7 +70,6 @@ wxXmlResource::wxXmlResource(const wxString& filemask, int flags) { m_flags = flags; m_version = -1; - m_handlers.DeleteContents(TRUE); Load(filemask); } @@ -84,7 +84,7 @@ bool wxXmlResource::Load(const wxString& filemask) wxString fnd; wxXmlResourceDataRecord *drec; bool iswild = wxIsWild(filemask); - bool rt = TRUE; + bool rt = true; #if wxUSE_FILESYSTEM wxFileSystem fsys; @@ -107,7 +107,7 @@ bool wxXmlResource::Load(const wxString& filemask) // filename and not URL: if (wxFileName::FileExists(fnd)) { - // Make the name absolute filename, because the app may + // Make the name absolute filename, because the app may // change working directory later: wxFileName fn(fnd); if (fn.IsRelative()) @@ -115,14 +115,16 @@ bool wxXmlResource::Load(const wxString& filemask) fn.MakeAbsolute(); fnd = fn.GetFullPath(); } +#if wxUSE_FILESYSTEM + fnd = wxFileSystem::FileNameToURL(fnd); +#endif } - + #if wxUSE_FILESYSTEM if (fnd.Lower().Matches(wxT("*.zip")) || fnd.Lower().Matches(wxT("*.xrs"))) { - wxString url(wxFileSystem::FileNameToURL(fnd)); - rt = rt && Load(url + wxT("#zip:*.xrc")); + rt = rt && Load(fnd + wxT("#zip:*.xrc")); } else #endif @@ -139,10 +141,11 @@ bool wxXmlResource::Load(const wxString& filemask) } # undef wxXmlFindFirst # undef wxXmlFindNext - return rt; + return rt && UpdateResources(); } +IMPLEMENT_ABSTRACT_CLASS(wxXmlResourceHandler, wxObject) void wxXmlResource::AddHandler(wxXmlResourceHandler *handler) { @@ -160,7 +163,7 @@ void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler) void wxXmlResource::ClearHandlers() { - m_handlers.Clear(); + WX_CLEAR_LIST(wxList, m_handlers); } @@ -259,7 +262,7 @@ bool wxXmlResource::AttachUnknownControl(const wxString& name, if (!container) { wxLogError(_("Cannot find container for unknown control '%s'."), name.c_str()); - return FALSE; + return false; } return control->Reparent(container); } @@ -273,9 +276,9 @@ static void ProcessPlatformProperty(wxXmlNode *node) wxXmlNode *c = node->GetChildren(); while (c) { - isok = FALSE; + isok = false; if (!c->GetPropVal(wxT("platform"), &s)) - isok = TRUE; + isok = true; else { wxStringTokenizer tkn(s, wxT(" |")); @@ -283,14 +286,13 @@ static void ProcessPlatformProperty(wxXmlNode *node) while (tkn.HasMoreTokens()) { s = tkn.GetNextToken(); -#ifdef __WXMSW__ +#ifdef __WINDOWS__ if (s == wxT("win")) isok = true; #endif -#ifdef __UNIX__ - if (s == wxT("unix")) isok = true; -#endif -#ifdef __MAC__ +#if defined(__MAC__) || defined(__APPLE__) if (s == wxT("mac")) isok = true; +#elif defined(__UNIX__) + if (s == wxT("unix")) isok = true; #endif #ifdef __OS2__ if (s == wxT("os2")) isok = true; @@ -318,11 +320,13 @@ static void ProcessPlatformProperty(wxXmlNode *node) -void wxXmlResource::UpdateResources() +bool wxXmlResource::UpdateResources() { + bool rt = true; bool modif; # if wxUSE_FILESYSTEM wxFSFile *file = NULL; + wxUnusedVar(file); wxFileSystem fsys; # endif @@ -330,9 +334,9 @@ void wxXmlResource::UpdateResources() #if !wxUSE_UNICODE && wxUSE_INTL if ( (GetFlags() & wxXRC_USE_LOCALE) == 0 ) { - // In case we are not using wxLocale to translate strings, convert the strings - // GUI's charset. This must not be done when wxXRC_USE_LOCALE is on, because - // it could break wxGetTranslation lookup. + // In case we are not using wxLocale to translate strings, convert the + // strings GUI's charset. This must not be done when wxXRC_USE_LOCALE + // is on, because it could break wxGetTranslation lookup. encoding = wxLocale::GetSystemEncodingName(); } #endif @@ -341,14 +345,18 @@ void wxXmlResource::UpdateResources() { modif = (m_data[i].Doc == NULL); - if (!modif) + if (!modif && !(m_flags & wxXRC_NO_RELOADING)) { # if wxUSE_FILESYSTEM file = fsys.OpenFile(m_data[i].File); modif = file && file->GetModificationTime() > m_data[i].Time; if (!file) + { wxLogError(_("Cannot open file '%s'."), m_data[i].File.c_str()); + rt = false; + } wxDELETE(file); + wxUnusedVar(file); # else modif = wxDateTime(wxFileModificationTime(m_data[i].File)) > m_data[i].Time; # endif @@ -356,12 +364,15 @@ void wxXmlResource::UpdateResources() if (modif) { + wxLogTrace(_T("xrc"), + _T("opening file '%s'"), m_data[i].File.c_str()); + wxInputStream *stream = NULL; # if wxUSE_FILESYSTEM file = fsys.OpenFile(m_data[i].File); - if (file) - stream = file->GetStream(); + if (file) + stream = file->GetStream(); # else stream = new wxFileInputStream(m_data[i].File); # endif @@ -376,14 +387,16 @@ void wxXmlResource::UpdateResources() wxLogError(_("Cannot load resources from file '%s'."), m_data[i].File.c_str()); wxDELETE(m_data[i].Doc); + rt = false; } else if (m_data[i].Doc->GetRoot()->GetName() != wxT("resource")) { wxLogError(_("Invalid XRC resource '%s': doesn't have root node 'resource'."), m_data[i].File.c_str()); wxDELETE(m_data[i].Doc); + rt = false; } else - { + { long version; int v1, v2, v3, v4; wxString verstr = m_data[i].Doc->GetRoot()->GetPropVal( @@ -396,19 +409,29 @@ void wxXmlResource::UpdateResources() if (m_version == -1) m_version = version; if (m_version != version) + { wxLogError(_("Resource files must have same version number!")); + rt = false; + } ProcessPlatformProperty(m_data[i].Doc->GetRoot()); - m_data[i].Time = file->GetModificationTime(); - } +#if wxUSE_FILESYSTEM + m_data[i].Time = file->GetModificationTime(); +#else + m_data[i].Time = wxDateTime(wxFileModificationTime(m_data[i].File)); +#endif + } # if wxUSE_FILESYSTEM - wxDELETE(file); + wxDELETE(file); + wxUnusedVar(file); # else - wxDELETE(stream); + wxDELETE(stream); # endif } } + + return rt; } @@ -438,7 +461,7 @@ wxXmlNode *wxXmlResource::DoFindResource(wxXmlNode *parent, wxString refName = node->GetPropVal(wxT("ref"), wxEmptyString); if (refName.empty()) continue; - wxXmlNode* refNode = FindResource(refName, wxEmptyString, TRUE); + wxXmlNode* refNode = FindResource(refName, wxEmptyString, true); if (refNode && refNode->GetPropVal(wxT("class"), wxEmptyString) == classname) { @@ -455,7 +478,7 @@ wxXmlNode *wxXmlResource::DoFindResource(wxXmlNode *parent, (node->GetName() == wxT("object") || node->GetName() == wxT("object_ref")) ) { - wxXmlNode* found = DoFindResource(node, name, classname, TRUE); + wxXmlNode* found = DoFindResource(node, name, classname, true); if ( found ) return found; } @@ -547,7 +570,7 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, if ( node->GetName() == wxT("object_ref") ) { wxString refName = node->GetPropVal(wxT("ref"), wxEmptyString); - wxXmlNode* refNode = FindResource(refName, wxEmptyString, TRUE); + wxXmlNode* refNode = FindResource(refName, wxEmptyString, true); if ( !refNode ) { @@ -565,15 +588,15 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, wxXmlResourceHandler *handler; if (handlerToUse) - { + { if (handlerToUse->CanHandle(node)) { return handlerToUse->CreateResource(node, parent, instance); } } else if (node->GetName() == wxT("object")) - { - wxNode *ND = m_handlers.GetFirst(); + { + wxList::compatibility_iterator ND = m_handlers.GetFirst(); while (ND) { handler = (wxXmlResourceHandler*)ND->GetData(); @@ -603,7 +626,6 @@ wxXmlSubclassFactoriesList *wxXmlResource::ms_subclassFactories = NULL; if (!ms_subclassFactories) { ms_subclassFactories = new wxXmlSubclassFactoriesList; - ms_subclassFactories->DeleteContents(TRUE); } ms_subclassFactories->Append(factory); } @@ -649,7 +671,7 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent wxString subclass = node->GetPropVal(wxT("subclass"), wxEmptyString); if (!subclass.empty()) { - for (wxXmlSubclassFactoriesList::Node *i = wxXmlResource::ms_subclassFactories->GetFirst(); + for (wxXmlSubclassFactoriesList::compatibility_iterator i = wxXmlResource::ms_subclassFactories->GetFirst(); i; i = i->GetNext()) { m_instance = i->GetData()->Create(subclass); @@ -693,6 +715,7 @@ void wxXmlResourceHandler::AddStyle(const wxString& name, int value) void wxXmlResourceHandler::AddWindowStyles() { + XRC_ADD_STYLE(wxCLIP_CHILDREN); XRC_ADD_STYLE(wxSIMPLE_BORDER); XRC_ADD_STYLE(wxSUNKEN_BORDER); XRC_ADD_STYLE(wxDOUBLE_BORDER); @@ -702,6 +725,8 @@ void wxXmlResourceHandler::AddWindowStyles() XRC_ADD_STYLE(wxTRANSPARENT_WINDOW); XRC_ADD_STYLE(wxWANTS_CHARS); XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE); + XRC_ADD_STYLE(wxFULL_REPAINT_ON_RESIZE); + XRC_ADD_STYLE(wxWS_EX_BLOCK_EVENTS); } @@ -738,7 +763,8 @@ int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults) wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) { - wxString str1(GetParamValue(param)); + wxXmlNode *parNode = GetParamNode(param); + wxString str1(GetNodeContent(parNode)); wxString str2; const wxChar *dt; wxChar amp_char; @@ -774,11 +800,31 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) else str2 << *dt; } - if (translate && m_resource->GetFlags() & wxXRC_USE_LOCALE) - return wxGetTranslation(str2); + if (m_resource->GetFlags() & wxXRC_USE_LOCALE) + { + if (translate && parNode && + parNode->GetPropVal(wxT("translate"), wxEmptyString) != wxT("0")) + { + return wxGetTranslation(str2); + } + else + { +#if wxUSE_UNICODE + return str2; +#else + // The string is internally stored as UTF-8, we have to convert + // it into system's default encoding so that it can be displayed: + return wxString(str2.mb_str(wxConvUTF8), wxConvLocal); +#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; - + } } @@ -851,11 +897,15 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, wxString sid = bmpNode->GetPropVal(wxT("stock_id"), wxEmptyString); if ( !sid.empty() ) { - wxString scl = bmpNode->GetPropVal(wxT("stock_client"), defaultArtClient); + wxString scl = bmpNode->GetPropVal(wxT("stock_client"), wxEmptyString); + if (scl.empty()) + scl = defaultArtClient; + else + scl = wxART_MAKE_CLIENT_ID_FROM_STR(scl); + wxBitmap stockArt = wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(sid), - wxART_MAKE_CLIENT_ID_FROM_STR(scl), - size); + scl, size); if ( stockArt.Ok() ) return stockArt; } @@ -950,7 +1000,7 @@ wxSize wxXmlResourceHandler::GetSize(const wxString& param) wxString s = GetParamValue(param); if (s.IsEmpty()) s = wxT("-1,-1"); bool is_dlg; - long sx, sy; + long sx, sy = 0; is_dlg = s[s.Length()-1] == wxT('d'); if (is_dlg) s.RemoveLast(); @@ -1050,7 +1100,7 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) else if (family == wxT("swiss")) ifamily = wxSWISS; else if (family == wxT("modern")) ifamily = wxMODERN; - bool underlined = GetBool(wxT("underlined"), FALSE); + bool underlined = GetBool(wxT("underlined"), false); wxString encoding = GetParamValue(wxT("encoding")); wxFontMapper mapper; @@ -1067,7 +1117,7 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) wxStringTokenizer tk(faces, wxT(",")); while (tk.HasMoreTokens()) { - int index = enu.GetFacenames()->Index(tk.GetNextToken(), FALSE); + int index = enu.GetFacenames()->Index(tk.GetNextToken(), false); if (index != wxNOT_FOUND) { facename = (*enu.GetFacenames())[index]; @@ -1087,17 +1137,20 @@ void wxXmlResourceHandler::SetupWindow(wxWindow *wnd) //FIXME : add cursor if (HasParam(wxT("exstyle"))) - wnd->SetExtraStyle(GetStyle(wxT("exstyle"))); + // Have to OR it with existing style, since + // some implementations (e.g. wxGTK) use the extra style + // during creation + wnd->SetExtraStyle(wnd->GetExtraStyle() | GetStyle(wxT("exstyle"))); if (HasParam(wxT("bg"))) wnd->SetBackgroundColour(GetColour(wxT("bg"))); if (HasParam(wxT("fg"))) wnd->SetForegroundColour(GetColour(wxT("fg"))); if (GetBool(wxT("enabled"), 1) == 0) - wnd->Enable(FALSE); + wnd->Enable(false); if (GetBool(wxT("focused"), 0) == 1) wnd->SetFocus(); if (GetBool(wxT("hidden"), 0) == 1) - wnd->Show(FALSE); + wnd->Show(false); #if wxUSE_TOOLTIPS if (HasParam(wxT("tooltip"))) wnd->SetToolTip(GetText(wxT("tooltip"))); @@ -1170,14 +1223,12 @@ static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = -2) index %= XRCID_TABLE_SIZE; XRCID_record *oldrec = NULL; - int matchcnt = 0; for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next) { if (wxStrcmp(rec->key, str_id) == 0) { return rec->id; } - matchcnt++; oldrec = rec; } @@ -1226,27 +1277,117 @@ static void CleanXRCID_Record(XRCID_record *rec) static void CleanXRCID_Records() { for (int i = 0; i < XRCID_TABLE_SIZE; i++) + { CleanXRCID_Record(XRCID_Records[i]); + XRCID_Records[i] = NULL; + } } static void AddStdXRCID_Records() { #define stdID(id) XRCID_Lookup(wxT(#id), id) stdID(-1); - stdID(wxID_OPEN); stdID(wxID_CLOSE); stdID(wxID_NEW); - stdID(wxID_SAVE); stdID(wxID_SAVEAS); stdID(wxID_REVERT); - stdID(wxID_EXIT); stdID(wxID_UNDO); stdID(wxID_REDO); - stdID(wxID_HELP); stdID(wxID_PRINT); stdID(wxID_PRINT_SETUP); - stdID(wxID_PREVIEW); stdID(wxID_ABOUT); stdID(wxID_HELP_CONTENTS); - stdID(wxID_HELP_COMMANDS); stdID(wxID_HELP_PROCEDURES); - stdID(wxID_CUT); stdID(wxID_COPY); stdID(wxID_PASTE); - stdID(wxID_CLEAR); stdID(wxID_FIND); stdID(wxID_DUPLICATE); - stdID(wxID_SELECTALL); stdID(wxID_OK); stdID(wxID_CANCEL); - stdID(wxID_APPLY); stdID(wxID_YES); stdID(wxID_NO); - stdID(wxID_STATIC); stdID(wxID_FORWARD); stdID(wxID_BACKWARD); - stdID(wxID_DEFAULT); stdID(wxID_MORE); stdID(wxID_SETUP); - stdID(wxID_RESET); stdID(wxID_HELP_CONTEXT); + + stdID(wxID_ANY); + stdID(wxID_SEPARATOR); + + stdID(wxID_OPEN); + stdID(wxID_CLOSE); + stdID(wxID_NEW); + stdID(wxID_SAVE); + stdID(wxID_SAVEAS); + stdID(wxID_REVERT); + stdID(wxID_EXIT); + stdID(wxID_UNDO); + stdID(wxID_REDO); + stdID(wxID_HELP); + stdID(wxID_PRINT); + stdID(wxID_PRINT_SETUP); + stdID(wxID_PREVIEW); + stdID(wxID_ABOUT); + stdID(wxID_HELP_CONTENTS); + stdID(wxID_HELP_COMMANDS); + stdID(wxID_HELP_PROCEDURES); + stdID(wxID_HELP_CONTEXT); stdID(wxID_CLOSE_ALL); + stdID(wxID_PREFERENCES); + stdID(wxID_CUT); + stdID(wxID_COPY); + stdID(wxID_PASTE); + stdID(wxID_CLEAR); + stdID(wxID_FIND); + stdID(wxID_DUPLICATE); + stdID(wxID_SELECTALL); + stdID(wxID_DELETE); + stdID(wxID_REPLACE); + stdID(wxID_REPLACE_ALL); + stdID(wxID_PROPERTIES); + stdID(wxID_VIEW_DETAILS); + stdID(wxID_VIEW_LARGEICONS); + stdID(wxID_VIEW_SMALLICONS); + stdID(wxID_VIEW_LIST); + stdID(wxID_VIEW_SORTDATE); + stdID(wxID_VIEW_SORTNAME); + stdID(wxID_VIEW_SORTSIZE); + stdID(wxID_VIEW_SORTTYPE); + stdID(wxID_FILE1); + stdID(wxID_FILE2); + stdID(wxID_FILE3); + stdID(wxID_FILE4); + stdID(wxID_FILE5); + stdID(wxID_FILE6); + stdID(wxID_FILE7); + stdID(wxID_FILE8); + stdID(wxID_FILE9); + stdID(wxID_OK); + stdID(wxID_CANCEL); + stdID(wxID_APPLY); + stdID(wxID_YES); + stdID(wxID_NO); + stdID(wxID_STATIC); + stdID(wxID_FORWARD); + stdID(wxID_BACKWARD); + stdID(wxID_DEFAULT); + stdID(wxID_MORE); + stdID(wxID_SETUP); + stdID(wxID_RESET); + stdID(wxID_CONTEXT_HELP); + stdID(wxID_YESTOALL); + stdID(wxID_NOTOALL); + stdID(wxID_ABORT); + stdID(wxID_RETRY); + stdID(wxID_IGNORE); + stdID(wxID_ADD); + stdID(wxID_REMOVE); + stdID(wxID_UP); + stdID(wxID_DOWN); + stdID(wxID_HOME); + stdID(wxID_REFRESH); + stdID(wxID_STOP); + stdID(wxID_INDEX); + stdID(wxID_BOLD); + stdID(wxID_ITALIC); + stdID(wxID_JUSTIFY_CENTER); + stdID(wxID_JUSTIFY_FILL); + stdID(wxID_JUSTIFY_RIGHT); + stdID(wxID_JUSTIFY_LEFT); + stdID(wxID_UNDERLINE); + stdID(wxID_INDENT); + stdID(wxID_UNINDENT); + stdID(wxID_ZOOM_100); + stdID(wxID_ZOOM_FIT); + stdID(wxID_ZOOM_IN); + stdID(wxID_ZOOM_OUT); + stdID(wxID_UNDELETE); + stdID(wxID_REVERT_TO_SAVED); + stdID(wxID_SYSTEM_MENU); + stdID(wxID_CLOSE_FRAME); + stdID(wxID_MOVE_FRAME); + stdID(wxID_RESIZE_FRAME); + stdID(wxID_MAXIMIZE_FRAME); + stdID(wxID_ICONIZE_FRAME); + stdID(wxID_RESTORE_FRAME); + #undef stdID } @@ -1265,11 +1406,13 @@ public: { AddStdXRCID_Records(); wxXmlResource::AddSubclassFactory(new wxXmlSubclassFactoryCXX); - return TRUE; + return true; } void OnExit() { delete wxXmlResource::Set(NULL); + if(wxXmlResource::ms_subclassFactories) + WX_CLEAR_LIST(wxXmlSubclassFactoriesList, *wxXmlResource::ms_subclassFactories); wxDELETE(wxXmlResource::ms_subclassFactories); CleanXRCID_Records(); } @@ -1287,4 +1430,4 @@ void wxXmlInitResourceModule() wxModule::RegisterModule(module); } - +#endif // wxUSE_XRC