]> git.saurik.com Git - wxWidgets.git/commitdiff
Support some CSS styles for the links in wxHTML too.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 7 Oct 2012 22:38:56 +0000 (22:38 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 7 Oct 2012 22:38:56 +0000 (22:38 +0000)
Refactor limited CSS styles support for <span> tag to reuse it for <a> 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
include/wx/html/winpars.h
src/html/m_links.cpp
src/html/m_span.cpp
src/html/winpars.cpp

index 59fb3b6d127ae14f1154aea03cbaa43d34017b7b..220a922f2538d61d2909083b6e9497a26379ca67 100644 (file)
@@ -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 <a> tags too in wxHTML (gevorg).
 - Add "inherit" to <font> XRC tag (Steffen Olszewski, Gero Meßsysteme GmbH).
 - Add support for wxALWAYS_SHOW_SB style to wxScrolled<> (Catalin Raceanu).
 
index bdb16749cf4d597bc8ae885eb7d1acebc8dc9bbe..f634481287e92efce36a8c8c16f6bf0ae74586e1 100644 (file)
@@ -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);
 };
 
index 9343b893f5f99b0dd2d849454301f730b8019331..308fa73b343988e134f20ddce799316c840362a8 100644 (file)
@@ -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;
index 8e1b99716c5c7f33fdd8fd2dd1dfbfc882114c2a..959ff4d253ebb5cdf00ad4662418827d19efa7ed 100644 (file)
@@ -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);
 
index adb15c8328cdaae36f47b37ece69b39da07944f8..09bd92284a089456728b93efe08567257b1f0c76 100644 (file)
@@ -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
 //-----------------------------------------------------------------------------