Added wxRichTextXMLHandler::RegisterNodeName so custom content classes can be added without
breaking XML loading git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71399 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
* Includes
|
* Includes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "wx/hashmap.h"
|
||||||
#include "wx/richtext/richtextbuffer.h"
|
#include "wx/richtext/richtextbuffer.h"
|
||||||
#include "wx/richtext/richtextstyles.h"
|
#include "wx/richtext/richtextstyles.h"
|
||||||
|
|
||||||
@@ -97,6 +98,17 @@ public:
|
|||||||
wxString GetText(wxXmlNode *node, const wxString& param = wxEmptyString, bool translate = false);
|
wxString GetText(wxXmlNode *node, const wxString& param = wxEmptyString, bool translate = false);
|
||||||
static wxXmlNode* FindNode(wxXmlNode* node, const wxString& name);
|
static wxXmlNode* FindNode(wxXmlNode* node, const wxString& name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Call with XML node name, C++ class name so that wxRTC can read in the node.
|
||||||
|
If you add a custom object, call this.
|
||||||
|
*/
|
||||||
|
static void RegisterNodeName(const wxString& nodeName, const wxString& className) { sm_nodeNameToClassMap[nodeName] = className; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
Cleans up the mapping between node name and C++ class.
|
||||||
|
*/
|
||||||
|
static void ClearNodeToClassMap() { sm_nodeNameToClassMap.clear(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
#if wxUSE_STREAMS
|
#if wxUSE_STREAMS
|
||||||
virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream);
|
virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream);
|
||||||
@@ -108,6 +120,8 @@ protected:
|
|||||||
wxMBConv* m_convMem;
|
wxMBConv* m_convMem;
|
||||||
wxMBConv* m_convFile;
|
wxMBConv* m_convFile;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static wxStringToStringHashMap sm_nodeNameToClassMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -53,7 +53,7 @@ public:
|
|||||||
Recursively exports an object to the stream.
|
Recursively exports an object to the stream.
|
||||||
*/
|
*/
|
||||||
bool ExportXML(wxOutputStream& stream, wxRichTextObject& obj, int level);
|
bool ExportXML(wxOutputStream& stream, wxRichTextObject& obj, int level);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Helper function: gets node context.
|
Helper function: gets node context.
|
||||||
*/
|
*/
|
||||||
@@ -86,6 +86,17 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool ImportXML(wxRichTextBuffer* buffer, wxRichTextObject* obj, wxXmlNode* node);
|
bool ImportXML(wxRichTextBuffer* buffer, wxRichTextObject* obj, wxXmlNode* node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Call with XML node name, C++ class name so that wxRTC can read in the node.
|
||||||
|
If you add a custom object, call this.
|
||||||
|
*/
|
||||||
|
static void RegisterNodeName(const wxString& nodeName, const wxString& className) { sm_nodeNameToClassMap[nodeName] = className; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
Cleans up the mapping between node name and C++ class.
|
||||||
|
*/
|
||||||
|
static void ClearNodeToClassMap() { sm_nodeNameToClassMap.clear(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -42,6 +42,7 @@
|
|||||||
#include "wx/richtext/richtextstyles.h"
|
#include "wx/richtext/richtextstyles.h"
|
||||||
#include "wx/richtext/richtextimagedlg.h"
|
#include "wx/richtext/richtextimagedlg.h"
|
||||||
#include "wx/richtext/richtextsizepage.h"
|
#include "wx/richtext/richtextsizepage.h"
|
||||||
|
#include "wx/richtext/richtextxml.h"
|
||||||
|
|
||||||
#include "wx/listimpl.cpp"
|
#include "wx/listimpl.cpp"
|
||||||
#include "wx/arrimpl.cpp"
|
#include "wx/arrimpl.cpp"
|
||||||
@@ -9855,6 +9856,17 @@ public:
|
|||||||
wxRichTextBuffer::SetRenderer(new wxRichTextStdRenderer);
|
wxRichTextBuffer::SetRenderer(new wxRichTextStdRenderer);
|
||||||
wxRichTextBuffer::InitStandardHandlers();
|
wxRichTextBuffer::InitStandardHandlers();
|
||||||
wxRichTextParagraph::InitDefaultTabs();
|
wxRichTextParagraph::InitDefaultTabs();
|
||||||
|
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("text"), wxT("wxRichTextPlainText"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("symbol"), wxT("wxRichTextPlainText"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("image"), wxT("wxRichTextImage"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("paragraph"), wxT("wxRichTextParagraph"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("paragraphlayout"), wxT("wxRichTextParagraphLayoutBox"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("textbox"), wxT("wxRichTextBox"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("cell"), wxT("wxRichTextCell"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("table"), wxT("wxRichTextTable"));
|
||||||
|
wxRichTextXMLHandler::RegisterNodeName(wxT("field"), wxT("wxRichTextField"));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void OnExit()
|
void OnExit()
|
||||||
@@ -9862,6 +9874,7 @@ public:
|
|||||||
wxRichTextBuffer::CleanUpHandlers();
|
wxRichTextBuffer::CleanUpHandlers();
|
||||||
wxRichTextBuffer::CleanUpDrawingHandlers();
|
wxRichTextBuffer::CleanUpDrawingHandlers();
|
||||||
wxRichTextBuffer::CleanUpFieldTypes();
|
wxRichTextBuffer::CleanUpFieldTypes();
|
||||||
|
wxRichTextXMLHandler::ClearNodeToClassMap();
|
||||||
wxRichTextDecimalToRoman(-1);
|
wxRichTextDecimalToRoman(-1);
|
||||||
wxRichTextParagraph::ClearDefaultTabs();
|
wxRichTextParagraph::ClearDefaultTabs();
|
||||||
wxRichTextCtrl::ClearAvailableFontNames();
|
wxRichTextCtrl::ClearAvailableFontNames();
|
||||||
|
@@ -89,6 +89,8 @@ static inline void AddString(wxString& str, const wxColour& col) { str << wxT("#
|
|||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxRichTextXMLHandler, wxRichTextFileHandler)
|
IMPLEMENT_DYNAMIC_CLASS(wxRichTextXMLHandler, wxRichTextFileHandler)
|
||||||
|
|
||||||
|
wxStringToStringHashMap wxRichTextXMLHandler::sm_nodeNameToClassMap;
|
||||||
|
|
||||||
void wxRichTextXMLHandler::Init()
|
void wxRichTextXMLHandler::Init()
|
||||||
{
|
{
|
||||||
#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
|
#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
|
||||||
@@ -158,24 +160,12 @@ bool wxRichTextXMLHandler::DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& s
|
|||||||
/// Creates an object given an XML element name
|
/// Creates an object given an XML element name
|
||||||
wxRichTextObject* wxRichTextXMLHandler::CreateObjectForXMLName(wxRichTextObject* WXUNUSED(parent), const wxString& name) const
|
wxRichTextObject* wxRichTextXMLHandler::CreateObjectForXMLName(wxRichTextObject* WXUNUSED(parent), const wxString& name) const
|
||||||
{
|
{
|
||||||
if (name == wxT("text") || name == wxT("symbol"))
|
// The standard node to class mappings are added in wxRichTextModule::OnInit in richtextbuffer.cpp
|
||||||
return new wxRichTextPlainText;
|
wxStringToStringHashMap::const_iterator it = sm_nodeNameToClassMap.find(name);
|
||||||
else if (name == wxT("image"))
|
if (it == sm_nodeNameToClassMap.end())
|
||||||
return new wxRichTextImage;
|
|
||||||
else if (name == wxT("paragraph"))
|
|
||||||
return new wxRichTextParagraph;
|
|
||||||
else if (name == wxT("paragraphlayout"))
|
|
||||||
return new wxRichTextParagraphLayoutBox;
|
|
||||||
else if (name == wxT("textbox"))
|
|
||||||
return new wxRichTextBox;
|
|
||||||
else if (name == wxT("cell"))
|
|
||||||
return new wxRichTextCell;
|
|
||||||
else if (name == wxT("table"))
|
|
||||||
return new wxRichTextTable;
|
|
||||||
else if (name == wxT("field"))
|
|
||||||
return new wxRichTextField;
|
|
||||||
else
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
else
|
||||||
|
return wxDynamicCast(wxCreateDynamicObject(it->second), wxRichTextObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Recursively import an object
|
/// Recursively import an object
|
||||||
|
Reference in New Issue
Block a user