gwenhywfar
4.3.3
|
00001 /*************************************************************************** 00002 begin : Sun May 16 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 00015 #include "gtk2_gui_p.h" 00016 #include "gtk2_gui_dialog_l.h" 00017 00018 #include <assert.h> 00019 00020 #include <gwenhywfar/inherit.h> 00021 #include <gwenhywfar/debug.h> 00022 #include <gwenhywfar/gui_be.h> 00023 #include <gwenhywfar/i18n.h> 00024 00025 #include <gwenhywfar/text.h> 00026 #include <gwenhywfar/mdigest.h> 00027 #include <gwenhywfar/debug.h> 00028 00029 00030 #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) 00031 00032 00033 00034 GWEN_INHERIT(GWEN_GUI, GTK2_GUI) 00035 00036 00037 00038 GWEN_GUI *Gtk2_Gui_new() { 00039 GWEN_GUI *gui; 00040 GTK2_GUI *xgui; 00041 00042 gui=GWEN_Gui_new(); 00043 GWEN_NEW_OBJECT(GTK2_GUI, xgui); 00044 GWEN_INHERIT_SETDATA(GWEN_GUI, GTK2_GUI, gui, xgui, Gtk2_Gui_FreeData); 00045 00046 GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_DIALOGSUPPORTED); 00047 GWEN_Gui_UseDialogs(gui); 00048 xgui->execDialogFn=GWEN_Gui_SetExecDialogFn(gui, GTK2_Gui_ExecDialog); 00049 xgui->openDialogFn=GWEN_Gui_SetOpenDialogFn(gui, GTK2_Gui_OpenDialog); 00050 xgui->closeDialogFn=GWEN_Gui_SetCloseDialogFn(gui, GTK2_Gui_CloseDialog); 00051 xgui->runDialogFn=GWEN_Gui_SetRunDialogFn(gui, GTK2_Gui_RunDialog); 00052 xgui->getFileNameDialogFn=GWEN_Gui_SetGetFileNameFn(gui, GTK2_Gui_GetFileName); 00053 00054 return gui; 00055 } 00056 00057 00058 00059 GWENHYWFAR_CB void Gtk2_Gui_FreeData(void *bp, void *p) { 00060 GTK2_GUI *xgui; 00061 00062 xgui=(GTK2_GUI*) p; 00063 00064 GWEN_FREE_OBJECT(xgui); 00065 } 00066 00067 00068 00069 GWENHYWFAR_CB int GTK2_Gui_ExecDialog(GWEN_GUI *gui, 00070 GWEN_DIALOG *dlg, 00071 uint32_t guiid) { 00072 int rv; 00073 00074 assert(dlg); 00075 rv=GTK2_Gui_OpenDialog(gui, dlg, guiid); 00076 if (rv<0) { 00077 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00078 return rv; 00079 } 00080 00081 rv=GTK2_Gui_RunDialog(gui, dlg, 1); 00082 GTK2_Gui_CloseDialog(gui, dlg); 00083 if (rv<0) { 00084 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00085 return rv; 00086 } 00087 00088 return rv; 00089 } 00090 00091 00092 00093 GWENHYWFAR_CB int GTK2_Gui_OpenDialog(GWEN_GUI *gui, 00094 GWEN_DIALOG *dlg, 00095 uint32_t guiid) { 00096 int rv; 00097 GtkWidget *g; 00098 00099 assert(dlg); 00100 Gtk2Gui_Dialog_Extend(dlg); 00101 rv=Gtk2Gui_Dialog_Setup(dlg, NULL); 00102 if (rv<0) { 00103 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00104 Gtk2Gui_Dialog_Unextend(dlg); 00105 return rv; 00106 } 00107 00108 g=Gtk2Gui_Dialog_GetMainWidget(dlg); 00109 if (g==NULL) { 00110 DBG_ERROR(GWEN_LOGDOMAIN, "No main widget"); 00111 Gtk2Gui_Dialog_Unextend(dlg); 00112 return GWEN_ERROR_INVALID; 00113 } 00114 00115 rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeInit, ""); 00116 if (rv<0) { 00117 DBG_INFO(GWEN_LOGDOMAIN, "Error initializing dialog: %d", rv); 00118 Gtk2Gui_Dialog_Unextend(dlg); 00119 return rv; 00120 } 00121 00122 /* show dialog */ 00123 gtk_widget_show_all(g); 00124 00125 return 0; 00126 } 00127 00128 00129 00130 GWENHYWFAR_CB int GTK2_Gui_CloseDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg) { 00131 GtkWidget *g; 00132 int rv; 00133 00134 assert(dlg); 00135 g=Gtk2Gui_Dialog_GetMainWidget(dlg); 00136 if (g==NULL) { 00137 DBG_ERROR(GWEN_LOGDOMAIN, "No main widget"); 00138 Gtk2Gui_Dialog_Unextend(dlg); 00139 return GWEN_ERROR_INVALID; 00140 } 00141 00142 /* hide dialog */ 00143 gtk_widget_hide_all(g); 00144 00145 /* send fini signal to dialog */ 00146 rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeFini, ""); 00147 if (rv<0) { 00148 DBG_INFO(GWEN_LOGDOMAIN, "Error deinitializing dialog: %d", rv); 00149 Gtk2Gui_Dialog_Unextend(dlg); 00150 return rv; 00151 } 00152 00153 Gtk2Gui_Dialog_Unextend(dlg); 00154 return 0; 00155 } 00156 00157 00158 00159 GWENHYWFAR_CB int GTK2_Gui_RunDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg, int untilEnd) { 00160 int rv; 00161 00162 assert(dlg); 00163 rv=GTK2_Gui_Dialog_Run(dlg, untilEnd); 00164 if (rv<0) { 00165 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00166 return rv; 00167 } 00168 return rv; 00169 } 00170 00171 00172 00173 GWENHYWFAR_CB int GTK2_Gui_GetFileName(GWEN_GUI *gui, 00174 const char *caption, 00175 GWEN_GUI_FILENAME_TYPE fnt, 00176 uint32_t flags, 00177 const char *patterns, 00178 GWEN_BUFFER *pathBuffer, 00179 uint32_t guiid) { 00180 char *folder=NULL; 00181 char *fileName=NULL; 00182 00183 if (GWEN_Buffer_GetUsedBytes(pathBuffer)) { 00184 folder=strdup(GWEN_Buffer_GetStart(pathBuffer)); 00185 fileName=strchr(folder, GWEN_DIR_SEPARATOR); 00186 if (fileName) { 00187 *fileName=0; 00188 fileName++; 00189 if (*fileName==0) 00190 fileName=NULL; 00191 } 00192 } 00193 00194 switch(fnt) { 00195 case GWEN_Gui_FileNameType_OpenFileName: { 00196 GtkWidget *dialog; 00197 00198 if (!(caption && *caption)) 00199 caption=I18N("Open File"); 00200 dialog=gtk_file_chooser_dialog_new (caption, 00201 NULL, 00202 GTK_FILE_CHOOSER_ACTION_OPEN, 00203 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 00204 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 00205 NULL); 00206 if (folder && *folder) 00207 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), folder); 00208 if (fileName && *fileName) 00209 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName); 00210 00211 if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { 00212 char *filename; 00213 00214 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); 00215 GWEN_Buffer_Reset(pathBuffer); 00216 GWEN_Buffer_AppendString(pathBuffer, filename); 00217 g_free (filename); 00218 gtk_widget_destroy (dialog); 00219 free(folder); 00220 return 0; 00221 } 00222 gtk_widget_destroy (dialog); 00223 free(folder); 00224 return GWEN_ERROR_USER_ABORTED; 00225 } 00226 00227 case GWEN_Gui_FileNameType_SaveFileName: { 00228 GtkWidget *dialog; 00229 00230 if (!(caption && *caption)) 00231 caption=I18N("Save File"); 00232 dialog=gtk_file_chooser_dialog_new (caption, 00233 NULL, 00234 GTK_FILE_CHOOSER_ACTION_SAVE, 00235 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 00236 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 00237 NULL); 00238 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); 00239 if (folder && *folder) 00240 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), folder); 00241 if (fileName && *fileName) 00242 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName); 00243 00244 if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { 00245 char *filename; 00246 00247 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); 00248 GWEN_Buffer_Reset(pathBuffer); 00249 GWEN_Buffer_AppendString(pathBuffer, filename); 00250 g_free(filename); 00251 gtk_widget_destroy(dialog); 00252 free(folder); 00253 return 0; 00254 } 00255 gtk_widget_destroy (dialog); 00256 free(folder); 00257 return GWEN_ERROR_USER_ABORTED; 00258 } 00259 00260 case GWEN_Gui_FileNameType_OpenDirectory: { 00261 GtkWidget *dialog; 00262 00263 if (!(caption && *caption)) 00264 caption=I18N("Select Folder"); 00265 dialog=gtk_file_chooser_dialog_new (caption, 00266 NULL, 00267 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, 00268 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 00269 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 00270 NULL); 00271 if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { 00272 char *filename; 00273 00274 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); 00275 GWEN_Buffer_Reset(pathBuffer); 00276 GWEN_Buffer_AppendString(pathBuffer, filename); 00277 g_free (filename); 00278 gtk_widget_destroy (dialog); 00279 free(folder); 00280 return 0; 00281 } 00282 gtk_widget_destroy (dialog); 00283 free(folder); 00284 return GWEN_ERROR_USER_ABORTED; 00285 } 00286 00287 default: 00288 break; 00289 } 00290 free(folder); 00291 00292 return GWEN_ERROR_USER_ABORTED; 00293 } 00294 00295 00296 00297 00298