X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b2c1044f9df296935aadd23e2a58f79b018905f..c37b0f0907b07878551a00165b0ad323bd2ccdaf:/src/richtext/richtexthtml.cpp diff --git a/src/richtext/richtexthtml.cpp b/src/richtext/richtexthtml.cpp index 0768034376..c21b00d2d4 100644 --- a/src/richtext/richtexthtml.cpp +++ b/src/richtext/richtexthtml.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2005-09-30 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -75,88 +74,117 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& ClearTemporaryImageLocations(); - buffer->Defragment(); + wxRichTextDrawingContext context(buffer); + buffer->Defragment(context); - wxTextOutputStream str(stream); +#if wxUSE_UNICODE + wxCSConv* customEncoding = NULL; + wxMBConv* conv = NULL; + if (!GetEncoding().IsEmpty()) + { + customEncoding = new wxCSConv(GetEncoding()); + if (!customEncoding->IsOk()) + { + wxDELETE(customEncoding); + } + } + if (customEncoding) + conv = customEncoding; + else + conv = & wxConvUTF8; +#endif - wxTextAttr currentParaStyle = buffer->GetAttributes(); - wxTextAttr currentCharStyle = buffer->GetAttributes(); + { +#if wxUSE_UNICODE + wxTextOutputStream str(stream, wxEOL_NATIVE, *conv); +#else + wxTextOutputStream str(stream, wxEOL_NATIVE); +#endif - if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) - str << wxT("
\n"); + wxRichTextAttr currentParaStyle = buffer->GetAttributes(); + wxRichTextAttr currentCharStyle = buffer->GetAttributes(); - OutputFont(currentParaStyle, str); + if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) + str << wxT("\n"); - m_font = false; - m_inTable = false; + OutputFont(currentParaStyle, str); - m_indents.Clear(); - m_listTypes.Clear(); + m_font = false; + m_inTable = false; - wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst(); - while (node) - { - wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph); - wxASSERT (para != NULL); + m_indents.Clear(); + m_listTypes.Clear(); - if (para) + wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst(); + while (node) { - wxTextAttr paraStyle(para->GetCombinedAttributes()); - - BeginParagraphFormatting(currentParaStyle, paraStyle, str); + wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph); + wxASSERT (para != NULL); - wxRichTextObjectList::compatibility_iterator node2 = para->GetChildren().GetFirst(); - while (node2) + if (para) { - wxRichTextObject* obj = node2->GetData(); - wxRichTextPlainText* textObj = wxDynamicCast(obj, wxRichTextPlainText); - if (textObj && !textObj->IsEmpty()) + wxRichTextAttr paraStyle(para->GetCombinedAttributes()); + + BeginParagraphFormatting(currentParaStyle, paraStyle, str); + + wxRichTextObjectList::compatibility_iterator node2 = para->GetChildren().GetFirst(); + while (node2) { - wxTextAttr charStyle(para->GetCombinedAttributes(obj->GetAttributes())); - BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); + wxRichTextObject* obj = node2->GetData(); + wxRichTextPlainText* textObj = wxDynamicCast(obj, wxRichTextPlainText); + if (textObj && !textObj->IsEmpty()) + { + wxRichTextAttr charStyle(para->GetCombinedAttributes(obj->GetAttributes())); + BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); - wxString text = textObj->GetText(); + wxString text = textObj->GetText(); - if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)) - text.MakeUpper(); + if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)) + text.MakeUpper(); - wxString toReplace = wxRichTextLineBreakChar; - text.Replace(toReplace, wxT("0.0)) + { + styleStr += wxString::Format(wxT("margin-left: %.2fmm; "), indentLeftMM); + } + float indentRightMM = thisStyle.GetRightIndent()/10.0; + if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && thisStyle.HasRightIndent() && (indentRightMM > 0.0)) + { + styleStr += wxString::Format(wxT("margin-right: %.2fmm; "), indentRightMM); + } + // First line indentation + float firstLineIndentMM = - thisStyle.GetLeftSubIndent() / 10.0; + if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && (firstLineIndentMM > 0.0)) + { + styleStr += wxString::Format(wxT("text-indent: %.2fmm; "), firstLineIndentMM); + } + + if (!styleStr.IsEmpty()) + str << wxT(" style=\"") << styleStr << wxT("\""); str << wxT(">"); - // Use a table - int indentTenthsMM = thisStyle.GetLeftIndent() + thisStyle.GetLeftSubIndent(); // TODO: convert to pixels - int indentPixels = indentTenthsMM/4; - str << wxString::Format(wxT("
"), indentPixels);
+ int indentPixels = static_cast
|