Well, wxHTML compiles in Unicode mode now. But if it works (without
[wxWidgets.git] / src / html / m_pre.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: mod_pre.cpp
3 // Purpose: wxHtml module for <PRE> ... </PRE> tag (code citation)
4 // Author: Vaclav Slavik
5 // RCS-ID: $Id$
6 // Copyright: (c) 1999 Vaclav Slavik
7 // Licence: wxWindows Licence
8 /////////////////////////////////////////////////////////////////////////////
9
10 #ifdef __GNUG__
11 #pragma implementation
12 #endif
13
14 #include <wx/wxprec.h>
15
16 #include "wx/defs.h"
17 #if wxUSE_HTML
18 #ifdef __BORDLANDC__
19 #pragma hdrstop
20 #endif
21
22 #ifndef WXPRECOMP
23 #include <wx/wx.h>
24 #endif
25
26
27 #include "wx/html/forcelnk.h"
28 #include "wx/html/m_templ.h"
29
30 #include "wx/html/htmlcell.h"
31 #include <wx/tokenzr.h>
32
33 FORCE_LINK_ME(mod_pre)
34
35
36 //-----------------------------------------------------------------------------
37 // wxHtmlCodeCell
38 //-----------------------------------------------------------------------------
39
40 class wxHtmlPRECell : public wxHtmlCell
41 {
42 private:
43 wxString** m_Text;
44 // list of wxString objects.
45 int m_LinesCnt;
46 // number of lines
47 int m_LineHeight;
48 // height of single line of text
49
50 public:
51 wxHtmlPRECell(const wxString& s, wxDC& dc);
52 ~wxHtmlPRECell();
53 void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
54 };
55
56
57 wxHtmlPRECell::wxHtmlPRECell(const wxString& s, wxDC& dc) : wxHtmlCell()
58 {
59 wxStringTokenizer tokenizer(s, "\n");
60 wxString tmp;
61 long int x, z;
62 int i;
63
64 m_LineHeight = dc.GetCharHeight();
65 m_LinesCnt = 0;
66 m_Text = NULL;
67 m_Width = m_Height = 0;
68
69 i = 0;
70 while (tokenizer.HasMoreTokens()) {
71 if (i % 10 == 0) m_Text = (wxString**) realloc(m_Text, sizeof(wxString*) * (i + 10));
72 tmp = tokenizer.NextToken();
73 tmp.Replace(wxT("&nbsp;"), wxT(" "), TRUE);
74 tmp.Replace(wxT("&quot;"), wxT("\""), TRUE);
75 tmp.Replace(wxT("&lt;"), wxT("<"), TRUE);
76 tmp.Replace(wxT("&gt;"), wxT(">"), TRUE);
77 tmp.Replace(wxT("&amp;"), wxT("&"), TRUE);
78 tmp.Replace(wxT("\t"), wxT(" "), TRUE);
79 tmp.Replace(wxT("\r"), wxT(""), TRUE);
80 m_Text[i++] = new wxString(tmp);
81
82 dc.GetTextExtent(tmp, &x, &z, &z);
83 if (x > m_Width) m_Width = x;
84 m_Height += m_LineHeight;
85 m_LinesCnt++;
86 }
87 }
88
89
90
91 wxHtmlPRECell::~wxHtmlPRECell()
92 {
93 for (int i = 0; i < m_LinesCnt; i++) delete m_Text[i];
94 free(m_Text);
95 }
96
97
98 void wxHtmlPRECell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
99 {
100 for (int i = 0; i < m_LinesCnt; i++)
101 dc.DrawText(*(m_Text[i]), x + m_PosX, y + m_PosY + m_LineHeight * i);
102
103 wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
104 }
105
106
107
108
109 //-----------------------------------------------------------------------------
110 // The list handler:
111 //-----------------------------------------------------------------------------
112
113
114 TAG_HANDLER_BEGIN(PRE, "PRE")
115
116 TAG_HANDLER_PROC(tag)
117 {
118 wxHtmlContainerCell *c;
119
120 int fixed = m_WParser -> GetFontFixed(),
121 italic = m_WParser -> GetFontItalic(),
122 underlined = m_WParser -> GetFontUnderlined(),
123 bold = m_WParser -> GetFontBold(),
124 fsize = m_WParser -> GetFontSize();
125
126 m_WParser -> CloseContainer();
127 c = m_WParser -> OpenContainer();
128 c -> SetAlignHor(wxHTML_ALIGN_LEFT);
129 c -> SetIndent(m_WParser -> GetCharHeight(), wxHTML_INDENT_VERTICAL);
130
131 m_WParser -> SetFontUnderlined(FALSE);
132 m_WParser -> SetFontBold(FALSE);
133 m_WParser -> SetFontItalic(FALSE);
134 m_WParser -> SetFontFixed(TRUE);
135 m_WParser -> SetFontSize(0);
136 c -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
137
138 {
139 wxString cit;
140 cit = m_WParser -> GetSource() -> Mid(tag.GetBeginPos(), tag.GetEndPos1() - tag.GetBeginPos());
141 c -> InsertCell(new wxHtmlPRECell(cit, *(m_WParser -> GetDC())));
142 }
143
144 m_WParser -> SetFontUnderlined(underlined);
145 m_WParser -> SetFontBold(bold);
146 m_WParser -> SetFontItalic(italic);
147 m_WParser -> SetFontFixed(fixed);
148 m_WParser -> SetFontSize(fsize);
149 c -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
150
151 m_WParser -> CloseContainer();
152 m_WParser -> OpenContainer();
153 return TRUE;
154 }
155
156 TAG_HANDLER_END(PRE)
157
158
159
160
161
162 TAGS_MODULE_BEGIN(Pre)
163
164 TAGS_MODULE_ADD(PRE)
165
166 TAGS_MODULE_END(Pre)
167
168 #endif