// Name: src/html/winpars.cpp
// Purpose: wxHtmlParser class (generic parser)
// Author: Vaclav Slavik
-// RCS-ID: $Id$
// Copyright: (c) 1999 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#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"
m_FontBold = m_FontItalic = m_FontUnderlined = m_FontFixed = FALSE;
m_FontSize = 3; //default one
CreateCurrentFont(); // we're selecting default font into
-
+
// we're not using GetCharWidth/Height() because of
// differences under X and win
wxCoord w,h;
m_Link = wxHtmlLinkInfo( wxEmptyString );
m_LinkColor.Set(0, 0, 0xFF);
m_ActualColor.Set(0, 0, 0);
+ const wxColour windowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW) ;
+ m_ActualBackgroundColor = m_windowInterface
+ ? m_windowInterface->GetHTMLBackgroundColour()
+ : windowColour;
+ m_ActualBackgroundMode = wxTRANSPARENT;
m_Align = wxHTML_ALIGN_LEFT;
m_ScriptMode = wxHTML_SCRIPT_NORMAL;
m_ScriptBaseline = 0;
#endif
m_Container->InsertCell(new wxHtmlColourCell(m_ActualColor));
- wxColour windowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW) ;
m_Container->InsertCell
(
new wxHtmlColourCell
(
- m_windowInterface
- ? m_windowInterface->GetHTMLBackgroundColour()
- : windowColour,
- wxHTML_CLR_BACKGROUND
+ m_ActualBackgroundColor,
+ m_ActualBackgroundMode == wxTRANSPARENT ? wxHTML_CLR_TRANSPARENT_BACKGROUND : wxHTML_CLR_BACKGROUND
)
);
}
+void wxHtmlWinParser::SetDC(wxDC *dc, double pixel_scale, double font_scale)
+{
+ m_DC = dc;
+ m_PixelScale = pixel_scale;
+ m_FontScale = font_scale;
+}
+
+void wxHtmlWinParser::SetFontPointSize(int pt)
+{
+ if (pt <= m_FontsSizes[0])
+ m_FontSize = 1;
+ else if (pt >= m_FontsSizes[6])
+ m_FontSize = 7;
+ else
+ {
+ // Find the font closest to the given value with a simple linear search
+ // (binary search is not worth it here for so small number of elements)
+ for ( int n = 0; n < 6; n++ )
+ {
+ if ( (pt > m_FontsSizes[n]) && (pt <= m_FontsSizes[n + 1]) )
+ {
+ if ( (pt - m_FontsSizes[n]) >= (m_FontsSizes[n + 1] - pt) )
+ {
+ // The actual size is closer to the next entry than to this
+ // one, so use it.
+ n++;
+ }
+
+ // Notice that m_FontSize starts from 1, hence +1 here.
+ m_FontSize = n + 1;
+
+ break;
+ }
+ }
+ }
+}
wxFont* wxHtmlWinParser::CreateCurrentFont()
{
#endif
))
{
- delete *fontptr;
- *fontptr = NULL;
+ wxDELETE(*fontptr);
}
if (*fontptr == NULL)
{
*faceptr = face;
*fontptr = new wxFont(
- (int) (m_FontsSizes[fs] * m_PixelScale),
+ (int) (m_FontsSizes[fs] * m_FontScale),
ff ? wxMODERN : wxSWISS,
fi ? wxITALIC : wxNORMAL,
fb ? wxBOLD : wxNORMAL,
m_nbsp = 0;
m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT;
- if (m_EncConv)
- {
- delete m_EncConv;
- m_EncConv = NULL;
- }
+ wxDELETE(m_EncConv);
if (enc == wxFONTENCODING_DEFAULT)
return;
wxLogError(_("Failed to display HTML document in %s encoding"),
wxFontMapper::GetEncodingName(enc).c_str());
m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT;
- delete m_EncConv;
- m_EncConv = NULL;
+ wxDELETE(m_EncConv);
}
}
#endif
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
//-----------------------------------------------------------------------------