00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifdef HAVE_CONFIG_H
00012 # include <config.h>
00013 #endif
00014
00015 #define DISABLE_DEBUGLOG
00016
00017
00018 #include "dlg_input_p.h"
00019
00020 #include <gwenhywfar/gwenhywfar.h>
00021 #include <gwenhywfar/pathmanager.h>
00022 #include <gwenhywfar/gui.h>
00023 #include <gwenhywfar/debug.h>
00024
00025
00026
00027
00028 GWEN_INHERIT(GWEN_DIALOG, GWEN_DLGINPUT)
00029
00030
00031
00032
00033
00034 GWEN_DIALOG *GWEN_DlgInput_new(uint32_t flags,
00035 const char *title,
00036 const char *text,
00037 int minLen,
00038 int maxLen) {
00039 GWEN_DIALOG *dlg;
00040 GWEN_DLGINPUT *xdlg;
00041 GWEN_BUFFER *fbuf;
00042 int rv;
00043
00044 if (flags & GWEN_GUI_INPUT_FLAGS_CONFIRM)
00045 dlg=GWEN_Dialog_new("dlg_gwen_input1");
00046 else
00047 dlg=GWEN_Dialog_new("dlg_gwen_input2");
00048 GWEN_NEW_OBJECT(GWEN_DLGINPUT, xdlg);
00049
00050 GWEN_INHERIT_SETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg, xdlg,
00051 GWEN_DlgInput_FreeData);
00052
00053 GWEN_Dialog_SetSignalHandler(dlg, GWEN_DlgInput_SignalHandler);
00054
00055
00056 fbuf=GWEN_Buffer_new(0, 256, 0, 1);
00057 rv=GWEN_PathManager_FindFile(GWEN_PM_LIBNAME, GWEN_PM_SYSDATADIR,
00058 "gwenhywfar/dialogs/dlg_input.dlg",
00059 fbuf);
00060 if (rv<0) {
00061 DBG_INFO(GWEN_LOGDOMAIN, "Dialog description file not found (%d).", rv);
00062 GWEN_Buffer_free(fbuf);
00063 GWEN_Dialog_free(dlg);
00064 return NULL;
00065 }
00066
00067
00068 rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf));
00069 if (rv<0) {
00070 DBG_INFO(GWEN_LOGDOMAIN, "here (%d).", rv);
00071 GWEN_Buffer_free(fbuf);
00072 GWEN_Dialog_free(dlg);
00073 return NULL;
00074 }
00075 GWEN_Buffer_free(fbuf);
00076
00077 xdlg->flags=flags;
00078 if (title)
00079 xdlg->title=strdup(title);
00080 if (text)
00081 xdlg->text=strdup(text);
00082 xdlg->minLen=minLen;
00083 xdlg->maxLen=maxLen;
00084
00085 if (!(flags & GWEN_GUI_INPUT_FLAGS_SHOW)) {
00086 GWEN_Dialog_AddWidgetFlags(dlg, "input1", GWEN_WIDGET_FLAGS_PASSWORD);
00087 GWEN_Dialog_AddWidgetFlags(dlg, "input2", GWEN_WIDGET_FLAGS_PASSWORD);
00088 }
00089
00090 if (maxLen>32) {
00091 GWEN_Dialog_SetWidgetColumns(dlg, "input1", 64);
00092 GWEN_Dialog_SetWidgetColumns(dlg, "input2", 64);
00093 }
00094 else {
00095 GWEN_Dialog_SetWidgetColumns(dlg, "input1", 32);
00096 GWEN_Dialog_SetWidgetColumns(dlg, "input2", 32);
00097 }
00098
00099 if (!(flags & GWEN_GUI_INPUT_FLAGS_CONFIRM)) {
00100 GWEN_Dialog_RemoveWidget(dlg, "input2");
00101 GWEN_Dialog_RemoveWidget(dlg, "label2");
00102 }
00103
00104 return dlg;
00105 }
00106
00107
00108
00109 void GWENHYWFAR_CB GWEN_DlgInput_FreeData(void *bp, void *p) {
00110 GWEN_DLGINPUT *xdlg;
00111
00112 xdlg=(GWEN_DLGINPUT*) p;
00113
00114 if (xdlg->response) {
00115 memset(xdlg->response, 0, strlen(xdlg->response));
00116 xdlg->response=NULL;
00117 }
00118 free(xdlg->title);
00119 free(xdlg->text);
00120
00121 GWEN_FREE_OBJECT(xdlg);
00122 }
00123
00124
00125
00126 int GWEN_DlgInput_CheckInput(GWEN_DIALOG *dlg) {
00127 GWEN_DLGINPUT *xdlg;
00128 const char *s1;
00129
00130 assert(dlg);
00131 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg);
00132 assert(xdlg);
00133
00134 s1=GWEN_Dialog_GetCharProperty(dlg, "input1", GWEN_DialogProperty_Value, 0, NULL);
00135 if (xdlg->flags & GWEN_GUI_INPUT_FLAGS_CONFIRM) {
00136 const char *s2;
00137
00138 s2=GWEN_Dialog_GetCharProperty(dlg, "input2", GWEN_DialogProperty_Value, 0, NULL);
00139
00140
00141 if (!s1 || !s2 || strcasecmp(s1, s2)!=0)
00142 return -1;
00143 }
00144
00145 if (!s1)
00146 return -1;
00147
00148 if (xdlg->minLen>=0) {
00149 if (strlen(s1)<xdlg->minLen)
00150 return -1;
00151 }
00152
00153 return 0;
00154 }
00155
00156
00157
00158 void GWEN_DlgInput_Init(GWEN_DIALOG *dlg) {
00159 GWEN_DLGINPUT *xdlg;
00160 GWEN_DB_NODE *dbParams;
00161
00162 assert(dlg);
00163 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg);
00164 assert(xdlg);
00165
00166 dbParams=GWEN_Dialog_GetPreferences(dlg);
00167 assert(dbParams);
00168
00169 #if 0
00170
00171 i=GWEN_DB_GetIntValue(dbParams, "dialog_width", 0, -1);
00172 if (i>=DIALOG_MINWIDTH)
00173 GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0);
00174
00175
00176 i=GWEN_DB_GetIntValue(dbParams, "dialog_height", 0, -1);
00177 if (i>=DIALOG_MINHEIGHT)
00178 GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0);
00179 #endif
00180
00181
00182 if (xdlg->title)
00183 GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, xdlg->title, 0);
00184
00185 if (xdlg->text)
00186 GWEN_Dialog_SetCharProperty(dlg, "descrLabel", GWEN_DialogProperty_Title, 0, xdlg->text, 0);
00187
00188
00189 GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 0, 0);
00190 GWEN_Dialog_SetIntProperty(dlg, "abortButton", GWEN_DialogProperty_Enabled, 0, 1, 0);
00191
00192 GWEN_Dialog_SetIntProperty(dlg, "input1", GWEN_DialogProperty_Focus, 0, 1, 0);
00193
00194
00195 xdlg->wasInit=1;
00196 }
00197
00198
00199
00200 void GWEN_DlgInput_Fini(GWEN_DIALOG *dlg) {
00201 GWEN_DLGINPUT *xdlg;
00202 GWEN_DB_NODE *dbParams;
00203
00204 assert(dlg);
00205 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg);
00206 assert(xdlg);
00207
00208 dbParams=GWEN_Dialog_GetPreferences(dlg);
00209 assert(dbParams);
00210
00211 if (xdlg->response) {
00212 memset(xdlg->response, 0, strlen(xdlg->response));
00213 xdlg->response=NULL;
00214 }
00215
00216 if (GWEN_DlgInput_CheckInput(dlg)==0) {
00217 const char *s;
00218 s=GWEN_Dialog_GetCharProperty(dlg, "input1", GWEN_DialogProperty_Value, 0, NULL);
00219 if (s)
00220 xdlg->response=strdup(s);
00221 }
00222
00223 #if 0
00224
00225 i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1);
00226 if (i<DIALOG_MINWIDTH)
00227 i=DIALOG_MINWIDTH;
00228 GWEN_DB_SetIntValue(dbParams,
00229 GWEN_DB_FLAGS_OVERWRITE_VARS,
00230 "dialog_width",
00231 i);
00232
00233
00234 i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1);
00235 if (i<DIALOG_MINHEIGHT)
00236 i=DIALOG_MINHEIGHT;
00237 GWEN_DB_SetIntValue(dbParams,
00238 GWEN_DB_FLAGS_OVERWRITE_VARS,
00239 "dialog_height",
00240 i);
00241 #endif
00242 }
00243
00244
00245
00246
00247 int GWEN_DlgInput_HandleActivated(GWEN_DIALOG *dlg, const char *sender) {
00248 GWEN_DLGINPUT *xdlg;
00249
00250 assert(dlg);
00251 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg);
00252 assert(xdlg);
00253
00254 if (strcasecmp(sender, "okButton")==0) {
00255 return GWEN_DialogEvent_ResultAccept;
00256 }
00257 else if (strcasecmp(sender, "abortButton")==0) {
00258 return GWEN_DialogEvent_ResultReject;
00259 }
00260 else if (strcasecmp(sender, "input1")==0 ||
00261 strcasecmp(sender, "input2")==0) {
00262 if (GWEN_DlgInput_CheckInput(dlg)==0)
00263 return GWEN_DialogEvent_ResultAccept;
00264 return GWEN_DialogEvent_ResultHandled;
00265 }
00266
00267 return GWEN_DialogEvent_ResultNotHandled;
00268 }
00269
00270
00271
00272 int GWEN_DlgInput_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) {
00273 GWEN_DLGINPUT *xdlg;
00274
00275 assert(dlg);
00276 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg);
00277 assert(xdlg);
00278
00279 if (strcasecmp(sender, "input1")==0 ||
00280 strcasecmp(sender, "input2")==0) {
00281 if (GWEN_DlgInput_CheckInput(dlg))
00282
00283 GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 0, 0);
00284 else
00285
00286 GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 1, 0);
00287 return GWEN_DialogEvent_ResultHandled;
00288 }
00289
00290 return GWEN_DialogEvent_ResultNotHandled;
00291 }
00292
00293
00294
00295 int GWENHYWFAR_CB GWEN_DlgInput_SignalHandler(GWEN_DIALOG *dlg,
00296 GWEN_DIALOG_EVENTTYPE t,
00297 const char *sender) {
00298 GWEN_DLGINPUT *xdlg;
00299
00300 assert(dlg);
00301 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg);
00302 assert(xdlg);
00303
00304 switch(t) {
00305 case GWEN_DialogEvent_TypeInit:
00306 GWEN_DlgInput_Init(dlg);
00307 return GWEN_DialogEvent_ResultHandled;;
00308
00309 case GWEN_DialogEvent_TypeFini:
00310 GWEN_DlgInput_Fini(dlg);
00311 return GWEN_DialogEvent_ResultHandled;;
00312
00313 case GWEN_DialogEvent_TypeValueChanged:
00314 return GWEN_DlgInput_HandleValueChanged(dlg, sender);
00315 break;
00316
00317 case GWEN_DialogEvent_TypeActivated:
00318 return GWEN_DlgInput_HandleActivated(dlg, sender);
00319
00320 case GWEN_DialogEvent_TypeEnabled:
00321 case GWEN_DialogEvent_TypeDisabled:
00322
00323 case GWEN_DialogEvent_TypeClose:
00324 return GWEN_DialogEvent_ResultAccept;
00325
00326 case GWEN_DialogEvent_TypeLast:
00327 return GWEN_DialogEvent_ResultNotHandled;
00328 }
00329
00330 return GWEN_DialogEvent_ResultNotHandled;
00331
00332 }
00333
00334
00335
00336 int GWEN_DlgInput_CopyInput(GWEN_DIALOG *dlg, char *buffer, int size) {
00337 GWEN_DLGINPUT *xdlg;
00338
00339 assert(dlg);
00340 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GWEN_DLGINPUT, dlg);
00341 assert(xdlg);
00342
00343 if (xdlg->response) {
00344 int l;
00345
00346 l=strlen(xdlg->response);
00347 if ((l+1)>size) {
00348 DBG_ERROR(GWEN_LOGDOMAIN, "Buffer too small");
00349 return GWEN_ERROR_BUFFER_OVERFLOW;
00350 }
00351
00352 memmove(buffer, xdlg->response, l+1);
00353 return 0;
00354 }
00355 return GWEN_ERROR_NO_DATA;
00356 }
00357
00358
00359
00360