]> git.saurik.com Git - wxWidgets.git/blame - src/html/winpars.cpp
Don't assume that msw.remap was 1, instead change it back to what it
[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
04db5c3f 41wxHtmlWinParser::wxHtmlWinParser(wxHtmlWindow *wnd) : wxHtmlParser()
5526e819 42{
211dfedd
VS
43 m_tmpStrBuf = NULL;
44 m_tmpStrBufSize = 0;
5526e819
VS
45 m_Window = wnd;
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) ;
eb6a4098 215 m_Container->InsertCell(
3403ccd5
RD
216 new wxHtmlColourCell(GetWindow() ?
217 GetWindow()->GetBackgroundColour() :
44d0c580 218 windowColour,
eb6a4098 219 wxHTML_CLR_BACKGROUND));
4f9297b0 220 m_Container->InsertCell(new wxHtmlFontCell(CreateCurrentFont()));
5526e819
VS
221}
222
5526e819
VS
223void wxHtmlWinParser::DoneParser()
224{
225 m_Container = NULL;
2b5f62a0
VZ
226#if !wxUSE_UNICODE
227 SetInputEncoding(wxFONTENCODING_ISO8859_1); // for next call
228#endif
5526e819
VS
229 wxHtmlParser::DoneParser();
230}
231
5526e819
VS
232wxObject* wxHtmlWinParser::GetProduct()
233{
234 wxHtmlContainerCell *top;
235
236 CloseContainer();
237 OpenContainer();
67cfebc2 238
5526e819 239 top = m_Container;
4f9297b0 240 while (top->GetParent()) top = top->GetParent();
ace0fab4
VS
241 top->RemoveExtraSpacing(true, true);
242
5526e819
VS
243 return top;
244}
245
0423bdc7 246wxFSFile *wxHtmlWinParser::OpenURL(wxHtmlURLType type,
6cc4e6b8 247 const wxString& url) const
04db5c3f 248{
04db5c3f 249 if ( m_Window )
6cc4e6b8 250 {
6cc4e6b8
VS
251 wxString myurl(url);
252 wxHtmlOpeningStatus status;
253 for (;;)
254 {
4bfa3189
WS
255 wxString myfullurl(myurl);
256
4bfa3189 257 // consider url as absolute path first
7e496014
WS
258 wxURI current(myurl);
259 myfullurl = current.BuildUnescapedURI();
4bfa3189
WS
260
261 // if not absolute then ...
262 if( current.IsReference() )
263 {
264 wxString basepath = GetFS()->GetPath();
7e496014 265 wxURI base(basepath);
4bfa3189 266
7e496014 267 // ... try to apply base path if valid ...
4bfa3189
WS
268 if( !base.IsReference() )
269 {
270 wxURI path(myfullurl);
271 path.Resolve( base );
7e496014 272 myfullurl = path.BuildUnescapedURI();
4bfa3189
WS
273 }
274 else
275 {
276 // ... or force such addition if not included already
7e496014 277 if( !current.GetPath().Contains(base.GetPath()) )
4bfa3189
WS
278 {
279 basepath += myurl;
7e496014
WS
280 wxURI connected( basepath );
281 myfullurl = connected.BuildUnescapedURI();
4bfa3189
WS
282 }
283 }
284 }
4bfa3189 285
0423bdc7 286 wxString redirect;
4bfa3189 287 status = m_Window->OnOpeningURL(type, myfullurl, &redirect);
0423bdc7 288 if ( status != wxHTML_REDIRECT )
6cc4e6b8 289 break;
0423bdc7
VZ
290
291 myurl = redirect;
6cc4e6b8 292 }
0423bdc7 293
6cc4e6b8
VS
294 if ( status == wxHTML_BLOCK )
295 return NULL;
2c892c0b
VZ
296
297 return GetFS()->OpenFile(myurl);
6cc4e6b8 298 }
2c892c0b
VZ
299
300 return wxHtmlParser::OpenURL(type, url);
04db5c3f 301}
5526e819 302
211dfedd 303void wxHtmlWinParser::AddText(const wxChar* txt)
5526e819 304{
e3c7fd79
VZ
305 size_t i = 0,
306 x,
307 lng = wxStrlen(txt);
211dfedd 308 register wxChar d;
5526e819 309 int templen = 0;
f23e92e7 310 wxChar nbsp = GetEntitiesParser()->GetCharForCode(160 /* nbsp */);
211dfedd
VS
311
312 if (lng+1 > m_tmpStrBufSize)
313 {
314 delete[] m_tmpStrBuf;
315 m_tmpStrBuf = new wxChar[lng+1];
316 m_tmpStrBufSize = lng+1;
317 }
318 wxChar *temp = m_tmpStrBuf;
3c8c8da2
VZ
319
320 if (m_tmpLastWasSpace)
4f9297b0 321 {
3c8c8da2
VZ
322 while ((i < lng) &&
323 ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) || (txt[i] == wxT(' ')) ||
211dfedd 324 (txt[i] == wxT('\t')))) i++;
5526e819
VS
325 }
326
3c8c8da2 327 while (i < lng)
4f9297b0 328 {
5526e819
VS
329 x = 0;
330 d = temp[templen++] = txt[i];
3c8c8da2 331 if ((d == wxT('\n')) || (d == wxT('\r')) || (d == wxT(' ')) || (d == wxT('\t')))
e3c7fd79 332 {
5526e819 333 i++, x++;
3c8c8da2 334 while ((i < lng) && ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) ||
211dfedd 335 (txt[i] == wxT(' ')) || (txt[i] == wxT('\t')))) i++, x++;
5526e819
VS
336 }
337 else i++;
338
3c8c8da2 339 if (x)
e3c7fd79 340 {
211dfedd 341 temp[templen-1] = wxT(' ');
97eac136 342 DoAddText(temp, templen, nbsp);
d1da8872 343 m_tmpLastWasSpace = true;
5526e819
VS
344 }
345 }
af035b26
VS
346
347 if (templen && (templen > 1 || temp[0] != wxT(' ')))
4f9297b0 348 {
97eac136
VS
349 DoAddText(temp, templen, nbsp);
350 m_tmpLastWasSpace = false;
351 }
352}
353
354void wxHtmlWinParser::DoAddText(wxChar *temp, int& templen, wxChar nbsp)
355{
356 temp[templen] = 0;
357 templen = 0;
2b5f62a0 358#if !wxUSE_UNICODE
97eac136
VS
359 if (m_EncConv)
360 m_EncConv->Convert(temp);
2b5f62a0 361#endif
97eac136
VS
362 size_t len = wxStrlen(temp);
363 for (size_t j = 0; j < len; j++)
364 {
365 if (temp[j] == nbsp)
366 temp[j] = wxT(' ');
5526e819 367 }
97eac136
VS
368
369 wxHtmlCell *c = new wxHtmlWordCell(temp, *(GetDC()));
370
3c115835
VS
371 ApplyStateToCell(c);
372
97eac136
VS
373 m_Container->InsertCell(c);
374 ((wxHtmlWordCell*)c)->SetPreviousWord(m_lastWordCell);
375 m_lastWordCell = (wxHtmlWordCell*)c;
5526e819
VS
376}
377
378
379
380wxHtmlContainerCell* wxHtmlWinParser::OpenContainer()
381{
382 m_Container = new wxHtmlContainerCell(m_Container);
4f9297b0 383 m_Container->SetAlignHor(m_Align);
d1da8872 384 m_tmpLastWasSpace = true;
5526e819
VS
385 /* to avoid space being first character in paragraph */
386 return m_Container;
387}
388
389
390
391wxHtmlContainerCell* wxHtmlWinParser::SetContainer(wxHtmlContainerCell *c)
392{
d1da8872 393 m_tmpLastWasSpace = true;
5526e819
VS
394 /* to avoid space being first character in paragraph */
395 return m_Container = c;
396}
397
398
399
400wxHtmlContainerCell* wxHtmlWinParser::CloseContainer()
401{
4f9297b0 402 m_Container = m_Container->GetParent();
5526e819
VS
403 return m_Container;
404}
405
406
f2c2fa4d
VS
407void wxHtmlWinParser::SetFontSize(int s)
408{
409 if (s < 1) s = 1;
410 else if (s > 7) s = 7;
411 m_FontSize = s;
412}
413
414
415
5526e819
VS
416wxFont* wxHtmlWinParser::CreateCurrentFont()
417{
418 int fb = GetFontBold(),
419 fi = GetFontItalic(),
420 fu = GetFontUnderlined(),
421 ff = GetFontFixed(),
f2c2fa4d 422 fs = GetFontSize() - 1 /*remap from <1;7> to <0;6>*/ ;
5526e819 423
f1ad10f3
VS
424 wxString face = ff ? m_FontFaceFixed : m_FontFaceNormal;
425 wxString *faceptr = &(m_FontsFacesTable[fb][fi][fu][ff][fs]);
426 wxFont **fontptr = &(m_FontsTable[fb][fi][fu][ff][fs]);
2b5f62a0 427#if !wxUSE_UNICODE
b250d384 428 wxFontEncoding *encptr = &(m_FontsEncTable[fb][fi][fu][ff][fs]);
2b5f62a0 429#endif
f1ad10f3 430
2b5f62a0
VZ
431 if (*fontptr != NULL && (*faceptr != face
432#if !wxUSE_UNICODE
433 || *encptr != m_OutputEnc
434#endif
435 ))
4f9297b0 436 {
f1ad10f3
VS
437 delete *fontptr;
438 *fontptr = NULL;
439 }
440
3c8c8da2 441 if (*fontptr == NULL)
4f9297b0 442 {
f1ad10f3
VS
443 *faceptr = face;
444 *fontptr = new wxFont(
7a5e6267 445 (int) (m_FontsSizes[fs] * m_PixelScale),
f1ad10f3
VS
446 ff ? wxMODERN : wxSWISS,
447 fi ? wxITALIC : wxNORMAL,
448 fb ? wxBOLD : wxNORMAL,
d1da8872 449 fu ? true : false, face
2b5f62a0
VZ
450#if wxUSE_UNICODE
451 );
452#else
453 , m_OutputEnc);
454 *encptr = m_OutputEnc;
455#endif
5526e819 456 }
4f9297b0 457 m_DC->SetFont(**fontptr);
f1ad10f3 458 return (*fontptr);
5526e819
VS
459}
460
461
462
f2c2fa4d
VS
463void wxHtmlWinParser::SetLink(const wxHtmlLinkInfo& link)
464{
3c8c8da2 465 m_Link = link;
f2c2fa4d
VS
466 m_UseLink = (link.GetHref() != wxEmptyString);
467}
468
3c8c8da2 469void wxHtmlWinParser::SetFontFace(const wxString& face)
b250d384 470{
3c8c8da2 471 if (GetFontFixed()) m_FontFaceFixed = face;
b250d384
VS
472 else m_FontFaceNormal = face;
473
2b5f62a0 474#if !wxUSE_UNICODE
b250d384
VS
475 if (m_InputEnc != wxFONTENCODING_DEFAULT)
476 SetInputEncoding(m_InputEnc);
2b5f62a0 477#endif
b250d384
VS
478}
479
3c115835
VS
480void wxHtmlWinParser::ApplyStateToCell(wxHtmlCell *cell)
481{
482 // set the link:
483 if (m_UseLink)
484 cell->SetLink(GetLink());
485
486 // apply current script mode settings:
487 cell->SetScriptMode(GetScriptMode(), GetScriptBaseline());
488}
b250d384
VS
489
490
2b5f62a0 491#if !wxUSE_UNICODE
b250d384
VS
492void wxHtmlWinParser::SetInputEncoding(wxFontEncoding enc)
493{
494 m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT;
3c8c8da2 495 if (m_EncConv)
daa616fc 496 {
3c8c8da2 497 delete m_EncConv;
daa616fc
VS
498 m_EncConv = NULL;
499 }
b250d384
VS
500
501 if (enc == wxFONTENCODING_DEFAULT) return;
502
503 wxFontEncoding altfix, altnorm;
504 bool availfix, availnorm;
3c8c8da2
VZ
505
506 // exact match?
142b3bc2
VS
507 availnorm = wxFontMapper::Get()->IsEncodingAvailable(enc, m_FontFaceNormal);
508 availfix = wxFontMapper::Get()->IsEncodingAvailable(enc, m_FontFaceFixed);
3c8c8da2 509 if (availnorm && availfix)
b250d384 510 m_OutputEnc = enc;
3c8c8da2 511
b250d384 512 // alternatives?
d1da8872
WS
513 else if (wxFontMapper::Get()->GetAltForEncoding(enc, &altnorm, m_FontFaceNormal, false) &&
514 wxFontMapper::Get()->GetAltForEncoding(enc, &altfix, m_FontFaceFixed, false) &&
b250d384
VS
515 altnorm == altfix)
516 m_OutputEnc = altnorm;
3c8c8da2 517
b250d384
VS
518 // at least normal face?
519 else if (availnorm)
520 m_OutputEnc = enc;
d1da8872 521 else if (wxFontMapper::Get()->GetAltForEncoding(enc, &altnorm, m_FontFaceNormal, false))
b250d384 522 m_OutputEnc = altnorm;
3c8c8da2 523
b250d384 524 else
c83e1237
SC
525 {
526#ifndef __WXMAC__
527 // okay, let convert to ISO_8859-1, available always
b250d384 528 m_OutputEnc = wxFONTENCODING_DEFAULT;
90548138 529#else
c83e1237 530 m_OutputEnc = wxLocale::GetSystemEncoding() ;
90548138 531#endif
c83e1237 532 }
3c8c8da2 533
b250d384 534 m_InputEnc = enc;
daa616fc
VS
535 if (m_OutputEnc == wxFONTENCODING_DEFAULT)
536 GetEntitiesParser()->SetEncoding(wxFONTENCODING_SYSTEM);
537 else
538 GetEntitiesParser()->SetEncoding(m_OutputEnc);
3c8c8da2 539
b250d384
VS
540 if (m_InputEnc == m_OutputEnc) return;
541
542 m_EncConv = new wxEncodingConverter();
3c8c8da2 543 if (!m_EncConv->Init(m_InputEnc,
b250d384
VS
544 (m_OutputEnc == wxFONTENCODING_DEFAULT) ?
545 wxFONTENCODING_ISO8859_1 : m_OutputEnc,
3c8c8da2 546 wxCONVERT_SUBSTITUTE))
b250d384 547 { // total failture :-(
3c8c8da2
VZ
548 wxLogError(_("Failed to display HTML document in %s encoding"),
549 wxFontMapper::GetEncodingName(enc).c_str());
b250d384
VS
550 m_InputEnc = m_OutputEnc = wxFONTENCODING_DEFAULT;
551 delete m_EncConv;
552 m_EncConv = NULL;
553 }
554}
2b5f62a0 555#endif
b250d384
VS
556
557
f2c2fa4d 558
5526e819
VS
559
560//-----------------------------------------------------------------------------
561// wxHtmlWinTagHandler
562//-----------------------------------------------------------------------------
563
564IMPLEMENT_ABSTRACT_CLASS(wxHtmlWinTagHandler, wxHtmlTagHandler)
565
5526e819
VS
566//-----------------------------------------------------------------------------
567// wxHtmlTagsModule
568//-----------------------------------------------------------------------------
569
d6a6d666
VS
570// NB: This is *NOT* winpars.cpp's initialization and shutdown code!!
571// This module is an ancestor for tag handlers modules defined
572// in m_*.cpp files with TAGS_MODULE_BEGIN...TAGS_MODULE_END construct.
573//
574// Do not add any winpars.cpp shutdown or initialization code to it,
575// create a new module instead!
5526e819
VS
576
577IMPLEMENT_DYNAMIC_CLASS(wxHtmlTagsModule, wxModule)
578
5526e819
VS
579bool wxHtmlTagsModule::OnInit()
580{
581 wxHtmlWinParser::AddModule(this);
d1da8872 582 return true;
5526e819
VS
583}
584
5526e819
VS
585void wxHtmlTagsModule::OnExit()
586{
f6bcfd97 587 wxHtmlWinParser::RemoveModule(this);
5526e819 588}
d6a6d666 589
223d09f6 590#endif
5526e819 591