\latexignore{\rtfignore{\wxheading{Members}}}
+
\membersection{wxXmlResource::wxXmlResource}\label{wxxmlresourcector}
\func{}{wxXmlResource}{\param{const wxString\& }{filemask}, \param{int }{flags = wxXRC\_USE\_LOCALE}}
XRC files from being reloaded from disk in case they have been modified there
since being last loaded (may slightly speed up loading them).}
+
\membersection{wxXmlResource::\destruct{wxXmlResource}}\label{wxxmlresourcedtor}
\func{}{\destruct{wxXmlResource}}{\void}
Destructor.
+
\membersection{wxXmlResource::AddHandler}\label{wxxmlresourceaddhandler}
\func{void}{AddHandler}{\param{wxXmlResourceHandler* }{handler}}
(wxxrc) can create include file that contains initialization code for
all controls used within the resource.
+
\membersection{wxXmlResource::AttachUnknownControl}\label{wxxmlresourceattachunknowncontrol}
\func{bool}{AttachUnknownControl}{\param{const wxString\& }{name}, \param{wxWindow* }{control}, \param{wxWindow* }{parent = NULL}}
Attaches an unknown control to the given panel/window/dialog.
Unknown controls are used in conjunction with <object class="unknown">.
+
\membersection{wxXmlResource::ClearHandlers}\label{wxxmlresourceclearhandlers}
\func{void}{ClearHandlers}{\void}
Removes all handlers.
+
\membersection{wxXmlResource::CompareVersion}\label{wxxmlresourcecompareversion}
\constfunc{int}{CompareVersion}{\param{int }{major}, \param{int }{minor}, \param{int }{release}, \param{int }{revision}}
Compares the XRC version to the argument. Returns -1 if the XRC version
is less than the argument, +1 if greater, and 0 if they equal.
+
\membersection{wxXmlResource::Get}\label{wxxmlresourceget}
\func{wxXmlResource*}{Get}{\void}
Gets the global resources object or creates one if none exists.
+
\membersection{wxXmlResource::GetFlags}\label{wxxmlresourcegetflags}
\func{int}{GetFlags}{\void}
Returns flags, which may be a bitlist of wxXRC\_USE\_LOCALE and wxXRC\_NO\_SUBCLASSING.
+
\membersection{wxXmlResource::GetVersion}\label{wxxmlresourcegetversion}
\constfunc{long}{GetVersion}{\void}
Returns version information (a.b.c.d = d+ 256*c + 256\textasciicircum2*b + 256\textasciitilde3*a).
+
\membersection{wxXmlResource::GetXRCID}\label{wxxmlresourcegetxmlid}
\func{int}{GetXRCID}{\param{const wxChar* }{str\_id}}
resource. To be used in event tables.
The macro {\tt XRCID(name)} is provided for convenience.
+
\membersection{wxXmlResource::InitAllHandlers}\label{wxxmlresourceinitallhandlers}
\func{void}{InitAllHandlers}{\void}
make the executable quite big because it forces linking against
most of the wxWidgets library.
+
\membersection{wxXmlResource::Load}\label{wxxmlresourceload}
\func{bool}{Load}{\param{const wxString\& }{filemask}}
Loads resources from XML files that match given filemask.
This method understands VFS (see filesys.h).
+
\membersection{wxXmlResource::LoadBitmap}\label{wxxmlresourceloadbitmap}
\func{wxBitmap}{LoadBitmap}{\param{const wxString\& }{name}}
Loads a bitmap resource from a file.
+
\membersection{wxXmlResource::LoadDialog}\label{wxxmlresourceloaddialog}
\func{wxDialog*}{LoadDialog}{\param{wxWindow* }{parent}, \param{const wxString\& }{name}}
dlg->ShowModal();
\end{verbatim}
+
\membersection{wxXmlResource::LoadFrame}\label{wxxmlresourceloadframe}
\func{bool}{LoadFrame}{\param{wxFrame* }{frame}, \param{wxWindow* }{parent}, \param{const wxString\& }{name}}
Loads a frame.
+
\membersection{wxXmlResource::LoadIcon}\label{wxxmlresourceloadicon}
\func{wxIcon}{LoadIcon}{\param{const wxString\& }{name}}
Loads an icon resource from a file.
+
\membersection{wxXmlResource::LoadMenu}\label{wxxmlresourceloadmenu}
\func{wxMenu*}{LoadMenu}{\param{const wxString\& }{name}}
Loads menu from resource. Returns NULL on failure.
+
\membersection{wxXmlResource::LoadMenuBar}\label{wxxmlresourceloadmenubar}
\func{wxMenuBar*}{LoadMenuBar}{\param{wxWindow* }{parent}, \param{const wxString\& }{name}}
Loads a menubar from resource. Returns NULL on failure.
+
\membersection{wxXmlResource::LoadPanel}\label{wxxmlresourceloadpanel}
\func{wxPanel*}{LoadPanel}{\param{wxWindow* }{parent}, \param{const wxString\& }{name}}
Loads a panel. {\it panel} points to parent window (if any). This form
is used to finish creation of an already existing instance.
+
\membersection{wxXmlResource::LoadToolBar}\label{wxxmlresourceloadtoolbar}
\func{wxToolBar*}{LoadToolBar}{\param{wxWindow* }{parent}, \param{const wxString\& }{name}}
Loads a toolbar.
+
\membersection{wxXmlResource::Set}\label{wxxmlresourceset}
\func{wxXmlResource*}{Set}{\param{wxXmlResource* }{res}}
Sets the global resources object and returns a pointer to the previous one (may be NULL).
+
\membersection{wxXmlResource::SetFlags}\label{wxxmlresourcesetflags}
\func{void}{SetFlags}{\param{int }{flags}}
Sets flags (bitlist of wxXRC\_USE\_LOCALE and wxXRC\_NO\_SUBCLASSING).
+
+\membersection{wxXmlResource::Unload}\label{wxxmlresourceunload}
+
+\func{bool}{Unload}{\param{const wxString\& }{filename}}
+
+This function unloads a resource previously loaded by
+\helpref{Load()}{wxxmlresourceload}.
+
+Returns \true if the resource was successfully unloaded and \false if it hasn't
+been found in the list of loaded resources.
+
// This method understands VFS (see filesys.h).
bool Load(const wxString& filemask);
+ // Unload resource from the given XML file (wildcards not allowed)
+ bool Unload(const wxString& filename);
+
// Initialize handlers for all supported controls/windows. This will
// make the executable quite big because it forces linking against
// most of the wxWidgets library.
wxObject *instance = NULL,
wxXmlResourceHandler *handlerToUse = NULL);
+ // Helper of Load() and Unload(): returns the URL corresponding to the
+ // given file if it's indeed a file, otherwise returns the original string
+ // unmodified
+ static wxString ConvertFileNameToURL(const wxString& filename);
+
+ // loading resources from archives is impossible without wxFileSystem
+#if wxUSE_FILESYSTEM
+ // Another helper: detect if the filename is a ZIP or XRS file
+ static bool IsArchive(const wxString& filename);
+#endif // wxUSE_FILESYSTEM
+
private:
long m_version;
}
+/* 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;
fnd = filemask;
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;
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)