From 0d7acfb995b00c7a78e4d6f1a62c813427d2fae9 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 7 Oct 2012 22:38:56 +0000 Subject: [PATCH] Support some CSS styles for the links in wxHTML too. Refactor limited CSS styles support for tag to reuse it for tag as well. Closes #14599. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72630 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/html/winpars.h | 4 ++ src/html/m_links.cpp | 26 +++++++++ src/html/m_span.cpp | 103 +----------------------------------- src/html/winpars.cpp | 107 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 139 insertions(+), 102 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 59fb3b6d12..220a922f25 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -562,6 +562,7 @@ All (GUI): - Show tooltips for the too long items in generic wxTreeCtrl (Steven Houchins). - Add wxStyledTextCtrl::AnnotationClearLine() (sentieshar). - Add support for background-color style to span element in wxHTML (gevorg). +- Add limited support for CSS styles for tags too in wxHTML (gevorg). - Add "inherit" to XRC tag (Steffen Olszewski, Gero Meßsysteme GmbH). - Add support for wxALWAYS_SHOW_SB style to wxScrolled<> (Catalin Raceanu). diff --git a/include/wx/html/winpars.h b/include/wx/html/winpars.h index bdb16749cf..f634481287 100644 --- a/include/wx/html/winpars.h +++ b/include/wx/html/winpars.h @@ -259,6 +259,8 @@ private: // the wxHtmlWinParser object //----------------------------------------------------------------------------- +class WXDLLIMPEXP_HTML wxHtmlStyleParams; + class WXDLLIMPEXP_HTML wxHtmlWinTagHandler : public wxHtmlTagHandler { DECLARE_ABSTRACT_CLASS(wxHtmlWinTagHandler) @@ -271,6 +273,8 @@ public: protected: wxHtmlWinParser *m_WParser; // same as m_Parser, but overcasted + void ApplyStyle(const wxHtmlStyleParams &styleParams); + wxDECLARE_NO_COPY_CLASS(wxHtmlWinTagHandler); }; diff --git a/src/html/m_links.cpp b/src/html/m_links.cpp index 9343b893f5..308fa73b34 100644 --- a/src/html/m_links.cpp +++ b/src/html/m_links.cpp @@ -20,6 +20,7 @@ #include "wx/html/forcelnk.h" #include "wx/html/m_templ.h" +#include "wx/html/styleparams.h" FORCE_LINK_ME(m_links) @@ -70,24 +71,49 @@ TAG_HANDLER_BEGIN(A, "A") { wxHtmlLinkInfo oldlnk = m_WParser->GetLink(); wxColour oldclr = m_WParser->GetActualColor(); + wxColour oldbackclr = m_WParser->GetActualBackgroundColor(); + int oldbackmode = m_WParser->GetActualBackgroundMode(); + int oldsize = m_WParser->GetFontSize(); + int oldbold = m_WParser->GetFontBold(); + int olditalic = m_WParser->GetFontItalic(); int oldund = m_WParser->GetFontUnderlined(); + wxString oldfontface = m_WParser->GetFontFace(); wxString name(tag.GetParam( wxT("HREF") )), target; if (tag.HasParam( wxT("TARGET") )) target = tag.GetParam( wxT("TARGET") ); + + // set default styles, might get overridden by ApplyStyle m_WParser->SetActualColor(m_WParser->GetLinkColor()); m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(m_WParser->GetLinkColor())); m_WParser->SetFontUnderlined(true); m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); m_WParser->SetLink(wxHtmlLinkInfo(name, target)); + // Load any style parameters + wxHtmlStyleParams styleParams(tag); + ApplyStyle(styleParams); + ParseInner(tag); m_WParser->SetLink(oldlnk); + m_WParser->SetFontSize(oldsize); + m_WParser->SetFontBold(oldbold); + m_WParser->SetFontFace(oldfontface); + m_WParser->SetFontItalic(olditalic); m_WParser->SetFontUnderlined(oldund); m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); m_WParser->SetActualColor(oldclr); m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(oldclr)); + if (oldbackmode != m_WParser->GetActualBackgroundMode() || + oldbackclr != m_WParser->GetActualBackgroundColor()) + { + m_WParser->SetActualBackgroundMode(oldbackmode); + m_WParser->SetActualBackgroundColor(oldbackclr); + m_WParser->GetContainer()->InsertCell( + new wxHtmlColourCell(oldbackclr, oldbackmode == wxTRANSPARENT ? wxHTML_CLR_TRANSPARENT_BACKGROUND : wxHTML_CLR_BACKGROUND)); + } + return true; } else return false; diff --git a/src/html/m_span.cpp b/src/html/m_span.cpp index 8e1b99716c..959ff4d253 100644 --- a/src/html/m_span.cpp +++ b/src/html/m_span.cpp @@ -45,108 +45,7 @@ TAG_HANDLER_BEGIN(SPAN, "SPAN" ) // Load any style parameters wxHtmlStyleParams styleParams(tag); - wxString str; - - str = styleParams.GetParam(wxS("color")); - if ( !str.empty() ) - { - wxColour clr; - if ( wxHtmlTag::ParseAsColour(str, &clr) ) - { - m_WParser->SetActualColor(clr); - m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(clr)); - } - } - - str = styleParams.GetParam(wxS("background-color")); - if ( !str.empty() ) - { - wxColour clr; - if ( wxHtmlTag::ParseAsColour(str, &clr) ) - { - m_WParser->SetActualBackgroundColor(clr); - m_WParser->SetActualBackgroundMode(wxSOLID); - m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(clr, wxHTML_CLR_BACKGROUND)); - } - } - - str = styleParams.GetParam(wxS("font-size")); - if ( !str.empty() ) - { - // Point size - int foundIndex = str.Find(wxS("pt")); - if (foundIndex != wxNOT_FOUND) - { - str.Truncate(foundIndex); - - long sizeValue; - if (str.ToLong(&sizeValue) == true) - { - // Set point size - m_WParser->SetFontPointSize(sizeValue); - m_WParser->GetContainer()->InsertCell( - new wxHtmlFontCell(m_WParser->CreateCurrentFont())); - } - } - // else: check for other ways of specifying size (TODO) - } - - str = styleParams.GetParam(wxS("font-weight")); - if ( !str.empty() ) - { - // Only bold and normal supported just now - if ( str == wxS("bold") ) - { - m_WParser->SetFontBold(true); - m_WParser->GetContainer()->InsertCell( - new wxHtmlFontCell(m_WParser->CreateCurrentFont())); - } - else if ( str == wxS("normal") ) - { - m_WParser->SetFontBold(false); - m_WParser->GetContainer()->InsertCell( - new wxHtmlFontCell(m_WParser->CreateCurrentFont())); - } - } - - str = styleParams.GetParam(wxS("font-style")); - if ( !str.empty() ) - { - // "oblique" and "italic" are more or less the same. - // "inherit" (using the parent font) is not supported. - if ( str == wxS("oblique") || str == wxS("italic") ) - { - m_WParser->SetFontItalic(true); - m_WParser->GetContainer()->InsertCell( - new wxHtmlFontCell(m_WParser->CreateCurrentFont())); - } - else if ( str == wxS("normal") ) - { - m_WParser->SetFontItalic(false); - m_WParser->GetContainer()->InsertCell( - new wxHtmlFontCell(m_WParser->CreateCurrentFont())); - } - } - - str = styleParams.GetParam(wxS("text-decoration")); - if ( !str.empty() ) - { - // Only underline is supported. - if ( str == wxS("underline") ) - { - m_WParser->SetFontUnderlined(true); - m_WParser->GetContainer()->InsertCell( - new wxHtmlFontCell(m_WParser->CreateCurrentFont())); - } - } - - str = styleParams.GetParam(wxS("font-family")); - if ( !str.empty() ) - { - m_WParser->SetFontFace(str); - m_WParser->GetContainer()->InsertCell( - new wxHtmlFontCell(m_WParser->CreateCurrentFont())); - } + ApplyStyle(styleParams); ParseInner(tag); diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index adb15c8328..09bd92284a 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -25,6 +25,7 @@ #include "wx/html/htmldefs.h" #include "wx/html/winpars.h" #include "wx/html/htmlwin.h" +#include "wx/html/styleparams.h" #include "wx/fontmap.h" #include "wx/uri.h" @@ -753,6 +754,112 @@ void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc) IMPLEMENT_ABSTRACT_CLASS(wxHtmlWinTagHandler, wxHtmlTagHandler) +void wxHtmlWinTagHandler::ApplyStyle(const wxHtmlStyleParams &styleParams) +{ + wxString str; + + str = styleParams.GetParam(wxS("color")); + if ( !str.empty() ) + { + wxColour clr; + if ( wxHtmlTag::ParseAsColour(str, &clr) ) + { + m_WParser->SetActualColor(clr); + m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(clr)); + } + } + + str = styleParams.GetParam(wxS("background-color")); + if ( !str.empty() ) + { + wxColour clr; + if ( wxHtmlTag::ParseAsColour(str, &clr) ) + { + m_WParser->SetActualBackgroundColor(clr); + m_WParser->SetActualBackgroundMode(wxSOLID); + m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(clr, wxHTML_CLR_BACKGROUND)); + } + } + + str = styleParams.GetParam(wxS("font-size")); + if ( !str.empty() ) + { + // Point size + int foundIndex = str.Find(wxS("pt")); + if (foundIndex != wxNOT_FOUND) + { + str.Truncate(foundIndex); + + long sizeValue; + if (str.ToLong(&sizeValue) == true) + { + // Set point size + m_WParser->SetFontPointSize(sizeValue); + m_WParser->GetContainer()->InsertCell( + new wxHtmlFontCell(m_WParser->CreateCurrentFont())); + } + } + // else: check for other ways of specifying size (TODO) + } + + str = styleParams.GetParam(wxS("font-weight")); + if ( !str.empty() ) + { + // Only bold and normal supported just now + if ( str == wxS("bold") ) + { + m_WParser->SetFontBold(true); + m_WParser->GetContainer()->InsertCell( + new wxHtmlFontCell(m_WParser->CreateCurrentFont())); + } + else if ( str == wxS("normal") ) + { + m_WParser->SetFontBold(false); + m_WParser->GetContainer()->InsertCell( + new wxHtmlFontCell(m_WParser->CreateCurrentFont())); + } + } + + str = styleParams.GetParam(wxS("font-style")); + if ( !str.empty() ) + { + // "oblique" and "italic" are more or less the same. + // "inherit" (using the parent font) is not supported. + if ( str == wxS("oblique") || str == wxS("italic") ) + { + m_WParser->SetFontItalic(true); + m_WParser->GetContainer()->InsertCell( + new wxHtmlFontCell(m_WParser->CreateCurrentFont())); + } + else if ( str == wxS("normal") ) + { + m_WParser->SetFontItalic(false); + m_WParser->GetContainer()->InsertCell( + new wxHtmlFontCell(m_WParser->CreateCurrentFont())); + } + } + + str = styleParams.GetParam(wxS("text-decoration")); + if ( !str.empty() ) + { + // Only underline is supported. + if ( str == wxS("underline") ) + { + m_WParser->SetFontUnderlined(true); + m_WParser->GetContainer()->InsertCell( + new wxHtmlFontCell(m_WParser->CreateCurrentFont())); + } + } + + str = styleParams.GetParam(wxS("font-family")); + if ( !str.empty() ) + { + m_WParser->SetFontFace(str); + m_WParser->GetContainer()->InsertCell( + new wxHtmlFontCell(m_WParser->CreateCurrentFont())); + } +} + //----------------------------------------------------------------------------- // wxHtmlTagsModule //-----------------------------------------------------------------------------