1///////////////////////////////////////////////////////////////////////////// 2// Name: winpars.h 3// Purpose: wxHtmlWinParser class (parser to be used with wxHtmlWindow) 4// Author: Vaclav Slavik 5// RCS-ID: $Id: winpars.h 59260 2009-03-02 10:43:00Z VS $ 6// Copyright: (c) 1999 Vaclav Slavik 7// Licence: wxWindows licence 8///////////////////////////////////////////////////////////////////////////// 9 10#ifndef _WX_WINPARS_H_ 11#define _WX_WINPARS_H_ 12 13#include "wx/defs.h" 14#if wxUSE_HTML 15 16#include "wx/module.h" 17#include "wx/font.h" 18#include "wx/html/htmlpars.h" 19#include "wx/html/htmlcell.h" 20#include "wx/encconv.h" 21 22class WXDLLIMPEXP_FWD_HTML wxHtmlWindow; 23class WXDLLIMPEXP_FWD_HTML wxHtmlWindowInterface; 24class WXDLLIMPEXP_FWD_HTML wxHtmlWinParser; 25class WXDLLIMPEXP_FWD_HTML wxHtmlWinTagHandler; 26class WXDLLIMPEXP_FWD_HTML wxHtmlTagsModule; 27struct wxHtmlWinParser_TextParsingState; 28 29 30//-------------------------------------------------------------------------------- 31// wxHtmlWinParser 32// This class is derived from wxHtmlParser and its mail goal 33// is to parse HTML input so that it can be displayed in 34// wxHtmlWindow. It uses special wxHtmlWinTagHandler. 35//-------------------------------------------------------------------------------- 36 37class WXDLLIMPEXP_HTML wxHtmlWinParser : public wxHtmlParser 38{ 39 DECLARE_ABSTRACT_CLASS(wxHtmlWinParser) 40 friend class wxHtmlWindow; 41 42public: 43 wxHtmlWinParser(wxHtmlWindowInterface *wndIface = NULL); 44 45 virtual ~wxHtmlWinParser(); 46 47 virtual void InitParser(const wxString& source); 48 virtual void DoneParser(); 49 virtual wxObject* GetProduct(); 50 51 virtual wxFSFile *OpenURL(wxHtmlURLType type, const wxString& url) const; 52 53 // Set's the DC used for parsing. If SetDC() is not called, 54 // parsing won't proceed 55 virtual void SetDC(wxDC *dc, double pixel_scale = 1.0) 56 { m_DC = dc; m_PixelScale = pixel_scale; } 57 58 wxDC *GetDC() {return m_DC;} 59 double GetPixelScale() {return m_PixelScale;} 60 int GetCharHeight() const {return m_CharHeight;} 61 int GetCharWidth() const {return m_CharWidth;} 62 63 // NOTE : these functions do _not_ return _actual_ 64 // height/width. They return h/w of default font 65 // for this DC. If you want actual values, call 66 // GetDC()->GetChar...() 67 68 // returns interface to the rendering window 69 wxHtmlWindowInterface *GetWindowInterface() {return m_windowInterface;} 70#if WXWIN_COMPATIBILITY_2_6 71 // deprecated, use GetWindowInterface()->GetHTMLWindow() instead 72 wxDEPRECATED( wxHtmlWindow *GetWindow() ); 73#endif 74 75 // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). 76 void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); 77 78 // Sets font sizes to be relative to the given size or the system 79 // default size; use either specified or default font 80 void SetStandardFonts(int size = -1, 81 const wxString& normal_face = wxEmptyString, 82 const wxString& fixed_face = wxEmptyString); 83 84 // Adds tags module. see wxHtmlTagsModule for details. 85 static void AddModule(wxHtmlTagsModule *module); 86 87 static void RemoveModule(wxHtmlTagsModule *module); 88 89 // parsing-related methods. These methods are called by tag handlers: 90 91 // Returns pointer to actual container. Common use in tag handler is : 92 // m_WParser->GetContainer()->InsertCell(new ...); 93 wxHtmlContainerCell *GetContainer() const {return m_Container;} 94 95 // opens new container. This container is sub-container of opened 96 // container. Sets GetContainer to newly created container 97 // and returns it. 98 wxHtmlContainerCell *OpenContainer(); 99 100 // works like OpenContainer except that new container is not created 101 // but c is used. You can use this to directly set actual container 102 wxHtmlContainerCell *SetContainer(wxHtmlContainerCell *c); 103 104 // closes the container and sets actual Container to upper-level 105 // container 106 wxHtmlContainerCell *CloseContainer(); 107 108 int GetFontSize() const {return m_FontSize;} 109 void SetFontSize(int s); 110 int GetFontBold() const {return m_FontBold;} 111 void SetFontBold(int x) {m_FontBold = x;} 112 int GetFontItalic() const {return m_FontItalic;} 113 void SetFontItalic(int x) {m_FontItalic = x;} 114 int GetFontUnderlined() const {return m_FontUnderlined;} 115 void SetFontUnderlined(int x) {m_FontUnderlined = x;} 116 int GetFontFixed() const {return m_FontFixed;} 117 void SetFontFixed(int x) {m_FontFixed = x;} 118 wxString GetFontFace() const {return GetFontFixed() ? m_FontFaceFixed : m_FontFaceNormal;} 119 void SetFontFace(const wxString& face); 120 121 int GetAlign() const {return m_Align;} 122 void SetAlign(int a) {m_Align = a;} 123 124 wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; } 125 void SetScriptMode(wxHtmlScriptMode mode) { m_ScriptMode = mode; } 126 long GetScriptBaseline() const { return m_ScriptBaseline; } 127 void SetScriptBaseline(long base) { m_ScriptBaseline = base; } 128 129 const wxColour& GetLinkColor() const { return m_LinkColor; } 130 void SetLinkColor(const wxColour& clr) { m_LinkColor = clr; } 131 const wxColour& GetActualColor() const { return m_ActualColor; } 132 void SetActualColor(const wxColour& clr) { m_ActualColor = clr ;} 133 const wxHtmlLinkInfo& GetLink() const { return m_Link; } 134 void SetLink(const wxHtmlLinkInfo& link); 135 136 // applies current parser state (link, sub/supscript, ...) to given cell 137 void ApplyStateToCell(wxHtmlCell *cell); 138 139#if !wxUSE_UNICODE 140 void SetInputEncoding(wxFontEncoding enc); 141 wxFontEncoding GetInputEncoding() const { return m_InputEnc; } 142 wxFontEncoding GetOutputEncoding() const { return m_OutputEnc; } 143 wxEncodingConverter *GetEncodingConverter() const { return m_EncConv; } 144#endif 145 146 // creates font depending on m_Font* members. 147 virtual wxFont* CreateCurrentFont(); 148 149#if wxABI_VERSION >= 20808 150 enum WhitespaceMode 151 { 152 Whitespace_Normal, // normal mode, collapse whitespace 153 Whitespace_Pre // inside <pre>, keep whitespace as-is 154 }; 155 156 // change the current whitespace handling mode 157 void SetWhitespaceMode(WhitespaceMode mode); 158 WhitespaceMode GetWhitespaceMode() const; 159#endif // wxABI_VERSION >= 20808 160 161protected: 162 virtual void AddText(const wxChar* txt); 163 164private: 165 void FlushWordBuf(wxChar *temp, int& templen, wxChar nbsp); 166 void AddWord(wxHtmlWordCell *c); 167 void AddWord(const wxString& word); 168 void AddPreBlock(const wxString& text); 169 170 bool m_tmpLastWasSpace; 171 wxChar *m_tmpStrBuf; 172 size_t m_tmpStrBufSize; 173 // temporary variables used by AddText 174 wxHtmlWindowInterface *m_windowInterface; 175 // window we're parsing for 176 double m_PixelScale; 177 wxDC *m_DC; 178 // Device Context we're parsing for 179 static wxList m_Modules; 180 // list of tags modules (see wxHtmlTagsModule for details) 181 // This list is used to initialize m_Handlers member. 182 183 wxHtmlContainerCell *m_Container; 184 // current container. See Open/CloseContainer for details. 185 186 int m_FontBold, m_FontItalic, m_FontUnderlined, m_FontFixed; // this is not true,false but 1,0, we need it for indexing 187 int m_FontSize; /* -2 to +4, 0 is default */ 188 wxColour m_LinkColor; 189 wxColour m_ActualColor; 190 // basic font parameters. 191 wxHtmlLinkInfo m_Link; 192 // actual hypertext link or empty string 193 bool m_UseLink; 194 // true if m_Link is not empty 195 long m_CharHeight, m_CharWidth; 196 // average height of normal-sized text 197 int m_Align; 198 // actual alignment 199 wxHtmlScriptMode m_ScriptMode; 200 // current script mode (sub/sup/normal) 201 long m_ScriptBaseline; 202 // current sub/supscript base 203 204 wxFont* m_FontsTable[2][2][2][2][7]; 205 wxString m_FontsFacesTable[2][2][2][2][7]; 206#if !wxUSE_UNICODE 207 wxFontEncoding m_FontsEncTable[2][2][2][2][7]; 208#endif 209 // table of loaded fonts. 1st four indexes are 0 or 1, depending on on/off 210 // state of these flags (from left to right): 211 // [bold][italic][underlined][fixed_size] 212 // last index is font size : from 0 to 6 (remapped from html sizes 1 to 7) 213 // Note : this table covers all possible combinations of fonts, but not 214 // all of them are used, so many items in table are usually NULL. 215 int m_FontsSizes[7]; 216 wxString m_FontFaceFixed, m_FontFaceNormal; 217 // html font sizes and faces of fixed and proportional fonts 218 219#if !wxUSE_UNICODE 220 wxFontEncoding m_InputEnc, m_OutputEnc; 221 // I/O font encodings 222 wxEncodingConverter *m_EncConv; 223#endif 224 225 // NB: this pointer replaces m_lastWordCell pointer in wx<=2.8.7; this 226 // way, wxHtmlWinParser remains ABI compatible with older versions 227 // despite addition of two fields in wxHtmlWinParser_TextParsingState 228 wxHtmlWinParser_TextParsingState *m_textParsingState; 229 230 DECLARE_NO_COPY_CLASS(wxHtmlWinParser) 231}; 232 233 234 235 236 237 238//----------------------------------------------------------------------------- 239// wxHtmlWinTagHandler 240// This is basicly wxHtmlTagHandler except 241// it is extended with protected member m_Parser pointing to 242// the wxHtmlWinParser object 243//----------------------------------------------------------------------------- 244 245class WXDLLIMPEXP_HTML wxHtmlWinTagHandler : public wxHtmlTagHandler 246{ 247 DECLARE_ABSTRACT_CLASS(wxHtmlWinTagHandler) 248 249public: 250 wxHtmlWinTagHandler() : wxHtmlTagHandler() {} 251 252 virtual void SetParser(wxHtmlParser *parser) {wxHtmlTagHandler::SetParser(parser); m_WParser = (wxHtmlWinParser*) parser;} 253 254protected: 255 wxHtmlWinParser *m_WParser; // same as m_Parser, but overcasted 256 257 DECLARE_NO_COPY_CLASS(wxHtmlWinTagHandler) 258}; 259 260 261 262 263 264 265//---------------------------------------------------------------------------- 266// wxHtmlTagsModule 267// This is basic of dynamic tag handlers binding. 268// The class provides methods for filling parser's handlers 269// hash table. 270// (See documentation for details) 271//---------------------------------------------------------------------------- 272 273class WXDLLIMPEXP_HTML wxHtmlTagsModule : public wxModule 274{ 275 DECLARE_DYNAMIC_CLASS(wxHtmlTagsModule) 276 277public: 278 wxHtmlTagsModule() : wxModule() {} 279 280 virtual bool OnInit(); 281 virtual void OnExit(); 282 283 // This is called by wxHtmlWinParser. 284 // The method must simply call parser->AddTagHandler(new 285 // <handler_class_name>); for each handler 286 virtual void FillHandlersTable(wxHtmlWinParser * WXUNUSED(parser)) { } 287}; 288 289 290#endif 291 292#endif // _WX_WINPARS_H_ 293