]> git.saurik.com Git - wxWidgets.git/blobdiff - src/richtext/richtextxml.cpp
Return NULL from wxWindow::GetCapture() when the capture is being lost.
[wxWidgets.git] / src / richtext / richtextxml.cpp
index a8d3894417aa7f8c1875bdacdb069054f8a4152c..2243f7c936e87024cb2d30927e77c10beea19bbc 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Julian Smart
 // Modified by:
 // Created:     2005-09-30
-// RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -89,6 +88,8 @@ static inline void AddString(wxString& str, const wxColour& col) { str << wxT("#
 
 IMPLEMENT_DYNAMIC_CLASS(wxRichTextXMLHandler, wxRichTextFileHandler)
 
+wxStringToStringHashMap wxRichTextXMLHandler::sm_nodeNameToClassMap;
+
 void wxRichTextXMLHandler::Init()
 {
 #if wxRICHTEXT_HAVE_DIRECT_OUTPUT
@@ -158,22 +159,12 @@ bool wxRichTextXMLHandler::DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& s
 /// Creates an object given an XML element name
 wxRichTextObject* wxRichTextXMLHandler::CreateObjectForXMLName(wxRichTextObject* WXUNUSED(parent), const wxString& name) const
 {
-    if (name == wxT("text") || name == wxT("symbol"))
-        return new wxRichTextPlainText;
-    else if (name == wxT("image"))
-        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
+    // The standard node to class mappings are added in wxRichTextModule::OnInit in richtextbuffer.cpp
+    wxStringToStringHashMap::const_iterator it = sm_nodeNameToClassMap.find(name);
+    if (it == sm_nodeNameToClassMap.end())
         return NULL;
+    else
+        return wxDynamicCast(wxCreateDynamicObject(it->second), wxRichTextObject);
 }
 
 /// Recursively import an object
@@ -207,6 +198,11 @@ bool wxRichTextXMLHandler::ImportXML(wxRichTextBuffer* buffer, wxRichTextObject*
 }
 
 bool wxRichTextXMLHandler::ImportProperties(wxRichTextObject* obj, wxXmlNode* node)
+{
+    return ImportProperties(obj->GetProperties(), node);
+}
+
+bool wxRichTextXMLHandler::ImportProperties(wxRichTextProperties& properties, wxXmlNode* node)
 {
     wxXmlNode* child = node->GetChildren();
     while (child)
@@ -225,7 +221,7 @@ bool wxRichTextXMLHandler::ImportProperties(wxRichTextObject* obj, wxXmlNode* no
                     wxVariant var = MakePropertyFromString(name, value, type);
                     if (!var.IsNull())
                     {
-                        obj->GetProperties().SetProperty(var);
+                        properties.SetProperty(var);
                     }
                 }
                 propertyChild = propertyChild->GetNext();
@@ -262,6 +258,8 @@ bool wxRichTextXMLHandler::ImportStyleDefinition(wxRichTextStyleSheet* sheet, wx
             child = child->GetNext();
         }
 
+        ImportProperties(def->GetProperties(), node);
+
         sheet->AddCharacterStyle(def);
     }
     else if (styleType == wxT("paragraphstyle"))
@@ -284,6 +282,8 @@ bool wxRichTextXMLHandler::ImportStyleDefinition(wxRichTextStyleSheet* sheet, wx
             child = child->GetNext();
         }
 
+        ImportProperties(def->GetProperties(), node);
+
         sheet->AddParagraphStyle(def);
     }
     else if (styleType == wxT("boxstyle"))
@@ -304,6 +304,8 @@ bool wxRichTextXMLHandler::ImportStyleDefinition(wxRichTextStyleSheet* sheet, wx
             child = child->GetNext();
         }
 
+        ImportProperties(def->GetProperties(), node);
+
         sheet->AddBoxStyle(def);
     }
     else if (styleType == wxT("liststyle"))
@@ -339,6 +341,8 @@ bool wxRichTextXMLHandler::ImportStyleDefinition(wxRichTextStyleSheet* sheet, wx
             child = child->GetNext();
         }
 
+        ImportProperties(def->GetProperties(), node);
+
         sheet->AddListStyle(def);
     }
 
