gwenhywfar  4.3.3
qt4_gui_dialog.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002     begin       : Mon Feb 15 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 #include "qt4_gui_dialog.hpp"
00011 #include "qt4dialogbox.hpp"
00012 
00013 #include <gwenhywfar/dialog_be.h>
00014 #include <gwenhywfar/widget_be.h>
00015 #include <gwenhywfar/debug.h>
00016 
00017 #include <QApplication>
00018 #include <QLabel>
00019 #include <QPushButton>
00020 #include <QLineEdit>
00021 #include <QTextEdit>
00022 #include <QTextBrowser>
00023 #include <QComboBox>
00024 #include <QGroupBox>
00025 #include <QProgressBar>
00026 #include <QHBoxLayout>
00027 #include <QVBoxLayout>
00028 #include <QGridLayout>
00029 #include <QFrame>
00030 #include <QTreeWidget>
00031 #include <QTabWidget>
00032 #include <QCheckBox>
00033 #include <QStackedWidget>
00034 #include <QScrollArea>
00035 #include <QSpinBox>
00036 #include <QRadioButton>
00037 #include <QHeaderView>
00038 
00039 #include <QDebug>
00040 
00041 #include <list>
00042 #include <string>
00043 
00044 
00045 
00046 
00047 #define QT4_DIALOG_WIDGET_REAL    0
00048 #define QT4_DIALOG_WIDGET_CONTENT 1
00049 #define QT4_DIALOG_WIDGET_LAYOUT  2
00050 
00051 #define QT4_DIALOG_STRING_TITLE  0
00052 #define QT4_DIALOG_STRING_VALUE  1
00053 
00054 
00055 
00056 #include "w_widget.cpp"
00057 #include "w_dialog.cpp"
00058 #include "w_vlayout.cpp"
00059 #include "w_hlayout.cpp"
00060 #include "w_gridlayout.cpp"
00061 #include "w_label.cpp"
00062 #include "w_lineedit.cpp"
00063 #include "w_pushbutton.cpp"
00064 #include "w_hline.cpp"
00065 #include "w_vline.cpp"
00066 #include "w_textedit.cpp"
00067 #include "w_combobox.cpp"
00068 #include "w_tabbook.cpp"
00069 #include "w_checkbox.cpp"
00070 #include "w_groupbox.cpp"
00071 #include "w_widgetstack.cpp"
00072 #include "w_textbrowser.cpp"
00073 #include "w_scrollarea.cpp"
00074 #include "w_progressbar.cpp"
00075 #include "w_listbox.cpp"
00076 #include "w_radiobutton.cpp"
00077 #include "w_spinbox.cpp"
00078 
00079 
00080 
00081 
00082 QT4_GuiDialog::QT4_GuiDialog(QT4_Gui *gui, GWEN_DIALOG *dlg)
00083   :CppDialog(dlg)
00084   ,_gui(gui)
00085   ,_mainWidget(NULL)
00086 {
00087 
00088 }
00089 
00090 
00091 
00092 QT4_GuiDialog::~QT4_GuiDialog() {
00093   if (_mainWidget)
00094     _mainWidget->unlinkFromDialog();
00095 
00096 }
00097 
00098 
00099 
00100 QT4_GuiDialog *QT4_GuiDialog::getDialog(GWEN_DIALOG *dlg) {
00101   CppDialog *cppDlg;
00102 
00103   cppDlg=CppDialog::getDialog(dlg);
00104   if (cppDlg)
00105     return dynamic_cast<QT4_GuiDialog*>(cppDlg);
00106   return NULL;
00107 }
00108 
00109 
00110 
00111 int QT4_GuiDialog::execute() {
00112   QT4_DialogBox *dialogBox;
00113   int rv;
00114 
00115   dialogBox=dynamic_cast<QT4_DialogBox*>(getMainWindow());
00116   if (dialogBox==NULL) {
00117     DBG_INFO(0, "Dialog's main widget is not derived from class FXDialogBox");
00118     return GWEN_ERROR_GENERIC;
00119   }
00120 
00121   /* execute dialog */
00122   rv=dialogBox->exec();
00123   GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeFini, "");
00124 
00125   if (rv==QT4_DialogBox::Accepted) {
00126     /* accepted */
00127     return 1;
00128   }
00129   else
00130     return 0;
00131 }
00132 
00133 
00134 
00135 int QT4_GuiDialog::openDialog() {
00136   QT4_DialogBox *dialogBox;
00137 
00138   dialogBox=dynamic_cast<QT4_DialogBox*>(getMainWindow());
00139   if (dialogBox==NULL) {
00140     DBG_INFO(0, "Dialog's main widget is not derived from class FXDialogBox");
00141     return GWEN_ERROR_GENERIC;
00142   }
00143 
00144   /* show dialog */
00145   dialogBox->show();
00146   /* gui update */
00147   qApp->processEvents();
00148 
00149   return 0;
00150 }
00151 
00152 
00153 
00154 int QT4_GuiDialog::closeDialog() {
00155   QT4_DialogBox *dialogBox;
00156 
00157   dialogBox=dynamic_cast<QT4_DialogBox*>(getMainWindow());
00158   if (dialogBox==NULL) {
00159     DBG_INFO(0, "Dialog's main widget is not derived from class FXDialogBox");
00160     return GWEN_ERROR_GENERIC;
00161   }
00162 
00163   /* let dialog write its settings */
00164   GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeFini, "");
00165 
00166   /* hide dialog */
00167   dialogBox->hide();
00168   /* gui update */
00169   qApp->processEvents();
00170 
00171   delete _mainWidget;
00172   _mainWidget=NULL;
00173 
00174   return 0;
00175 }
00176 
00177 
00178 
00179 int QT4_GuiDialog::runDialog(bool untilEnd) {
00180   QT4_DialogBox *dialogBox;
00181 
00182   dialogBox=dynamic_cast<QT4_DialogBox*>(getMainWindow());
00183   if (dialogBox==NULL) {
00184     DBG_INFO(0, "Dialog's main widget is not derived from class FXDialogBox");
00185     return GWEN_ERROR_GENERIC;
00186   }
00187 
00188   if (untilEnd) {
00189     dialogBox->cont();
00190   }
00191   else { {
00192     /* gui update */
00193     qApp->processEvents();
00194   }
00195   }
00196 
00197   return 0;
00198 }
00199 
00200 
00201 
00202 int QT4_GuiDialog::setIntProperty(GWEN_WIDGET *w,
00203                                   GWEN_DIALOG_PROPERTY prop,
00204                                   int index,
00205                                   int value,
00206                                   int doSignal) {
00207   return GWEN_Widget_SetIntProperty(w, prop, index, value, doSignal);
00208 }
00209 
00210 
00211 
00212 int QT4_GuiDialog::getIntProperty(GWEN_WIDGET *w,
00213                                   GWEN_DIALOG_PROPERTY prop,
00214                                   int index,
00215                                   int defaultValue) {
00216   return GWEN_Widget_GetIntProperty(w, prop, index, defaultValue);
00217 }
00218 
00219 
00220 
00221 int QT4_GuiDialog::setCharProperty(GWEN_WIDGET *w,
00222                                    GWEN_DIALOG_PROPERTY prop,
00223                                    int index,
00224                                    const char *value,
00225                                    int doSignal) {
00226   return GWEN_Widget_SetCharProperty(w, prop, index, value, doSignal);
00227 }
00228 
00229 
00230 
00231 const char *QT4_GuiDialog::getCharProperty(GWEN_WIDGET *w,
00232                                            GWEN_DIALOG_PROPERTY prop,
00233                                            int index,
00234                                            const char *defaultValue) {
00235   return GWEN_Widget_GetCharProperty(w, prop, index, defaultValue);
00236 }
00237 
00238 
00239 
00240 int QT4_GuiDialog::setupTree(GWEN_WIDGET *w) {
00241   int rv;
00242   Qt4_W_Widget *xw=NULL;
00243 
00244   switch(GWEN_Widget_GetType(w)) {
00245   case GWEN_Widget_TypeDialog:
00246     xw=new Qt4_W_Dialog(w);
00247     break;
00248   case GWEN_Widget_TypeVLayout:
00249     xw=new Qt4_W_VLayout(w);
00250     break;
00251   case GWEN_Widget_TypeHLayout:
00252     xw=new Qt4_W_HLayout(w);
00253     break;
00254   case GWEN_Widget_TypeGridLayout:
00255     xw=new Qt4_W_GridLayout(w);
00256     break;
00257   case GWEN_Widget_TypeLabel:
00258     xw=new Qt4_W_Label(w);
00259     break;
00260   case GWEN_Widget_TypeLineEdit:
00261     xw=new Qt4_W_LineEdit(w);
00262     break;
00263   case GWEN_Widget_TypeVSpacer:
00264   case GWEN_Widget_TypeHSpacer:
00265     /* abuse widget */
00266     xw=new Qt4_W_Widget(w);
00267     break;
00268   case GWEN_Widget_TypePushButton:
00269     xw=new Qt4_W_PushButton(w);
00270     break;
00271   case GWEN_Widget_TypeHLine:
00272     xw=new Qt4_W_HLine(w);
00273     break;
00274   case GWEN_Widget_TypeVLine:
00275     xw=new Qt4_W_VLine(w);
00276     break;
00277   case GWEN_Widget_TypeTextEdit:
00278     xw=new Qt4_W_TextEdit(w);
00279     break;
00280   case GWEN_Widget_TypeComboBox:
00281     xw=new Qt4_W_ComboBox(w);
00282     break;
00283   case GWEN_Widget_TypeTabBook:
00284     xw=new Qt4_W_TabBook(w);
00285     break;
00286   case GWEN_Widget_TypeTabPage:
00287     xw=new Qt4_W_VLayout(w);
00288     break;
00289   case GWEN_Widget_TypeCheckBox:
00290     xw=new Qt4_W_CheckBox(w);
00291     break;
00292   case GWEN_Widget_TypeGroupBox:
00293     xw=new Qt4_W_GroupBox(w);
00294     break;
00295   case GWEN_Widget_TypeWidgetStack:
00296     xw=new Qt4_W_WidgetStack(w);
00297     break;
00298   case GWEN_Widget_TypeTextBrowser:
00299     xw=new Qt4_W_TextBrowser(w);
00300     break;
00301   case GWEN_Widget_TypeScrollArea:
00302     xw=new Qt4_W_ScrollArea(w);
00303     break;
00304   case GWEN_Widget_TypeProgressBar:
00305     xw=new Qt4_W_ProgressBar(w);
00306     break;
00307   case GWEN_Widget_TypeListBox:
00308     xw=new Qt4_W_ListBox(w);
00309     break;
00310   case GWEN_Widget_TypeRadioButton:
00311     xw=new Qt4_W_RadioButton(w);
00312     break;
00313   case GWEN_Widget_TypeSpinBox:
00314     xw=new Qt4_W_SpinBox(w);
00315     break;
00316   default:
00317     DBG_ERROR(GWEN_LOGDOMAIN, "Unhandled widget type %d (%s)",
00318               GWEN_Widget_GetType(w), GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
00319     break;
00320   }
00321 
00322   if (xw==NULL) {
00323     DBG_ERROR(GWEN_LOGDOMAIN, "No widget created.");
00324     return GWEN_ERROR_INTERNAL;
00325   }
00326 
00327   rv=xw->setup();
00328   if (rv<0) {
00329     DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00330     return rv;
00331   }
00332   else {
00333     GWEN_WIDGET *wChild;
00334 
00335     if (GWEN_Widget_GetType(w)==GWEN_Widget_TypeDialog)
00336       _mainWidget=(QT4_DialogBox*) GWEN_Widget_GetImplData(xw->getCInterface(), QT4_DIALOG_WIDGET_REAL);
00337 
00338     /* handle children */
00339     wChild=GWEN_Widget_Tree_GetFirstChild(w);
00340     while(wChild) {
00341       /* recursion */
00342       rv=setupTree(wChild);
00343       if (rv<0) {
00344         DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00345         return rv;
00346       }
00347       wChild=GWEN_Widget_Tree_GetNext(wChild);
00348     }
00349   }
00350 
00351   return 0;
00352 }
00353 
00354 
00355 bool QT4_GuiDialog::setup(QWidget *parentWindow) {
00356   GWEN_WIDGET_TREE *wtree;
00357   GWEN_WIDGET *w;
00358   int rv;
00359 
00360   wtree=GWEN_Dialog_GetWidgets(_dialog);
00361   if (wtree==NULL) {
00362     DBG_ERROR(GWEN_LOGDOMAIN, "No widget tree in dialog");
00363     return false;
00364   }
00365   w=GWEN_Widget_Tree_GetFirst(wtree);
00366   if (w==NULL) {
00367     DBG_ERROR(GWEN_LOGDOMAIN, "No widgets in dialog");
00368     return false;
00369   }
00370 
00371   rv=setupTree(w);
00372   if (rv<0) {
00373     DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
00374     return false;
00375   }
00376 
00377   _mainWidget=(QT4_DialogBox*) GWEN_Widget_GetImplData(w, QT4_DIALOG_WIDGET_REAL);
00378 
00379   rv=GWEN_Dialog_EmitSignalToAll(_dialog, GWEN_DialogEvent_TypeInit, "");
00380   if (rv<0) {
00381     DBG_INFO(0, "Error initializing dialog: %d", rv);
00382     return false;
00383   }
00384 
00385 
00386   return true;
00387 }
00388 
00389 
00390 
00391 
00392