From 4fdc2c5f2a4dd7f1394e374095b1cd3a34dfaa1b Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Wed, 23 Sep 2009 11:05:52 +0000 Subject: [PATCH] Added wxRICHTEXT_HANDLER_USE_CSS flag for HTML handler to use CSS where possible. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62032 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 9 ++- include/wx/richtext/richtexthtml.h | 3 + interface/wx/richtext/richtexthtml.h | 3 +- src/richtext/richtexthtml.cpp | 115 +++++++++++++++++++-------- 4 files changed, 95 insertions(+), 35 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 52e2f71b57..1e45b1e7c7 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -1,4 +1,4 @@ -------------------------------------------------------------------------------- +------------------------------------------------------------------------------- wxWidgets Change Log ------------------------------------------------------------------------------- @@ -427,10 +427,14 @@ All (GUI): Borders around property grid are now native for consistency. - Added wxXmlResource::LoadObjectRecursively(). - Added wxColour::Set/GetRGB() and Set/GetRGBA() methods (Marcel Haß). +- wxRTC: added wxRICHTEXT_HANDLER_USE_CSS flag for HTML handler to use CSS + where possible. +- wxRTC: corrected centring and right-justification spacing. GTK: - wxRadioBox constructor uses default consistent with other ports now. +- Corrected themed border display. MSW: @@ -442,6 +446,9 @@ MSW: - Allow customizing wxStandardPaths logic for program directory determination. - Use time in wxDateTime <-> SYSTEMTIME conversion (troelsk). - Setting colours for wxSpinCtrl now works. +- Worked around child window and caret positioning bug (in Windows) when using + wxBORDER_THEME in a container window. +- Suppressed spurious character event for decimal key in numeric keypad. i18n: diff --git a/include/wx/richtext/richtexthtml.h b/include/wx/richtext/richtexthtml.h index dee3f7091f..86cb17af69 100644 --- a/include/wx/richtext/richtexthtml.h +++ b/include/wx/richtext/richtexthtml.h @@ -18,6 +18,9 @@ #include "wx/richtext/richtextbuffer.h" +// Use CSS styles where applicable, otherwise use non-CSS workarounds +#define wxRICHTEXT_HANDLER_USE_CSS 0x1000 + /*! * wxRichTextHTMLHandler */ diff --git a/interface/wx/richtext/richtexthtml.h b/interface/wx/richtext/richtexthtml.h index fba16366be..95b89bc1c5 100644 --- a/interface/wx/richtext/richtexthtml.h +++ b/interface/wx/richtext/richtexthtml.h @@ -49,7 +49,8 @@ - wxRICHTEXT_HANDLER_NO_HEADER_FOOTER Don't include header and footer tags (HTML, HEAD, BODY), so that the HTML can be used as part of a larger document. - + - wxRICHTEXT_HANDLER_USE_CSS + Use CSS where possible, otherwise use workarounds that will show in wxHtmlWindow. @library{wxrichtext} @category{richtext} diff --git a/src/richtext/richtexthtml.cpp b/src/richtext/richtexthtml.cpp index 95f6c4754d..6079da35c5 100644 --- a/src/richtext/richtexthtml.cpp +++ b/src/richtext/richtexthtml.cpp @@ -101,33 +101,33 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& #else wxTextOutputStream str(stream, wxEOL_NATIVE); #endif - + wxTextAttr currentParaStyle = buffer->GetAttributes(); wxTextAttr currentCharStyle = buffer->GetAttributes(); - + if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) str << wxT("\n"); - + OutputFont(currentParaStyle, str); - + m_font = false; m_inTable = false; - + m_indents.Clear(); m_listTypes.Clear(); - + wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst(); while (node) { wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph); wxASSERT (para != NULL); - + if (para) { wxTextAttr paraStyle(para->GetCombinedAttributes()); - + BeginParagraphFormatting(currentParaStyle, paraStyle, str); - + wxRichTextObjectList::compatibility_iterator node2 = para->GetChildren().GetFirst(); while (node2) { @@ -137,41 +137,41 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& { wxTextAttr charStyle(para->GetCombinedAttributes(obj->GetAttributes())); BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); - + wxString text = textObj->GetText(); - + if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)) text.MakeUpper(); - + wxString toReplace = wxRichTextLineBreakChar; text.Replace(toReplace, wxT("
")); - + str << text; - + EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); } - + wxRichTextImage* image = wxDynamicCast(obj, wxRichTextImage); if( image && (!image->IsEmpty() || image->GetImageBlock().GetData())) WriteImage( image, stream ); - + node2 = node2->GetNext(); } - + EndParagraphFormatting(currentParaStyle, paraStyle, str); - + str << wxT("\n"); } node = node->GetNext(); } - + CloseLists(-1, str); - + str << wxT(""); - + if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) str << wxT(""); - + str << wxT("\n"); } @@ -284,25 +284,59 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED( wxString align = GetAlignment(thisStyle); str << wxString::Format(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 = indentLeftMM*10/4; + + if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) == 0) + { + // Use a table to do indenting if we don't have CSS + str << wxString::Format(wxT("
"), indentPixels); + m_inTable = true; + } OutputFont(thisStyle, str); - if (thisStyle.GetLeftSubIndent() < 0) + if (((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) == 0) && (thisStyle.GetLeftSubIndent() < 0)) { str << SymbolicIndent( - thisStyle.GetLeftSubIndent()); } - - m_inTable = true; } } else @@ -312,8 +346,23 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED( wxString align = GetAlignment(thisStyle); str << wxString::Format(wxT("

"); } -- 2.45.2