removed wxITALIC/wxSLANT stuff from wxHTML (no longer neccessary, we have intelligent...
[wxWidgets.git] / src / html / winpars.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: winpars.cpp
3 // Purpose: wxHtmlParser class (generic parser)
4 // Author: Vaclav Slavik
5 // RCS-ID: $Id$
6 // Copyright: (c) 1999 Vaclav Slavik
7 // Licence: wxWindows Licence
8 /////////////////////////////////////////////////////////////////////////////
9
10
11 #ifdef __GNUG__
12 #pragma implementation
13 #endif
14
15 #include "wx/wxprec.h"
16
17 #include "wx/defs.h"
18 #if wxUSE_HTML
19
20 #ifdef __BORDLANDC__
21 #pragma hdrstop
22 #endif
23
24 #ifndef WXPRECOMP
25 #include "wx/wx.h"
26 #endif
27
28 #include "wx/html/htmldefs.h"
29 #include "wx/html/winpars.h"
30 #include "wx/html/htmlwin.h"
31
32
33 //-----------------------------------------------------------------------------
34 // wxHtmlWinParser
35 //-----------------------------------------------------------------------------
36
37
38 wxList wxHtmlWinParser::m_Modules;
39
40 wxHtmlWinParser::wxHtmlWinParser(wxWindow *wnd) : wxHtmlParser()
41 {
42 m_Window = wnd;
43 m_Container = NULL;
44 m_DC = NULL;
45 m_CharHeight = m_CharWidth = 0;
46 m_UseLink = FALSE;
47
48 {
49 int i, j, k, l, m;
50 for (i = 0; i < 2; i++)
51 for (j = 0; j < 2; j++)
52 for (k = 0; k < 2; k++)
53 for (l = 0; l < 2; l++)
54 for (m = 0; m < 7; m++)
55 m_FontsTable[i][j][k][l][m] = NULL;
56 #ifdef __WXMSW__
57 static int default_sizes[7] = {7, 8, 10, 12, 16, 22, 30};
58 #else
59 static int default_sizes[7] = {10, 12, 14, 16, 19, 24, 32};
60 #endif
61 SetFonts("", "", default_sizes);
62 }
63
64 // fill in wxHtmlParser's tables:
65 wxNode *node = m_Modules.GetFirst();
66 while (node) {
67 wxHtmlTagsModule *mod = (wxHtmlTagsModule*) node -> GetData();
68 mod -> FillHandlersTable(this);
69 node = node -> GetNext();
70 }
71 }
72
73
74
75 void wxHtmlWinParser::AddModule(wxHtmlTagsModule *module)
76 {
77 m_Modules.Append(module);
78 }
79
80
81
82 void wxHtmlWinParser::SetFonts(wxString normal_face, wxString fixed_face, const int *sizes)
83 {
84 int i, j, k, l, m;
85
86 for (i = 0; i < 7; i++) m_FontsSizes[i] = sizes[i];
87 m_FontFaceFixed = fixed_face;
88 m_FontFaceNormal = normal_face;
89
90 for (i = 0; i < 2; i++)
91 for (j = 0; j < 2; j++)
92 for (k = 0; k < 2; k++)
93 for (l = 0; l < 2; l++)
94 for (m = 0; m < 7; m++) {
95 if (m_FontsTable[i][j][k][l][m] != NULL) {
96 delete m_FontsTable[i][j][k][l][m];
97 m_FontsTable[i][j][k][l][m] = NULL;
98 }
99 }
100 }
101
102
103
104 void wxHtmlWinParser::InitParser(const wxString& source)
105 {
106 wxHtmlParser::InitParser(source);
107 wxASSERT_MSG(m_DC != NULL, _("no DC assigned to wxHtmlWinParser!!"));
108
109 m_FontBold = m_FontItalic = m_FontUnderlined = m_FontFixed = FALSE;
110 m_FontSize = 0;
111 CreateCurrentFont(); // we're selecting default font into
112 m_DC -> GetTextExtent("H", &m_CharWidth, &m_CharHeight);
113 /* NOTE : we're not using GetCharWidth/Height() because
114 of differences under X and win
115 */
116
117 m_Link = "";
118 m_LinkColor.Set(0, 0, 0xFF);
119 m_ActualColor.Set(0, 0, 0);
120 m_Align = wxHTML_ALIGN_LEFT;
121 m_tmpLastWasSpace = FALSE;
122
123 OpenContainer();
124
125 OpenContainer();
126 m_Container -> InsertCell(new wxHtmlColourCell(m_ActualColor));
127 m_Container -> InsertCell(new wxHtmlFontCell(CreateCurrentFont()));
128 }
129
130
131
132 void wxHtmlWinParser::DoneParser()
133 {
134 m_Container = NULL;
135 wxHtmlParser::DoneParser();
136 }
137
138
139
140 wxObject* wxHtmlWinParser::GetProduct()
141 {
142 wxHtmlContainerCell *top;
143
144 CloseContainer();
145 OpenContainer();
146 GetContainer() -> SetIndent(m_CharHeight, wxHTML_INDENT_TOP);
147 top = m_Container;
148 while (top -> GetParent()) top = top -> GetParent();
149 return top;
150 }
151
152
153
154 wxList* wxHtmlWinParser::GetTempData()
155 {
156 int i, j, k, l, m;
157 wxFont *f;
158 wxList *lst = wxHtmlParser::GetTempData();
159
160 if (lst == NULL) lst = new wxList;
161 lst -> DeleteContents(TRUE);
162
163 for (i = 0; i < 2; i++)
164 for (j = 0; j < 2; j++)
165 for (k = 0; k < 2; k++)
166 for (l = 0; l < 2; l++)
167 for (m = 0; m < 7; m++) {
168 f = m_FontsTable[i][j][k][l][m];
169 if (f) lst -> Append(f);
170 }
171 return lst;
172 }
173
174
175
176 void wxHtmlWinParser::AddText(const char* txt)
177 {
178 wxHtmlCell *c;
179 int i = 0, x, lng = strlen(txt);
180 char temp[wxHTML_BUFLEN];
181 register char d;
182 int templen = 0;
183
184 if (m_tmpLastWasSpace) {
185 while ((i < lng) && ((txt[i] == '\n') || (txt[i] == '\r') || (txt[i] == ' ') || (txt[i] == '\t'))) i++;
186 }
187
188 while (i < lng) {
189 x = 0;
190 d = temp[templen++] = txt[i];
191 if ((d == '\n') || (d == '\r') || (d == ' ') || (d == '\t')) {
192 i++, x++;
193 while ((i < lng) && ((txt[i] == '\n') || (txt[i] == '\r') || (txt[i] == ' ') || (txt[i] == '\t'))) i++, x++;
194 }
195 else i++;
196
197 if (x) {
198 temp[templen-1] = ' ';
199 temp[templen] = 0;
200 templen = 0;
201 c = new wxHtmlWordCell(temp, *(GetDC()));
202 if (m_UseLink) c -> SetLink(m_Link);
203 m_Container -> InsertCell(c);
204 m_tmpLastWasSpace = TRUE;
205 }
206 }
207 if (templen) {
208 temp[templen] = 0;
209 c = new wxHtmlWordCell(temp, *(GetDC()));
210 if (m_UseLink) c -> SetLink(m_Link);
211 m_Container -> InsertCell(c);
212 m_tmpLastWasSpace = FALSE;
213 }
214 }
215
216
217
218 wxHtmlContainerCell* wxHtmlWinParser::OpenContainer()
219 {
220 m_Container = new wxHtmlContainerCell(m_Container);
221 m_Container -> SetAlignHor(m_Align);
222 m_tmpLastWasSpace = TRUE;
223 /* to avoid space being first character in paragraph */
224 return m_Container;
225 }
226
227
228
229 wxHtmlContainerCell* wxHtmlWinParser::SetContainer(wxHtmlContainerCell *c)
230 {
231 m_tmpLastWasSpace = TRUE;
232 /* to avoid space being first character in paragraph */
233 return m_Container = c;
234 }
235
236
237
238 wxHtmlContainerCell* wxHtmlWinParser::CloseContainer()
239 {
240 m_Container = m_Container -> GetParent();
241 return m_Container;
242 }
243
244
245 wxFont* wxHtmlWinParser::CreateCurrentFont()
246 {
247 int fb = GetFontBold(),
248 fi = GetFontItalic(),
249 fu = GetFontUnderlined(),
250 ff = GetFontFixed(),
251 fs = GetFontSize() + 2 /*remap from <-2;4> to <0;7>*/ ;
252
253 if (m_FontsTable[fb][fi][fu][ff][fs] == NULL) {
254 m_FontsTable[fb][fi][fu][ff][fs] =
255 new wxFont(
256 m_FontsSizes[fs] * m_PixelScale,
257 ff ? wxMODERN : wxSWISS,
258 fi ? wxITALIC : wxNORMAL,
259 fb ? wxBOLD : wxNORMAL,
260 fu ? TRUE : FALSE, ff ? m_FontFaceFixed : m_FontFaceNormal);
261 }
262 m_DC -> SetFont(*(m_FontsTable[fb][fi][fu][ff][fs]));
263 return (m_FontsTable[fb][fi][fu][ff][fs]);
264 }
265
266
267
268
269 //-----------------------------------------------------------------------------
270 // wxHtmlWinTagHandler
271 //-----------------------------------------------------------------------------
272
273 IMPLEMENT_ABSTRACT_CLASS(wxHtmlWinTagHandler, wxHtmlTagHandler)
274
275
276
277 //-----------------------------------------------------------------------------
278 // wxHtmlTagsModule
279 //-----------------------------------------------------------------------------
280
281
282 IMPLEMENT_DYNAMIC_CLASS(wxHtmlTagsModule, wxModule)
283
284
285 bool wxHtmlTagsModule::OnInit()
286 {
287 wxHtmlWinParser::AddModule(this);
288 return TRUE;
289 }
290
291
292
293 void wxHtmlTagsModule::OnExit()
294 {
295 }
296 #endif
297