00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifdef _MSC_VER
00026 #include <windows_config.h>
00027 #else
00028 #include <config.h>
00029 #endif
00030
00031 #include <fxver.h>
00032 #include <xincs.h>
00033 #include <fxdefs.h>
00034 #include <fx.h>
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 using namespace FX;
00049 #include "FXSevenSegment.h"
00050 #include "FXLCDLabel.h"
00051 #include "FXBaseObject.h"
00052
00053 #ifdef CHECK_MEMORY_LEAKS
00054 #include <foreign/nvwa/debug_new.h>
00055 #endif // CHECK_MEMORY_LEAKS
00056 using namespace FXEX;
00057 namespace FXEX {
00058
00059 FXDEFMAP(FXLCDLabel) FXLCDLabelMap[]={
00060 FXMAPFUNC(SEL_PAINT,0,FXLCDLabel::onPaint),
00061 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXLCDLabel::onCmdSetValue),
00062 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXLCDLabel::onCmdSetIntValue),
00063 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETREALVALUE,FXLCDLabel::onCmdSetRealValue),
00064 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE,FXLCDLabel::onCmdSetStringValue),
00065 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXLCDLabel::onCmdGetIntValue),
00066 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETREALVALUE,FXLCDLabel::onCmdGetRealValue),
00067 FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETSTRINGVALUE,FXLCDLabel::onCmdGetStringValue),
00068
00069
00070 FXMAPKEY(FXLCDLabel::ID_SEVENSEGMENT,FXLCDLabel::onRedirectEvent),
00071 };
00072 FXIMPLEMENT(FXLCDLabel,FXHorizontalFrame,FXLCDLabelMap,ARRAYNUMBER(FXLCDLabelMap))
00073
00074 FXLCDLabel::FXLCDLabel(FXComposite* p,FXuint nfig,FXObject* tgt,FXSelector sel,FXuint opts,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs) : FXHorizontalFrame(p,opts,0,0,0,0,pl,pr,pt,pb,hs,0) {
00075 if (nfig==0) fxerror("%s: must have at least one figure.\n",getClassName());
00076 nfigures=nfig;
00077 setTarget(tgt);
00078 setSelector(sel);
00079 enable();
00080 for (FXint i=0; i<nfigures; i++) {
00081 new FXSevenSegment(this,this,ID_SEVENSEGMENT,0,0,0,0);
00082 }
00083 }
00084
00085 FXLCDLabel::~FXLCDLabel() {
00086
00087
00088
00089
00090
00091 }
00092
00093
00094 void FXLCDLabel::create() {
00095 FXHorizontalFrame::create();
00096 for (FXWindow *child=getFirst(); child; child=child->getNext()) {
00097 child->create();
00098 }
00099 }
00100
00101
00102 void FXLCDLabel::detach() {
00103 for (FXWindow *child=getFirst(); child; child=child->getNext()) {
00104 child->detach();
00105 }
00106 FXHorizontalFrame::detach();
00107 }
00108
00109
00110 void FXLCDLabel::destroy() {
00111 for (FXWindow *child=getFirst(); child; child=child->getNext()) {
00112 child->destroy();
00113 }
00114 FXHorizontalFrame::destroy();
00115 }
00116
00117
00118 FXColor FXLCDLabel::getFgColor() const {
00119 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00120 return child->getFgColor();
00121 }
00122
00123
00124 void FXLCDLabel::setFgColor(FXColor clr) {
00125 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00126 if (clr!=child->getFgColor()) {
00127 for (child=(FXSevenSegment*)getFirst(); child; child=(FXSevenSegment*)child->getNext()) {
00128 child->setFgColor(clr);
00129 }
00130 }
00131 }
00132
00133
00134 FXColor FXLCDLabel::getBgColor() const {
00135 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00136 return child->getBgColor();
00137 }
00138
00139
00140 void FXLCDLabel::setBgColor(FXColor clr) {
00141 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00142 if (clr!=child->getBgColor()) {
00143 for (child=(FXSevenSegment*)getFirst(); child; child=(FXSevenSegment*)child->getNext()) {
00144 child->setBgColor(clr);
00145 }
00146 }
00147 }
00148
00149
00150 void FXLCDLabel::setText(FXString lbl) {
00151 if (lbl!=label) {
00152 label=lbl;
00153 recalc();
00154 update();
00155 }
00156 }
00157
00158
00159 FXint FXLCDLabel::getHorizontal() const {
00160 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00161 return child->getHorizontal();
00162 }
00163
00164
00165 void FXLCDLabel::setHorizontal(const FXint len) {
00166 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00167 if (len!=child->getHorizontal()) {
00168 for (child=(FXSevenSegment*)getFirst(); child; child=(FXSevenSegment*)child->getNext()) {
00169 child->setHorizontal(len);
00170 }
00171 recalc();
00172 update();
00173 }
00174 }
00175
00176
00177 FXint FXLCDLabel::getVertical() const {
00178 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00179 return child->getVertical();
00180 }
00181
00182
00183 void FXLCDLabel::setVertical(const FXint len) {
00184 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00185 if (len!=child->getVertical()) {
00186 for (child=(FXSevenSegment*)getFirst(); child; child=(FXSevenSegment*)child->getNext()) {
00187 child->setVertical(len);
00188 }
00189 recalc();
00190 update();
00191 }
00192 }
00193
00194
00195 FXint FXLCDLabel::getThickness() const {
00196 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00197 return child->getThickness();
00198 }
00199
00200
00201 void FXLCDLabel::setThickness(const FXint width) {
00202 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00203 if (width!=child->getThickness()) {
00204 for (child=(FXSevenSegment*)getFirst(); child; child=(FXSevenSegment*)child->getNext()) {
00205 child->setThickness(width);
00206 }
00207 recalc();
00208 update();
00209 }
00210 }
00211
00212
00213 FXint FXLCDLabel::getGroove() const {
00214 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00215 return child->getGroove();
00216 }
00217
00218
00219 void FXLCDLabel::setGroove(const FXint width) {
00220 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00221 if (width!=child->getGroove()) {
00222 for (child=(FXSevenSegment*)getFirst(); child; child=(FXSevenSegment*)child->getNext()) {
00223 child->setGroove(width);
00224 }
00225 recalc();
00226 update();
00227 }
00228 }
00229
00230
00231 long FXLCDLabel::onCmdSetValue(FXObject*,FXSelector,void* ptr) {
00232 setText((const FXchar*)ptr);
00233 return 1;
00234 }
00235
00236
00237 long FXLCDLabel::onCmdSetIntValue(FXObject*,FXSelector,void* ptr) {
00238 setText(FXStringVal(*((FXint*)ptr)));
00239 return 1;
00240 }
00241
00242
00243 long FXLCDLabel::onCmdSetRealValue(FXObject*,FXSelector,void* ptr) {
00244 setText(FXStringVal(*((FXdouble*)ptr)));
00245 return 1;
00246 }
00247
00248
00249 long FXLCDLabel::onCmdSetStringValue(FXObject*,FXSelector,void* ptr) {
00250 setText(*((FXString*)ptr));
00251 return 1;
00252 }
00253
00254
00255 long FXLCDLabel::onCmdGetIntValue(FXObject*,FXSelector,void* ptr) {
00256 *((FXint*)ptr)=FXIntVal(getText());
00257 return 1;
00258 }
00259
00260
00261 long FXLCDLabel::onCmdGetRealValue(FXObject*,FXSelector,void* ptr) {
00262 *((FXdouble*)ptr)=FXDoubleVal(getText());
00263 return 1;
00264 }
00265
00266
00267 long FXLCDLabel::onCmdGetStringValue(FXObject*,FXSelector,void* ptr) {
00268 *((FXString*)ptr)=getText();
00269 return 1;
00270 }
00271
00272
00273 long FXLCDLabel::onPaint(FXObject*,FXSelector,void *ptr) {
00274 FXEvent *event= (FXEvent*) ptr;
00275 FXDCWindow dc(this, event);
00276 drawFrame(dc,0,0,width,height);
00277 FXSevenSegment *child = (FXSevenSegment*)getFirst();
00278
00279 dc.setForeground(child->getBgColor());
00280 dc.fillRectangle(border, border, width-(border<<1), height-(border<<1));
00281
00282 dc.setForeground(child->getFgColor());
00283 drawString(label);
00284 return 1;
00285 }
00286
00287
00288 void FXLCDLabel::drawString(const FXString& lbl) {
00289 FXint i=0;
00290 FXString displayString(' ',nfigures);
00291 if (options&LCDLABEL_LEADING_ZEROS && (FXIntVal(lbl) || lbl=="0")) {
00292 FXString txt = lbl;
00293 if (txt[0]=='-') {
00294 displayString.replace(0,'-');
00295 txt.erase(0);
00296 i=1;
00297 }
00298 for (; (i+txt.length())<nfigures; i++) {
00299 displayString.replace(i,'0');
00300 }
00301 displayString.insert(i,txt);
00302 } else if (options&JUSTIFY_RIGHT) {
00303 for (; (i+lbl.length())<nfigures; i++) {}
00304 displayString.insert(i,lbl);
00305 } else {
00306 displayString.insert(0,lbl);
00307 }
00308 displayString.trunc(nfigures);
00309 i=0;
00310
00311
00312
00313
00314
00315 FXSevenSegment *child=(FXSevenSegment*)getFirst();
00316 if (options&LAYOUT_FILL) {
00317 FXint width=this->width-padleft-padright-(border<<1);
00318 FXint height=this->height-padtop-padbottom-(border<<1);
00319 hspacing=FXMAX(width,height)/50;
00320 if (hspacing<1) hspacing=1;
00321 FXint hsl=(width-(nfigures-1)*hspacing)/nfigures;
00322 if (hsl<5) hsl=5;
00323 FXint vsl=height>>1;
00324 if (vsl<5) vsl=5;
00325 FXint st=FXMIN(hsl,vsl)/4;
00326 if (st<1) st=1;
00327 FXint groove=st/4;
00328 if (groove<1) groove=1;
00329 if (options&LAYOUT_FILL_X) {
00330 hsl-=groove<<1;
00331 for (; child; child=(FXSevenSegment*)child->getNext()) {
00332 child->setHorizontal(hsl);
00333 }
00334 child=(FXSevenSegment*)getFirst();
00335 }
00336 if (options&LAYOUT_FILL_Y) {
00337 vsl-=groove<<1;
00338 for (; child; child=(FXSevenSegment*)child->getNext()) {
00339 child->setVertical(vsl);
00340 }
00341 child=(FXSevenSegment*)getFirst();
00342 }
00343 for (; child; child=(FXSevenSegment*)child->getNext()) {
00344 child->setText(displayString[i++]);
00345 child->setGroove(groove);
00346 child->setThickness(st);
00347 }
00348 } else {
00349 for (; child; child=(FXSevenSegment*)child->getNext()) {
00350 child->setText(displayString[i++]);
00351 }
00352 }
00353 }
00354
00355
00356 long FXLCDLabel::onRedirectEvent(FXObject*,FXSelector sel,void *ptr) {
00357 FXuint seltype = FXSELTYPE(sel);
00358 if (isEnabled()) {
00359 if (target) target->handle(this,FXSEL(seltype,message),ptr);
00360 }
00361 return 1;
00362 }
00363
00364
00365 FXint FXLCDLabel::getDefaultWidth() {
00366 return padleft + getFirst()->getDefaultWidth()*nfigures + hspacing*(nfigures-1) + padright + (border<<1);
00367 }
00368
00369
00370 FXint FXLCDLabel::getDefaultHeight() {
00371 return padtop + getFirst()->getDefaultHeight() + padbottom + (border<<1);
00372 }
00373
00374
00375 void FXLCDLabel::save(FXStream &store) const {
00376 FXHorizontalFrame::save(store);
00377 store << label;
00378 store << nfigures;
00379 }
00380
00381
00382 void FXLCDLabel::load(FXStream &store) {
00383 FXHorizontalFrame::load(store);
00384 store >> label;
00385 store >> nfigures;
00386 }
00387
00388
00389 long FXLCDLabel::onQueryTip(FXObject *sender,FXSelector sel,void *ptr) {
00390 if (getParent()) return getParent()->handle(sender,sel,ptr);
00391 return 0;
00392 }
00393
00394
00395 long FXLCDLabel::onQueryHelp(FXObject *sender,FXSelector sel,void *ptr) {
00396 if (getParent()) return getParent()->handle(sender,sel,ptr);
00397 return 0;
00398 }
00399
00400 }
00401