This fixes the DLL build of aui library as it can now be linked without leaving any unresolved dependencies to the code in xml library (where wxXmlNode is implemented). Closes #15686. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75734 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			413 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			413 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// 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/filesys.h"
 | 
						|
#include "wx/imaglist.h"
 | 
						|
#include "wx/window.h"
 | 
						|
 | 
						|
class WXDLLIMPEXP_FWD_ADV wxAnimation;
 | 
						|
 | 
						|
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 bool IsObjectNode(const wxXmlNode *node) const = 0;
 | 
						|
    virtual wxString GetNodeContent(const wxXmlNode *node) = 0;
 | 
						|
    virtual wxXmlNode *GetNodeParent(const wxXmlNode *node) const = 0;
 | 
						|
    virtual wxXmlNode *GetNodeNext(const wxXmlNode *node) const = 0;
 | 
						|
    virtual wxXmlNode *GetNodeChildren(const wxXmlNode *node) const = 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_node = NULL;
 | 
						|
        m_parent =
 | 
						|
        m_instance = NULL;
 | 
						|
        m_parentAsWindow = NULL;
 | 
						|
        m_resource = NULL;
 | 
						|
 | 
						|
        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)
 | 
						|
    {
 | 
						|
        GetImpl()->ReportError(context, message);
 | 
						|
    }
 | 
						|
    void ReportError(const wxString& message)
 | 
						|
    {
 | 
						|
        GetImpl()->ReportError(message);
 | 
						|
    }
 | 
						|
    void ReportParamError(const wxString& param, const wxString& message)
 | 
						|
    {
 | 
						|
        GetImpl()->ReportParamError(param, message);
 | 
						|
    }
 | 
						|
 | 
						|
    bool IsOfClass(wxXmlNode *node, const wxString& classname) const
 | 
						|
    {
 | 
						|
        return GetImpl()->IsOfClass(node, classname);
 | 
						|
    }
 | 
						|
 | 
						|
    bool IsObjectNode(const wxXmlNode *node) const
 | 
						|
    {
 | 
						|
        return GetImpl()->IsObjectNode(node);
 | 
						|
    }
 | 
						|
    wxString GetNodeContent(const wxXmlNode *node)
 | 
						|
    {
 | 
						|
        return GetImpl()->GetNodeContent(node);
 | 
						|
    }
 | 
						|
 | 
						|
    wxXmlNode *GetNodeParent(const wxXmlNode *node) const
 | 
						|
    {
 | 
						|
        return GetImpl()->GetNodeParent(node);
 | 
						|
    }
 | 
						|
    wxXmlNode *GetNodeNext(const wxXmlNode *node) const
 | 
						|
    {
 | 
						|
        return GetImpl()->GetNodeNext(node);
 | 
						|
    }
 | 
						|
    wxXmlNode *GetNodeChildren(const wxXmlNode *node) const
 | 
						|
    {
 | 
						|
        return GetImpl()->GetNodeChildren(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;
 | 
						|
 | 
						|
    // provide method access to those member variables
 | 
						|
    wxXmlResource* GetResource() const        { return m_resource; }
 | 
						|
    wxXmlNode* GetNode() const                { return m_node; }
 | 
						|
    wxString GetClass() const                 { return m_class; }
 | 
						|
    wxObject* GetParent() const               { return m_parent; }
 | 
						|
    wxObject* GetInstance() const             { return m_instance; }
 | 
						|
    wxWindow* GetParentAsWindow() const       { return m_parentAsWindow; }
 | 
						|
 | 
						|
    
 | 
						|
    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_
 |