X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/603f702b4a0e19ffa27cffc52872efaac1aa8c54..062dfc9a96dc9e796c53544f41ff92dc47f26e82:/src/richtext/richtextxml.cpp?ds=sidebyside diff --git a/src/richtext/richtextxml.cpp b/src/richtext/richtextxml.cpp index 5f2f84cbe9..9a34fd8894 100644 --- a/src/richtext/richtextxml.cpp +++ b/src/richtext/richtextxml.cpp @@ -169,9 +169,9 @@ wxRichTextObject* wxRichTextXMLHandler::CreateObjectForXMLName(wxRichTextObject* else if (name == wxT("textbox")) return new wxRichTextBox; else if (name == wxT("cell")) - return new wxRichTextBox; + return new wxRichTextCell; else if (name == wxT("table")) - return new wxRichTextBox; + return new wxRichTextTable; else return NULL; } @@ -181,9 +181,9 @@ bool wxRichTextXMLHandler::ImportXML(wxRichTextBuffer* buffer, wxRichTextObject* { bool recurse = false; obj->ImportFromXML(buffer, node, this, & recurse); - + // TODO: how to control whether to import children. - + wxRichTextCompositeObject* compositeParent = wxDynamicCast(obj, wxRichTextCompositeObject); if (recurse && compositeParent) { @@ -221,7 +221,7 @@ bool wxRichTextXMLHandler::ImportProperties(wxRichTextObject* obj, wxXmlNode* no wxString name = propertyChild->GetAttribute(wxT("name"), wxEmptyString); wxString value = propertyChild->GetAttribute(wxT("value"), wxEmptyString); wxString type = propertyChild->GetAttribute(wxT("type"), wxEmptyString); - + wxVariant var = MakePropertyFromString(name, value, type); if (!var.IsNull()) { @@ -406,11 +406,15 @@ wxString wxRichTextXMLHandler::GetText(wxXmlNode *node, const wxString& param, b wxXmlNode* wxRichTextXMLHandler::FindNode(wxXmlNode* node, const wxString& name) { + if (node->GetName() == name && name == wxT("stylesheet")) + return node; + wxXmlNode* child = node->GetChildren(); while (child) { if (child->GetName() == name) return child; + child = child->GetNext(); } return NULL; } @@ -743,7 +747,7 @@ bool wxRichTextXMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& return false; wxString version(wxT("1.0") ) ; - + bool deleteConvFile = false; wxString fileEncoding; //wxMBConv* convFile = NULL; @@ -788,7 +792,7 @@ bool wxRichTextXMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& #endif wxXmlDocument* doc = new wxXmlDocument; doc->SetFileEncoding(fileEncoding); - + wxXmlNode* rootNode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("richtext")); doc->SetRoot(rootNode); rootNode->AddAttribute(wxT("version"), wxT("1.0.0.0")); @@ -798,12 +802,12 @@ bool wxRichTextXMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& { wxXmlNode* styleSheetNode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("stylesheet")); rootNode->AddChild(styleSheetNode); - + wxString nameAndDescr; - + if (!buffer->GetStyleSheet()->GetName().empty()) styleSheetNode->AddAttribute(wxT("name"), buffer->GetStyleSheet()->GetName()); - + if (!buffer->GetStyleSheet()->GetDescription().empty()) styleSheetNode->AddAttribute(wxT("description"), buffer->GetStyleSheet()->GetDescription()); @@ -942,20 +946,25 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxRichT wxRichTextListStyleDefinition* listDef = wxDynamicCast(def, wxRichTextListStyleDefinition); wxRichTextBoxStyleDefinition* boxDef = wxDynamicCast(def, wxRichTextBoxStyleDefinition); + wxString name = def->GetName(); + wxString nameProp; + if (!name.empty()) + nameProp = wxT(" name=\"") + AttributeToXML(name) + wxT("\""); + wxString baseStyle = def->GetBaseStyle(); wxString baseStyleProp; if (!baseStyle.empty()) - baseStyleProp = wxT(" basestyle=\"") + baseStyle + wxT("\""); + baseStyleProp = wxT(" basestyle=\"") + AttributeToXML(baseStyle) + wxT("\""); wxString descr = def->GetDescription(); wxString descrProp; if (!descr.empty()) - descrProp = wxT(" description=\"") + descr + wxT("\""); + descrProp = wxT(" description=\"") + AttributeToXML(descr) + wxT("\""); if (charDef) { OutputIndentation(stream, level); - OutputString(stream, wxT("")); + OutputString(stream, wxT("")); level ++; @@ -977,9 +986,9 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxRichT OutputIndentation(stream, level); if (!listDef->GetNextStyle().empty()) - baseStyleProp << wxT(" nextstyle=\"") << listDef->GetNextStyle() << wxT("\""); + baseStyleProp << wxT(" nextstyle=\"") << AttributeToXML(listDef->GetNextStyle()) << wxT("\""); - OutputString(stream, wxT("")); + OutputString(stream, wxT("")); level ++; @@ -1018,9 +1027,9 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxRichT OutputIndentation(stream, level); if (!paraDef->GetNextStyle().empty()) - baseStyleProp << wxT(" nextstyle=\"") << paraDef->GetNextStyle() << wxT("\""); + baseStyleProp << wxT(" nextstyle=\"") << AttributeToXML(paraDef->GetNextStyle()) << wxT("\""); - OutputString(stream, wxT("")); + OutputString(stream, wxT("")); level ++; @@ -1041,7 +1050,7 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxRichT { OutputIndentation(stream, level); - OutputString(stream, wxT("")); + OutputString(stream, wxT("")); level ++; @@ -1067,10 +1076,10 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxRichT wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool isPara) { wxString str; - if (attr.HasTextColour() && attr.GetTextColour().Ok()) + if (attr.HasTextColour() && attr.GetTextColour().IsOk()) AddAttribute(str, wxT("textcolor"), attr.GetTextColour()); - if (attr.HasBackgroundColour() && attr.GetBackgroundColour().Ok()) + if (attr.HasBackgroundColour() && attr.GetBackgroundColour().IsOk()) AddAttribute(str, wxT("bgcolor"), attr.GetBackgroundColour()); if (attr.HasFontSize()) @@ -1089,7 +1098,7 @@ wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool is AddAttribute(str, wxT("fontunderlined"), (int) attr.GetFontUnderlined()); if (attr.HasFontFaceName()) - AddAttribute(str, wxT("fontface"), attr.GetFontFaceName()); + AddAttribute(str, wxT("fontface"), AttributeToXML(attr.GetFontFaceName())); if (attr.HasTextEffects()) { @@ -1098,7 +1107,7 @@ wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool is } if (!attr.GetCharacterStyleName().empty()) - AddAttribute(str, wxT("characterstyle"), attr.GetCharacterStyleName()); + AddAttribute(str, wxT("characterstyle"), AttributeToXML(attr.GetCharacterStyleName())); if (attr.HasURL()) AddAttribute(str, wxT("url"), AttributeToXML(attr.GetURL())); @@ -1139,19 +1148,19 @@ wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool is if (!attr.GetBulletText().empty() && (attr.GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_SYMBOL)) AddAttribute(str, wxT("bulletsymbol"), (int) (attr.GetBulletText()[0])); else - AddAttribute(str, wxT("bullettext"), attr.GetBulletText()); + AddAttribute(str, wxT("bullettext"), AttributeToXML(attr.GetBulletText())); AddAttribute(str, wxT("bulletfont"), attr.GetBulletFont()); } if (attr.HasBulletName()) - AddAttribute(str, wxT("bulletname"), attr.GetBulletName()); + AddAttribute(str, wxT("bulletname"), AttributeToXML(attr.GetBulletName())); if (!attr.GetParagraphStyleName().empty()) - AddAttribute(str, wxT("parstyle"), attr.GetParagraphStyleName()); + AddAttribute(str, wxT("parstyle"), AttributeToXML(attr.GetParagraphStyleName())); if (!attr.GetListStyleName().empty()) - AddAttribute(str, wxT("liststyle"), attr.GetListStyleName()); + AddAttribute(str, wxT("liststyle"), AttributeToXML(attr.GetListStyleName())); if (attr.HasTabs()) { @@ -1173,15 +1182,29 @@ wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool is if (attr.HasOutlineLevel()) AddAttribute(str, wxT("outlinelevel"), (int) attr.GetOutlineLevel()); } - + AddAttribute(str, wxT("margin"), attr.GetTextBoxAttr().GetMargins()); AddAttribute(str, wxT("padding"), attr.GetTextBoxAttr().GetPadding()); AddAttribute(str, wxT("position"), attr.GetTextBoxAttr().GetPosition()); AddAttribute(str, wxT("border"), attr.GetTextBoxAttr().GetBorder()); AddAttribute(str, wxT("outline"), attr.GetTextBoxAttr().GetOutline()); AddAttribute(str, wxT("width"), attr.GetTextBoxAttr().GetWidth()); - AddAttribute(str, wxT("height"), attr.GetTextBoxAttr().GetWidth()); - + AddAttribute(str, wxT("height"), attr.GetTextBoxAttr().GetHeight()); + + if (attr.GetTextBoxAttr().HasVerticalAlignment()) + { + wxString value; + if (attr.GetTextBoxAttr().GetVerticalAlignment() == wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_TOP) + value = wxT("top"); + else if (attr.GetTextBoxAttr().GetVerticalAlignment() == wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_CENTRE) + value = wxT("centre"); + else if (attr.GetTextBoxAttr().GetVerticalAlignment() == wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_BOTTOM) + value = wxT("bottom"); + else + value = wxT("none"); + AddAttribute(str, wxT("verticalalignment"), value); + } + if (attr.GetTextBoxAttr().HasFloatMode()) { wxString value; @@ -1199,9 +1222,9 @@ wxString wxRichTextXMLHandler::AddAttributes(const wxRichTextAttr& attr, bool is wxString value; if (attr.GetTextBoxAttr().GetClearMode() == wxTEXT_BOX_ATTR_CLEAR_LEFT) value = wxT("left"); - else if (attr.GetTextBoxAttr().GetFloatMode() == wxTEXT_BOX_ATTR_CLEAR_RIGHT) + else if (attr.GetTextBoxAttr().GetClearMode() == wxTEXT_BOX_ATTR_CLEAR_RIGHT) value = wxT("right"); - else if (attr.GetTextBoxAttr().GetFloatMode() == wxTEXT_BOX_ATTR_CLEAR_BOTH) + else if (attr.GetTextBoxAttr().GetClearMode() == wxTEXT_BOX_ATTR_CLEAR_BOTH) value = wxT("both"); else value = wxT("none"); @@ -1245,7 +1268,7 @@ bool wxRichTextXMLHandler::WriteProperties(wxOutputStream& stream, const wxRichT { const wxVariant& var = properties[i]; if (!var.IsNull()) - { + { const wxString& name = var.GetName(); wxString value = MakeStringFromProperty(var); @@ -1289,17 +1312,17 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxXmlNode* parent, wxRichTextSt wxString baseStyle = def->GetBaseStyle(); wxString descr = def->GetDescription(); - + wxXmlNode* defNode = new wxXmlNode(wxXML_ELEMENT_NODE, wxEmptyString); parent->AddChild(defNode); if (!baseStyle.empty()) defNode->AddAttribute(wxT("basestyle"), baseStyle); if (!descr.empty()) defNode->AddAttribute(wxT("description"), descr); - + wxXmlNode* styleNode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("style")); defNode->AddChild(styleNode); - + if (charDef) { defNode->SetName(wxT("characterstyle")); @@ -1348,9 +1371,9 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxXmlNode* parent, wxRichTextSt bool wxRichTextXMLHandler::AddAttributes(wxXmlNode* node, wxRichTextAttr& attr, bool isPara) { - if (attr.HasTextColour() && attr.GetTextColour().Ok()) + if (attr.HasTextColour() && attr.GetTextColour().IsOk()) node->AddAttribute(wxT("textcolor"), MakeString(attr.GetTextColour())); - if (attr.HasBackgroundColour() && attr.GetBackgroundColour().Ok()) + if (attr.HasBackgroundColour() && attr.GetBackgroundColour().IsOk()) node->AddAttribute(wxT("bgcolor"), MakeString(attr.GetBackgroundColour())); if (attr.HasFontSize()) @@ -1454,7 +1477,21 @@ bool wxRichTextXMLHandler::AddAttributes(wxXmlNode* node, wxRichTextAttr& attr, AddAttribute(node, wxT("border"), attr.GetTextBoxAttr().GetBorder()); AddAttribute(node, wxT("outline"), attr.GetTextBoxAttr().GetOutline()); AddAttribute(node, wxT("width"), attr.GetTextBoxAttr().GetWidth()); - AddAttribute(node, wxT("height"), attr.GetTextBoxAttr().GetWidth()); + AddAttribute(node, wxT("height"), attr.GetTextBoxAttr().GetHeight()); + + if (attr.GetTextBoxAttr().HasVerticalAlignment()) + { + wxString value; + if (attr.GetTextBoxAttr().GetVerticalAlignment() == wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_TOP) + value = wxT("top"); + else if (attr.GetTextBoxAttr().GetVerticalAlignment() == wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_CENTRE) + value = wxT("centre"); + else if (attr.GetTextBoxAttr().GetVerticalAlignment() == wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_BOTTOM) + value = wxT("bottom"); + else + value = wxT("none"); + AddAttribute(node, wxT("verticalalignment"), value); + } if (attr.GetTextBoxAttr().HasFloatMode()) { @@ -1473,9 +1510,9 @@ bool wxRichTextXMLHandler::AddAttributes(wxXmlNode* node, wxRichTextAttr& attr, wxString value; if (attr.GetTextBoxAttr().GetClearMode() == wxTEXT_BOX_ATTR_CLEAR_LEFT) value = wxT("left"); - else if (attr.GetTextBoxAttr().GetFloatMode() == wxTEXT_BOX_ATTR_CLEAR_RIGHT) + else if (attr.GetTextBoxAttr().GetClearMode() == wxTEXT_BOX_ATTR_CLEAR_RIGHT) value = wxT("right"); - else if (attr.GetTextBoxAttr().GetFloatMode() == wxTEXT_BOX_ATTR_CLEAR_BOTH) + else if (attr.GetTextBoxAttr().GetClearMode() == wxTEXT_BOX_ATTR_CLEAR_BOTH) value = wxT("both"); else value = wxT("none"); @@ -1814,6 +1851,17 @@ bool wxRichTextXMLHandler::ImportStyle(wxRichTextAttr& attr, wxXmlNode* node, bo attr.GetTextBoxAttr().GetHeight().SetValue(wxRichTextParseDimension(value)); } + else if (name == wxT("verticalalignment")) + { + if (value == wxT("top")) + attr.GetTextBoxAttr().SetVerticalAlignment(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_TOP); + else if (value == wxT("centre")) + attr.GetTextBoxAttr().SetVerticalAlignment(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_CENTRE); + else if (value == wxT("bottom")) + attr.GetTextBoxAttr().SetVerticalAlignment(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_BOTTOM); + else if (value == wxT("none")) + attr.GetTextBoxAttr().SetVerticalAlignment(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_NONE); + } else if (name == wxT("float")) { if (value == wxT("left")) @@ -1929,7 +1977,7 @@ bool wxRichTextXMLHandler::ImportStyle(wxRichTextAttr& attr, wxXmlNode* node, bo attr.GetTextBoxAttr().GetPosition().GetBottom().SetValue(wxRichTextParseDimension(value)); } } - + xmlAttr = xmlAttr->GetNext(); } @@ -1944,8 +1992,8 @@ bool wxRichTextObject::ImportFromXML(wxRichTextBuffer* WXUNUSED(buffer), wxXmlNo { handler->ImportProperties(this, node); handler->ImportStyle(GetAttributes(), node, UsesParagraphAttributes()); - - *recurse = false; + + *recurse = true; return true; } @@ -1965,7 +2013,7 @@ bool wxRichTextObject::ExportXML(wxOutputStream& stream, int indent, wxRichTextX { handler->WriteProperties(stream, GetProperties(), indent); } - + wxRichTextCompositeObject* composite = wxDynamicCast(this, wxRichTextCompositeObject); if (composite) { @@ -2011,7 +2059,7 @@ bool wxRichTextObject::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handle bool wxRichTextPlainText::ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse) { wxRichTextObject::ImportFromXML(buffer, node, handler, recurse); - + if (node->GetName() == wxT("text")) { wxString text; @@ -2036,7 +2084,7 @@ bool wxRichTextPlainText::ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* nod } textChild = textChild->GetNext(); } - + SetText(text); } else if (node->GetName() == wxT("symbol")) @@ -2157,7 +2205,7 @@ bool wxRichTextPlainText::ExportXML(wxOutputStream& stream, int indent, wxRichTe ::OutputString(stream, wxT("GetConvMem(), handler->GetConvFile()); ::OutputString(stream, style + wxT(">"), handler->GetConvMem(), handler->GetConvFile()); - + if (GetProperties().GetCount() > 0) { handler->WriteProperties(stream, GetProperties(), indent); @@ -2217,7 +2265,7 @@ bool wxRichTextPlainText::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* han parent->AddChild(elementNode); handler->AddAttributes(elementNode, GetAttributes(), false); handler->WriteProperties(elementNode, GetProperties()); - + wxXmlNode* textNode = new wxXmlNode(wxXML_TEXT_NODE, wxT("text")); elementNode->AddChild(textNode); @@ -2231,7 +2279,7 @@ bool wxRichTextPlainText::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* han // Output this character as a number in a separate tag, because XML can't cope // with entities below 32 except for 10 and 13 - + wxXmlNode* elementNode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("symbol")); parent->AddChild(elementNode); @@ -2257,14 +2305,14 @@ bool wxRichTextPlainText::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* han wxXmlNode* elementNode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("text")); parent->AddChild(elementNode); handler->AddAttributes(elementNode, GetAttributes(), false); - + wxXmlNode* textNode = new wxXmlNode(wxXML_TEXT_NODE, wxT("text")); elementNode->AddChild(textNode); if (fragment[0] == wxT(' ') || fragment[fragment.length()-1] == wxT(' ')) fragment = wxT("\"") + fragment + wxT("\""); - textNode->SetContent(fragment); + textNode->SetContent(fragment); } return true; } @@ -2318,7 +2366,7 @@ bool wxRichTextImage::ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, w wxStringInputStream strStream(data); GetImageBlock().ReadHex(strStream, data.length(), imageType); - + return true; } else @@ -2333,7 +2381,7 @@ bool wxRichTextImage::ExportXML(wxOutputStream& stream, int indent, wxRichTextXM ::OutputIndentation(stream, indent); ::OutputString(stream, wxT("GetConvMem(), handler->GetConvFile()); - if (!GetImageBlock().Ok()) + if (!GetImageBlock().IsOk()) { // No data ::OutputString(stream, style + wxT(">"), handler->GetConvMem(), handler->GetConvFile()); @@ -2371,7 +2419,7 @@ bool wxRichTextImage::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler wxXmlNode* elementNode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("image")); parent->AddChild(elementNode); - if (GetImageBlock().Ok()) + if (GetImageBlock().IsOk()) elementNode->AddAttribute(wxT("imagetype"), MakeString((int) GetImageBlock().GetImageType())); handler->AddAttributes(elementNode, GetAttributes(), false); @@ -2383,7 +2431,7 @@ bool wxRichTextImage::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler dataNode->AddChild(textNode); wxString strData; -#if 1 +#if 1 { wxMemoryOutputStream stream; if (GetImageBlock().WriteHex(stream)) @@ -2403,12 +2451,12 @@ bool wxRichTextImage::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler else strData = wxEmptyString; } - + } #else { wxStringOutputStream strStream(& strData); - GetImageBlock().WriteHex(strStream); + GetImageBlock().WriteHex(strStream); } #endif @@ -2424,7 +2472,7 @@ bool wxRichTextImage::ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler bool wxRichTextParagraphLayoutBox::ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse) { wxRichTextObject::ImportFromXML(buffer, node, handler, recurse); - + *recurse = true; wxString partial = node->GetAttribute(wxT("partialparagraph"), wxEmptyString); @@ -2476,7 +2524,7 @@ bool wxRichTextParagraphLayoutBox::ExportXML(wxOutputStream& stream, int indent, { handler->WriteProperties(stream, GetProperties(), indent); } - + size_t i; for (i = 0; i < GetChildCount(); i++) { @@ -2517,12 +2565,12 @@ bool wxRichTextParagraphLayoutBox::ExportXML(wxXmlNode* parent, wxRichTextXMLHan bool wxRichTextTable::ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse) { wxRichTextBox::ImportFromXML(buffer, node, handler, recurse); - + *recurse = false; m_rowCount = wxAtoi(node->GetAttribute(wxT("rows"), wxEmptyString)); m_colCount = wxAtoi(node->GetAttribute(wxT("cols"), wxEmptyString)); - + wxXmlNode* child = node->GetChildren(); while (child) { @@ -2574,7 +2622,7 @@ bool wxRichTextTable::ExportXML(wxOutputStream& stream, int indent, wxRichTextXM { handler->WriteProperties(stream, GetProperties(), indent); } - + int i, j; for (i = 0; i < m_rowCount; i++) {