X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4dca3e02a667ce25c420543001fc34dde94dfa1a..a3b9c43bbc6bf71b6b618d4e2a71231e9cd431dc:/include/wx/xrc/xmlreshandler.h diff --git a/include/wx/xrc/xmlreshandler.h b/include/wx/xrc/xmlreshandler.h new file mode 100644 index 0000000000..46eb374c18 --- /dev/null +++ b/include/wx/xrc/xmlreshandler.h @@ -0,0 +1,372 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xmlreshandler.cpp +// Purpose: XML resource handler +// Author: Steven Lamerton +// Created: 2011/01/26 +// RCS-ID: $id$ +// Copyright: (c) 2011 Steven Lamerton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XRC_XMLRESHANDLER_H_ +#define _WX_XRC_XMLRESHANDLER_H_ + +#include "wx/defs.h" + +#if wxUSE_XRC + +#include "wx/string.h" +#include "wx/artprov.h" +#include "wx/colour.h" +#include "wx/animate.h" +#include "wx/filesys.h" +#include "wx/imaglist.h" + +class WXDLLIMPEXP_FWD_XML wxXmlNode; +class WXDLLIMPEXP_FWD_XML wxXmlResource; + +class WXDLLIMPEXP_FWD_CORE wxXmlResourceHandler; + +// Helper macro used by the classes derived from wxXmlResourceHandler but also +// by wxXmlResourceHandler implementation itself. +#define XRC_ADD_STYLE(style) AddStyle(wxT(#style), style) + +// Abstract base class for the implementation object used by +// wxXmlResourceHandlerImpl. The real implementation is in +// wxXmlResourceHandlerImpl class in the "xrc" library while this class is in +// the "core" itself -- but it is so small that it doesn't matter. + +class WXDLLIMPEXP_CORE wxXmlResourceHandlerImplBase : public wxObject +{ +public: + // Constructor. + wxXmlResourceHandlerImplBase(wxXmlResourceHandler *handler) + : m_handler(handler) + {} + + // Destructor. + virtual ~wxXmlResourceHandlerImplBase() {} + + virtual wxObject *CreateResource(wxXmlNode *node, wxObject *parent, + wxObject *instance) = 0; + virtual bool IsOfClass(wxXmlNode *node, const wxString& classname) const = 0; + virtual wxString GetNodeContent(const wxXmlNode *node) = 0; + virtual bool HasParam(const wxString& param) = 0; + virtual wxXmlNode *GetParamNode(const wxString& param) = 0; + virtual wxString GetParamValue(const wxString& param) = 0; + virtual wxString GetParamValue(const wxXmlNode* node) = 0; + virtual int GetStyle(const wxString& param = wxT("style"), int defaults = 0) = 0; + virtual wxString GetText(const wxString& param, bool translate = true) = 0; + virtual int GetID() = 0; + virtual wxString GetName() = 0; + virtual bool GetBool(const wxString& param, bool defaultv = false) = 0; + virtual long GetLong(const wxString& param, long defaultv = 0) = 0; + virtual float GetFloat(const wxString& param, float defaultv = 0) = 0; + virtual wxColour GetColour(const wxString& param, + const wxColour& defaultv = wxNullColour) = 0; + virtual wxSize GetSize(const wxString& param = wxT("size"), + wxWindow *windowToUse = NULL) = 0; + virtual wxPoint GetPosition(const wxString& param = wxT("pos")) = 0; + virtual wxCoord GetDimension(const wxString& param, wxCoord defaultv = 0, + wxWindow *windowToUse = NULL) = 0; + virtual wxDirection GetDirection(const wxString& param, wxDirection dir = wxLEFT) = 0; + virtual wxBitmap GetBitmap(const wxString& param = wxT("bitmap"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxBitmap GetBitmap(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxIcon GetIcon(const wxString& param = wxT("icon"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxIcon GetIcon(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) = 0; + virtual wxIconBundle GetIconBundle(const wxString& param, + const wxArtClient& defaultArtClient = wxART_OTHER) = 0; + virtual wxImageList *GetImageList(const wxString& param = wxT("imagelist")) = 0; + +#if wxUSE_ANIMATIONCTRL + virtual wxAnimation GetAnimation(const wxString& param = wxT("animation")) = 0; +#endif + + virtual wxFont GetFont(const wxString& param = wxT("font"), wxWindow* parent = NULL) = 0; + virtual bool GetBoolAttr(const wxString& attr, bool defaultv) = 0; + virtual void SetupWindow(wxWindow *wnd) = 0; + virtual void CreateChildren(wxObject *parent, bool this_hnd_only = false) = 0; + virtual void CreateChildrenPrivately(wxObject *parent, + wxXmlNode *rootnode = NULL) = 0; + virtual wxObject *CreateResFromNode(wxXmlNode *node, wxObject *parent, + wxObject *instance = NULL) = 0; + +#if wxUSE_FILESYSTEM + virtual wxFileSystem& GetCurFileSystem() = 0; +#endif + virtual void ReportError(wxXmlNode *context, const wxString& message) = 0; + virtual void ReportError(const wxString& message) = 0; + virtual void ReportParamError(const wxString& param, const wxString& message) = 0; + + wxXmlResourceHandler* GetHandler() { return m_handler; } + +protected: + wxXmlResourceHandler *m_handler; +}; + +// Base class for all XRC handlers. +// +// Notice that this class is defined in the core library itself and so can be +// used as the base class by classes in any GUI library. However to actually be +// usable, it needs to be registered with wxXmlResource which implies linking +// the application with the xrc library. +// +// Also note that all the methods forwarding to GetImpl() are documented only +// in wxXmlResourceHandlerImpl in wx/xrc/xmlres.h to avoid duplication. + +class WXDLLIMPEXP_CORE wxXmlResourceHandler : public wxObject +{ +public: + // Constructor creates an unusable object, before anything can be done with + // it, SetImpl() needs to be called as done by wxXmlResource::AddHandler(). + wxXmlResourceHandler() + { + m_impl = NULL; + } + + // This should be called exactly once. + void SetImpl(wxXmlResourceHandlerImplBase* impl) + { + wxASSERT_MSG( !m_impl, wxS("Should be called exactly once") ); + + m_impl = impl; + } + + + // Destructor. + virtual ~wxXmlResourceHandler() + { + delete m_impl; + } + + wxObject *CreateResource(wxXmlNode *node, wxObject *parent, + wxObject *instance) + { + return GetImpl()->CreateResource(node, parent, instance); + } + + // This one is called from CreateResource after variables + // were filled. + virtual wxObject *DoCreateResource() = 0; + + // Returns true if it understands this node and can create + // a resource from it, false otherwise. + virtual bool CanHandle(wxXmlNode *node) = 0; + + + void SetParentResource(wxXmlResource *res) + { + m_resource = res; + } + + + // These methods are not forwarded to wxXmlResourceHandlerImpl because they + // are called from the derived classes ctors and so before SetImpl() can be + // called. + + // Add a style flag (e.g. wxMB_DOCKABLE) to the list of flags + // understood by this handler. + void AddStyle(const wxString& name, int value); + + // Add styles common to all wxWindow-derived classes. + void AddWindowStyles(); + +protected: + // Everything else is simply forwarded to wxXmlResourceHandlerImpl. + void ReportError(wxXmlNode *context, const wxString& message) + { + return GetImpl()->ReportError(context, message); + } + void ReportError(const wxString& message) + { + return GetImpl()->ReportError(message); + } + void ReportParamError(const wxString& param, const wxString& message) + { + return GetImpl()->ReportParamError(param, message); + } + + bool IsOfClass(wxXmlNode *node, const wxString& classname) const + { + return GetImpl()->IsOfClass(node, classname); + } + wxString GetNodeContent(const wxXmlNode *node) + { + return GetImpl()->GetNodeContent(node); + } + bool HasParam(const wxString& param) + { + return GetImpl()->HasParam(param); + } + + wxXmlNode *GetParamNode(const wxString& param) + { + return GetImpl()->GetParamNode(param); + } + wxString GetParamValue(const wxString& param) + { + return GetImpl()->GetParamValue(param); + } + wxString GetParamValue(const wxXmlNode* node) + { + return GetImpl()->GetParamValue(node); + } + int GetStyle(const wxString& param = wxT("style"), int defaults = 0) + { + return GetImpl()->GetStyle(param, defaults); + } + wxString GetText(const wxString& param, bool translate = true) + { + return GetImpl()->GetText(param, translate); + } + int GetID() const + { + return GetImpl()->GetID(); + } + wxString GetName() + { + return GetImpl()->GetName(); + } + bool GetBool(const wxString& param, bool defaultv = false) + { + return GetImpl()->GetBool(param, defaultv); + } + long GetLong(const wxString& param, long defaultv = 0) + { + return GetImpl()->GetLong(param, defaultv); + } + float GetFloat(const wxString& param, float defaultv = 0) + { + return GetImpl()->GetFloat(param, defaultv); + } + wxColour GetColour(const wxString& param, + const wxColour& defaultv = wxNullColour) + { + return GetImpl()->GetColour(param, defaultv); + } + wxSize GetSize(const wxString& param = wxT("size"), + wxWindow *windowToUse = NULL) + { + return GetImpl()->GetSize(param, windowToUse); + } + wxPoint GetPosition(const wxString& param = wxT("pos")) + { + return GetImpl()->GetPosition(param); + } + wxCoord GetDimension(const wxString& param, wxCoord defaultv = 0, + wxWindow *windowToUse = NULL) + { + return GetImpl()->GetDimension(param, defaultv, windowToUse); + } + wxDirection GetDirection(const wxString& param, wxDirection dir = wxLEFT) + { + return GetImpl()->GetDirection(param, dir); + } + wxBitmap GetBitmap(const wxString& param = wxT("bitmap"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetBitmap(param, defaultArtClient, size); + } + wxBitmap GetBitmap(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetBitmap(node, defaultArtClient, size); + } + wxIcon GetIcon(const wxString& param = wxT("icon"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetIcon(param, defaultArtClient, size); + } + wxIcon GetIcon(const wxXmlNode* node, + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize) + { + return GetImpl()->GetIcon(node, defaultArtClient, size); + } + wxIconBundle GetIconBundle(const wxString& param, + const wxArtClient& defaultArtClient = wxART_OTHER) + { + return GetImpl()->GetIconBundle(param, defaultArtClient); + } + wxImageList *GetImageList(const wxString& param = wxT("imagelist")) + { + return GetImpl()->GetImageList(param); + } + +#if wxUSE_ANIMATIONCTRL + wxAnimation GetAnimation(const wxString& param = wxT("animation")) + { + return GetImpl()->GetAnimation(param); + } +#endif + + wxFont GetFont(const wxString& param = wxT("font"), + wxWindow* parent = NULL) + { + return GetImpl()->GetFont(param, parent); + } + bool GetBoolAttr(const wxString& attr, bool defaultv) + { + return GetImpl()->GetBoolAttr(attr, defaultv); + } + void SetupWindow(wxWindow *wnd) + { + GetImpl()->SetupWindow(wnd); + } + void CreateChildren(wxObject *parent, bool this_hnd_only = false) + { + GetImpl()->CreateChildren(parent, this_hnd_only); + } + void CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode = NULL) + { + GetImpl()->CreateChildrenPrivately(parent, rootnode); + } + wxObject *CreateResFromNode(wxXmlNode *node, + wxObject *parent, wxObject *instance = NULL) + { + return GetImpl()->CreateResFromNode(node, parent, instance); + } + +#if wxUSE_FILESYSTEM + wxFileSystem& GetCurFileSystem() + { + return GetImpl()->GetCurFileSystem(); + } +#endif + + // Variables (filled by CreateResource) + wxXmlNode *m_node; + wxString m_class; + wxObject *m_parent, *m_instance; + wxWindow *m_parentAsWindow; + wxXmlResource *m_resource; + + wxArrayString m_styleNames; + wxArrayInt m_styleValues; + + friend class wxXmlResourceHandlerImpl; + +private: + // This is supposed to never return NULL because SetImpl() should have been + // called. + wxXmlResourceHandlerImplBase* GetImpl() const; + + wxXmlResourceHandlerImplBase *m_impl; + + wxDECLARE_ABSTRACT_CLASS(wxXmlResourceHandler); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XRC_XMLRESHANDLER_H_