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 wxWidgets Change Log
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@@ -427,10 +427,14 @@ All (GUI):
Borders around property grid are now native for consistency. Borders around property grid are now native for consistency.
- Added wxXmlResource::LoadObjectRecursively(). - Added wxXmlResource::LoadObjectRecursively().
- Added wxColour::Set/GetRGB() and Set/GetRGBA() methods (Marcel Haß). - 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: GTK:
- wxRadioBox constructor uses default consistent with other ports now. - wxRadioBox constructor uses default consistent with other ports now.
- Corrected themed border display.
MSW: MSW:
@@ -442,6 +446,9 @@ MSW:
- Allow customizing wxStandardPaths logic for program directory determination. - Allow customizing wxStandardPaths logic for program directory determination.
- Use time in wxDateTime <-> SYSTEMTIME conversion (troelsk). - Use time in wxDateTime <-> SYSTEMTIME conversion (troelsk).
- Setting colours for wxSpinCtrl now works. - 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: i18n:

View File

@@ -18,6 +18,9 @@
#include "wx/richtext/richtextbuffer.h" #include "wx/richtext/richtextbuffer.h"
// Use CSS styles where applicable, otherwise use non-CSS workarounds
#define wxRICHTEXT_HANDLER_USE_CSS 0x1000
/*! /*!
* wxRichTextHTMLHandler * wxRichTextHTMLHandler
*/ */

View File

@@ -49,7 +49,8 @@
- wxRICHTEXT_HANDLER_NO_HEADER_FOOTER - wxRICHTEXT_HANDLER_NO_HEADER_FOOTER
Don't include header and footer tags (HTML, HEAD, BODY), so that the HTML Don't include header and footer tags (HTML, HEAD, BODY), so that the HTML
can be used as part of a larger document. 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} @library{wxrichtext}
@category{richtext} @category{richtext}

View File

@@ -101,33 +101,33 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream&
#else #else
wxTextOutputStream str(stream, wxEOL_NATIVE); wxTextOutputStream str(stream, wxEOL_NATIVE);
#endif #endif
wxTextAttr currentParaStyle = buffer->GetAttributes(); wxTextAttr currentParaStyle = buffer->GetAttributes();
wxTextAttr currentCharStyle = buffer->GetAttributes(); wxTextAttr currentCharStyle = buffer->GetAttributes();
if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0)
str << wxT("<html><head></head><body>\n"); str << wxT("<html><head></head><body>\n");
OutputFont(currentParaStyle, str); OutputFont(currentParaStyle, str);
m_font = false; m_font = false;
m_inTable = false; m_inTable = false;
m_indents.Clear(); m_indents.Clear();
m_listTypes.Clear(); m_listTypes.Clear();
wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst(); wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst();
while (node) while (node)
{ {
wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph); wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph);
wxASSERT (para != NULL); wxASSERT (para != NULL);
if (para) if (para)
{ {
wxTextAttr paraStyle(para->GetCombinedAttributes()); wxTextAttr paraStyle(para->GetCombinedAttributes());
BeginParagraphFormatting(currentParaStyle, paraStyle, str); BeginParagraphFormatting(currentParaStyle, paraStyle, str);
wxRichTextObjectList::compatibility_iterator node2 = para->GetChildren().GetFirst(); wxRichTextObjectList::compatibility_iterator node2 = para->GetChildren().GetFirst();
while (node2) while (node2)
{ {
@@ -137,41 +137,41 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream&
{ {
wxTextAttr charStyle(para->GetCombinedAttributes(obj->GetAttributes())); wxTextAttr charStyle(para->GetCombinedAttributes(obj->GetAttributes()));
BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str);
wxString text = textObj->GetText(); wxString text = textObj->GetText();
if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)) if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
text.MakeUpper(); text.MakeUpper();
wxString toReplace = wxRichTextLineBreakChar; wxString toReplace = wxRichTextLineBreakChar;
text.Replace(toReplace, wxT("<br>")); text.Replace(toReplace, wxT("<br>"));
str << text; str << text;
EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, str);
} }
wxRichTextImage* image = wxDynamicCast(obj, wxRichTextImage); wxRichTextImage* image = wxDynamicCast(obj, wxRichTextImage);
if( image && (!image->IsEmpty() || image->GetImageBlock().GetData())) if( image && (!image->IsEmpty() || image->GetImageBlock().GetData()))
WriteImage( image, stream ); WriteImage( image, stream );
node2 = node2->GetNext(); node2 = node2->GetNext();
} }
EndParagraphFormatting(currentParaStyle, paraStyle, str); EndParagraphFormatting(currentParaStyle, paraStyle, str);
str << wxT("\n"); str << wxT("\n");
} }
node = node->GetNext(); node = node->GetNext();
} }
CloseLists(-1, str); CloseLists(-1, str);
str << wxT("</font>"); str << wxT("</font>");
if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0)
str << wxT("</body></html>"); str << wxT("</body></html>");
str << wxT("\n"); str << wxT("\n");
} }
@@ -284,25 +284,59 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED(
wxString align = GetAlignment(thisStyle); wxString align = GetAlignment(thisStyle);
str << wxString::Format(wxT("<p align=\"%s\""), align.c_str()); str << wxString::Format(wxT("<p align=\"%s\""), align.c_str());
if (thisStyle.HasParagraphSpacingAfter() && thisStyle.GetParagraphSpacingAfter() == 0) wxString styleStr;
str << wxT(" style=\"margin: 0px;\"");
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(">"); str << wxT(">");
// Use a table
int indentTenthsMM = thisStyle.GetLeftIndent() + thisStyle.GetLeftSubIndent();
// TODO: convert to pixels // TODO: convert to pixels
int indentPixels = indentTenthsMM/4; int indentPixels = indentLeftMM*10/4;
str << wxString::Format(wxT("<table border=0 cellpadding=0 cellspacing=0><tr><td width=\"%d\"></td><td>"), indentPixels);
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); OutputFont(thisStyle, str);
if (thisStyle.GetLeftSubIndent() < 0) if (((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) == 0) && (thisStyle.GetLeftSubIndent() < 0))
{ {
str << SymbolicIndent( - thisStyle.GetLeftSubIndent()); str << SymbolicIndent( - thisStyle.GetLeftSubIndent());
} }
m_inTable = true;
} }
} }
else else
@@ -312,8 +346,23 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED(
wxString align = GetAlignment(thisStyle); wxString align = GetAlignment(thisStyle);
str << wxString::Format(wxT("<p align=\"%s\""), align.c_str()); str << wxString::Format(wxT("<p align=\"%s\""), align.c_str());
if (thisStyle.HasParagraphSpacingAfter() && thisStyle.GetParagraphSpacingAfter() == 0) wxString styleStr;
str << wxT(" style=\"margin: 0px;\"");
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(">"); str << wxT(">");
} }