@@ -835,6 +839,8 @@ bool wxRichTextXMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream&
             wxRichTextBoxStyleDefinition* def = buffer->GetStyleSheet()->GetBoxStyle(i);
             ExportStyleDefinition(styleSheetNode, def);
         }
+
+        WriteProperties(styleSheetNode, buffer->GetStyleSheet()->GetProperties());
     }
     bool success = ExportXML(rootNode, *buffer);
 #if wxRICHTEXT_USE_OUTPUT_TIMINGS
@@ -910,6 +916,8 @@ bool wxRichTextXMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream&
             ExportStyleDefinition(stream, def, level + 1);
         }
 
+        WriteProperties(stream, buffer->GetStyleSheet()->GetProperties(), level);
+
         OutputIndentation(stream, level);
         OutputString(stream, wxT("</stylesheet>"));
     }
@@ -1068,6 +1076,7 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxRichT
         OutputString(stream, wxT("</boxstyle>"));
     }
 
+    WriteProperties(stream, def->GetProperties(), level);
 
     return true;
 }
@@ -1082,8 +1091,10 @@ wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool is
     if (attr.HasBackgroundColour() && attr.GetBackgroundColour().IsOk())
         AddAttribute(str, wxT("bgcolor"), attr.GetBackgroundColour());
 
-    if (attr.HasFontSize())
-        AddAttribute(str, wxT("fontsize"), attr.GetFontSize());
+    if (attr.HasFontPointSize())
+        AddAttribute(str, wxT("fontpointsize"), attr.GetFontSize());
+    else if (attr.HasFontPixelSize())
+        AddAttribute(str, wxT("fontpixelsize"), attr.GetFontSize());
 
     if (attr.HasFontFamily())
         AddAttribute(str, wxT("fontfamily"), attr.GetFontFamily());
@@ -1193,6 +1204,10 @@ wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool is
     AddAttribute(str, wxT("outline"), attr.GetTextBoxAttr().GetOutline());
     AddAttribute(str, wxT("width"), attr.GetTextBoxAttr().GetWidth());
     AddAttribute(str, wxT("height"), attr.GetTextBoxAttr().GetHeight());
+    AddAttribute(str, wxT("minwidth"), attr.GetTextBoxAttr().GetMinSize().GetWidth());
+    AddAttribute(str, wxT("minheight"), attr.GetTextBoxAttr().GetMinSize().GetHeight());
+    AddAttribute(str, wxT("maxwidth"), attr.GetTextBoxAttr().GetMaxSize().GetWidth());
+    AddAttribute(str, wxT("maxheight"), attr.GetTextBoxAttr().GetMaxSize().GetHeight());
 
     if (attr.GetTextBoxAttr().HasVerticalAlignment())
     {
@@ -1262,7 +1277,7 @@ bool wxRichTextXMLHandler::WriteProperties(wxOutputStream& stream, const wxRichT
         level ++;
 
         OutputIndentation(stream, level);
-        OutputString(stream, wxT("<properties"));
+        OutputString(stream, wxT("<properties>"));
 
         level ++;
 
@@ -1279,14 +1294,14 @@ bool wxRichTextXMLHandler::WriteProperties(wxOutputStream& stream, const wxRichT
                 OutputString(stream, wxT("<property name=\"") + name +
                     wxT("\" type=\"") + var.GetType() + wxT("\" value=\""));
                 OutputStringEnt(stream, value);
-                OutputString(stream, wxT("\"/>\n"));
+                OutputString(stream, wxT("\"/>"));
             }
         }
 
         level --;
 
         OutputIndentation(stream, level);
-        OutputString(stream, wxT("</properties>\n"));
+        OutputString(stream, wxT("</properties>"));
 
         level --;
     }
@@ -1369,6 +1384,8 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxXmlNode* parent, wxRichTextSt
         AddAttributes(styleNode, def->GetStyle(), true);
     }
 
+    WriteProperties(defNode, def->GetProperties());
+
     return true;
 }
 
