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
This commit is contained in:
Julian Smart 2009-09-23 11:05:52 +00:00
parent 2f0baf9797
commit 4fdc2c5f2a
4 changed files with 95 additions and 35 deletions

View File

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

View File

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

View File

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

View File

@ -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("<html><head></head><body>\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("<br>"));
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("</font>");
if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0)
str << wxT("</body></html>");
str << wxT("\n");
}
@ -284,25 +284,59 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED(
wxString align = GetAlignment(thisStyle);
str << wxString::Format(wxT("<p align=\"%s\""), align.c_str());
if (thisStyle.HasParagraphSpacingAfter() && thisStyle.GetParagraphSpacingAfter() == 0)
str << wxT(" style=\"margin: 0px;\"");
wxString styleStr;
if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && thisStyle.HasParagraphSpacingBefore())
{
float spacingBeforeMM = thisStyle.GetParagraphSpacingBefore() / 10.0;
styleStr += wxString::Format(wxT("margin-top: %.2fmm; "), spacingBeforeMM);
}
if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && thisStyle.HasParagraphSpacingAfter())
{
float spacingAfterMM = thisStyle.GetParagraphSpacingAfter() / 10.0;
styleStr += wxString::Format(wxT("margin-bottom: %.2fmm; "), spacingAfterMM);
}
float indentLeftMM = (thisStyle.GetLeftIndent() + thisStyle.GetLeftSubIndent())/10.0;
if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && (indentLeftMM > 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("<table border=0 cellpadding=0 cellspacing=0><tr><td width=\"%d\"></td><td>"), 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("<table border=0 cellpadding=0 cellspacing=0><tr><td width=\"%d\"></td><td>"), 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("<p align=\"%s\""), align.c_str());
if (thisStyle.HasParagraphSpacingAfter() && thisStyle.GetParagraphSpacingAfter() == 0)
str << wxT(" style=\"margin: 0px;\"");
wxString styleStr;
if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && thisStyle.HasParagraphSpacingBefore())
{
float spacingBeforeMM = thisStyle.GetParagraphSpacingBefore() / 10.0;
styleStr += wxString::Format(wxT("margin-top: %.2fmm; "), spacingBeforeMM);
}
if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && thisStyle.HasParagraphSpacingAfter())
{
float spacingAfterMM = thisStyle.GetParagraphSpacingAfter() / 10.0;
styleStr += wxString::Format(wxT("margin-bottom: %.2fmm; "), spacingAfterMM);
}
if (!styleStr.IsEmpty())
str << wxT(" style=\"") << styleStr << wxT("\"");
str << wxT(">");
}