gwenhywfar  4.3.3
fox16_gui_dialog.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002     begin       : Fri Jan 22 2010
00003     copyright   : (C) 2010 by Martin Preuss
00004     email       : martin@libchipcard.de
00005 
00006  ***************************************************************************
00007  *          Please see toplevel file COPYING for license details           *
00008  ***************************************************************************/
00009 
00010 #ifdef HAVE_CONFIG_H
00011 # include <config.h>
00012 #endif
00013 
00014 #include "fox16_gui_dialog_l.hpp"
00015 #include "fox16_gui_sortinglist_l.hpp"
00016 #include "fox16_htmllabel.hpp"
00017 #include "fox16_htmltext.hpp"
00018 
00019 #include "theme.h"
00020 
00021 #include <gwenhywfar/dialog_be.h>
00022 #include <gwenhywfar/directory.h>
00023 #include <gwenhywfar/debug.h>
00024 
00025 #include <list>
00026 #include <string>
00027 #include <assert.h>
00028 
00029 #include <fxkeys.h>
00030 
00031 
00032 #define FOX16_DIALOG_WIDGET_REAL    0
00033 #define FOX16_DIALOG_WIDGET_CONTENT 1
00034 
00035 #define FOX16_DIALOG_STRING_TITLE  0
00036 #define FOX16_DIALOG_STRING_VALUE  1
00037 
00038 
00039 
00040 
00041 
00042 FXDEFMAP(FOX16_GuiDialog) FOX16_GuiDialogMap[]={
00043   FXMAPFUNCS(SEL_COMMAND, FOX16_GuiDialog::ID_WIDGET_FIRST, FOX16_GuiDialog::ID_WIDGET_LAST, FOX16_GuiDialog::onSelCommand),
00044   FXMAPFUNCS(SEL_CHANGED, FOX16_GuiDialog::ID_WIDGET_FIRST, FOX16_GuiDialog::ID_WIDGET_LAST, FOX16_GuiDialog::onSelChanged),
00045   FXMAPFUNCS(SEL_KEYPRESS, FOX16_GuiDialog::ID_WIDGET_FIRST, FOX16_GuiDialog::ID_WIDGET_LAST, FOX16_GuiDialog::onSelKeyPress),
00046   FXMAPFUNCS(SEL_KEYRELEASE, FOX16_GuiDialog::ID_WIDGET_FIRST, FOX16_GuiDialog::ID_WIDGET_LAST, FOX16_GuiDialog::onSelKeyRelease)
00047 };
00048 
00049 
00050 FXIMPLEMENT(FOX16_GuiDialog, FXObject, FOX16_GuiDialogMap, ARRAYNUMBER(FOX16_GuiDialogMap))
00051 
00052 
00053 
00054 FOX16_GuiDialog::FOX16_GuiDialog()
00055 :FXObject()
00056 ,CppDialog()
00057 ,_gui(NULL)
00058 ,_widgetCount(0)
00059 ,_mainWidget(NULL)
00060 ,m_iconSource(NULL)
00061 {
00062 }
00063 
00064 
00065 
00066 FOX16_GuiDialog::FOX16_GuiDialog(FOX16_Gui *gui, GWEN_DIALOG *dlg)
00067 :FXObject()
00068 ,CppDialog(dlg)
00069 ,_gui(gui)
00070 ,_widgetCount(0)
00071 ,_mainWidget(NULL)
00072 ,m_iconSource(NULL)
00073 {
00074 }
00075 
00076 
00077 
00078 FOX16_GuiDialog::~FOX16_GuiDialog() {
00079   if (_mainWidget)
00080     delete _mainWidget;
00081   if (!m_iconList.empty()) {
00082     std::list<FXIcon*>::iterator it;
00083 
00084     for (it=m_iconList.begin(); it!=m_iconList.end(); it++)
00085       delete *it;
00086     m_iconList.clear();
00087   }
00088   if (m_iconSource)
00089     delete m_iconSource;
00090 
00091   if (!m_radioGroups.empty()) {
00092     std::list<RadioButtonGroup*>::iterator it;
00093 
00094     for (it=m_radioGroups.begin(); it!=m_radioGroups.end(); it++)
00095       delete *it;
00096   }
00097 }
00098 
00099 
00100 
00101 FOX16_GuiDialog *FOX16_GuiDialog::getDialog(GWEN_DIALOG *dlg) {
00102   CppDialog *cppDlg;
00103 
00104   cppDlg=CppDialog::getDialog(dlg);
00105   if (cppDlg)
00106     return dynamic_cast<FOX16_GuiDialog*>(cppDlg);
00107   return NULL;
00108 }
00109 
00110 
00111 
00112 FXIcon *FOX16_GuiDialog::getIcon(const char *fileName) {
00113   GWEN_STRINGLIST *sl;
00114 
00115   sl=GWEN_Dialog_GetMediaPaths(_dialog);
00116   if (sl) {
00117     GWEN_BUFFER *tbuf;
00118     int rv;
00119     FXIcon *ic;
00120 
00121     tbuf=GWEN_Buffer_new(0, 256, 0, 1);
00122     rv=GWEN_Directory_FindFileInPaths(sl, fileName, tbuf);
00123     if (rv<0) {
00124       DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
00125       GWEN_Buffer_free(tbuf);
00126       return NULL;
00127     }
00128 
00129     if (m_iconSource==NULL)
00130       m_iconSource=new FXIconSource(FXApp::instance());
00131 
00132     DBG_DEBUG(GWEN_LOGDOMAIN, "Loading [%s]", GWEN_Buffer_GetStart(tbuf));
00133     ic=m_iconSource->loadIconFile(GWEN_Buffer_GetStart(tbuf));
00134     if (ic==NULL) {
00135       DBG_ERROR(GWEN_LOGDOMAIN, "Could not load icon [%s]", GWEN_Buffer_GetStart(tbuf));
00136       GWEN_Buffer_free(tbuf);
00137       return NULL;
00138     }
00139     m_iconList.push_back(ic);
00140     GWEN_Buffer_free(tbuf);
00141     return ic;
00142   }
00143   else {
00144     DBG_ERROR(GWEN_LOGDOMAIN, "No media paths in dialog");
00145     return NULL;
00146   }
00147 }
00148 
00149 
00150 
00151 int FOX16_GuiDialog::execute() {
00152   FXDialogBox *dialogBox;
00153   int rv;
00154 
00155   dialogBox=_mainWidget;
00156 
00157   /* execute dialog */
00158   dialogBox->show(PLACEMENT_OWNER);
00159   rv=dialogBox->execute();
00160   GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeFini, "");
00161 
00162   if (rv==0) {
00163     /* aborted */
00164     return 0;
00165   }
00166   else
00167     /* accepted */
00168     return 1;
00169 }
00170 
00171 
00172 int FOX16_GuiDialog::setIntProperty(GWEN_WIDGET *w,
00173                                     GWEN_DIALOG_PROPERTY prop,
00174                                     int index,
00175                                     int value,
00176                                     int doSignal) {
00177   DBG_DEBUG(GWEN_LOGDOMAIN, "SetIntProperty([%s], %d)", GWEN_Widget_GetName(w), value);
00178 
00179   switch(GWEN_Widget_GetType(w)) {
00180   case GWEN_Widget_TypeUnknown:
00181     return GWEN_ERROR_GENERIC;
00182 
00183   case GWEN_Widget_TypeNone:
00184     return GWEN_ERROR_GENERIC;
00185 
00186   case GWEN_Widget_TypeComboBox:
00187     {
00188       THEMECOMBOBOX *f;
00189 
00190       f=(THEMECOMBOBOX*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00191       assert(f);
00192 
00193       switch(prop) {
00194       case GWEN_DialogProperty_Value:
00195         if (value<f->getNumItems()) {
00196           f->setCurrentItem(value, doSignal?TRUE:FALSE);
00197           return 0;
00198         }
00199         else {
00200           DBG_ERROR(GWEN_LOGDOMAIN, "Index %d out of range in widget [%s]", value, GWEN_Widget_GetName(w));
00201           return GWEN_ERROR_INVALID;
00202         }
00203 
00204       case GWEN_DialogProperty_ClearValues:
00205         f->clearItems();
00206         return 0;
00207 
00208       default:
00209         break;
00210       }
00211       break;
00212     }
00213 
00214   case GWEN_Widget_TypeRadioButton:
00215     {
00216       FXRadioButton *f;
00217 
00218       f=(FXRadioButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00219       assert(f);
00220 
00221       switch(prop) {
00222       case GWEN_DialogProperty_Value:
00223         f->setCheck((value==0)?FALSE:TRUE, doSignal?TRUE:FALSE);
00224         return 0;
00225 
00226       default:
00227         break;
00228       }
00229       break;
00230     }
00231 
00232   case GWEN_Widget_TypeProgressBar:
00233     {
00234       FXProgressBar *f;
00235 
00236       f=(FXProgressBar*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00237       assert(f);
00238 
00239       switch(prop) {
00240       case GWEN_DialogProperty_Value:
00241         f->setProgress(value);
00242         return 0;
00243 
00244       case GWEN_DialogProperty_MinValue:
00245         if (value!=0) {
00246           DBG_ERROR(GWEN_LOGDOMAIN, "MinValue should be 0!");
00247           return GWEN_ERROR_INVALID;
00248         }
00249         return 0;
00250 
00251       case GWEN_DialogProperty_MaxValue:
00252         f->setTotal(value);
00253         return 0;
00254 
00255       default:
00256         break;
00257       }
00258       break;
00259     }
00260 
00261   case GWEN_Widget_TypeSpinBox:
00262     {
00263       FXSpinner *f;
00264 
00265       f=(FXSpinner*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00266       assert(f);
00267 
00268       switch(prop) {
00269       case GWEN_DialogProperty_Value:
00270         f->setValue(value);
00271         return 0;
00272 
00273       case GWEN_DialogProperty_MinValue: {
00274         FXint lo, hi;
00275 
00276         f->getRange(lo, hi);
00277         lo=value;
00278         f->setRange(lo, hi);
00279         return 0;
00280       }
00281 
00282       case GWEN_DialogProperty_MaxValue: {
00283         FXint lo, hi;
00284 
00285         f->getRange(lo, hi);
00286         hi=value;
00287         if (hi<lo)
00288           hi=lo;
00289         f->setRange(lo, hi);
00290         return 0;
00291       }
00292 
00293       default:
00294         break;
00295       }
00296       break;
00297     }
00298 
00299   case GWEN_Widget_TypeListBox:
00300     {
00301       FOX16_GuiSortingList *f;
00302       FXFoldingItem *fi;
00303       int i=0;
00304 
00305       f=(FOX16_GuiSortingList*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00306       assert(f);
00307 
00308       switch(prop) {
00309       case GWEN_DialogProperty_Value:
00310         fi=f->getFirstItem();
00311         while(fi && i<value) {
00312           fi=fi->getNext();
00313           i++;
00314         }
00315         if (fi && i==value)
00316           f->setCurrentItem(fi, doSignal?TRUE:FALSE);
00317         else {
00318           DBG_ERROR(GWEN_LOGDOMAIN, "Value %d out of range", value);
00319           return GWEN_ERROR_INVALID;
00320         }
00321         return 0;
00322 
00323       case GWEN_DialogProperty_ColumnWidth:
00324         f->setHeaderSize(index, value);
00325         return 0;
00326 
00327       case GWEN_DialogProperty_SelectionMode:
00328         switch(value) {
00329         case GWEN_Dialog_SelectionMode_None:
00330           /* simply fall-through */
00331         case GWEN_Dialog_SelectionMode_Single:
00332           f->setListStyle(FOLDINGLIST_BROWSESELECT);
00333           return 0;
00334         case GWEN_Dialog_SelectionMode_Multi:
00335           f->setListStyle(FOLDINGLIST_EXTENDEDSELECT);
00336           return 0;
00337           ;
00338         }
00339         DBG_ERROR(GWEN_LOGDOMAIN, "Unknown SelectionMode %d", value);
00340         return GWEN_ERROR_INVALID;
00341 
00342       case GWEN_DialogProperty_SelectionState:
00343         {
00344           FXFoldingItem *ti;
00345 
00346           ti=f->getItem(index);
00347           if (ti==NULL) {
00348             DBG_ERROR(GWEN_LOGDOMAIN, "Index %d out of range", index);
00349             return GWEN_ERROR_INVALID;
00350           }
00351           ti->setSelected((value==0)?FALSE:TRUE);
00352           return 0;
00353         }
00354 
00355       case GWEN_DialogProperty_ClearValues:
00356         f->clearItems();
00357         return 0;
00358 
00359       case GWEN_DialogProperty_SortDirection:
00360         {
00361           int i;
00362 
00363           for (i=0; i<f->getNumHeaders(); i++) {
00364             if (i==index) {
00365               switch(value) {
00366               case GWEN_DialogSortDirection_None:
00367                 f->setHeaderArrowDir(i, MAYBE);
00368                 break;
00369               case GWEN_DialogSortDirection_Up:
00370                 f->setHeaderArrowDir(i, TRUE);
00371                 break;
00372               case GWEN_DialogSortDirection_Down:
00373                 f->setHeaderArrowDir(i, FALSE);
00374                 break;
00375               }
00376             }
00377             else
00378               f->setHeaderArrowDir(i, MAYBE);
00379           }
00380 
00381           switch(value) {
00382           case GWEN_DialogSortDirection_None:
00383             break;
00384           case GWEN_DialogSortDirection_Up:
00385             f->sortByColumn(i, true);
00386             break;
00387           case GWEN_DialogSortDirection_Down:
00388             f->sortByColumn(i, false);
00389             break;
00390           }
00391         }
00392         return 0;
00393 
00394       case GWEN_DialogProperty_Sort:
00395         {
00396           int i;
00397 
00398           for (i=0; i<f->getNumHeaders(); i++) {
00399             FXbool b;
00400 
00401             b=f->getHeaderArrowDir(i);
00402             if (b!=MAYBE) {
00403               if (b==TRUE)
00404                 f->sortByColumn(i, true);
00405               else
00406                 f->sortByColumn(i, false);
00407               break;
00408             }
00409           }
00410         }
00411         return 0;
00412 
00413 
00414       default:
00415         break;
00416       }
00417       break;
00418     }
00419 
00420   case GWEN_Widget_TypeCheckBox:
00421     {
00422       FXCheckButton *f;
00423 
00424       f=(FXCheckButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00425       assert(f);
00426 
00427       switch(prop) {
00428       case GWEN_DialogProperty_Value:
00429         f->setCheck((value==0)?FALSE:TRUE, doSignal?TRUE:FALSE);
00430         return 0;
00431 
00432       default:
00433         break;
00434       }
00435       break;
00436     }
00437 
00438   case GWEN_Widget_TypeTabBook:
00439     {
00440       FXTabBook *f;
00441 
00442       f=(FXTabBook*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00443       assert(f);
00444 
00445       switch(prop) {
00446       case GWEN_DialogProperty_Value:
00447         f->setCurrent(value, doSignal?TRUE:FALSE);
00448         return 0;
00449 
00450       default:
00451         break;
00452       }
00453       break;
00454     }
00455 
00456   case GWEN_Widget_TypeWidgetStack:
00457     {
00458       FXSwitcher *f;
00459 
00460       f=(FXSwitcher*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00461       assert(f);
00462 
00463       switch(prop) {
00464       case GWEN_DialogProperty_Value:
00465         f->setCurrent(value, doSignal?TRUE:FALSE);
00466         return 0;
00467 
00468       default:
00469         break;
00470       }
00471       break;
00472     }
00473 
00474   case GWEN_Widget_TypeLabel:
00475   case GWEN_Widget_TypePushButton:
00476   case GWEN_Widget_TypeLineEdit:
00477   case GWEN_Widget_TypeTextEdit:
00478   case GWEN_Widget_TypeGroupBox:
00479   case GWEN_Widget_TypeHSpacer:
00480   case GWEN_Widget_TypeVSpacer:
00481   case GWEN_Widget_TypeHLayout:
00482   case GWEN_Widget_TypeVLayout:
00483   case GWEN_Widget_TypeGridLayout:
00484   case GWEN_Widget_TypeDialog:
00485   case GWEN_Widget_TypeTabPage:
00486   case GWEN_Widget_TypeScrollArea:
00487   case GWEN_Widget_TypeHLine:
00488   case GWEN_Widget_TypeVLine:
00489   case GWEN_Widget_TypeTextBrowser:
00490     ;
00491   }
00492 
00493   {
00494     FXWindow *f;
00495 
00496     f=(FXWindow*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00497     assert(f);
00498 
00499     switch(prop) {
00500     case GWEN_DialogProperty_Width:
00501       f->recalc();
00502       f->resize(value, f->getHeight());
00503       return 0;
00504     case GWEN_DialogProperty_Height:
00505       f->recalc();
00506       f->resize(f->getWidth(), value);
00507       return 0;
00508     case GWEN_DialogProperty_Enabled:
00509       if (value==0)
00510         f->disable();
00511       else
00512         f->enable();
00513       return 0;
00514 
00515     case GWEN_DialogProperty_Focus:
00516       f->setFocus();
00517       return 0;
00518 
00519     case GWEN_DialogProperty_Visibility:
00520       if (value==0) {
00521         f->hide();
00522         f->recalc();
00523       }
00524       else {
00525         f->show();
00526         f->recalc();
00527       }
00528       return 0;
00529 
00530     case GWEN_DialogProperty_Title:
00531     case GWEN_DialogProperty_Value:
00532     case GWEN_DialogProperty_MinValue:
00533     case GWEN_DialogProperty_MaxValue:
00534     case GWEN_DialogProperty_AddValue:
00535     case GWEN_DialogProperty_ClearValues:
00536     case GWEN_DialogProperty_ValueCount:
00537     case GWEN_DialogProperty_ColumnWidth:
00538     case GWEN_DialogProperty_SelectionMode:
00539     case GWEN_DialogProperty_SelectionState:
00540     case GWEN_DialogProperty_SortDirection:
00541     case GWEN_DialogProperty_Sort:
00542     case GWEN_DialogProperty_ToolTip:
00543     case GWEN_DialogProperty_None:
00544     case GWEN_DialogProperty_Unknown:
00545       ;
00546     }
00547   }
00548 
00549   DBG_WARN(0, "Function is not appropriate for this type of widget (%s)",
00550            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
00551   return GWEN_ERROR_INVALID;
00552 }
00553 
00554 
00555 
00556 int FOX16_GuiDialog::getIntProperty(GWEN_WIDGET *w,
00557                                     GWEN_DIALOG_PROPERTY prop,
00558                                     int index,
00559                                     int defaultValue) {
00560   switch(GWEN_Widget_GetType(w)) {
00561   case GWEN_Widget_TypeUnknown:
00562   case GWEN_Widget_TypeNone:
00563     return defaultValue;
00564 
00565   case GWEN_Widget_TypeComboBox:
00566     {
00567       THEMECOMBOBOX *f;
00568 
00569       f=(THEMECOMBOBOX*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00570       assert(f);
00571 
00572       switch(prop) {
00573       case GWEN_DialogProperty_Value:
00574         return f->getCurrentItem();
00575 
00576       case GWEN_DialogProperty_ValueCount:
00577         return f->getNumItems();
00578 
00579       default:
00580         break;
00581       }
00582       break;
00583     }
00584 
00585   case GWEN_Widget_TypeRadioButton:
00586     {
00587       FXRadioButton *f;
00588 
00589       f=(FXRadioButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00590       assert(f);
00591 
00592       switch(prop) {
00593       case GWEN_DialogProperty_Value:
00594         return (f->getCheck()==TRUE)?1:0;
00595 
00596       default:
00597         break;
00598       }
00599       break;
00600     }
00601 
00602   case GWEN_Widget_TypeProgressBar:
00603     {
00604       FXProgressBar *f;
00605 
00606       f=(FXProgressBar*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00607       assert(f);
00608 
00609       switch(prop) {
00610       case GWEN_DialogProperty_Value:
00611         return f->getProgress();
00612 
00613       case GWEN_DialogProperty_MinValue:
00614         return 0;
00615 
00616       case GWEN_DialogProperty_MaxValue:
00617         return f->getTotal();
00618 
00619       default:
00620         break;
00621       }
00622 
00623       break;
00624     }
00625 
00626   case GWEN_Widget_TypeSpinBox:
00627     {
00628       FXSpinner *f;
00629 
00630       f=(FXSpinner*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00631       assert(f);
00632 
00633       switch(prop) {
00634       case GWEN_DialogProperty_Value:
00635         return f->getValue();
00636 
00637       case GWEN_DialogProperty_MinValue: {
00638         FXint lo, hi;
00639 
00640         f->getRange(lo, hi);
00641         return lo;
00642       }
00643 
00644       case GWEN_DialogProperty_MaxValue: {
00645         FXint lo, hi;
00646 
00647         f->getRange(lo, hi);
00648         return hi;
00649       }
00650 
00651       default:
00652         break;
00653       }
00654 
00655       break;
00656     }
00657 
00658   case GWEN_Widget_TypeListBox:
00659     {
00660       FOX16_GuiSortingList *f;
00661       FXFoldingItem *fi;
00662       int i=0;
00663 
00664       f=(FOX16_GuiSortingList*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00665       assert(f);
00666 
00667       switch(prop) {
00668       case GWEN_DialogProperty_Value:
00669         fi=f->getCurrentItem();
00670         if (fi==NULL)
00671           return defaultValue;
00672         else {
00673           FXFoldingItem *ti;
00674 
00675           ti=fi;
00676           while( (ti=ti->getPrev()) )
00677             i++;
00678 
00679           return i;
00680         }
00681 
00682       case GWEN_DialogProperty_ValueCount:
00683         return f->getNumItems();
00684 
00685       case GWEN_DialogProperty_ColumnWidth:
00686         return f->getHeaderSize(index);
00687 
00688       case GWEN_DialogProperty_SelectionMode:
00689         {
00690           switch(f->getListStyle()) {
00691           case FOLDINGLIST_BROWSESELECT:
00692             return GWEN_Dialog_SelectionMode_Single;
00693           case FOLDINGLIST_EXTENDEDSELECT:
00694             return GWEN_Dialog_SelectionMode_Multi;
00695           default:
00696             return GWEN_Dialog_SelectionMode_None;
00697           }
00698           break;
00699         }
00700 
00701       case GWEN_DialogProperty_SelectionState:
00702         {
00703           FXFoldingItem *ti;
00704           int i=index;
00705 
00706           ti=f->getFirstItem();
00707           while(ti && i) {
00708             ti=ti->getNext();
00709             i--;
00710           }
00711 
00712           if (ti)
00713             return (ti->isSelected()==TRUE)?1:0;
00714           return defaultValue;
00715         }
00716 
00717       case GWEN_DialogProperty_SortDirection:
00718         {
00719           int i;
00720 
00721           for (i=0; i<f->getNumHeaders(); i++) {
00722             if (i==index) {
00723               FXbool b;
00724 
00725               b=f->getHeaderArrowDir(i);
00726               if (b==MAYBE)
00727                 return GWEN_DialogSortDirection_None;
00728               else if (b==TRUE)
00729                 return GWEN_DialogSortDirection_Up;
00730               else
00731                 return GWEN_DialogSortDirection_Down;
00732             }
00733           }
00734           DBG_ERROR(GWEN_LOGDOMAIN, "Column %d out of range", index);
00735         }
00736         return defaultValue;
00737 
00738       default:
00739         break;
00740       }
00741 
00742       break;
00743     }
00744 
00745   case GWEN_Widget_TypeCheckBox:
00746     {
00747       FXCheckButton *f;
00748 
00749       f=(FXCheckButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00750       assert(f);
00751 
00752       switch(prop) {
00753       case GWEN_DialogProperty_Value:
00754         return (f->getCheck()==TRUE)?1:0;
00755 
00756       default:
00757         break;
00758       }
00759 
00760       break;
00761     }
00762 
00763   case GWEN_Widget_TypeTabBook:
00764     {
00765       FXTabBook *f;
00766 
00767       f=(FXTabBook*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00768       assert(f);
00769 
00770       switch(prop) {
00771       case GWEN_DialogProperty_Value:
00772         return f->getCurrent();
00773 
00774       default:
00775         break;
00776       }
00777 
00778       break;
00779     }
00780 
00781   case GWEN_Widget_TypeWidgetStack:
00782     {
00783       FXSwitcher *f;
00784 
00785       f=(FXSwitcher*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00786       assert(f);
00787 
00788       switch(prop) {
00789       case GWEN_DialogProperty_Value:
00790         return f->getCurrent();
00791 
00792       default:
00793         break;
00794       }
00795 
00796       break;
00797     }
00798 
00799   case GWEN_Widget_TypeLabel:
00800   case GWEN_Widget_TypePushButton:
00801   case GWEN_Widget_TypeLineEdit:
00802   case GWEN_Widget_TypeTextEdit:
00803   case GWEN_Widget_TypeGroupBox:
00804   case GWEN_Widget_TypeHSpacer:
00805   case GWEN_Widget_TypeVSpacer:
00806   case GWEN_Widget_TypeHLayout:
00807   case GWEN_Widget_TypeVLayout:
00808   case GWEN_Widget_TypeGridLayout:
00809   case GWEN_Widget_TypeDialog:
00810   case GWEN_Widget_TypeTabPage:
00811   case GWEN_Widget_TypeScrollArea:
00812   case GWEN_Widget_TypeHLine:
00813   case GWEN_Widget_TypeVLine:
00814   case GWEN_Widget_TypeTextBrowser:
00815     break;
00816   }
00817 
00818   /* generic properties every widget has */
00819   {
00820     FXWindow *f;
00821 
00822     f=(FXWindow*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00823     assert(f);
00824 
00825     switch(prop) {
00826     case GWEN_DialogProperty_Width:
00827       return f->getWidth();
00828 
00829     case GWEN_DialogProperty_Height:
00830       return f->getHeight();
00831 
00832     case GWEN_DialogProperty_Enabled:
00833       return (f->isEnabled()==TRUE)?1:0;
00834 
00835     case GWEN_DialogProperty_Focus:
00836       return (f->hasFocus())?1:0;
00837 
00838     case GWEN_DialogProperty_Title:
00839     case GWEN_DialogProperty_Value:
00840     case GWEN_DialogProperty_MinValue:
00841     case GWEN_DialogProperty_MaxValue:
00842     case GWEN_DialogProperty_AddValue:
00843     case GWEN_DialogProperty_ClearValues:
00844     case GWEN_DialogProperty_ValueCount:
00845     case GWEN_DialogProperty_ColumnWidth:
00846     case GWEN_DialogProperty_SelectionMode:
00847     case GWEN_DialogProperty_SelectionState:
00848     case GWEN_DialogProperty_SortDirection:
00849     case GWEN_DialogProperty_Sort:
00850     case GWEN_DialogProperty_Visibility:
00851     case GWEN_DialogProperty_ToolTip:
00852     case GWEN_DialogProperty_None:
00853     case GWEN_DialogProperty_Unknown:
00854       ;
00855     }
00856   }
00857 
00858 
00859   DBG_WARN(0, "Function is not appropriate for this type of widget (%s)",
00860            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
00861   return defaultValue;
00862 }
00863 
00864 
00865 
00866 int FOX16_GuiDialog::setCharProperty(GWEN_WIDGET *w,
00867                                      GWEN_DIALOG_PROPERTY prop,
00868                                      int index,
00869                                      const char *value,
00870                                      int doSignal) {
00871 
00872   FXString strValue;
00873   FXString htmlValue;
00874 
00875   if (value && *value) {
00876     strValue=FOX16_Gui::getRawText(value);
00877     htmlValue=FOX16_Gui::getHtmlText(value);
00878   }
00879 
00880   switch(GWEN_Widget_GetType(w)) {
00881   case GWEN_Widget_TypeUnknown:
00882     return GWEN_ERROR_GENERIC;
00883   case GWEN_Widget_TypeNone:
00884     return GWEN_ERROR_GENERIC;
00885 
00886   case GWEN_Widget_TypeLabel:
00887     {
00888       FOX16_HtmlLabel *f;
00889 
00890       f=(FOX16_HtmlLabel*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00891       assert(f);
00892 
00893       switch(prop) {
00894       case GWEN_DialogProperty_Title:
00895         f->setText(htmlValue);
00896         return 0;
00897 
00898       default:
00899         break;
00900       }
00901       break;
00902     }
00903 
00904   case GWEN_Widget_TypeTextBrowser:
00905     {
00906       FOX16_HtmlText *f;
00907 
00908       f=(FOX16_HtmlText*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00909       assert(f);
00910 
00911       switch(prop) {
00912       case GWEN_DialogProperty_Value:
00913         f->setText(htmlValue);
00914         f->makePositionVisible(strValue.length());
00915         return 0;
00916 
00917       case GWEN_DialogProperty_AddValue:
00918         f->setText(f->getText()+htmlValue);
00919         return 0;
00920 
00921       case GWEN_DialogProperty_ClearValues:
00922         f->setText("");
00923         return 0;
00924 
00925       default:
00926         break;
00927       }
00928       break;
00929 
00930     }
00931 
00932   case GWEN_Widget_TypePushButton:
00933     {
00934       THEMEBUTTON *f;
00935 
00936       f=(THEMEBUTTON*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00937       assert(f);
00938 
00939       switch(prop) {
00940       case GWEN_DialogProperty_Title:
00941         f->setText(value);
00942         return 0;
00943 
00944       case GWEN_DialogProperty_ToolTip:
00945         f->setTipText(htmlValue);
00946         return 0;
00947 
00948       default:
00949         break;
00950       }
00951       break;
00952     }
00953 
00954   case GWEN_Widget_TypeLineEdit:
00955     {
00956       FXTextField *f;
00957 
00958       f=(FXTextField*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00959       assert(f);
00960 
00961       switch(prop) {
00962       case GWEN_DialogProperty_Value:
00963         f->setText(value, doSignal?TRUE:FALSE);
00964         return 0;
00965 
00966       case GWEN_DialogProperty_ToolTip:
00967         f->setTipText(htmlValue);
00968         return 0;
00969 
00970       default:
00971         break;
00972       }
00973       break;
00974     }
00975 
00976   case GWEN_Widget_TypeTextEdit:
00977     {
00978       FXText *f;
00979 
00980       f=(FXText*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
00981       assert(f);
00982 
00983       switch(prop) {
00984       case GWEN_DialogProperty_Value:
00985         f->setText(strValue);
00986         return 0;
00987 
00988       case GWEN_DialogProperty_ToolTip:
00989         f->setTipText(htmlValue);
00990         return 0;
00991 
00992       default:
00993         break;
00994       }
00995       break;
00996     }
00997 
00998   case GWEN_Widget_TypeComboBox:
00999     {
01000       THEMECOMBOBOX *f;
01001 
01002       f=(THEMECOMBOBOX*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01003       assert(f);
01004 
01005       switch(prop) {
01006       case GWEN_DialogProperty_Value:
01007         // undefined
01008         break;
01009 
01010       case GWEN_DialogProperty_ToolTip:
01011         f->setTipText(htmlValue);
01012         return 0;
01013 
01014       case GWEN_DialogProperty_AddValue:
01015         {
01016           int i;
01017 
01018           f->appendItem(strValue);
01019           i=f->getNumItems();
01020           if (i>10)
01021             i=10;
01022           f->setNumVisible(i);
01023           return 0;
01024         }
01025 
01026       case GWEN_DialogProperty_ClearValues:
01027         f->clearItems();
01028         return 0;
01029 
01030       default:
01031         break;
01032       }
01033       break;
01034     }
01035 
01036   case GWEN_Widget_TypeGroupBox:
01037     {
01038       FXGroupBox *f;
01039 
01040       f=(FXGroupBox*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01041       assert(f);
01042 
01043       switch(prop) {
01044       case GWEN_DialogProperty_Title:
01045         f->setText(strValue);
01046         return 0;
01047       default:
01048         break;
01049       }
01050       break;
01051     }
01052 
01053   case GWEN_Widget_TypeRadioButton:
01054     {
01055       FXRadioButton *f;
01056 
01057       f=(FXRadioButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01058       assert(f);
01059 
01060       switch(prop) {
01061       case GWEN_DialogProperty_Title:
01062         f->setText(strValue);
01063         return 0;
01064 
01065       case GWEN_DialogProperty_ToolTip:
01066         f->setTipText(htmlValue);
01067         return 0;
01068 
01069       default:
01070         break;
01071       }
01072       break;
01073     }
01074 
01075   case GWEN_Widget_TypeCheckBox:
01076     {
01077       FXCheckButton *f;
01078 
01079       f=(FXCheckButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01080       assert(f);
01081 
01082       switch(prop) {
01083       case GWEN_DialogProperty_Title:
01084         f->setText(strValue);
01085         return 0;
01086 
01087       case GWEN_DialogProperty_ToolTip:
01088         f->setTipText(htmlValue);
01089         return 0;
01090 
01091       default:
01092         break;
01093       }
01094       break;
01095     }
01096 
01097   case GWEN_Widget_TypeTabPage:
01098     {
01099       FXWindow *f1;
01100       THEMETABITEM *f2;
01101 
01102       f1=(FXWindow*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01103       assert(f1);
01104       f2=(THEMETABITEM*) (f1->getPrev());
01105       assert(f2);
01106 
01107       switch(prop) {
01108       case GWEN_DialogProperty_Title:
01109         f2->setText(strValue);
01110         return 0;
01111 
01112       case GWEN_DialogProperty_ToolTip:
01113         f2->setTipText(htmlValue);
01114         return 0;
01115 
01116       default:
01117         break;
01118       }
01119       break;
01120     }
01121 
01122   case GWEN_Widget_TypeDialog:
01123     {
01124       FXDialogBox *f;
01125 
01126       f=(FXDialogBox*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01127       assert(f);
01128 
01129       switch(prop) {
01130       case GWEN_DialogProperty_Title:
01131         f->setTitle(strValue);
01132         return 0;
01133       default:
01134         break;
01135       }
01136       break;
01137     }
01138 
01139   case GWEN_Widget_TypeListBox:
01140     {
01141       FXFoldingList *f;
01142       FXString str;
01143       FXString t;
01144       FXint n=0;
01145 
01146       f=(FXFoldingList*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01147       assert(f);
01148 
01149       switch(prop) {
01150       case GWEN_DialogProperty_Title:
01151         f->getHeader()->clearItems();
01152         str=strValue;
01153         while(!(t=str.section('\t',n)).empty()){
01154           f->appendHeader(t, NULL, 20);
01155           n++;
01156         }
01157         return 0;
01158 
01159       case GWEN_DialogProperty_AddValue:
01160         f->appendItem(NULL, strValue);
01161         return 0;
01162 
01163       case GWEN_DialogProperty_ClearValues:
01164         f->clearItems();
01165         return 0;
01166 
01167       default:
01168         break;
01169       }
01170       break;
01171     }
01172 
01173   case GWEN_Widget_TypeSpinBox:
01174     {
01175       FXSpinner *f;
01176 
01177       f=(FXSpinner*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01178       assert(f);
01179 
01180       switch(prop) {
01181       case GWEN_DialogProperty_ToolTip:
01182         f->setTipText(htmlValue);
01183         return 0;
01184 
01185       default:
01186         break;
01187       }
01188       break;
01189     }
01190 
01191   case GWEN_Widget_TypeProgressBar:
01192   case GWEN_Widget_TypeHSpacer:
01193   case GWEN_Widget_TypeVSpacer:
01194   case GWEN_Widget_TypeHLayout:
01195   case GWEN_Widget_TypeVLayout:
01196   case GWEN_Widget_TypeGridLayout:
01197   case GWEN_Widget_TypeTabBook:
01198   case GWEN_Widget_TypeScrollArea:
01199   case GWEN_Widget_TypeWidgetStack:
01200   case GWEN_Widget_TypeHLine:
01201   case GWEN_Widget_TypeVLine:
01202     ;
01203   }
01204 
01205   /* this block is just to make sure we get warnings when new
01206    * properties are available but not handled here
01207    */
01208   switch(prop) {
01209   case GWEN_DialogProperty_Title:
01210   case GWEN_DialogProperty_Value:
01211   case GWEN_DialogProperty_MinValue:
01212   case GWEN_DialogProperty_MaxValue:
01213   case GWEN_DialogProperty_Enabled:
01214   case GWEN_DialogProperty_AddValue:
01215   case GWEN_DialogProperty_ClearValues:
01216   case GWEN_DialogProperty_ValueCount:
01217   case GWEN_DialogProperty_ColumnWidth:
01218   case GWEN_DialogProperty_Width:
01219   case GWEN_DialogProperty_Height:
01220   case GWEN_DialogProperty_SelectionMode:
01221   case GWEN_DialogProperty_SelectionState:
01222   case GWEN_DialogProperty_Focus:
01223   case GWEN_DialogProperty_SortDirection:
01224   case GWEN_DialogProperty_Sort:
01225   case GWEN_DialogProperty_Visibility:
01226   case GWEN_DialogProperty_ToolTip:
01227   case GWEN_DialogProperty_None:
01228   case GWEN_DialogProperty_Unknown:
01229     break;
01230   }
01231 
01232   DBG_WARN(0, "Function is not appropriate for this type of widget (%s)",
01233            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
01234   return GWEN_ERROR_INVALID;
01235 }
01236 
01237 
01238 
01239 const char *FOX16_GuiDialog::getCharProperty(GWEN_WIDGET *w,
01240                                              GWEN_DIALOG_PROPERTY prop,
01241                                              int index,
01242                                              const char *defaultValue) {
01243   FXString str;
01244 
01245   switch(GWEN_Widget_GetType(w)) {
01246   case GWEN_Widget_TypeUnknown:
01247     return defaultValue;
01248   case GWEN_Widget_TypeNone:
01249     return defaultValue;
01250 
01251   case GWEN_Widget_TypeLabel:
01252     {
01253       FOX16_HtmlLabel *f;
01254 
01255       f=(FOX16_HtmlLabel*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01256       assert(f);
01257 
01258       switch(prop) {
01259       case GWEN_DialogProperty_Title:
01260         str=f->getText();
01261         if (str.empty())
01262           return defaultValue;
01263         else {
01264           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01265           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01266         }
01267 
01268       default:
01269         break;
01270       }
01271       break;
01272     }
01273 
01274   case GWEN_Widget_TypePushButton:
01275     {
01276       THEMEBUTTON *f;
01277 
01278       f=(THEMEBUTTON*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01279       assert(f);
01280 
01281       switch(prop) {
01282       case GWEN_DialogProperty_Title:
01283         str=f->getText();
01284         if (str.empty())
01285           return defaultValue;
01286         else {
01287           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01288           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01289         }
01290 
01291       default:
01292         break;
01293       }
01294       break;
01295     }
01296 
01297   case GWEN_Widget_TypeLineEdit:
01298     {
01299       FXTextField *f;
01300 
01301       f=(FXTextField*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01302       assert(f);
01303 
01304       switch(prop) {
01305       case GWEN_DialogProperty_Value:
01306         str=f->getText();
01307         if (str.empty())
01308           return defaultValue;
01309         else {
01310           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_VALUE, str.text());
01311           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_VALUE);
01312         }
01313 
01314       default:
01315         break;
01316       }
01317       break;
01318     }
01319 
01320   case GWEN_Widget_TypeTextEdit:
01321     {
01322       FXText *f;
01323 
01324       f=(FXText*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01325       assert(f);
01326 
01327       switch(prop) {
01328       case GWEN_DialogProperty_Value:
01329         str=f->getText();
01330         if (str.empty())
01331           return defaultValue;
01332         else {
01333           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_VALUE, str.text());
01334           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_VALUE);
01335         }
01336 
01337       default:
01338         break;
01339       }
01340       break;
01341     }
01342 
01343   case GWEN_Widget_TypeTextBrowser:
01344     {
01345       FOX16_HtmlText *f;
01346 
01347       f=(FOX16_HtmlText*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01348       assert(f);
01349 
01350       switch(prop) {
01351       case GWEN_DialogProperty_Value:
01352         str=f->getText();
01353         if (str.empty())
01354           return defaultValue;
01355         else {
01356           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_VALUE, str.text());
01357           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_VALUE);
01358         }
01359 
01360       default:
01361         break;
01362       }
01363       break;
01364     }
01365 
01366   case GWEN_Widget_TypeComboBox:
01367     {
01368       THEMECOMBOBOX *f;
01369 
01370       f=(THEMECOMBOBOX*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01371       assert(f);
01372 
01373       switch(prop) {
01374       case GWEN_DialogProperty_Value:
01375         if (index<f->getNumItems()) {
01376           str=f->getItem(index);
01377           if (str.empty())
01378             return defaultValue;
01379           else {
01380             GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_VALUE, str.text());
01381             return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_VALUE);
01382           }
01383         }
01384         else {
01385           DBG_ERROR(GWEN_LOGDOMAIN, "Index %d out of range", index);
01386           return defaultValue;
01387         }
01388 
01389       default:
01390         break;
01391       }
01392       break;
01393     }
01394 
01395   case GWEN_Widget_TypeGroupBox:
01396     {
01397       FXGroupBox *f;
01398 
01399       f=(FXGroupBox*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01400       assert(f);
01401 
01402       switch(prop) {
01403       case GWEN_DialogProperty_Title:
01404         str=f->getText();
01405         if (str.empty())
01406           return defaultValue;
01407         else {
01408           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01409           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01410         }
01411 
01412       default:
01413         break;
01414       }
01415       break;
01416     }
01417 
01418   case GWEN_Widget_TypeRadioButton:
01419     {
01420       FXRadioButton *f;
01421 
01422       f=(FXRadioButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01423       assert(f);
01424 
01425       switch(prop) {
01426       case GWEN_DialogProperty_Title:
01427         str=f->getText();
01428         if (str.empty())
01429           return defaultValue;
01430         else {
01431           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01432           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01433         }
01434 
01435       default:
01436         break;
01437       }
01438       break;
01439     }
01440 
01441   case GWEN_Widget_TypeCheckBox:
01442     {
01443       FXCheckButton *f;
01444 
01445       f=(FXCheckButton*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01446       assert(f);
01447 
01448       switch(prop) {
01449       case GWEN_DialogProperty_Title:
01450         str=f->getText();
01451         if (str.empty())
01452           return defaultValue;
01453         else {
01454           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01455           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01456         }
01457 
01458       default:
01459         break;
01460       }
01461       break;
01462     }
01463 
01464   case GWEN_Widget_TypeTabPage:
01465     {
01466       FXWindow *f1;
01467       THEMETABITEM *f2;
01468 
01469       f1=(FXWindow*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01470       assert(f1);
01471       f2=(THEMETABITEM*) (f1->getPrev());
01472       assert(f2);
01473 
01474       switch(prop) {
01475       case GWEN_DialogProperty_Title:
01476         str=f2->getText();
01477         if (str.empty())
01478           return defaultValue;
01479         else {
01480           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01481           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01482         }
01483 
01484       default:
01485         break;
01486       }
01487 
01488       break;
01489     }
01490 
01491   case GWEN_Widget_TypeDialog:
01492     {
01493       FXDialogBox *f;
01494 
01495       f=(FXDialogBox*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01496       assert(f);
01497 
01498       switch(prop) {
01499       case GWEN_DialogProperty_Title:
01500         str=f->getTitle();
01501         if (str.empty())
01502           return defaultValue;
01503         else {
01504           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01505           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01506         }
01507 
01508       default:
01509         break;
01510       }
01511       break;
01512     }
01513 
01514   case GWEN_Widget_TypeListBox:
01515     {
01516       FXFoldingList *f;
01517       FXHeader *fh;
01518       FXFoldingItem *fi;
01519 
01520       f=(FXFoldingList*)GWEN_Widget_GetImplData(w, FOX16_DIALOG_WIDGET_REAL);
01521       assert(f);
01522 
01523       switch(prop) {
01524       case GWEN_DialogProperty_Title:
01525         fh=f->getHeader();
01526         if (fh) {
01527           int i;
01528 
01529           for (i=0; i<fh->getNumItems(); i++) {
01530             if (!str.empty())
01531               str+="\t";
01532             str+=fh->getItemText(i);
01533           }
01534         }
01535 
01536         if (str.empty())
01537           return defaultValue;
01538         else {
01539           GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_TITLE, str.text());
01540           return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_TITLE);
01541         }
01542 
01543       case GWEN_DialogProperty_Value:
01544         fi=f->getFirstItem();
01545         if (fi) {
01546           int i=index;
01547 
01548           while(fi && i>0) {
01549             fi=fi->getNext();
01550             i--;
01551           }
01552           if (fi) {
01553             str=fi->getText();
01554             if (str.empty())
01555               return defaultValue;
01556             GWEN_Widget_SetText(w, FOX16_DIALOG_STRING_VALUE, str.text());
01557             return GWEN_Widget_GetText(w, FOX16_DIALOG_STRING_VALUE);
01558           }
01559           else {
01560             DBG_ERROR(GWEN_LOGDOMAIN, "Index %d out of range", index);
01561             return defaultValue;
01562           }
01563         }
01564         else {
01565           DBG_ERROR(GWEN_LOGDOMAIN, "Empty list");
01566           return defaultValue;
01567         }
01568 
01569       default:
01570         break;
01571       }
01572       break;
01573     }
01574 
01575 
01576   case GWEN_Widget_TypeProgressBar:
01577   case GWEN_Widget_TypeSpinBox:
01578   case GWEN_Widget_TypeHSpacer:
01579   case GWEN_Widget_TypeVSpacer:
01580   case GWEN_Widget_TypeHLayout:
01581   case GWEN_Widget_TypeVLayout:
01582   case GWEN_Widget_TypeGridLayout:
01583   case GWEN_Widget_TypeTabBook:
01584   case GWEN_Widget_TypeScrollArea:
01585   case GWEN_Widget_TypeWidgetStack:
01586   case GWEN_Widget_TypeHLine:
01587   case GWEN_Widget_TypeVLine:
01588     break;
01589   }
01590 
01591   /* this block is just to make sure we get warnings when new
01592    * properties are available but not handled here
01593    */
01594   switch(prop) {
01595   case GWEN_DialogProperty_Title:
01596   case GWEN_DialogProperty_Value:
01597   case GWEN_DialogProperty_MinValue:
01598   case GWEN_DialogProperty_MaxValue:
01599   case GWEN_DialogProperty_Enabled:
01600   case GWEN_DialogProperty_AddValue:
01601   case GWEN_DialogProperty_ClearValues:
01602   case GWEN_DialogProperty_ValueCount:
01603   case GWEN_DialogProperty_ColumnWidth:
01604   case GWEN_DialogProperty_Width:
01605   case GWEN_DialogProperty_Height:
01606   case GWEN_DialogProperty_SelectionMode:
01607   case GWEN_DialogProperty_SelectionState:
01608   case GWEN_DialogProperty_Focus:
01609   case GWEN_DialogProperty_SortDirection:
01610   case GWEN_DialogProperty_Sort:
01611   case GWEN_DialogProperty_Visibility:
01612   case GWEN_DialogProperty_ToolTip:
01613   case GWEN_DialogProperty_None:
01614   case GWEN_DialogProperty_Unknown:
01615     break;
01616   }
01617 
01618 
01619   DBG_WARN(0, "Function is not appropriate for this type of widget (%s)",
01620            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
01621   return defaultValue;
01622 }
01623 
01624 
01625 
01626 
01627 
01628 long FOX16_GuiDialog::onSelCommand(FXObject *sender, FXSelector sel, void *ptr) {
01629   GWEN_WIDGET *w;
01630   const char *wname;
01631   int rv=GWEN_DialogEvent_ResultNotHandled;
01632   FXDialogBox *dialogBox;
01633 
01634   w=GWEN_Dialog_FindWidgetByImplData(_dialog, FOX16_DIALOG_WIDGET_REAL, sender);
01635   if (w==NULL) {
01636     if (!m_radioGroups.empty()) {
01637       std::list<RadioButtonGroup*>::iterator it;
01638       RadioButtonGroup *grp=NULL;
01639 
01640       for (it=m_radioGroups.begin(); it!=m_radioGroups.end(); it++) {
01641         if ((*it)->getDataTarget()==sender) {
01642           grp=*it;
01643           break;
01644         }
01645       }
01646 
01647       if (grp==NULL) {
01648         DBG_WARN(GWEN_LOGDOMAIN, "Widget or RadioButtonGroup not found");
01649         return 0;
01650       }
01651       else {
01652         DBG_INFO(0, "Found button group %d: %d", grp->getGroupId(), grp->getRadioValue());
01653         // no signal for now
01654         return 1;
01655       }
01656     }
01657   }
01658   wname=GWEN_Widget_GetName(w);
01659 
01660   dialogBox=_mainWidget;
01661 
01662   DBG_DEBUG(GWEN_LOGDOMAIN, "Command for [%s] (type: %s)",
01663             wname?wname:"(unnamed)",
01664             GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
01665 
01666   switch(GWEN_Widget_GetType(w)) {
01667   case GWEN_Widget_TypeUnknown:
01668     return GWEN_ERROR_GENERIC;
01669 
01670   case GWEN_Widget_TypeNone:
01671     return GWEN_ERROR_GENERIC;
01672 
01673   case GWEN_Widget_TypePushButton:
01674   case GWEN_Widget_TypeLineEdit:
01675   case GWEN_Widget_TypeComboBox:
01676   case GWEN_Widget_TypeListBox:
01677   case GWEN_Widget_TypeCheckBox:
01678   case GWEN_Widget_TypeLabel:
01679   case GWEN_Widget_TypeTextEdit:
01680     rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
01681                               GWEN_DialogEvent_TypeActivated,
01682                               GWEN_Widget_GetName(w));
01683     break;
01684   case GWEN_Widget_TypeSpinBox:
01685     rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
01686                               GWEN_DialogEvent_TypeValueChanged,
01687                               GWEN_Widget_GetName(w));
01688     break;
01689 
01690   case GWEN_Widget_TypeRadioButton: /* use SEL_UPDATED for FXRadioButton */
01691   case GWEN_Widget_TypeProgressBar:
01692   case GWEN_Widget_TypeGroupBox:
01693   case GWEN_Widget_TypeHSpacer:
01694   case GWEN_Widget_TypeVSpacer:
01695   case GWEN_Widget_TypeHLayout:
01696   case GWEN_Widget_TypeVLayout:
01697   case GWEN_Widget_TypeGridLayout:
01698   case GWEN_Widget_TypeDialog:
01699   case GWEN_Widget_TypeTabBook:
01700   case GWEN_Widget_TypeTabPage:
01701   case GWEN_Widget_TypeScrollArea:
01702   case GWEN_Widget_TypeWidgetStack:
01703   case GWEN_Widget_TypeHLine:
01704   case GWEN_Widget_TypeVLine:
01705   case GWEN_Widget_TypeTextBrowser:
01706     /* nothing to do for these types */
01707     ;
01708   }
01709 
01710   if (rv==GWEN_DialogEvent_ResultAccept) {
01711     dialogBox->getApp()->stopModal(dialogBox, 1);
01712   }
01713   else if (rv==GWEN_DialogEvent_ResultReject) {
01714     dialogBox->getApp()->stopModal(dialogBox, 0);
01715   }
01716 
01717   return 1;
01718 }
01719 
01720 
01721 
01722 long FOX16_GuiDialog::onSelChanged(FXObject *sender, FXSelector sel, void *ptr) {
01723   GWEN_WIDGET *w;
01724   int rv=GWEN_DialogEvent_ResultNotHandled;
01725   FXDialogBox *dialogBox;
01726 
01727   w=GWEN_Dialog_FindWidgetByImplData(_dialog, FOX16_DIALOG_WIDGET_REAL, sender);
01728   if (w==NULL) {
01729     DBG_INFO(0, "Widget not found");
01730     return 0;
01731   }
01732 
01733   dialogBox=_mainWidget;
01734 
01735   switch(GWEN_Widget_GetType(w)) {
01736   case GWEN_Widget_TypeUnknown:
01737     return GWEN_ERROR_GENERIC;
01738   case GWEN_Widget_TypeNone:
01739     return GWEN_ERROR_GENERIC;
01740   case GWEN_Widget_TypeSpinBox:
01741   case GWEN_Widget_TypeLineEdit:
01742     rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
01743                               GWEN_DialogEvent_TypeValueChanged,
01744                               GWEN_Widget_GetName(w));
01745     break;
01746 
01747   case GWEN_Widget_TypeLabel:
01748   case GWEN_Widget_TypePushButton:
01749   case GWEN_Widget_TypeTextEdit:
01750   case GWEN_Widget_TypeComboBox:
01751   case GWEN_Widget_TypeRadioButton:
01752   case GWEN_Widget_TypeProgressBar:
01753   case GWEN_Widget_TypeGroupBox:
01754   case GWEN_Widget_TypeHSpacer:
01755   case GWEN_Widget_TypeVSpacer:
01756   case GWEN_Widget_TypeHLayout:
01757   case GWEN_Widget_TypeVLayout:
01758   case GWEN_Widget_TypeGridLayout:
01759   case GWEN_Widget_TypeListBox:
01760   case GWEN_Widget_TypeDialog:
01761   case GWEN_Widget_TypeTabBook:
01762   case GWEN_Widget_TypeTabPage:
01763   case GWEN_Widget_TypeCheckBox:
01764   case GWEN_Widget_TypeScrollArea:
01765   case GWEN_Widget_TypeWidgetStack:
01766   case GWEN_Widget_TypeHLine:
01767   case GWEN_Widget_TypeVLine:
01768   case GWEN_Widget_TypeTextBrowser:
01769     ;
01770   }
01771 
01772   if (rv==GWEN_DialogEvent_ResultAccept) {
01773     GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeFini, "");
01774     dialogBox->getApp()->stopModal(dialogBox, 1);
01775   }
01776   else if (rv==GWEN_DialogEvent_ResultReject) {
01777     GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeFini, "");
01778     dialogBox->getApp()->stopModal(dialogBox, 0);
01779   }
01780 
01781   return 1;
01782 }
01783 
01784 
01785 
01786 long FOX16_GuiDialog::onSelKeyPress(FXObject *sender, FXSelector sel, void *ptr) {
01787   GWEN_WIDGET *w;
01788 
01789   w=GWEN_Dialog_FindWidgetByImplData(_dialog, FOX16_DIALOG_WIDGET_REAL, sender);
01790   if (w==NULL) {
01791     DBG_INFO(0, "Widget not found");
01792     return 0;
01793   }
01794 
01795   switch(GWEN_Widget_GetType(w)) {
01796   case GWEN_Widget_TypeUnknown:
01797   case GWEN_Widget_TypeNone:
01798     return 0;
01799 
01800   case GWEN_Widget_TypeDialog:
01801     /* catch ENTER key */
01802     if (((FXEvent*)ptr)->code==KEY_Return || ((FXEvent*)ptr)->code==KEY_KP_Enter) {
01803       return 1;
01804     }
01805     return 0;
01806 
01807   case GWEN_Widget_TypeLabel:
01808   case GWEN_Widget_TypePushButton:
01809   case GWEN_Widget_TypeLineEdit:
01810   case GWEN_Widget_TypeTextEdit:
01811   case GWEN_Widget_TypeComboBox:
01812   case GWEN_Widget_TypeRadioButton:
01813   case GWEN_Widget_TypeProgressBar:
01814   case GWEN_Widget_TypeSpinBox:
01815   case GWEN_Widget_TypeGroupBox:
01816   case GWEN_Widget_TypeHSpacer:
01817   case GWEN_Widget_TypeVSpacer:
01818   case GWEN_Widget_TypeHLayout:
01819   case GWEN_Widget_TypeVLayout:
01820   case GWEN_Widget_TypeGridLayout:
01821   case GWEN_Widget_TypeListBox:
01822   case GWEN_Widget_TypeTabBook:
01823   case GWEN_Widget_TypeTabPage:
01824   case GWEN_Widget_TypeCheckBox:
01825   case GWEN_Widget_TypeScrollArea:
01826   case GWEN_Widget_TypeWidgetStack:
01827   case GWEN_Widget_TypeHLine:
01828   case GWEN_Widget_TypeVLine:
01829   case GWEN_Widget_TypeTextBrowser:
01830     ;
01831   }
01832 
01833   return 0;
01834 }
01835 
01836 
01837 
01838 long FOX16_GuiDialog::onSelKeyRelease(FXObject *sender, FXSelector sel, void *ptr) {
01839   GWEN_WIDGET *w;
01840 
01841   w=GWEN_Dialog_FindWidgetByImplData(_dialog, FOX16_DIALOG_WIDGET_REAL, sender);
01842   if (w==NULL) {
01843     DBG_INFO(0, "Widget not found");
01844     return 0;
01845   }
01846 
01847   switch(GWEN_Widget_GetType(w)) {
01848   case GWEN_Widget_TypeDialog:
01849     /* catch ENTER key */
01850     if (((FXEvent*)ptr)->code==KEY_Return || ((FXEvent*)ptr)->code==KEY_KP_Enter) {
01851       return 1;
01852     }
01853     return 0;
01854 
01855   case GWEN_Widget_TypeUnknown:
01856   case GWEN_Widget_TypeNone:
01857   case GWEN_Widget_TypeLabel:
01858   case GWEN_Widget_TypePushButton:
01859   case GWEN_Widget_TypeLineEdit:
01860   case GWEN_Widget_TypeTextEdit:
01861   case GWEN_Widget_TypeComboBox:
01862   case GWEN_Widget_TypeRadioButton:
01863   case GWEN_Widget_TypeProgressBar:
01864   case GWEN_Widget_TypeSpinBox:
01865   case GWEN_Widget_TypeGroupBox:
01866   case GWEN_Widget_TypeHSpacer:
01867   case GWEN_Widget_TypeVSpacer:
01868   case GWEN_Widget_TypeHLayout:
01869   case GWEN_Widget_TypeVLayout:
01870   case GWEN_Widget_TypeGridLayout:
01871   case GWEN_Widget_TypeListBox:
01872   case GWEN_Widget_TypeTabBook:
01873   case GWEN_Widget_TypeTabPage:
01874   case GWEN_Widget_TypeCheckBox:
01875   case GWEN_Widget_TypeScrollArea:
01876   case GWEN_Widget_TypeWidgetStack:
01877   case GWEN_Widget_TypeHLine:
01878   case GWEN_Widget_TypeVLine:
01879   case GWEN_Widget_TypeTextBrowser:
01880     ;
01881   }
01882 
01883   return 0;
01884 }
01885 
01886 
01887 
01888 bool FOX16_GuiDialog::setup(FXWindow *parentWindow) {
01889   FXWindow *xw;
01890   GWEN_WIDGET_TREE *wtree;
01891   GWEN_WIDGET *w;
01892   int rv;
01893 
01894   wtree=GWEN_Dialog_GetWidgets(_dialog);
01895   if (wtree==NULL) {
01896     DBG_ERROR(GWEN_LOGDOMAIN, "No widget tree in dialog");
01897     return false;
01898   }
01899   w=GWEN_Widget_Tree_GetFirst(wtree);
01900   if (w==NULL) {
01901     DBG_ERROR(GWEN_LOGDOMAIN, "No widgets in dialog");
01902     return false;
01903   }
01904 
01905   xw=setupTree(parentWindow, w);
01906   if (xw==NULL) {
01907     DBG_INFO(0, "here");
01908     return false;
01909   }
01910 
01911   _mainWidget=dynamic_cast<FXDialogBox*>(xw);
01912   assert(_mainWidget);
01913 
01914   rv=GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeInit, "");
01915   if (rv<0) {
01916     DBG_INFO(0, "Error initializing dialog: %d", rv);
01917     return false;
01918   }
01919 
01920   /* create X11 server side resources */
01921   xw->create();
01922 
01923   xw->layout();
01924 
01925   return true;
01926 }
01927 
01928 
01929 
01930 
01931 FXWindow *FOX16_GuiDialog::setupTree(FXWindow *parentWindow, GWEN_WIDGET *w) {
01932   const char *s;
01933   const char *name;
01934   FXuint opts=0;
01935   uint32_t flags;
01936   FXString text;
01937   FXString htmlText;
01938   FXComposite *parentComposite=NULL;
01939   FXWindow *wChild=NULL;
01940   FXWindow *wContent=NULL;
01941   GWEN_WIDGET *parentWidget;
01942   int cols;
01943   int rows;
01944 
01945   /* sample data */
01946   flags=GWEN_Widget_GetFlags(w);
01947   s=GWEN_Widget_GetText(w, 0);
01948   if (s) {
01949     text=FXString(s);
01950     htmlText=FOX16_Gui::getHtmlText(s);
01951   }
01952   name=GWEN_Widget_GetName(w);
01953   cols=GWEN_Widget_GetColumns(w);
01954   rows=GWEN_Widget_GetRows(w);
01955 
01956   parentWidget=GWEN_Widget_Tree_GetParent(w);
01957 
01958   /* check for parent type */
01959   if (parentWindow)
01960     parentComposite=dynamic_cast<FXComposite*>(parentWindow);
01961   if (parentComposite==NULL) {
01962     switch(GWEN_Widget_GetType(w)) {
01963     case GWEN_Widget_TypeDialog:
01964       /* these types don't need the parent to be a FXComposite */
01965       break;
01966     default:
01967       DBG_ERROR(GWEN_LOGDOMAIN, "Parent of widget [%s] (type %d) is not a composite",
01968                 name?name:"(unnamed)", GWEN_Widget_GetType(w));
01969       return NULL;
01970     }
01971   }
01972 
01973   /* setup info for new widget */
01974   if (flags & GWEN_WIDGET_FLAGS_FILLX)
01975     opts|=LAYOUT_FILL_X | LAYOUT_FILL_COLUMN;
01976   if (flags & GWEN_WIDGET_FLAGS_FILLY)
01977     opts|=LAYOUT_FILL_Y;
01978   if (flags & GWEN_WIDGET_FLAGS_DECOR_SHRINKABLE)
01979     opts|=DECOR_SHRINKABLE;
01980   if (flags & GWEN_WIDGET_FLAGS_DECOR_STRETCHABLE)
01981     opts|=DECOR_STRETCHABLE;
01982   if (flags & GWEN_WIDGET_FLAGS_DECOR_MINIMIZE)
01983     opts|=DECOR_MINIMIZE;
01984   if (flags & GWEN_WIDGET_FLAGS_DECOR_MAXIMIZE)
01985     opts|=DECOR_MAXIMIZE;
01986   if (flags & GWEN_WIDGET_FLAGS_DECOR_CLOSE)
01987     opts|=DECOR_CLOSE;
01988   if (flags & GWEN_WIDGET_FLAGS_DECOR_MENU)
01989     opts|=DECOR_MENU;
01990   if (flags & GWEN_WIDGET_FLAGS_EQUAL_WIDTH)
01991     opts|=PACK_UNIFORM_WIDTH;
01992   if (flags & GWEN_WIDGET_FLAGS_EQUAL_HEIGHT)
01993     opts|=PACK_UNIFORM_HEIGHT;
01994   if (flags & GWEN_WIDGET_FLAGS_JUSTIFY_LEFT)
01995     opts|=JUSTIFY_LEFT;
01996   if (flags & GWEN_WIDGET_FLAGS_JUSTIFY_RIGHT)
01997     opts|=JUSTIFY_RIGHT;
01998   if (flags & GWEN_WIDGET_FLAGS_JUSTIFY_TOP)
01999     opts|=JUSTIFY_TOP;
02000   if (flags & GWEN_WIDGET_FLAGS_JUSTIFY_BOTTOM)
02001     opts|=JUSTIFY_BOTTOM;
02002   if (flags & GWEN_WIDGET_FLAGS_JUSTIFY_CENTERX)
02003     opts|=JUSTIFY_CENTER_X;
02004   if (flags & GWEN_WIDGET_FLAGS_JUSTIFY_CENTERY)
02005     opts|=JUSTIFY_CENTER_Y;
02006 
02007   /* create THIS widget */
02008   switch(GWEN_Widget_GetType(w)) {
02009 
02010   case GWEN_Widget_TypeLabel: {
02011     FOX16_HtmlLabel *label;
02012     int wi;
02013     const char *s;
02014     GWEN_STRINGLISTENTRY *se;
02015 
02016     if (flags & GWEN_WIDGET_FLAGS_NO_WORDWRAP)
02017       opts|=FOX16_HtmlLabel::FLAGS_NO_WORDWRAP;
02018     label=new FOX16_HtmlLabel(parentComposite,
02019                               htmlText,
02020                               opts);
02021     s=GWEN_Widget_GetIconFileName(w);
02022     if (s && *s) {
02023       FXIcon *ic;
02024 
02025       ic=getIcon(s);
02026       if (ic)
02027         label->setIcon(ic);
02028     }
02029 
02030     wi=GWEN_Widget_GetWidth(w);
02031     if (wi>0)
02032       label->setMaxDefaultWidth(wi);
02033 
02034     /* copy media paths to label */
02035     se=GWEN_StringList_FirstEntry(GWEN_Dialog_GetMediaPaths(_dialog));
02036     while(se) {
02037       const char *s;
02038   
02039       s=GWEN_StringListEntry_Data(se);
02040       assert(s);
02041       label->addMediaPath(s);
02042       se=GWEN_StringListEntry_Next(se);
02043     }
02044 
02045     wChild=label;
02046     break;
02047   }
02048 
02049   case GWEN_Widget_TypePushButton: {
02050     const char *s;
02051     FXIcon *ic=NULL;
02052 
02053     if (flags & GWEN_WIDGET_FLAGS_DEFAULT_WIDGET)
02054       opts|=BUTTON_DEFAULT | BUTTON_INITIAL | BUTTON_NORMAL;
02055     else
02056       opts|=BUTTON_NORMAL;
02057     s=GWEN_Widget_GetIconFileName(w);
02058     if (s && *s)
02059       ic=getIcon(s);
02060 
02061     wChild=new THEMEBUTTON(parentComposite,
02062                            text,
02063                            ic,  /* icon */
02064                            this,
02065                            ID_WIDGET_FIRST+_widgetCount,
02066                            opts);
02067     break;
02068   }
02069 
02070   case GWEN_Widget_TypeLineEdit:
02071     if (flags & GWEN_WIDGET_FLAGS_PASSWORD)
02072       opts|=TEXTFIELD_PASSWD;
02073     if (flags & GWEN_WIDGET_FLAGS_READONLY)
02074       opts|=TEXTFIELD_READONLY;
02075     wChild=new FXTextField(parentComposite,
02076                            cols?cols:16,
02077                            this,
02078                            ID_WIDGET_FIRST+_widgetCount,
02079                            opts | TEXTFIELD_NORMAL | TEXTFIELD_ENTER_ONLY);
02080     break;
02081 
02082   case GWEN_Widget_TypeTextEdit:
02083     {
02084       FXText *f;
02085 
02086       if (flags & GWEN_WIDGET_FLAGS_READONLY)
02087         opts|=TEXT_READONLY;
02088       f=new FXText(parentComposite,
02089                    this,
02090                    ID_WIDGET_FIRST+_widgetCount,
02091                    opts | HSCROLLING_OFF);
02092       if (cols)
02093         f->setVisibleColumns(cols);
02094       if (rows)
02095         f->setVisibleRows(rows);
02096       wChild=f;
02097       break;
02098     }
02099 
02100   case GWEN_Widget_TypeTextBrowser:
02101     {
02102       FOX16_HtmlText *f;
02103 
02104       f=new FOX16_HtmlText(parentComposite, "",
02105                            opts | HSCROLLING_OFF);
02106       wChild=f;
02107       break;
02108     }
02109 
02110   case GWEN_Widget_TypeComboBox:
02111     if (flags & GWEN_WIDGET_FLAGS_READONLY)
02112       opts|=COMBOBOX_STATIC;
02113     wChild=new THEMECOMBOBOX(parentComposite,
02114                              cols?cols:16,
02115                              this,
02116                              ID_WIDGET_FIRST+_widgetCount,
02117                              opts);
02118     break;
02119 
02120   case GWEN_Widget_TypeRadioButton: {
02121     FXRadioButton *rb;
02122     int groupId;
02123     RadioButtonGroup *grp=NULL;
02124     std::list<RadioButtonGroup*>::iterator it;
02125 
02126     groupId=GWEN_Widget_GetGroupId(w);
02127 
02128 
02129     for (it=m_radioGroups.begin(); it!=m_radioGroups.end(); it++) {
02130       if ((*it)->getGroupId()==groupId) {
02131         grp=*it;
02132       }
02133     }
02134     if (grp==NULL) {
02135       grp=new RadioButtonGroup(groupId, this, ID_WIDGET_FIRST+_widgetCount);
02136       m_radioGroups.push_back(grp);
02137     }
02138 
02139     rb=new FXRadioButton(parentComposite,
02140                          text,
02141                          grp->getDataTarget(),
02142                          FXDataTarget::ID_OPTION+grp->getButtonCount(),
02143                          opts | RADIOBUTTON_NORMAL);
02144     grp->addButton(rb);
02145     wChild=rb;
02146     break;
02147   }
02148 
02149   case GWEN_Widget_TypeProgressBar:
02150     wChild=new FXProgressBar(parentComposite,
02151                              this,
02152                              ID_WIDGET_FIRST+_widgetCount,
02153                              opts | PROGRESSBAR_NORMAL | PROGRESSBAR_PERCENTAGE);
02154     break;
02155 
02156   case GWEN_Widget_TypeGroupBox:
02157     wChild=new FXGroupBox(parentComposite,
02158                           text,
02159                           opts | GROUPBOX_NORMAL | FRAME_LINE);
02160     break;
02161 
02162   case GWEN_Widget_TypeHSpacer:
02163     wChild=new FXSpring(parentComposite, opts | LAYOUT_FILL_X);
02164     break;
02165 
02166   case GWEN_Widget_TypeVSpacer:
02167     wChild=new FXSpring(parentComposite, opts | LAYOUT_FILL_Y);
02168     break;
02169 
02170   case GWEN_Widget_TypeHLayout:
02171     wChild=new FXHorizontalFrame(parentComposite, opts,
02172                                  0, 0, 0, 0, 0, 0, 0, 0);
02173     break;
02174 
02175   case GWEN_Widget_TypeVLayout:
02176     wChild=new FXVerticalFrame(parentComposite, opts,
02177                                0, 0, 0, 0, 0, 0, 0, 0);
02178     break;
02179 
02180   case GWEN_Widget_TypeGridLayout:
02181     if (cols & rows) {
02182       DBG_ERROR(GWEN_LOGDOMAIN, "State columns *or* rows, not both in widget [%s]",
02183                 name?name:"(unnamed)");
02184       return NULL;
02185     }
02186     if (cols)
02187       wChild=new FXMatrix(parentComposite, cols,
02188                           opts | MATRIX_BY_COLUMNS,
02189                           0, 0, 0, 0, 0, 0, 0, 0);
02190     else
02191       wChild=new FXMatrix(parentComposite, rows,
02192                           opts | MATRIX_BY_ROWS,
02193                           0, 0, 0, 0, 0, 0, 0, 0);
02194     break;
02195 
02196   case GWEN_Widget_TypeListBox:
02197     wChild=new FOX16_GuiSortingList(parentComposite,
02198                                     this,
02199                                     ID_WIDGET_FIRST+_widgetCount,
02200                                     opts | FRAME_SUNKEN|FRAME_THICK | LISTBOX_NORMAL);
02201     break;
02202 
02203   case GWEN_Widget_TypeDialog:
02204     if (parentWindow)
02205       wChild=new FXDialogBox(parentWindow,
02206                              name?FXString(name):FXString(""),
02207                              opts | DECOR_TITLE | DECOR_BORDER);
02208     else
02209       wChild=new FXDialogBox(FXApp::instance(),
02210                              name?FXString(name):FXString(""),
02211                              opts | DECOR_TITLE | DECOR_BORDER);
02212     break;
02213 
02214   case GWEN_Widget_TypeTabBook:
02215     wChild=new FXTabBook(parentComposite,
02216                          this,
02217                          ID_WIDGET_FIRST+_widgetCount,
02218                          opts | TABBOOK_NORMAL);
02219     break;
02220 
02221   case GWEN_Widget_TypeTabPage:
02222     if (parentWidget==NULL) {
02223       DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] has no parent", name?name:"(unnamed)");
02224       return NULL;
02225     }
02226     else {
02227       FXTabBook *tbook=dynamic_cast<FXTabBook*>(parentWindow);
02228       if (tbook==NULL) {
02229         DBG_ERROR(GWEN_LOGDOMAIN, "Parent of widget [%s] needs to be of type TabBook", name?name:"(unnamed)");
02230         return NULL;
02231       }
02232 
02233       new THEMETABITEM(tbook, text, NULL, opts | TAB_TOP_NORMAL);
02234       wChild=new FXVerticalFrame(tbook, opts);
02235     }
02236     break;
02237 
02238   case GWEN_Widget_TypeCheckBox:
02239     wChild=new FXCheckButton(parentComposite,
02240                              text,
02241                              this,
02242                              ID_WIDGET_FIRST+_widgetCount,
02243                              opts | CHECKBUTTON_NORMAL);
02244     break;
02245 
02246   case GWEN_Widget_TypeScrollArea:
02247     {
02248       FXScrollWindow *f;
02249 
02250       f=new FXScrollWindow(parentComposite, opts);
02251       wChild=f;
02252       wContent=f->contentWindow();
02253       break;
02254     }
02255 
02256   case GWEN_Widget_TypeWidgetStack:
02257     wChild=new FXSwitcher(parentComposite, opts);
02258     break;
02259 
02260   case GWEN_Widget_TypeHLine:
02261     wChild=new FXHorizontalSeparator(parentComposite, opts | SEPARATOR_GROOVE);
02262     break;
02263 
02264   case GWEN_Widget_TypeVLine:
02265     wChild=new FXVerticalSeparator(parentComposite, opts | SEPARATOR_GROOVE);
02266     break;
02267 
02268   case GWEN_Widget_TypeSpinBox:
02269     wChild=new FXSpinner(parentComposite,
02270                          cols?cols:16,
02271                          this,
02272                          ID_WIDGET_FIRST+_widgetCount,
02273                          opts | SPIN_NORMAL);
02274     break;
02275 
02276   case GWEN_Widget_TypeUnknown:
02277     DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] is of type \'unknown\'", name?name:"(unnamed)");
02278     return NULL;
02279   case GWEN_Widget_TypeNone:
02280     DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] is of type \'none\'", name?name:"(unnamed)");
02281     return NULL;
02282   }
02283 
02284   assert(wChild);
02285   _widgetCount++;
02286 
02287   if (wContent==NULL)
02288     wContent=wChild;
02289 
02290   GWEN_Widget_SetImplData(w, FOX16_DIALOG_WIDGET_REAL, (void*) wChild);
02291   GWEN_Widget_SetImplData(w, FOX16_DIALOG_WIDGET_CONTENT, (void*) wContent);
02292 
02293   /* handle children */
02294   w=GWEN_Widget_Tree_GetFirstChild(w);
02295   while(w) {
02296     if (NULL==setupTree(wContent, w))
02297       return NULL;
02298     w=GWEN_Widget_Tree_GetNext(w);
02299   }
02300 
02301   return wChild;
02302 }
02303 
02304 
02305 
02306 int FOX16_GuiDialog::cont() {
02307   FXDialogBox *dialogBox;
02308 
02309   dialogBox=_mainWidget;
02310   return dialogBox->getApp()->runModalFor(dialogBox);
02311 }
02312 
02313 
02314 
02315 int FOX16_GuiDialog::openDialog() {
02316   FXDialogBox *dialogBox;
02317 
02318   dialogBox=_mainWidget;
02319 
02320   /* show dialog */
02321   dialogBox->layout();
02322   dialogBox->show(PLACEMENT_OWNER);
02323 
02324   return 0;
02325 }
02326 
02327 
02328 
02329 int FOX16_GuiDialog::closeDialog() {
02330   FXDialogBox *dialogBox;
02331 
02332   dialogBox=_mainWidget;
02333 
02334   /* let dialog write its settings */
02335   GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeFini, "");
02336 
02337   /* hide dialog */
02338   dialogBox->hide();
02339   delete _mainWidget;
02340   _mainWidget=NULL;
02341 
02342   return 0;
02343 }
02344 
02345 
02346