gwenhywfar
4.3.3
|
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