X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/97eac136f38a16dcd181b7e6c062c079d43a7702..0c246b3ca3a803904525dd02da7bc94cb6565890:/src/html/winpars.cpp diff --git a/src/html/winpars.cpp b/src/html/winpars.cpp index 52578cc0ee..cb4a11b7f1 100644 --- a/src/html/winpars.cpp +++ b/src/html/winpars.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: winpars.cpp +// Name: src/html/winpars.cpp // Purpose: wxHtmlParser class (generic parser) // Author: Vaclav Slavik // RCS-ID: $Id$ @@ -9,24 +9,23 @@ #include "wx/wxprec.h" -#include "wx/defs.h" -#if wxUSE_HTML && wxUSE_STREAMS - #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_HTML && wxUSE_STREAMS + #ifndef WXPRECOMP #include "wx/intl.h" #include "wx/dc.h" + #include "wx/log.h" + #include "wx/settings.h" #endif #include "wx/html/htmldefs.h" #include "wx/html/winpars.h" #include "wx/html/htmlwin.h" #include "wx/fontmap.h" -#include "wx/log.h" -#include "wx/settings.h" #include "wx/uri.h" @@ -38,11 +37,11 @@ IMPLEMENT_ABSTRACT_CLASS(wxHtmlWinParser, wxHtmlParser) wxList wxHtmlWinParser::m_Modules; -wxHtmlWinParser::wxHtmlWinParser(wxHtmlWindow *wnd) : wxHtmlParser() +wxHtmlWinParser::wxHtmlWinParser(wxHtmlWindowInterface *wndIface) { m_tmpStrBuf = NULL; m_tmpStrBufSize = 0; - m_Window = wnd; + m_windowInterface = wndIface; m_Container = NULL; m_DC = NULL; m_CharHeight = m_CharWidth = 0; @@ -111,25 +110,50 @@ void wxHtmlWinParser::RemoveModule(wxHtmlTagsModule *module) m_Modules.DeleteObject(module); } -void wxHtmlWinParser::SetFonts(const wxString& normal_face, const wxString& fixed_face, +// build all HTML font sizes (1..7) from the given base size +static void wxBuildFontSizes(int *sizes, int size) +{ + // using a fixed factor (1.2, from CSS2) is a bad idea as explained at + // http://www.w3.org/TR/CSS21/fonts.html#font-size-props but this is by far + // simplest thing to do so still do it like this for now + sizes[0] = int(size * 0.75); // exception to 1.2 rule, otherwise too small + sizes[1] = int(size * 0.83); + sizes[2] = size; + sizes[3] = int(size * 1.2); + sizes[4] = int(size * 1.44); + sizes[5] = int(size * 1.73); + sizes[6] = int(size * 2); +} + +static int wxGetDefaultHTMLFontSize() +{ + // base the default font size on the size of the default system font but + // also ensure that we have a font of reasonable size, otherwise small HTML + // fonts are unreadable + int size = wxNORMAL_FONT->GetPointSize(); + if ( size < 10 ) + size = 10; + return size; +} + +void wxHtmlWinParser::SetFonts(const wxString& normal_face, + const wxString& fixed_face, const int *sizes) { - static int default_sizes[7] = - { - wxHTML_FONT_SIZE_1, - wxHTML_FONT_SIZE_2, - wxHTML_FONT_SIZE_3, - wxHTML_FONT_SIZE_4, - wxHTML_FONT_SIZE_5, - wxHTML_FONT_SIZE_6, - wxHTML_FONT_SIZE_7 - }; + static int default_sizes[7] = { 0 }; + if ( !sizes ) + { + if ( !default_sizes[0] ) + wxBuildFontSizes(default_sizes, wxGetDefaultHTMLFontSize()); - if (sizes == NULL) sizes = default_sizes; + sizes = default_sizes; + } int i, j, k, l, m; - for (i = 0; i < 7; i++) m_FontsSizes[i] = sizes[i]; + for (i = 0; i < 7; i++) + m_FontsSizes[i] = sizes[i]; + m_FontFaceFixed = fixed_face; m_FontFaceNormal = normal_face; @@ -154,22 +178,15 @@ void wxHtmlWinParser::SetStandardFonts(int size, const wxString& normal_face, const wxString& fixed_face) { - wxFont defaultFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); - - int f_sizes[7]; if (size == -1) - size = defaultFont.GetPointSize(); + size = wxGetDefaultHTMLFontSize(); - f_sizes[0] = int(size * 0.6); - f_sizes[1] = int(size * 0.8); - f_sizes[2] = size; - f_sizes[3] = int(size * 1.2); - f_sizes[4] = int(size * 1.4); - f_sizes[5] = int(size * 1.6); - f_sizes[6] = int(size * 1.8); + int f_sizes[7]; + wxBuildFontSizes(f_sizes, size); - wxString normal = normal_face.empty() ? - defaultFont.GetFaceName() : normal_face; + wxString normal = normal_face; + if ( normal.empty() ) + normal = wxNORMAL_FONT->GetFaceName(); SetFonts(normal, fixed_face, f_sizes); } @@ -192,10 +209,16 @@ void wxHtmlWinParser::InitParser(const wxString& source) m_LinkColor.Set(0, 0, 0xFF); m_ActualColor.Set(0, 0, 0); m_Align = wxHTML_ALIGN_LEFT; + m_ScriptMode = wxHTML_SCRIPT_NORMAL; + m_ScriptBaseline = 0; m_tmpLastWasSpace = false; m_lastWordCell = NULL; + // open the toplevel container that contains everything else and that + // is never closed (this makes parser's life easier): OpenContainer(); + + // then open the first container into which page's content will go: OpenContainer(); #if !wxUSE_UNICODE @@ -210,11 +233,18 @@ void wxHtmlWinParser::InitParser(const wxString& source) m_Container->InsertCell(new wxHtmlColourCell(m_ActualColor)); wxColour windowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW) ; - m_Container->InsertCell( - new wxHtmlColourCell(GetWindow() ? - GetWindow()->GetBackgroundColour() : - windowColour, - wxHTML_CLR_BACKGROUND)); + + m_Container->InsertCell + ( + new wxHtmlColourCell + ( + m_windowInterface + ? m_windowInterface->GetHTMLBackgroundColour() + : windowColour, + wxHTML_CLR_BACKGROUND + ) + ); + m_Container->InsertCell(new wxHtmlFontCell(CreateCurrentFont())); } @@ -227,6 +257,15 @@ void wxHtmlWinParser::DoneParser() wxHtmlParser::DoneParser(); } +#if WXWIN_COMPATIBILITY_2_6 +wxHtmlWindow *wxHtmlWinParser::GetWindow() +{ + if (!m_windowInterface) + return NULL; + return wxDynamicCast(m_windowInterface->GetHTMLWindow(), wxHtmlWindow); +} +#endif + wxObject* wxHtmlWinParser::GetProduct() { wxHtmlContainerCell *top; @@ -244,58 +283,56 @@ wxObject* wxHtmlWinParser::GetProduct() wxFSFile *wxHtmlWinParser::OpenURL(wxHtmlURLType type, const wxString& url) const { - if ( m_Window ) + if ( !m_windowInterface ) + return wxHtmlParser::OpenURL(type, url); + + wxString myurl(url); + wxHtmlOpeningStatus status; + for (;;) { - wxString myurl(url); - wxHtmlOpeningStatus status; - for (;;) - { - wxString myfullurl(myurl); + wxString myfullurl(myurl); - // consider url as absolute path first - wxURI current(myurl); - myfullurl = current.BuildUnescapedURI(); + // consider url as absolute path first + wxURI current(myurl); + myfullurl = current.BuildUnescapedURI(); - // if not absolute then ... - if( current.IsReference() ) - { - wxString basepath = GetFS()->GetPath(); - wxURI base(basepath); + // if not absolute then ... + if( current.IsReference() ) + { + wxString basepath = GetFS()->GetPath(); + wxURI base(basepath); - // ... try to apply base path if valid ... - if( !base.IsReference() ) - { - wxURI path(myfullurl); - path.Resolve( base ); - myfullurl = path.BuildUnescapedURI(); - } - else + // ... try to apply base path if valid ... + if( !base.IsReference() ) + { + wxURI path(myfullurl); + path.Resolve( base ); + myfullurl = path.BuildUnescapedURI(); + } + else + { + // ... or force such addition if not included already + if( !current.GetPath().Contains(base.GetPath()) ) { - // ... or force such addition if not included already - if( !current.GetPath().Contains(base.GetPath()) ) - { - basepath += myurl; - wxURI connected( basepath ); - myfullurl = connected.BuildUnescapedURI(); - } + basepath += myurl; + wxURI connected( basepath ); + myfullurl = connected.BuildUnescapedURI(); } } - - wxString redirect; - status = m_Window->OnOpeningURL(type, myfullurl, &redirect); - if ( status != wxHTML_REDIRECT ) - break; - - myurl = redirect; } - if ( status == wxHTML_BLOCK ) - return NULL; + wxString redirect; + status = m_windowInterface->OnHTMLOpeningURL(type, myfullurl, &redirect); + if ( status != wxHTML_REDIRECT ) + break; - return GetFS()->OpenFile(myurl); + myurl = redirect; } - return wxHtmlParser::OpenURL(type, url); + if ( status == wxHTML_BLOCK ) + return NULL; + + return GetFS()->OpenFile(myurl); } void wxHtmlWinParser::AddText(const wxChar* txt) @@ -366,8 +403,8 @@ void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen, wxChar nbsp) wxHtmlCell *c = new wxHtmlWordCell(temp, *(GetDC())); - if (m_UseLink) - c->SetLink(m_Link); + ApplyStateToCell(c); + m_Container->InsertCell(c); ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell); m_lastWordCell = (wxHtmlWordCell*)c; @@ -464,7 +501,6 @@ void wxHtmlWinParser::SetLink(const wxHtmlLinkInfo& link) m_UseLink = (link.GetHref() != wxEmptyString); } - void wxHtmlWinParser::SetFontFace(const wxString& face) { if (GetFontFixed()) m_FontFaceFixed = face; @@ -476,6 +512,15 @@ void wxHtmlWinParser::SetFontFace(const wxString& face) #endif } +void wxHtmlWinParser::ApplyStateToCell(wxHtmlCell *cell) +{ + // set the link: + if (m_UseLink) + cell->SetLink(GetLink()); + + // apply current script mode settings: + cell->SetScriptMode(GetScriptMode(), GetScriptBaseline()); +} #if !wxUSE_UNICODE @@ -514,7 +559,7 @@ void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc) else { #ifndef __WXMAC__ - // okay, let convert to ISO_8859-1, available always + // okay, let's convert to ISO_8859-1, available always m_OutputEnc = wxFONTENCODING_DEFAULT; #else m_OutputEnc = wxLocale::GetSystemEncoding() ; @@ -534,7 +579,7 @@ void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc) (m_OutputEnc == wxFONTENCODING_DEFAULT) ? wxFONTENCODING_ISO8859_1 : m_OutputEnc, wxCONVERT_SUBSTITUTE)) - { // total failture :-( + { // total failure :-( wxLogError(_("Failed to display HTML document in %s encoding"), wxFontMapper::GetEncodingName(enc).c_str()); m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT; @@ -578,4 +623,3 @@ void wxHtmlTagsModule::OnExit() } #endif -