/////////////////////////////////////////////////////////////////////////////
// Name: xmlres.cpp
-// Purpose: XML resources
+// Purpose: XRC resources
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
WX_DEFINE_OBJARRAY(wxXmlResourceDataRecords);
-wxXmlResource::wxXmlResource(bool use_locale)
+wxXmlResource::wxXmlResource(int flags)
{
m_handlers.DeleteContents(TRUE);
- m_useLocale = use_locale;
+ m_flags = flags;
m_version = -1;
}
-wxXmlResource::wxXmlResource(const wxString& filemask, bool use_locale)
+wxXmlResource::wxXmlResource(const wxString& filemask, int flags)
{
- m_useLocale = use_locale;
+ m_flags = flags;
m_version = -1;
m_handlers.DeleteContents(TRUE);
Load(filemask);
while (!!fnd)
{
#if wxUSE_FILESYSTEM
- if (filemask.Lower().Matches("*.zip") ||
- filemask.Lower().Matches("*.rsc"))
+ if (filemask.Lower().Matches(wxT("*.zip")) ||
+ filemask.Lower().Matches(wxT("*.rsc")))
{
rt = rt && Load(fnd + wxT("#zip:*.xmb"));
rt = rt && Load(fnd + wxT("#zip:*.xrc"));
}
-void wxXmlResource::ProcessPlatformProperty(wxXmlNode *node)
+static void ProcessPlatformProperty(wxXmlNode *node)
{
wxString s;
bool isok;
}
if (isok)
+ {
ProcessPlatformProperty(c);
+ c = c->GetNext();
+ }
else
{
node->RemoveChild(c);
+ wxXmlNode *c2 = c->GetNext();
delete c;
+ c = c2;
}
-
- c = c->GetNext();
}
}
}
else if (m_data[i].Doc->GetRoot()->GetName() != wxT("resource"))
{
- wxLogError(_("Invalid XML resource '%s': doesn't have root node 'resource'."), m_data[i].File.c_str());
+ wxLogError(_("Invalid XRC resource '%s': doesn't have root node 'resource'."), m_data[i].File.c_str());
wxDELETE(m_data[i].Doc);
}
else
}
}
- wxLogError(_("XML resource '%s' (class '%s') not found!"),
+ wxLogError(_("XRC resource '%s' (class '%s') not found!"),
name.c_str(), classname.c_str());
return NULL;
}
wxObject *myParent = m_parent, *myInstance = m_instance;
wxWindow *myParentAW = m_parentAsWindow, *myInstanceAW = m_instanceAsWindow;
+ m_instance = instance;
+ if (!m_instance && node->HasProp(wxT("subclass")) &&
+ !(m_resource->GetFlags() & wxXRC_NO_SUBCLASSING))
+ {
+ wxString subclass = node->GetPropVal(wxT("subclass"), wxEmptyString);
+ wxClassInfo* classInfo = wxClassInfo::FindClass(subclass);
+
+ if (classInfo)
+ m_instance = classInfo->CreateObject();
+
+ if (!m_instance)
+ {
+ wxLogError(_("Subclass '%s' not found for resource '%s', not subclassing!"),
+ subclass.c_str(), node->GetPropVal(wxT("name"), wxEmptyString).c_str());
+ }
+
+ m_instance = classInfo->CreateObject();
+ }
+
m_node = node;
m_class = node->GetPropVal(wxT("class"), wxEmptyString);
m_parent = parent;
- m_instance = instance;
m_parentAsWindow = wxDynamicCast(m_parent, wxWindow);
m_instanceAsWindow = wxDynamicCast(m_instance, wxWindow);
void wxXmlResourceHandler::AddWindowStyles()
{
- ADD_STYLE(wxSIMPLE_BORDER);
- ADD_STYLE(wxSUNKEN_BORDER);
- ADD_STYLE(wxDOUBLE_BORDER);
- ADD_STYLE(wxRAISED_BORDER);
- ADD_STYLE(wxSTATIC_BORDER);
- ADD_STYLE(wxNO_BORDER);
- ADD_STYLE(wxTRANSPARENT_WINDOW);
- ADD_STYLE(wxWANTS_CHARS);
- ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
+ XRC_ADD_STYLE(wxSIMPLE_BORDER);
+ XRC_ADD_STYLE(wxSUNKEN_BORDER);
+ XRC_ADD_STYLE(wxDOUBLE_BORDER);
+ XRC_ADD_STYLE(wxRAISED_BORDER);
+ XRC_ADD_STYLE(wxSTATIC_BORDER);
+ XRC_ADD_STYLE(wxNO_BORDER);
+ XRC_ADD_STYLE(wxTRANSPARENT_WINDOW);
+ XRC_ADD_STYLE(wxWANTS_CHARS);
+ XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
}
wxString wxXmlResourceHandler::GetText(const wxString& param)
{
- wxString str1 = GetParamValue(param);
+ wxString str1;
wxString str2;
const wxChar *dt;
wxChar amp_char;
- // VS: First version of XML resources used $ instead of & (which is illegal in XML),
+ if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
+ str1 = wxGetTranslation(GetParamValue(param));
+ else
+ str1 = GetParamValue(param);
+
+ // VS: First version of XRC resources used $ instead of & (which is illegal in XML),
// but later I realized that '_' fits this purpose much better (because
// &File means "File with F underlined").
if (m_resource->CompareVersion(2,3,0,1) < 0)
}
else str2 << *dt;
}
-
- if (m_resource->GetUseLocale())
- return wxGetTranslation(str2);
- else
- return str2;
+
+ return str2;
}
stdID(wxID_DEFAULT); stdID(wxID_MORE); stdID(wxID_SETUP);
stdID(wxID_RESET); stdID(wxID_HELP_CONTEXT);
#undef stdID
- else return XMLID(sid.c_str());
+ else return wxXmlResource::GetXMLID(sid);
}
if (v.Length() != 7 || v[0u] != wxT('#') ||
wxSscanf(v.c_str(), wxT("#%lX"), &tmp) != 1)
{
- wxLogError(_("XML resource: Incorrect colour specification '%s' for property '%s'."),
+ wxLogError(_("XRC resource: Incorrect colour specification '%s' for property '%s'."),
v.c_str(), param.c_str());
return wxNullColour;
}
wxFSFile *fsfile = GetCurFileSystem().OpenFile(name);
if (fsfile == NULL)
{
- wxLogError(_("XML resource: Cannot create bitmap from '%s'."), param.mb_str());
+ wxLogError(_("XRC resource: Cannot create bitmap from '%s'."), param.c_str());
return wxNullBitmap;
}
wxImage img(*(fsfile->GetStream()));
#endif
if (!img.Ok())
{
- wxLogError(_("XML resource: Cannot create bitmap from '%s'."), param.mb_str());
+ wxLogError(_("XRC resource: Cannot create bitmap from '%s'."), param.c_str());
return wxNullBitmap;
}
if (!(size == wxDefaultSize)) img.Rescale(size.x, size.y);
if (!s.BeforeFirst(wxT(',')).ToLong(&sx) ||
!s.AfterLast(wxT(',')).ToLong(&sy))
{
- wxLogError(_("Cannot parse coordinates from '%s'."), s.mb_str());
+ wxLogError(_("Cannot parse coordinates from '%s'."), s.c_str());
return wxDefaultSize;
}
if (!s.ToLong(&sx))
{
- wxLogError(_("Cannot parse dimension from '%s'."), s.mb_str());
+ wxLogError(_("Cannot parse dimension from '%s'."), s.c_str());
return defaultv;
}
wxXmlNode *font_node = GetParamNode(param);
if (font_node == NULL)
{
- wxLogError(_("Cannot find font node '%s'."), param.mb_str());
+ wxLogError(_("Cannot find font node '%s'."), param.c_str());
return wxNullFont;
}
wxString encoding = GetParamValue(wxT("encoding"));
wxFontMapper mapper;
wxFontEncoding enc = wxFONTENCODING_DEFAULT;
- if (!encoding.IsEmpty()) enc = mapper.CharsetToEncoding(encoding);
- if (enc == wxFONTENCODING_SYSTEM) enc = wxFONTENCODING_SYSTEM;
+ if (!encoding.IsEmpty())
+ enc = mapper.CharsetToEncoding(encoding);
+ if (enc == wxFONTENCODING_SYSTEM)
+ enc = wxFONTENCODING_DEFAULT;
wxString faces = GetParamValue(wxT("face"));
wxString facename = wxEmptyString;
struct XMLID_record
{
int id;
- char *key;
+ wxChar *key;
XMLID_record *next;
};
static XMLID_record *XMLID_Records[XMLID_TABLE_SIZE] = {NULL};
-/*static*/ int wxXmlResource::GetXMLID(const char *str_id)
+/*static*/ int wxXmlResource::GetXMLID(const wxChar *str_id)
{
static int XMLID_LastID = wxID_HIGHEST;
int index = 0;
- for (const char *c = str_id; *c != '\0'; c++) index += (int)*c;
+ for (const wxChar *c = str_id; *c != wxT('\0'); c++) index += (int)*c;
index %= XMLID_TABLE_SIZE;
XMLID_record *oldrec = NULL;
int matchcnt = 0;
for (XMLID_record *rec = XMLID_Records[index]; rec; rec = rec->next)
{
- if (strcmp(rec->key, str_id) == 0)
+ if (wxStrcmp(rec->key, str_id) == 0)
{
return rec->id;
}
&XMLID_Records[index] : &oldrec->next;
*rec_var = new XMLID_record;
(*rec_var)->id = ++XMLID_LastID;
- (*rec_var)->key = strdup(str_id);
+ (*rec_var)->key = wxStrdup(str_id);
(*rec_var)->next = NULL;
return (*rec_var)->id;
if (rec)
{
CleanXMLID_Record(rec->next);
- free (rec->key);
+ free(rec->key);
delete rec;
}
}