X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0bca03736369e836cce9297509505c5972e775dd..4f33a4dd4c6e92ec613aa73737030e992f5d8c65:/src/xrc/xmlres.cpp diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index 789761a6e1..5a024457b6 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -27,6 +27,9 @@ #include "wx/dialog.h" #include "wx/settings.h" #include "wx/bitmap.h" + #include "wx/image.h" + #include "wx/module.h" + #include "wx/wxcrtvararg.h" #endif #ifndef __WXWINCE__ @@ -38,8 +41,6 @@ #include "wx/filename.h" #include "wx/tokenzr.h" #include "wx/fontenum.h" -#include "wx/module.h" -#include "wx/image.h" #include "wx/fontmap.h" #include "wx/artprov.h" @@ -65,16 +66,18 @@ wxXmlResource *wxXmlResource::ms_instance = NULL; return old; } -wxXmlResource::wxXmlResource(int flags) +wxXmlResource::wxXmlResource(int flags, const wxString& domain) { m_flags = flags; m_version = -1; + SetDomain(domain); } -wxXmlResource::wxXmlResource(const wxString& filemask, int flags) +wxXmlResource::wxXmlResource(const wxString& filemask, int flags, const wxString& domain) { m_flags = flags; m_version = -1; + SetDomain(domain); Load(filemask); } @@ -83,6 +86,11 @@ wxXmlResource::~wxXmlResource() ClearHandlers(); } +void wxXmlResource::SetDomain(const wxString& domain) +{ + m_domain = domain; +} + /* static */ wxString wxXmlResource::ConvertFileNameToURL(const wxString& filename) @@ -343,7 +351,7 @@ static void ProcessPlatformProperty(wxXmlNode *node) while (c) { isok = false; - if (!c->GetPropVal(wxT("platform"), &s)) + if (!c->GetAttribute(wxT("platform"), &s)) isok = true; else { @@ -473,7 +481,7 @@ bool wxXmlResource::UpdateResources() { long version; int v1, v2, v3, v4; - wxString verstr = m_data[i].Doc->GetRoot()->GetPropVal( + wxString verstr = m_data[i].Doc->GetRoot()->GetAttribute( wxT("version"), wxT("0.0.0.0")); if (wxSscanf(verstr.c_str(), wxT("%i.%i.%i.%i"), &v1, &v2, &v3, &v4) == 4) @@ -526,20 +534,20 @@ wxXmlNode *wxXmlResource::DoFindResource(wxXmlNode *parent, if ( node->GetType() == wxXML_ELEMENT_NODE && (node->GetName() == wxT("object") || node->GetName() == wxT("object_ref")) && - node->GetPropVal(wxT("name"), &dummy) && dummy == name ) + node->GetAttribute(wxT("name"), &dummy) && dummy == name ) { - wxString cls(node->GetPropVal(wxT("class"), wxEmptyString)); + wxString cls(node->GetAttribute(wxT("class"), wxEmptyString)); if (!classname || cls == classname) return node; - // object_ref may not have 'class' property: + // object_ref may not have 'class' attribute: if (cls.empty() && node->GetName() == wxT("object_ref")) { - wxString refName = node->GetPropVal(wxT("ref"), wxEmptyString); + wxString refName = node->GetAttribute(wxT("ref"), wxEmptyString); if (refName.empty()) continue; wxXmlNode* refNode = FindResource(refName, wxEmptyString, true); if (refNode && - refNode->GetPropVal(wxT("class"), wxEmptyString) == classname) + refNode->GetAttribute(wxT("class"), wxEmptyString) == classname) { return node; } @@ -593,34 +601,35 @@ wxXmlNode *wxXmlResource::FindResource(const wxString& name, static void MergeNodes(wxXmlNode& dest, wxXmlNode& with) { - // Merge properties: - for (wxXmlProperty *prop = with.GetProperties(); prop; prop = prop->GetNext()) + // Merge attributes: + for ( wxXmlAttribute *attr = with.GetAttributes(); + attr; attr = attr->GetNext() ) { - wxXmlProperty *dprop; - for (dprop = dest.GetProperties(); dprop; dprop = dprop->GetNext()) + wxXmlAttribute *dattr; + for (dattr = dest.GetAttributes(); dattr; dattr = dattr->GetNext()) { - if ( dprop->GetName() == prop->GetName() ) + if ( dattr->GetName() == attr->GetName() ) { - dprop->SetValue(prop->GetValue()); + dattr->SetValue(attr->GetValue()); break; } } - if ( !dprop ) - dest.AddProperty(prop->GetName(), prop->GetValue()); + if ( !dattr ) + dest.AddAttribute(attr->GetName(), attr->GetValue()); } // Merge child nodes: for (wxXmlNode* node = with.GetChildren(); node; node = node->GetNext()) { - wxString name = node->GetPropVal(wxT("name"), wxEmptyString); + wxString name = node->GetAttribute(wxT("name"), wxEmptyString); wxXmlNode *dnode; for (dnode = dest.GetChildren(); dnode; dnode = dnode->GetNext() ) { if ( dnode->GetName() == node->GetName() && - dnode->GetPropVal(wxT("name"), wxEmptyString) == name && + dnode->GetAttribute(wxT("name"), wxEmptyString) == name && dnode->GetType() == node->GetType() ) { MergeNodes(*dnode, *node); @@ -631,7 +640,7 @@ static void MergeNodes(wxXmlNode& dest, wxXmlNode& with) if ( !dnode ) { static const wxChar *AT_END = wxT("end"); - wxString insert_pos = node->GetPropVal(wxT("insert_at"), AT_END); + wxString insert_pos = node->GetAttribute(wxT("insert_at"), AT_END); if ( insert_pos == AT_END ) { dest.AddChild(new wxXmlNode(*node)); @@ -656,7 +665,7 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, // handling of referenced resource if ( node->GetName() == wxT("object_ref") ) { - wxString refName = node->GetPropVal(wxT("ref"), wxEmptyString); + wxString refName = node->GetAttribute(wxT("ref"), wxEmptyString); wxXmlNode* refNode = FindResource(refName, wxEmptyString, true); if ( !refNode ) @@ -697,7 +706,7 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, wxLogError(_("No handler found for XML node '%s', class '%s'!"), node->GetName().c_str(), - node->GetPropVal(wxT("class"), wxEmptyString).c_str()); + node->GetAttribute(wxT("class"), wxEmptyString).c_str()); return NULL; } @@ -751,10 +760,10 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent wxWindow *myParentAW = m_parentAsWindow; m_instance = instance; - if (!m_instance && node->HasProp(wxT("subclass")) && + if (!m_instance && node->HasAttribute(wxT("subclass")) && !(m_resource->GetFlags() & wxXRC_NO_SUBCLASSING)) { - wxString subclass = node->GetPropVal(wxT("subclass"), wxEmptyString); + wxString subclass = node->GetAttribute(wxT("subclass"), wxEmptyString); if (!subclass.empty()) { for (wxXmlSubclassFactoriesList::compatibility_iterator i = wxXmlResource::ms_subclassFactories->GetFirst(); @@ -767,7 +776,7 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent if (!m_instance) { - wxString name = node->GetPropVal(wxT("name"), wxEmptyString); + wxString name = node->GetAttribute(wxT("name"), wxEmptyString); wxLogError(_("Subclass '%s' not found for resource '%s', not subclassing!"), subclass.c_str(), name.c_str()); } @@ -775,7 +784,7 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent } m_node = node; - m_class = node->GetPropVal(wxT("class"), wxEmptyString); + m_class = node->GetAttribute(wxT("class"), wxEmptyString); m_parent = parent; m_parentAsWindow = wxDynamicCast(m_parent, wxWindow); @@ -914,9 +923,9 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) if (m_resource->GetFlags() & wxXRC_USE_LOCALE) { if (translate && parNode && - parNode->GetPropVal(wxT("translate"), wxEmptyString) != wxT("0")) + parNode->GetAttribute(wxT("translate"), wxEmptyString) != wxT("0")) { - return wxGetTranslation(str2); + return wxGetTranslation(str2, m_resource->GetDomain()); } else { @@ -978,7 +987,7 @@ int wxXmlResourceHandler::GetID() wxString wxXmlResourceHandler::GetName() { - return m_node->GetPropVal(wxT("name"), wxT("-1")); + return m_node->GetAttribute(wxT("name"), wxT("-1")); } @@ -1042,9 +1051,13 @@ static wxColour GetSystemColour(const wxString& name) return wxNullColour; } -wxColour wxXmlResourceHandler::GetColour(const wxString& param) +wxColour wxXmlResourceHandler::GetColour(const wxString& param, const wxColour& defaultv) { wxString v = GetParamValue(param); + + if ( v.empty() ) + return defaultv; + wxColour clr; // wxString -> wxColour conversion @@ -1056,7 +1069,7 @@ wxColour wxXmlResourceHandler::GetColour(const wxString& param) if (clr.Ok()) return clr; - wxLogError(_("XRC resource: Incorrect colour specification '%s' for property '%s'."), + wxLogError(_("XRC resource: Incorrect colour specification '%s' for attribute '%s'."), v.c_str(), param.c_str()); return wxNullColour; } @@ -1074,10 +1087,10 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, wxXmlNode *bmpNode = GetParamNode(param); if ( bmpNode ) { - wxString sid = bmpNode->GetPropVal(wxT("stock_id"), wxEmptyString); + wxString sid = bmpNode->GetAttribute(wxT("stock_id"), wxEmptyString); if ( !sid.empty() ) { - wxString scl = bmpNode->GetPropVal(wxT("stock_client"), wxEmptyString); + wxString scl = bmpNode->GetAttribute(wxT("stock_client"), wxEmptyString); if (scl.empty()) scl = defaultArtClient; else @@ -1095,7 +1108,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, wxString name = GetParamValue(param); if (name.empty()) return wxNullBitmap; #if wxUSE_FILESYSTEM - wxFSFile *fsfile = GetCurFileSystem().OpenFile(name); + wxFSFile *fsfile = GetCurFileSystem().OpenFile(name, wxFS_READ | wxFS_SEEKABLE); if (fsfile == NULL) { wxLogError(_("XRC resource: Cannot create bitmap from '%s'."), @@ -1118,6 +1131,39 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, return wxBitmap(img); } +#if wxUSE_ANIMATIONCTRL +wxAnimation wxXmlResourceHandler::GetAnimation(const wxString& param) +{ + wxAnimation ani; + + /* load the animation from file: */ + wxString name = GetParamValue(param); + if (name.empty()) return wxNullAnimation; +#if wxUSE_FILESYSTEM + wxFSFile *fsfile = GetCurFileSystem().OpenFile(name, wxFS_READ | wxFS_SEEKABLE); + if (fsfile == NULL) + { + wxLogError(_("XRC resource: Cannot create animation from '%s'."), + name.c_str()); + return wxNullAnimation; + } + ani.Load(*(fsfile->GetStream())); + delete fsfile; +#else + ani.LoadFile(name); +#endif + + if (!ani.IsOk()) + { + wxLogError(_("XRC resource: Cannot create animation from '%s'."), + name.c_str()); + return wxNullAnimation; + } + + return ani; +} +#endif // wxUSE_ANIMATIONCTRL + wxIcon wxXmlResourceHandler::GetIcon(const wxString& param, @@ -1147,6 +1193,14 @@ wxXmlNode *wxXmlResourceHandler::GetParamNode(const wxString& param) } + +bool wxXmlResourceHandler::IsOfClass(wxXmlNode *node, const wxString& classname) +{ + return node->GetAttribute(wxT("class"), wxEmptyString) == classname; +} + + + wxString wxXmlResourceHandler::GetNodeContent(wxXmlNode *node) { wxXmlNode *n = node; @@ -1490,17 +1544,17 @@ void wxXmlResourceHandler::CreateChildrenPrivately(wxObject *parent, wxXmlNode * struct XRCID_record { int id; - wxChar *key; + char *key; XRCID_record *next; }; static XRCID_record *XRCID_Records[XRCID_TABLE_SIZE] = {NULL}; -static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = wxID_NONE) +static int XRCID_Lookup(const char *str_id, int value_if_not_found = wxID_NONE) { int index = 0; - for (const wxChar *c = str_id; *c != wxT('\0'); c++) index += (int)*c; + for (const char *c = str_id; *c != '\0'; c++) index += (int)*c; index %= XRCID_TABLE_SIZE; XRCID_record *oldrec = NULL; @@ -1519,7 +1573,7 @@ static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = wxID_NONE (*rec_var)->key = wxStrdup(str_id); (*rec_var)->next = NULL; - wxChar *end; + char *end; if (value_if_not_found != wxID_NONE) (*rec_var)->id = value_if_not_found; else @@ -1542,7 +1596,7 @@ static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = wxID_NONE static void AddStdXRCID_Records(); /*static*/ -int wxXmlResource::GetXRCID(const wxChar *str_id, int value_if_not_found) +int wxXmlResource::DoGetXRCID(const char *str_id, int value_if_not_found) { static bool s_stdIDsAdded = false; @@ -1577,7 +1631,7 @@ static void CleanXRCID_Records() static void AddStdXRCID_Records() { -#define stdID(id) XRCID_Lookup(wxT(#id), id) +#define stdID(id) XRCID_Lookup(#id, id) stdID(-1); stdID(wxID_ANY); @@ -1595,6 +1649,7 @@ static void AddStdXRCID_Records() stdID(wxID_HELP); stdID(wxID_PRINT); stdID(wxID_PRINT_SETUP); + stdID(wxID_PAGE_SETUP); stdID(wxID_PREVIEW); stdID(wxID_ABOUT); stdID(wxID_HELP_CONTENTS);