]> git.saurik.com Git - wxWidgets.git/blame - src/html/winpars.cpp
wx/wxprec.h already includes wx/defs.h (with other minor cleaning).
[wxWidgets.git] / src / html / winpars.cpp
CommitLineData
5526e819 1/////////////////////////////////////////////////////////////////////////////
69941f05 2// Name: winpars.cpp
5526e819
VS
3// Purpose: wxHtmlParser class (generic parser)
4// Author: Vaclav Slavik
69941f05 5// RCS-ID: $Id$
5526e819 6// Copyright: (c) 1999 Vaclav Slavik
65571936 7// Licence: wxWindows licence
5526e819
VS
8/////////////////////////////////////////////////////////////////////////////
9
3096bd2f 10#include "wx/wxprec.h"
5526e819
VS
11
12#include "wx/defs.h"
f6bcfd97 13#if wxUSE_HTML && wxUSE_STREAMS
5526e819 14
2b5f62a0 15#ifdef __BORLANDC__
5526e819
VS
16#pragma hdrstop
17#endif
18
19#ifndef WXPRECOMP
04dbb646
VZ
20 #include "wx/intl.h"
21 #include "wx/dc.h"
5526e819
VS
22#endif
23
69941f05
VS
24#include "wx/html/htmldefs.h"
25#include "wx/html/winpars.h"
26#include "wx/html/htmlwin.h"
b250d384 27#include "wx/fontmap.h"
f3c82859 28#include "wx/log.h"
3403ccd5 29#include "wx/settings.h"
3ec372c8 30#include "wx/uri.h"
5526e819
VS
31
32
33//-----------------------------------------------------------------------------
34// wxHtmlWinParser
35//-----------------------------------------------------------------------------
36
4f44ea36 37IMPLEMENT_ABSTRACT_CLASS(wxHtmlWinParser, wxHtmlParser)
5526e819
VS
38
39wxList wxHtmlWinParser::m_Modules;
40
bc55e31b 41wxHtmlWinParser::wxHtmlWinParser(wxHtmlWindowInterface *wndIface)
5526e819 42{
211dfedd
VS
43 m_tmpStrBuf = NULL;
44 m_tmpStrBufSize = 0;
bc55e31b 45 m_windowInterface = wndIface;
5526e819
VS
46 m_Container = NULL;
47 m_DC = NULL;
48 m_CharHeight = m_CharWidth = 0;
d1da8872 49 m_UseLink = false;
2b5f62a0 50#if !wxUSE_UNICODE
b250d384 51 m_EncConv = NULL;
2b5f62a0
VZ
52 m_InputEnc = wxFONTENCODING_ISO8859_1;
53 m_OutputEnc = wxFONTENCODING_DEFAULT;
54#endif
b6d93b26 55 m_lastWordCell = NULL;
5526e819
VS
56
57 {
58 int i, j, k, l, m;
59 for (i = 0; i < 2; i++)
60 for (j = 0; j < 2; j++)
61 for (k = 0; k < 2; k++)
62 for (l = 0; l < 2; l++)
3c8c8da2 63 for (m = 0; m < 7; m++)
e3c7fd79 64 {
5526e819 65 m_FontsTable[i][j][k][l][m] = NULL;
f1ad10f3 66 m_FontsFacesTable[i][j][k][l][m] = wxEmptyString;
2b5f62a0 67#if !wxUSE_UNICODE
b250d384 68 m_FontsEncTable[i][j][k][l][m] = wxFONTENCODING_DEFAULT;
2b5f62a0 69#endif
f1ad10f3 70 }
4eecf115
VS
71
72 SetFonts(wxEmptyString, wxEmptyString, NULL);
5526e819
VS
73 }
74
75 // fill in wxHtmlParser's tables:
222ed1d6 76 wxList::compatibility_iterator node = m_Modules.GetFirst();
3c8c8da2 77 while (node)
4f9297b0
VS
78 {
79 wxHtmlTagsModule *mod = (wxHtmlTagsModule*) node->GetData();
80 mod->FillHandlersTable(this);
81 node = node->GetNext();
5526e819
VS
82 }
83}
84
b250d384
VS
85wxHtmlWinParser::~wxHtmlWinParser()
86{
87 int i, j, k, l, m;
88
89 for (i = 0; i < 2; i++)
90 for (j = 0; j < 2; j++)
91 for (k = 0; k < 2; k++)
92 for (l = 0; l < 2; l++)
3c8c8da2 93 for (m = 0; m < 7; m++)
e3c7fd79 94 {
3c8c8da2 95 if (m_FontsTable[i][j][k][l][m] != NULL)
b250d384
VS
96 delete m_FontsTable[i][j][k][l][m];
97 }
2b5f62a0 98#if !wxUSE_UNICODE
211dfedd 99 delete m_EncConv;
2b5f62a0 100#endif
211dfedd 101 delete[] m_tmpStrBuf;
b250d384
VS
102}
103
5526e819
VS
104void wxHtmlWinParser::AddModule(wxHtmlTagsModule *module)
105{
106 m_Modules.Append(module);
107}
108
f6bcfd97
BP
109void wxHtmlWinParser::RemoveModule(wxHtmlTagsModule *module)
110{
111 m_Modules.DeleteObject(module);
112}
113
fbfb8bcc 114void wxHtmlWinParser::SetFonts(const wxString& normal_face, const wxString& fixed_face,
4eecf115 115 const int *sizes)
5526e819 116{
4eecf115
VS
117 static int default_sizes[7] =
118 {
119 wxHTML_FONT_SIZE_1,
d1da8872
WS
120 wxHTML_FONT_SIZE_2,
121 wxHTML_FONT_SIZE_3,
122 wxHTML_FONT_SIZE_4,
123 wxHTML_FONT_SIZE_5,
124 wxHTML_FONT_SIZE_6,
125 wxHTML_FONT_SIZE_7
4eecf115 126 };
d1da8872 127
4eecf115
VS
128 if (sizes == NULL) sizes = default_sizes;
129
c9f56e70
VS
130 int i, j, k, l, m;
131
132 for (i = 0; i < 7; i++) m_FontsSizes[i] = sizes[i];
5526e819
VS
133 m_FontFaceFixed = fixed_face;
134 m_FontFaceNormal = normal_face;
3c8c8da2 135
2b5f62a0 136#if !wxUSE_UNICODE
b250d384 137 SetInputEncoding(m_InputEnc);
2b5f62a0 138#endif
c9f56e70
VS
139
140 for (i = 0; i < 2; i++)
141 for (j = 0; j < 2; j++)
142 for (k = 0; k < 2; k++)
143 for (l = 0; l < 2; l++)
144 for (m = 0; m < 7; m++) {
3c8c8da2 145 if (m_FontsTable[i][j][k][l][m] != NULL)
e3c7fd79 146 {
c9f56e70
VS
147 delete m_FontsTable[i][j][k][l][m];
148 m_FontsTable[i][j][k][l][m] = NULL;
149 }
150 }
5526e819
VS
151}
152
10e5c7ea
VS
153void wxHtmlWinParser::SetStandardFonts(int size,
154 const wxString& normal_face,
155 const wxString& fixed_face)
7acd3625 156{
10e5c7ea 157 wxFont defaultFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
d1da8872 158
7acd3625
RD
159 int f_sizes[7];
160 if (size == -1)
10e5c7ea 161 size = defaultFont.GetPointSize();
7acd3625
RD
162
163 f_sizes[0] = int(size * 0.6);
164 f_sizes[1] = int(size * 0.8);
165 f_sizes[2] = size;
166 f_sizes[3] = int(size * 1.2);
167 f_sizes[4] = int(size * 1.4);
168 f_sizes[5] = int(size * 1.6);
169 f_sizes[6] = int(size * 1.8);
10e5c7ea 170
d1da8872 171 wxString normal = normal_face.empty() ?
10e5c7ea 172 defaultFont.GetFaceName() : normal_face;
d1da8872 173
10e5c7ea 174 SetFonts(normal, fixed_face, f_sizes);
7acd3625
RD
175}
176
5526e819
VS
177void wxHtmlWinParser::InitParser(const wxString& source)
178{
179 wxHtmlParser::InitParser(source);
2b5f62a0 180 wxASSERT_MSG(m_DC != NULL, wxT("no DC assigned to wxHtmlWinParser!!"));
5526e819
VS
181
182 m_FontBold = m_FontItalic = m_FontUnderlined = m_FontFixed = FALSE;
f2c2fa4d 183 m_FontSize = 3; //default one
5526e819 184 CreateCurrentFont(); // we're selecting default font into
2b5f62a0 185 m_DC->GetTextExtent( wxT("H"), &m_CharWidth, &m_CharHeight);
5526e819 186 /* NOTE : we're not using GetCharWidth/Height() because
0e8c8233 187 of differences under X and win
5526e819
VS
188 */
189
d1da8872 190 m_UseLink = false;
9548f380 191 m_Link = wxHtmlLinkInfo( wxEmptyString );
5526e819
VS
192 m_LinkColor.Set(0, 0, 0xFF);
193 m_ActualColor.Set(0, 0, 0);
efba2b89 194 m_Align = wxHTML_ALIGN_LEFT;
3c115835
VS
195 m_ScriptMode = wxHTML_SCRIPT_NORMAL;
196 m_ScriptBaseline = 0;
d1da8872 197 m_tmpLastWasSpace = false;
b6d93b26 198 m_lastWordCell = NULL;
5526e819
VS
199
200 OpenContainer();
5526e819 201 OpenContainer();
2b5f62a0 202
fa2f5d3b 203#if !wxUSE_UNICODE
2b5f62a0
VZ
204 wxString charset = ExtractCharsetInformation(source);
205 if (!charset.empty())
206 {
207 wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(charset);
208 if (enc != wxFONTENCODING_SYSTEM)
209 SetInputEncoding(enc);
210 }
211#endif
212
4f9297b0 213 m_Container->InsertCell(new wxHtmlColourCell(m_ActualColor));
44d0c580 214 wxColour windowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW) ;
bc55e31b
VS
215
216 m_Container->InsertCell
217 (
218 new wxHtmlColourCell
219 (
220 m_windowInterface
221 ? m_windowInterface->GetHTMLBackgroundColour()
222 : windowColour,
223 wxHTML_CLR_BACKGROUND
224 )
225 );
226
4f9297b0 227 m_Container->InsertCell(new wxHtmlFontCell(CreateCurrentFont()));
5526e819
VS
228}
229
5526e819
VS
230void wxHtmlWinParser::DoneParser()
231{
232 m_Container = NULL;
2b5f62a0
VZ
233#if !wxUSE_UNICODE
234 SetInputEncoding(wxFONTENCODING_ISO8859_1); // for next call
235#endif
5526e819
VS
236 wxHtmlParser::DoneParser();
237}
238
bc55e31b
VS
239#if WXWIN_COMPATIBILITY_2_6
240wxHtmlWindow *wxHtmlWinParser::GetWindow()
241{
242 if (!m_windowInterface)
243 return NULL;
244 return wxDynamicCast(m_windowInterface->GetHTMLWindow(), wxHtmlWindow);
245}
246#endif
247
5526e819
VS
248wxObject* wxHtmlWinParser::GetProduct()
249{
250 wxHtmlContainerCell *top;
251
252 CloseContainer();
253 OpenContainer();
67cfebc2 254
5526e819 255 top = m_Container;
4f9297b0 256 while (top->GetParent()) top = top->GetParent();
ace0fab4
VS
257 top->RemoveExtraSpacing(true, true);
258
5526e819
VS
259 return top;
260}
261
0423bdc7 262wxFSFile *wxHtmlWinParser::OpenURL(wxHtmlURLType type,
6cc4e6b8 263 const wxString& url) const
04db5c3f 264{
bc55e31b
VS
265 if ( !m_windowInterface )
266 return wxHtmlParser::OpenURL(type, url);
267
268 wxString myurl(url);
269 wxHtmlOpeningStatus status;
270 for (;;)
6cc4e6b8 271 {
bc55e31b 272 wxString myfullurl(myurl);
4bfa3189 273
bc55e31b
VS
274 // consider url as absolute path first
275 wxURI current(myurl);
276 myfullurl = current.BuildUnescapedURI();
4bfa3189 277
bc55e31b
VS
278 // if not absolute then ...
279 if( current.IsReference() )
280 {
281 wxString basepath = GetFS()->GetPath();
282 wxURI base(basepath);
4bfa3189 283
bc55e31b
VS
284 // ... try to apply base path if valid ...
285 if( !base.IsReference() )
286 {
287 wxURI path(myfullurl);
288 path.Resolve( base );
289 myfullurl = path.BuildUnescapedURI();
290 }
291 else
292 {
293 // ... or force such addition if not included already
294 if( !current.GetPath().Contains(base.GetPath()) )
4bfa3189 295 {
bc55e31b
VS
296 basepath += myurl;
297 wxURI connected( basepath );
298 myfullurl = connected.BuildUnescapedURI();
4bfa3189
WS
299 }
300 }
6cc4e6b8 301 }
0423bdc7 302
bc55e31b
VS
303 wxString redirect;
304 status = m_windowInterface->OnHTMLOpeningURL(type, myfullurl, &redirect);
305 if ( status != wxHTML_REDIRECT )
306 break;
2c892c0b 307
bc55e31b 308 myurl = redirect;
6cc4e6b8 309 }
2c892c0b 310
bc55e31b
VS
311 if ( status == wxHTML_BLOCK )
312 return NULL;
313
314 return GetFS()->OpenFile(myurl);
04db5c3f 315}
5526e819 316
211dfedd 317void wxHtmlWinParser::AddText(const wxChar* txt)
5526e819 318{
e3c7fd79
VZ
319 size_t i = 0,
320 x,
321 lng = wxStrlen(txt);
211dfedd 322 register wxChar d;
5526e819 323 int templen = 0;
f23e92e7 324 wxChar nbsp = GetEntitiesParser()->GetCharForCode(160 /* nbsp */);
211dfedd
VS
325
326 if (lng+1 > m_tmpStrBufSize)
327 {
328 delete[] m_tmpStrBuf;
329 m_tmpStrBuf = new wxChar[lng+1];
330 m_tmpStrBufSize = lng+1;
331 }
332 wxChar *temp = m_tmpStrBuf;
3c8c8da2
VZ
333
334 if (m_tmpLastWasSpace)
4f9297b0 335 {
3c8c8da2
VZ
336 while ((i < lng) &&
337 ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) || (txt[i] == wxT(' ')) ||
211dfedd 338 (txt[i] == wxT('\t')))) i++;
5526e819
VS
339 }
340
3c8c8da2 341 while (i < lng)
4f9297b0 342 {
5526e819
VS
343 x = 0;
344 d = temp[templen++] = txt[i];
3c8c8da2 345 if ((d == wxT('\n')) || (d == wxT('\r')) || (d == wxT(' ')) || (d == wxT('\t')))
e3c7fd79 346 {
5526e819 347 i++, x++;
3c8c8da2 348 while ((i < lng) && ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) ||
211dfedd 349 (txt[i] == wxT(' ')) || (txt[i] == wxT('\t')))) i++, x++;
5526e819
VS
350 }
351 else i++;
352
3c8c8da2 353 if (x)
e3c7fd79 354 {
211dfedd 355 temp[templen-1] = wxT(' ');
97eac136 356 DoAddText(temp, templen, nbsp);
d1da8872 357 m_tmpLastWasSpace = true;
5526e819
VS
358 }
359 }
af035b26
VS
360
361 if (templen && (templen > 1 || temp[0] != wxT(' ')))
4f9297b0 362 {
97eac136
VS
363 DoAddText(temp, templen, nbsp);
364 m_tmpLastWasSpace = false;
365 }
366}
367
368void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen, wxChar nbsp)
369{
370 temp[templen] = 0;
371 templen = 0;
2b5f62a0 372#if !wxUSE_UNICODE
97eac136
VS
373 if (m_EncConv)
374 m_EncConv->Convert(temp);
2b5f62a0 375#endif
97eac136
VS
376 size_t len = wxStrlen(temp);
377 for (size_t j = 0; j < len; j++)
378 {
379 if (temp[j] == nbsp)
380 temp[j] = wxT(' ');
5526e819 381 }
97eac136
VS
382
383 wxHtmlCell *c = new wxHtmlWordCell(temp, *(GetDC()));
384
3c115835
VS
385 ApplyStateToCell(c);
386
97eac136
VS
387 m_Container->InsertCell(c);
388 ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell);
389 m_lastWordCell = (wxHtmlWordCell*)c;
5526e819
VS
390}
391
392
393
394wxHtmlContainerCell* wxHtmlWinParser::OpenContainer()
395{
396 m_Container = new wxHtmlContainerCell(m_Container);
4f9297b0 397 m_Container->SetAlignHor(m_Align);
d1da8872 398 m_tmpLastWasSpace = true;
5526e819
VS
399 /* to avoid space being first character in paragraph */
400 return m_Container;
401}
402
403
404
405wxHtmlContainerCell* wxHtmlWinParser::SetContainer(wxHtmlContainerCell *c)
406{
d1da8872 407 m_tmpLastWasSpace = true;
5526e819
VS
408 /* to avoid space being first character in paragraph */
409 return m_Container = c;
410}
411
412
413
414wxHtmlContainerCell* wxHtmlWinParser::CloseContainer()
415{
4f9297b0 416 m_Container = m_Container->GetParent();
5526e819
VS
417 return m_Container;
418}
419
420
f2c2fa4d
VS
421void wxHtmlWinParser::SetFontSize(int s)
422{
423 if (s < 1) s = 1;
424 else if (s > 7) s = 7;
425 m_FontSize = s;
426}
427
428
429
5526e819
VS
430wxFont* wxHtmlWinParser::CreateCurrentFont()
431{
432 int fb = GetFontBold(),
433 fi = GetFontItalic(),
434 fu = GetFontUnderlined(),
435 ff = GetFontFixed(),
f2c2fa4d 436 fs = GetFontSize() - 1 /*remap from <1;7> to <0;6>*/ ;
5526e819 437
f1ad10f3
VS
438 wxString face = ff ? m_FontFaceFixed : m_FontFaceNormal;
439 wxString *faceptr = &(m_FontsFacesTable[fb][fi][fu][ff][fs]);
440 wxFont **fontptr = &(m_FontsTable[fb][fi][fu][ff][fs]);
2b5f62a0 441#if !wxUSE_UNICODE
b250d384 442 wxFontEncoding *encptr = &(m_FontsEncTable[fb][fi][fu][ff][fs]);
2b5f62a0 443#endif
f1ad10f3 444
2b5f62a0
VZ
445 if (*fontptr != NULL && (*faceptr != face
446#if !wxUSE_UNICODE
447 || *encptr != m_OutputEnc
448#endif
449 ))
4f9297b0 450 {
f1ad10f3
VS
451 delete *fontptr;
452 *fontptr = NULL;
453 }
454
3c8c8da2 455 if (*fontptr == NULL)
4f9297b0 456 {
f1ad10f3
VS
457 *faceptr = face;
458 *fontptr = new wxFont(
7a5e6267 459 (int) (m_FontsSizes[fs] * m_PixelScale),
f1ad10f3
VS
460 ff ? wxMODERN : wxSWISS,
461 fi ? wxITALIC : wxNORMAL,
462 fb ? wxBOLD : wxNORMAL,
d1da8872 463 fu ? true : false, face
2b5f62a0
VZ
464#if wxUSE_UNICODE
465 );
466#else
467 , m_OutputEnc);
468 *encptr = m_OutputEnc;
469#endif
5526e819 470 }
4f9297b0 471 m_DC->SetFont(**fontptr);
f1ad10f3 472 return (*fontptr);
5526e819
VS
473}
474
475
476
f2c2fa4d
VS
477void wxHtmlWinParser::SetLink(const wxHtmlLinkInfo& link)
478{
3c8c8da2 479 m_Link = link;
f2c2fa4d
VS
480 m_UseLink = (link.GetHref() != wxEmptyString);
481}
482
3c8c8da2 483void wxHtmlWinParser::SetFontFace(const wxString& face)
b250d384 484{
3c8c8da2 485 if (GetFontFixed()) m_FontFaceFixed = face;
b250d384
VS
486 else m_FontFaceNormal = face;
487
2b5f62a0 488#if !wxUSE_UNICODE
b250d384
VS
489 if (m_InputEnc != wxFONTENCODING_DEFAULT)
490 SetInputEncoding(m_InputEnc);
2b5f62a0 491#endif
b250d384
VS
492}
493
3c115835
VS
494void wxHtmlWinParser::ApplyStateToCell(wxHtmlCell *cell)
495{
496 // set the link:
497 if (m_UseLink)
498 cell->SetLink(GetLink());
499
500 // apply current script mode settings:
501 cell->SetScriptMode(GetScriptMode(), GetScriptBaseline());
502}
b250d384
VS
503
504
2b5f62a0 505#if !wxUSE_UNICODE
b250d384
VS
506void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc)
507{
508 m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT;
3c8c8da2 509 if (m_EncConv)
daa616fc 510 {
3c8c8da2 511 delete m_EncConv;
daa616fc
VS
512 m_EncConv = NULL;
513 }
b250d384
VS
514
515 if (enc == wxFONTENCODING_DEFAULT) return;
516
517 wxFontEncoding altfix, altnorm;
518 bool availfix, availnorm;
3c8c8da2
VZ
519
520 // exact match?
142b3bc2
VS
521 availnorm = wxFontMapper::Get()->IsEncodingAvailable(enc, m_FontFaceNormal);
522 availfix = wxFontMapper::Get()->IsEncodingAvailable(enc, m_FontFaceFixed);
3c8c8da2 523 if (availnorm && availfix)
b250d384 524 m_OutputEnc = enc;
3c8c8da2 525
b250d384 526 // alternatives?
d1da8872
WS
527 else if (wxFontMapper::Get()->GetAltForEncoding(enc, &altnorm, m_FontFaceNormal, false) &&
528 wxFontMapper::Get()->GetAltForEncoding(enc, &altfix, m_FontFaceFixed, false) &&
b250d384
VS
529 altnorm == altfix)
530 m_OutputEnc = altnorm;
3c8c8da2 531
b250d384
VS
532 // at least normal face?
533 else if (availnorm)
534 m_OutputEnc = enc;
d1da8872 535 else if (wxFontMapper::Get()->GetAltForEncoding(enc, &altnorm, m_FontFaceNormal, false))
b250d384 536 m_OutputEnc = altnorm;
3c8c8da2 537
b250d384 538 else
c83e1237
SC
539 {
540#ifndef __WXMAC__
541 // okay, let convert to ISO_8859-1, available always
b250d384 542 m_OutputEnc = wxFONTENCODING_DEFAULT;
90548138 543#else
c83e1237 544 m_OutputEnc = wxLocale::GetSystemEncoding() ;
90548138 545#endif
c83e1237 546 }
3c8c8da2 547
b250d384 548 m_InputEnc = enc;
daa616fc
VS
549 if (m_OutputEnc == wxFONTENCODING_DEFAULT)
550 GetEntitiesParser()->SetEncoding(wxFONTENCODING_SYSTEM);
551 else
552 GetEntitiesParser()->SetEncoding(m_OutputEnc);
3c8c8da2 553
b250d384
VS
554 if (m_InputEnc == m_OutputEnc) return;
555
556 m_EncConv = new wxEncodingConverter();
3c8c8da2 557 if (!m_EncConv->Init(m_InputEnc,
b250d384
VS
558 (m_OutputEnc == wxFONTENCODING_DEFAULT) ?
559 wxFONTENCODING_ISO8859_1 : m_OutputEnc,
3c8c8da2 560 wxCONVERT_SUBSTITUTE))
b250d384 561 { // total failture :-(
3c8c8da2
VZ
562 wxLogError(_("Failed to display HTML document in %s encoding"),
563 wxFontMapper::GetEncodingName(enc).c_str());
b250d384
VS
564 m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT;
565 delete m_EncConv;
566 m_EncConv = NULL;
567 }
568}
2b5f62a0 569#endif
b250d384
VS
570
571
f2c2fa4d 572
5526e819
VS
573
574//-----------------------------------------------------------------------------
575// wxHtmlWinTagHandler
576//-----------------------------------------------------------------------------
577
578IMPLEMENT_ABSTRACT_CLASS(wxHtmlWinTagHandler, wxHtmlTagHandler)
579
5526e819
VS
580//-----------------------------------------------------------------------------
581// wxHtmlTagsModule
582//-----------------------------------------------------------------------------
583
d6a6d666
VS
584// NB: This is *NOT* winpars.cpp's initialization and shutdown code!!
585// This module is an ancestor for tag handlers modules defined
586// in m_*.cpp files with TAGS_MODULE_BEGIN...TAGS_MODULE_END construct.
587//
588// Do not add any winpars.cpp shutdown or initialization code to it,
589// create a new module instead!
5526e819
VS
590
591IMPLEMENT_DYNAMIC_CLASS(wxHtmlTagsModule, wxModule)
592
5526e819
VS
593bool wxHtmlTagsModule::OnInit()
594{
595 wxHtmlWinParser::AddModule(this);
d1da8872 596 return true;
5526e819
VS
597}
598
5526e819
VS
599void wxHtmlTagsModule::OnExit()
600{
f6bcfd97 601 wxHtmlWinParser::RemoveModule(this);
5526e819 602}
d6a6d666 603
223d09f6 604#endif
5526e819 605