#include "wx/frame.h"
#include "wx/wfstream.h"
#include "wx/filesys.h"
+#include "wx/filename.h"
#include "wx/log.h"
#include "wx/intl.h"
#include "wx/tokenzr.h"
#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"
fnd = filemask;
while (!!fnd)
{
+ // 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
+ }
+
#if wxUSE_FILESYSTEM
- if (filemask.Lower().Matches(wxT("*.zip")) ||
- filemask.Lower().Matches(wxT("*.xrs")))
+ if (fnd.Lower().Matches(wxT("*.zip")) ||
+ fnd.Lower().Matches(wxT("*.xrs")))
{
- rt = rt && Load(fnd + wxT("#zip:*.xmlbin"));
- rt = rt && Load(fnd + wxT("#zip:*.xrc"));
+ wxString url(wxFileSystem::FileNameToURL(fnd));
+ rt = rt && Load(url + wxT("#zip:*.xrc"));
}
else
#endif
}
+IMPLEMENT_ABSTRACT_CLASS(wxXmlResourceHandler, wxObject)
void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
{
while (tkn.HasMoreTokens())
{
s = tkn.GetNextToken();
- if (
#ifdef __WXMSW__
- s == wxString(wxT("win"))
-#elif defined(__UNIX__)
- s == wxString(wxT("unix"))
-#elif defined(__MAC__)
- s == wxString(wxT("mac"))
-#elif defined(__OS2__)
- s == wxString(wxT("os2"))
-#else
- FALSE
+ if (s == wxT("win")) isok = true;
+#endif
+#ifdef __UNIX__
+ if (s == wxT("unix")) isok = true;
+#endif
+#ifdef __MAC__
+ if (s == wxT("mac")) isok = true;
+#endif
+#ifdef __OS2__
+ if (s == wxT("os2")) isok = true;
#endif
- ) isok = TRUE;
+
+ if (isok)
+ break;
}
}
#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
dest.SetContent(with.GetContent());
}
-wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, wxObject *instance)
+wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent,
+ wxObject *instance,
+ wxXmlResourceHandler *handlerToUse)
{
if (node == NULL) return NULL;
}
wxXmlResourceHandler *handler;
- wxObject *ret;
- wxNode * ND = m_handlers.GetFirst();
- while (ND)
- {
- handler = (wxXmlResourceHandler*)ND->GetData();
- if (node->GetName() == wxT("object") && handler->CanHandle(node))
+
+ if (handlerToUse)
+ {
+ if (handlerToUse->CanHandle(node))
{
- ret = handler->CreateResource(node, parent, instance);
- if (ret) return ret;
+ return handlerToUse->CreateResource(node, parent, instance);
+ }
+ }
+ else if (node->GetName() == wxT("object"))
+ {
+ wxNode *ND = m_handlers.GetFirst();
+ while (ND)
+ {
+ handler = (wxXmlResourceHandler*)ND->GetData();
+ if (handler->CanHandle(node))
+ {
+ return handler->CreateResource(node, parent, instance);
+ }
+ ND = ND->GetNext();
}
- ND = ND->GetNext();
}
wxLogError(_("No handler found for XML node '%s', class '%s'!"),
int wxXmlResourceHandler::GetID()
{
- wxString sid = GetName();
- long num;
-
- if (sid == wxT("-1")) return -1;
- else if (sid.IsNumber() && sid.ToLong(&num)) return num;
-#define stdID(id) else if (sid == wxT(#id)) return id
- 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_CLOSE_ALL);
-#undef stdID
- else return wxXmlResource::GetXRCID(sid);
+ return wxXmlResource::GetXRCID(GetName());
}
wxFSFile *fsfile = GetCurFileSystem().OpenFile(name);
if (fsfile == NULL)
{
- wxLogError(_("XRC resource: Cannot create bitmap from '%s'."), param.c_str());
+ wxLogError(_("XRC resource: Cannot create bitmap from '%s'."),
+ name.c_str());
return wxNullBitmap;
}
wxImage img(*(fsfile->GetStream()));
const wxArtClient& defaultArtClient,
wxSize size)
{
-#if wxCHECK_VERSION(2,3,0) || defined(__WXMSW__)
wxIcon icon;
icon.CopyFromBitmap(GetBitmap(param, defaultArtClient, size));
-#else
- wxIcon *iconpt;
- wxBitmap bmppt = GetBitmap(param, size);
- iconpt = (wxIcon*)(&bmppt);
- wxIcon icon(*iconpt);
-#endif
return icon;
}
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE &&
- n->GetName() == wxT("object"))
+ (n->GetName() == wxT("object") || n->GetName() == wxT("object_ref")))
{
- if (this_hnd_only && CanHandle(n))
- CreateResource(n, parent, NULL);
- else
- m_resource->CreateResFromNode(n, parent, NULL);
+ m_resource->CreateResFromNode(n, parent, NULL,
+ this_hnd_only ? this : NULL);
}
n = n->GetNext();
}
static XRCID_record *XRCID_Records[XRCID_TABLE_SIZE] = {NULL};
-/*static*/ int wxXmlResource::GetXRCID(const wxChar *str_id)
+static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = -2)
{
static int XRCID_LastID = wxID_HIGHEST;
XRCID_record **rec_var = (oldrec == NULL) ?
&XRCID_Records[index] : &oldrec->next;
*rec_var = new XRCID_record;
- (*rec_var)->id = ++XRCID_LastID;
(*rec_var)->key = wxStrdup(str_id);
(*rec_var)->next = NULL;
+ wxChar *end;
+ if (value_if_not_found != -2)
+ (*rec_var)->id = value_if_not_found;
+ else
+ {
+ int asint = wxStrtol(str_id, &end, 10);
+ if (*str_id && *end == 0)
+ {
+ // if str_id was integer, keep it verbosely:
+ (*rec_var)->id = asint;
+ }
+ else
+ {
+ (*rec_var)->id = ++XRCID_LastID;
+ }
+ }
+
return (*rec_var)->id;
}
+/*static*/ int wxXmlResource::GetXRCID(const wxChar *str_id)
+{
+ return XRCID_Lookup(str_id);
+}
+
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_CLOSE_ALL);
+#undef stdID
+}
wxXmlResourceModule() {}
bool OnInit()
{
+ AddStdXRCID_Records();
wxXmlResource::AddSubclassFactory(new wxXmlSubclassFactoryCXX);
return TRUE;
}
module->Init();
wxModule::RegisterModule(module);
}
-
-