gwenhywfar  4.6.0beta
fox16_htmltext.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Tue Feb 23 2010
3  copyright : (C) 2010 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 #include "fox16_htmltext.hpp"
15 #include "fox16_htmlctx.hpp"
16 
17 #include <gwenhywfar/debug.h>
18 #include <gwenhywfar/i18n.h>
19 
20 #include <assert.h>
21 
22 
23 #define MAX_DEFAULT_WIDTH 400
24 #define BORDER 2
25 
26 
27 
28 FXDEFMAP(FOX16_HtmlText) FOX16_HtmlTextMap[]={
29  FXMAPFUNC(SEL_PAINT,0,FOX16_HtmlText::onPaint),
30 };
31 
32 
33 
34 // Object implementation
35 FXIMPLEMENT(FOX16_HtmlText, FXScrollArea, FOX16_HtmlTextMap, ARRAYNUMBER(FOX16_HtmlTextMap))
36 
37 
38 
39 
40 FOX16_HtmlText::FOX16_HtmlText(FXComposite* p, const FXString& text,
41  FXuint opts,
42  FXint x, FXint y, FXint w, FXint h)
43 :FXScrollArea(p, opts, x, y, w, h)
44 ,m_htmlCtx(NULL)
45 ,m_minWidth(0)
46 ,m_maxDefaultWidth(MAX_DEFAULT_WIDTH)
47 ,m_haveDefaultDims(false)
48 ,margintop(BORDER)
49 ,marginbottom(BORDER)
50 ,marginleft(BORDER)
51 ,marginright(BORDER)
52 ,barwidth(8)
53 {
54  setText(text);
55  flags|=FLAG_ENABLED;
56 }
57 
58 
59 
61 :FXScrollArea()
62 ,m_htmlCtx(NULL)
63 ,m_minWidth(0)
64 {
65  flags|=FLAG_ENABLED;
66 }
67 
68 
69 
71  if (m_htmlCtx)
72  delete m_htmlCtx;
73 }
74 
75 
76 
77 void FOX16_HtmlText::setText(const FXString& text) {
78  m_haveDefaultDims=false;
79  m_text=text;
80  updateHtml();
81  flags|=FLAG_DIRTY;
82  layout();
83  recalc();
84  update();
85 }
86 
87 
88 
90  int w;
91  int wNeeded;
92 
93  m_htmlCtx->layout(-1, -1);
94  wNeeded=m_htmlCtx->getWidth();
95  w=wNeeded;
96  if (w>m_maxDefaultWidth)
98  if (w<viewport_w)
99  w=viewport_w;
100  //if (w<wNeeded) {
101  m_htmlCtx->layout(w-BORDER*2, -1);
102  //}
105  m_haveDefaultDims=true;
106 }
107 
108 
109 
111  if (m_htmlCtx==NULL)
112  updateHtml();
113 
114  if (!m_haveDefaultDims)
115  calcDefaultDims();
116 
117  m_htmlCtx->layout(viewport_w-(marginleft+marginright+barwidth), -1);
118  return m_htmlCtx->getWidth();
119 }
120 
121 
122 
124  if (m_htmlCtx==NULL)
125  updateHtml();
126 
127  if (!m_haveDefaultDims)
128  calcDefaultDims();
129 
130  return m_htmlCtx->getHeight();
131 }
132 
133 
134 
135 long FOX16_HtmlText::onPaint(FXObject*, FXSelector, void *ptr) {
136  FXEvent* event=(FXEvent*)ptr;
137  FXDCWindow dc(this,event);
138  //dc.setFont(font);
139  //dc.setForeground(FXRGB(255,0,0));
140  //dc.fillRectangle(event->rect.x,event->rect.y,event->rect.w,event->rect.h);
141 
142  dc.setForeground(backColor);
143  dc.fillRectangle(event->rect.x, event->rect.y, event->rect.w, event->rect.h);
144 
145  // Paint top margin
146  if (event->rect.y<=margintop){
147  dc.setForeground(backColor);
148  dc.fillRectangle(0, 0, viewport_w, margintop);
149  }
150 
151  // Paint bottom margin
152  if (event->rect.y+event->rect.h>=viewport_h-marginbottom){
153  dc.setForeground(backColor);
154  dc.fillRectangle(0, viewport_h-marginbottom, viewport_w, marginbottom);
155  }
156 
157  // Paint left margin
158  if(event->rect.x<marginleft){
159  dc.setForeground(backColor);
160  dc.fillRectangle(0, margintop, marginleft, viewport_h-margintop-marginbottom);
161  }
162 
163  // Paint right margin
164  if(event->rect.x+event->rect.w>=viewport_w-marginright){
165  dc.setForeground(backColor);
166  dc.fillRectangle(viewport_w-marginright, margintop, marginright, viewport_h-margintop-marginbottom);
167  }
168 
169  // Paint text
170  //dc.setClipRectangle(marginleft, margintop, viewport_w-marginright-marginleft, viewport_h-margintop-marginbottom);
171 
172  //drawContents(dc, event->rect.x, event->rect.y, event->rect.w, event->rect.h);
173 
174  if (m_htmlCtx) {
175 #if 0 /* this doesn work */
176  m_htmlCtx->paintAt(&dc, -marginleft-pos_x, -margintop-pos_y,
177  event->rect.x,
178  event->rect.y,
179  event->rect.w,
180  event->rect.h);
181 #else
182  m_htmlCtx->paintAt(&dc, -marginleft-pos_x, -margintop-pos_y,
183  0, 0,
184  viewport_w-(marginleft+marginright+barwidth),
185  viewport_h-(margintop+marginbottom));
186 #endif
187  }
188  else {
189  DBG_ERROR(GWEN_LOGDOMAIN, "No HtmlContext");
190  }
191 
192  return 1;
193 }
194 
195 
196 
197 
199  int w;
200 
201  m_haveDefaultDims=false;
202  if (options & FLAGS_NO_WORDWRAP)
203  w=-1;
204  else
205  w=viewport_w;
206 
207  if (m_htmlCtx==NULL)
208  updateHtml();
210 
211  // Scrollbars adjusted
212  FXScrollArea::layout();
213 
214  update();
215  flags&=~FLAG_DIRTY;
216 }
217 
218 
219 
221  if (m_htmlCtx)
222  delete m_htmlCtx;
223  m_htmlCtx=new FOX16_HtmlCtx(0);
224  m_htmlCtx->setBackgroundColor(backColor);
225  m_htmlCtx->setForegroundColor(fxcolorfromname("black"));
226  m_htmlCtx->setText(m_text.text());
227  flags|=FLAG_DIRTY;
228 }
229 
230 
232  FXint xPos, yPos;
233 
234  xPos=pos_x;
235  yPos=getContentHeight()-viewport_h;
236  if (xPos>=0 && yPos>=0)
237  setPosition(-xPos, -yPos);
238 }
239 
240 
241 
242 
243