@@ -1379,8 +1396,10 @@ bool wxRichTextXMLHandler::AddAttributes(wxXmlNode* node, wxRichTextAttr& attr,
     if (attr.HasBackgroundColour() && attr.GetBackgroundColour().IsOk())
         node->AddAttribute(wxT("bgcolor"), MakeString(attr.GetBackgroundColour()));
 
-    if (attr.HasFontSize())
-        node->AddAttribute(wxT("fontsize"), MakeString(attr.GetFontSize()));
+    if (attr.HasFontPointSize())
+        node->AddAttribute(wxT("fontpointsize"), MakeString(attr.GetFontSize()));
+    else if (attr.HasFontPixelSize())
+        node->AddAttribute(wxT("fontpixelsize"), MakeString(attr.GetFontSize()));
     if (attr.HasFontFamily())
         node->AddAttribute(wxT("fontfamily"), MakeString(attr.GetFontFamily()));
     if (attr.HasFontItalic())
@@ -1484,6 +1503,10 @@ bool wxRichTextXMLHandler::AddAttributes(wxXmlNode* node, wxRichTextAttr& attr,
     AddAttribute(node, wxT("outline"), attr.GetTextBoxAttr().GetOutline());
     AddAttribute(node, wxT("width"), attr.GetTextBoxAttr().GetWidth());
     AddAttribute(node, wxT("height"), attr.GetTextBoxAttr().GetHeight());
+    AddAttribute(node, wxT("minwidth"), attr.GetTextBoxAttr().GetMinSize().GetWidth());
+    AddAttribute(node, wxT("minheight"), attr.GetTextBoxAttr().GetMinSize().GetHeight());
+    AddAttribute(node, wxT("maxwidth"), attr.GetTextBoxAttr().GetMaxSize().GetWidth());
+    AddAttribute(node, wxT("maxheight"), attr.GetTextBoxAttr().GetMaxSize().GetHeight());
 
     if (attr.GetTextBoxAttr().HasVerticalAlignment())
     {
@@ -1663,10 +1686,15 @@ bool wxRichTextXMLHandler::ImportStyle(wxRichTextAttr& attr, wxXmlNode* node, bo
             if (!value.empty())
                 attr.SetFontStyle((wxFontStyle)wxAtoi(value));
         }
-        else if (name == wxT("fontsize"))
+        else if (name == wxT("fontsize") || name == wxT("fontpointsize"))
+        {
+            if (!value.empty())
+                attr.SetFontPointSize(wxAtoi(value));
+        }
+        else if (name == wxT("fontpixelsize"))
         {
             if (!value.empty())
-                attr.SetFontSize(wxAtoi(value));
+                attr.SetFontPixelSize(wxAtoi(value));
         }
         else if (name == wxT("fontweight"))
         {
@@ -1863,6 +1891,22 @@ bool wxRichTextXMLHandler::ImportStyle(wxRichTextAttr& attr, wxXmlNode* node, bo
             {
                 attr.GetTextBoxAttr().GetHeight().SetValue(wxRichTextParseDimension(value));
             }
+            else if (name == wxT("minwidth"))
+            {
+                attr.GetTextBoxAttr().GetMinSize().GetWidth().SetValue(wxRichTextParseDimension(value));
+            }
+            else if (name == wxT("minheight"))
+            {
+                attr.GetTextBoxAttr().GetMinSize().GetHeight().SetValue(wxRichTextParseDimension(value));
+            }
+            else if (name == wxT("maxwidth"))
+            {
+                attr.GetTextBoxAttr().GetMaxSize().GetWidth().SetValue(wxRichTextParseDimension(value));
+            }
+            else if (name == wxT("maxheight"))
+            {
+                attr.GetTextBoxAttr().GetMaxSize().GetHeight().SetValue(wxRichTextParseDimension(value));
+            }
 
             else if (name == wxT("verticalalignment"))
             {
@@ -2508,6 +2552,7 @@ bool wxRichTextParagraphLayoutBox::ImportFromXML(wxRichTextBuffer* buffer, wxXml
 
             child2 = child2->GetNext();
         }
+        handler->ImportProperties(sheet->GetProperties(), child);
 
         // Notify that styles have changed. If this is vetoed by the app,
         // the new sheet will be deleted. If it is not vetoed, the