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:
Julian Smart
2012-05-10 11:59:59 +00:00
parent 1e58c8b944
commit 1aca9fcdfc
4 changed files with 46 additions and 18 deletions

View File

@@ -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

View File

@@ -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:
/** /**

View File

@@ -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();

View File

@@ -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