1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: src/html/m_fonts.cpp 3 // Purpose: wxHtml module for fonts & colors of fonts 4 // Author: Vaclav Slavik 5 // Copyright: (c) 1999 Vaclav Slavik 6 // Licence: wxWindows licence 7 ///////////////////////////////////////////////////////////////////////////// 8 9 #include "wx/wxprec.h" 10 11 #ifdef __BORLANDC__ 12 #pragma hdrstop 13 #endif 14 15 #if wxUSE_HTML && wxUSE_STREAMS 16 17 #ifndef WX_PRECOMP 18 #endif 19 20 #include "wx/html/forcelnk.h" 21 #include "wx/html/m_templ.h" 22 #include "wx/fontenum.h" 23 #include "wx/tokenzr.h" 24 25 FORCE_LINK_ME(m_fonts) 26 27 28 TAG_HANDLER_BEGIN(FONT, "FONT" ) 29 30 TAG_HANDLER_VARS 31 wxArrayString m_Faces; 32 TAG_HANDLER_CONSTR(FONT)33 TAG_HANDLER_CONSTR(FONT) { } 34 TAG_HANDLER_PROC(tag)35 TAG_HANDLER_PROC(tag) 36 { 37 wxColour oldclr = m_WParser->GetActualColor(); 38 int oldsize = m_WParser->GetFontSize(); 39 wxString oldface = m_WParser->GetFontFace(); 40 41 { 42 wxColour clr; 43 if (tag.GetParamAsColour(wxT("COLOR"), &clr)) 44 { 45 m_WParser->SetActualColor(clr); 46 m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(clr)); 47 } 48 } 49 50 { 51 long tmp = 0; 52 wxString sizeStr; 53 if (tag.GetParamAsString(wxT("SIZE"), &sizeStr) && sizeStr.ToLong(&tmp)) 54 { 55 wxChar c = sizeStr[0]; 56 if (c == wxT('+') || c == wxT('-')) 57 m_WParser->SetFontSize(oldsize+tmp); 58 else 59 m_WParser->SetFontSize(tmp); 60 m_WParser->GetContainer()->InsertCell( 61 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 62 } 63 } 64 65 wxString faces; 66 if (tag.GetParamAsString(wxT("FACE"), &faces)) 67 { 68 if (m_Faces.GetCount() == 0) 69 m_Faces = wxFontEnumerator::GetFacenames(); 70 71 wxStringTokenizer tk(faces, wxT(",")); 72 int index; 73 74 while (tk.HasMoreTokens()) 75 { 76 if ((index = m_Faces.Index(tk.GetNextToken(), false)) != wxNOT_FOUND) 77 { 78 m_WParser->SetFontFace(m_Faces[index]); 79 m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 80 break; 81 } 82 } 83 } 84 85 ParseInner(tag); 86 87 if (oldface != m_WParser->GetFontFace()) 88 { 89 m_WParser->SetFontFace(oldface); 90 m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 91 } 92 if (oldsize != m_WParser->GetFontSize()) 93 { 94 m_WParser->SetFontSize(oldsize); 95 m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 96 } 97 if (oldclr != m_WParser->GetActualColor()) 98 { 99 m_WParser->SetActualColor(oldclr); 100 m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(oldclr)); 101 } 102 return true; 103 } 104 105 TAG_HANDLER_END(FONT) 106 107 108 TAG_HANDLER_BEGIN(FACES_U, "U,STRIKE,DEL") 109 TAG_HANDLER_CONSTR(FACES_U)110 TAG_HANDLER_CONSTR(FACES_U) { } 111 TAG_HANDLER_PROC(tag)112 TAG_HANDLER_PROC(tag) 113 { 114 int underlined = m_WParser->GetFontUnderlined(); 115 116 m_WParser->SetFontUnderlined(true); 117 m_WParser->GetContainer()->InsertCell( 118 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 119 120 ParseInner(tag); 121 122 m_WParser->SetFontUnderlined(underlined); 123 m_WParser->GetContainer()->InsertCell( 124 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 125 return true; 126 } 127 128 TAG_HANDLER_END(FACES_U) 129 130 131 132 133 TAG_HANDLER_BEGIN(FACES_B, "B,STRONG") TAG_HANDLER_CONSTR(FACES_B)134 TAG_HANDLER_CONSTR(FACES_B) { } 135 TAG_HANDLER_PROC(tag)136 TAG_HANDLER_PROC(tag) 137 { 138 int bold = m_WParser->GetFontBold(); 139 140 m_WParser->SetFontBold(true); 141 m_WParser->GetContainer()->InsertCell( 142 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 143 144 ParseInner(tag); 145 146 m_WParser->SetFontBold(bold); 147 m_WParser->GetContainer()->InsertCell( 148 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 149 return true; 150 } 151 152 TAG_HANDLER_END(FACES_B) 153 154 155 156 157 TAG_HANDLER_BEGIN(FACES_I, "I,EM,CITE,ADDRESS") TAG_HANDLER_CONSTR(FACES_I)158 TAG_HANDLER_CONSTR(FACES_I) { } 159 TAG_HANDLER_PROC(tag)160 TAG_HANDLER_PROC(tag) 161 { 162 int italic = m_WParser->GetFontItalic(); 163 164 m_WParser->SetFontItalic(true); 165 m_WParser->GetContainer()->InsertCell( 166 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 167 168 ParseInner(tag); 169 170 m_WParser->SetFontItalic(italic); 171 m_WParser->GetContainer()->InsertCell( 172 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 173 return true; 174 } 175 176 TAG_HANDLER_END(FACES_I) 177 178 179 180 181 TAG_HANDLER_BEGIN(FACES_TT, "TT,CODE,KBD,SAMP") TAG_HANDLER_CONSTR(FACES_TT)182 TAG_HANDLER_CONSTR(FACES_TT) { } 183 TAG_HANDLER_PROC(tag)184 TAG_HANDLER_PROC(tag) 185 { 186 int fixed = m_WParser->GetFontFixed(); 187 188 m_WParser->SetFontFixed(true); 189 m_WParser->GetContainer()->InsertCell( 190 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 191 192 ParseInner(tag); 193 194 m_WParser->SetFontFixed(fixed); 195 m_WParser->GetContainer()->InsertCell( 196 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 197 return true; 198 } 199 200 TAG_HANDLER_END(FACES_TT) 201 202 203 204 205 206 TAG_HANDLER_BEGIN(Hx, "H1,H2,H3,H4,H5,H6") TAG_HANDLER_CONSTR(Hx)207 TAG_HANDLER_CONSTR(Hx) { } 208 TAG_HANDLER_PROC(tag)209 TAG_HANDLER_PROC(tag) 210 { 211 int old_size, old_b, old_i, old_u, old_f, old_al; 212 wxHtmlContainerCell *c; 213 214 old_size = m_WParser->GetFontSize(); 215 old_b = m_WParser->GetFontBold(); 216 old_i = m_WParser->GetFontItalic(); 217 old_u = m_WParser->GetFontUnderlined(); 218 old_f = m_WParser->GetFontFixed(); 219 old_al = m_WParser->GetAlign(); 220 221 m_WParser->SetFontBold(true); 222 m_WParser->SetFontItalic(false); 223 m_WParser->SetFontUnderlined(false); 224 m_WParser->SetFontFixed(false); 225 226 if (tag.GetName() == wxT("H1")) 227 m_WParser->SetFontSize(7); 228 else if (tag.GetName() == wxT("H2")) 229 m_WParser->SetFontSize(6); 230 else if (tag.GetName() == wxT("H3")) 231 m_WParser->SetFontSize(5); 232 else if (tag.GetName() == wxT("H4")) 233 { 234 m_WParser->SetFontSize(5); 235 m_WParser->SetFontItalic(true); 236 m_WParser->SetFontBold(false); 237 } 238 else if (tag.GetName() == wxT("H5")) 239 m_WParser->SetFontSize(4); 240 else if (tag.GetName() == wxT("H6")) 241 { 242 m_WParser->SetFontSize(4); 243 m_WParser->SetFontItalic(true); 244 m_WParser->SetFontBold(false); 245 } 246 247 c = m_WParser->GetContainer(); 248 if (c->GetFirstChild()) 249 { 250 m_WParser->CloseContainer(); 251 m_WParser->OpenContainer(); 252 c = m_WParser->GetContainer(); 253 } 254 c = m_WParser->GetContainer(); 255 256 c->SetAlign(tag); 257 c->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 258 c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP); 259 m_WParser->SetAlign(c->GetAlignHor()); 260 261 ParseInner(tag); 262 263 m_WParser->SetFontSize(old_size); 264 m_WParser->SetFontBold(old_b); 265 m_WParser->SetFontItalic(old_i); 266 m_WParser->SetFontUnderlined(old_u); 267 m_WParser->SetFontFixed(old_f); 268 m_WParser->SetAlign(old_al); 269 270 m_WParser->GetContainer()->InsertCell( 271 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 272 m_WParser->CloseContainer(); 273 m_WParser->OpenContainer(); 274 c = m_WParser->GetContainer(); 275 c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP); 276 277 return true; 278 } 279 280 TAG_HANDLER_END(Hx) 281 282 283 TAG_HANDLER_BEGIN(BIGSMALL, "BIG,SMALL") TAG_HANDLER_CONSTR(BIGSMALL)284 TAG_HANDLER_CONSTR(BIGSMALL) { } 285 TAG_HANDLER_PROC(tag)286 TAG_HANDLER_PROC(tag) 287 { 288 int oldsize = m_WParser->GetFontSize(); 289 int sz = (tag.GetName() == wxT("BIG")) ? +1 : -1; 290 291 m_WParser->SetFontSize(sz); 292 m_WParser->GetContainer()->InsertCell( 293 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 294 295 ParseInner(tag); 296 297 m_WParser->SetFontSize(oldsize); 298 m_WParser->GetContainer()->InsertCell( 299 new wxHtmlFontCell(m_WParser->CreateCurrentFont())); 300 return true; 301 } 302 303 TAG_HANDLER_END(BIGSMALL) 304 305 306 307 308 TAGS_MODULE_BEGIN(Fonts) 309 310 TAGS_MODULE_ADD(FONT) 311 TAGS_MODULE_ADD(FACES_U) 312 TAGS_MODULE_ADD(FACES_I) 313 TAGS_MODULE_ADD(FACES_B) 314 TAGS_MODULE_ADD(FACES_TT) 315 TAGS_MODULE_ADD(Hx) 316 TAGS_MODULE_ADD(BIGSMALL) 317 318 TAGS_MODULE_END(Fonts) 319 320 321 #endif 322