gwenhywfar  5.10.1
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  setText(text);
54  flags|=FLAG_ENABLED;
55 }
56 
57 
58 
60  :FXScrollArea()
61  ,m_htmlCtx(NULL)
62  ,m_minWidth(0) {
63  flags|=FLAG_ENABLED;
64 }
65 
66 
67 
69  if (m_htmlCtx)
70  delete m_htmlCtx;
71 }
72 
73 
74 
75 void FOX16_HtmlText::setText(const FXString& text) {
76  m_haveDefaultDims=false;
77  m_text=text;
78  updateHtml();
79  flags|=FLAG_DIRTY;
80  layout();
81  recalc();
82  update();
83 }
84 
85 
86 
88  int w;
89  int wNeeded;
90 
91  m_htmlCtx->layout(-1, -1);
92  wNeeded=m_htmlCtx->getWidth();
93  w=wNeeded;
94  if (w>m_maxDefaultWidth)
96  if (w<viewport_w)
97  w=viewport_w;
98  //if (w<wNeeded) {
99  m_htmlCtx->layout(w-BORDER*2, -1);
100  //}
103  m_haveDefaultDims=true;
104 }
105 
106 
107 
109  if (m_htmlCtx==NULL)
110  updateHtml();
111 
112  if (!m_haveDefaultDims)
113  calcDefaultDims();
114 
115  m_htmlCtx->layout(viewport_w-(marginleft+marginright+barwidth), -1);
116  return m_htmlCtx->getWidth();
117 }
118 
119 
120 
122  if (m_htmlCtx==NULL)
123  updateHtml();
124 
125  if (!m_haveDefaultDims)
126  calcDefaultDims();
127 
128  return m_htmlCtx->getHeight();
129 }
130 
131 
132 
133 long FOX16_HtmlText::onPaint(FXObject*, FXSelector, void *ptr) {
134  FXEvent* event=(FXEvent*)ptr;
135  FXDCWindow dc(this,event);
136  //dc.setFont(font);
137  //dc.setForeground(FXRGB(255,0,0));
138  //dc.fillRectangle(event->rect.x,event->rect.y,event->rect.w,event->rect.h);
139 
140  dc.setForeground(backColor);
141  dc.fillRectangle(event->rect.x, event->rect.y, event->rect.w, event->rect.h);
142 
143  // Paint top margin
144  if (event->rect.y<=margintop) {
145  dc.setForeground(backColor);
146  dc.fillRectangle(0, 0, viewport_w, margintop);
147  }
148 
149  // Paint bottom margin
150  if (event->rect.y+event->rect.h>=viewport_h-marginbottom) {
151  dc.setForeground(backColor);
152  dc.fillRectangle(0, viewport_h-marginbottom, viewport_w, marginbottom);
153  }
154 
155  // Paint left margin
156  if(event->rect.x<marginleft) {
157  dc.setForeground(backColor);
158  dc.fillRectangle(0, margintop, marginleft, viewport_h-margintop-marginbottom);
159  }
160 
161  // Paint right margin
162  if(event->rect.x+event->rect.w>=viewport_w-marginright) {
163  dc.setForeground(backColor);
164  dc.fillRectangle(viewport_w-marginright, margintop, marginright, viewport_h-margintop-marginbottom);
165  }
166 
167  // Paint text
168  //dc.setClipRectangle(marginleft, margintop, viewport_w-marginright-marginleft, viewport_h-margintop-marginbottom);
169 
170  //drawContents(dc, event->rect.x, event->rect.y, event->rect.w, event->rect.h);
171 
172  if (m_htmlCtx) {
173 #if 0 /* this doesn work */
174  m_htmlCtx->paintAt(&dc, -marginleft-pos_x, -margintop-pos_y,
175  event->rect.x,
176  event->rect.y,
177  event->rect.w,
178  event->rect.h);
179 #else
180  m_htmlCtx->paintAt(&dc, -marginleft-pos_x, -margintop-pos_y,
181  0, 0,
182  viewport_w-(marginleft+marginright+barwidth),
183  viewport_h-(margintop+marginbottom));
184 #endif
185  }
186  else {
187  DBG_ERROR(GWEN_LOGDOMAIN, "No HtmlContext");
188  }
189 
190  return 1;
191 }
192 
193 
194 
195 
197  int w;
198 
199  m_haveDefaultDims=false;
200  if (options & FLAGS_NO_WORDWRAP)
201  w=-1;
202  else
203  w=viewport_w;
204 
205  if (m_htmlCtx==NULL)
206  updateHtml();
208 
209  // Scrollbars adjusted
210  FXScrollArea::layout();
211 
212  update();
213  flags&=~FLAG_DIRTY;
214 }
215 
216 
217 
219  if (m_htmlCtx)
220  delete m_htmlCtx;
221  m_htmlCtx=new FOX16_HtmlCtx(0);
222  m_htmlCtx->setBackgroundColor(backColor);
223  m_htmlCtx->setForegroundColor(fxcolorfromname("black"));
224  m_htmlCtx->setText(m_text.text());
225  flags|=FLAG_DIRTY;
226 }
227 
228 
230  FXint xPos, yPos;
231 
232  xPos=pos_x;
233  yPos=getContentHeight()-viewport_h;
234  if (xPos>=0 && yPos>=0)
235  setPosition(-xPos, -yPos);
236 }
237 
238 
239 
240 
241 
int layout(int width, int height)
FXDEFMAP(FOX16_HtmlText) FOX16_HtmlTextMap[]
void makePositionVisible(FXint pos)
#define NULL
Definition: binreloc.c:300
#define GWEN_LOGDOMAIN
Definition: logger.h:35
long onPaint(FXObject *, FXSelector, void *)
void setText(const FXString &text)
Set the text for this label.
void setText(const char *s)
void setForegroundColor(FXColor c)
FOX16_HtmlCtx * m_htmlCtx
virtual FXint getContentWidth()
virtual FXint getContentHeight()
FXIMPLEMENT(FOX16_GuiSortingList, FXFoldingList, FOX16_GuiSortingListMap, ARRAYNUMBER(FOX16_GuiSortingListMap)) FOX16_GuiSortingList
void setBackgroundColor(FXColor c)
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
void paintAt(FXDC *dc, int xOffset, int yOffset, int xText, int yText, int w, int h)
#define MAX_DEFAULT_WIDTH
#define BORDER