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