gwenhywfar 4.0.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 rv=GTK2_Gui_OpenDialog(gui, dlg, guiid); 00075 if (rv<0) { 00076 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00077 return rv; 00078 } 00079 00080 rv=GTK2_Gui_RunDialog(gui, dlg, 1); 00081 GTK2_Gui_CloseDialog(gui, dlg); 00082 if (rv<0) { 00083 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00084 return rv; 00085 } 00086 00087 return rv; 00088 } 00089 00090 00091 00092 GWENHYWFAR_CB int GTK2_Gui_OpenDialog(GWEN_GUI *gui, 00093 GWEN_DIALOG *dlg, 00094 uint32_t guiid) { 00095 int rv; 00096 GtkWidget *g; 00097 00098 Gtk2Gui_Dialog_Extend(dlg); 00099 rv=Gtk2Gui_Dialog_Setup(dlg, NULL); 00100 if (rv<0) { 00101 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00102 Gtk2Gui_Dialog_Unextend(dlg); 00103 return rv; 00104 } 00105 00106 g=Gtk2Gui_Dialog_GetMainWidget(dlg); 00107 if (g==NULL) { 00108 DBG_ERROR(GWEN_LOGDOMAIN, "No main widget"); 00109 Gtk2Gui_Dialog_Unextend(dlg); 00110 return GWEN_ERROR_INVALID; 00111 } 00112 00113 rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeInit, ""); 00114 if (rv<0) { 00115 DBG_INFO(GWEN_LOGDOMAIN, "Error initializing dialog: %d", rv); 00116 Gtk2Gui_Dialog_Unextend(dlg); 00117 return rv; 00118 } 00119 00120 /* show dialog */ 00121 gtk_widget_show_all(g); 00122 00123 return 0; 00124 } 00125 00126 00127 00128 GWENHYWFAR_CB int GTK2_Gui_CloseDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg) { 00129 GtkWidget *g; 00130 int rv; 00131 00132 g=Gtk2Gui_Dialog_GetMainWidget(dlg); 00133 if (g==NULL) { 00134 DBG_ERROR(GWEN_LOGDOMAIN, "No main widget"); 00135 Gtk2Gui_Dialog_Unextend(dlg); 00136 return GWEN_ERROR_INVALID; 00137 } 00138 00139 /* hide dialog */ 00140 gtk_widget_hide_all(g); 00141 00142 /* send fini signal to dialog */ 00143 rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeFini, ""); 00144 if (rv<0) { 00145 DBG_INFO(GWEN_LOGDOMAIN, "Error deinitializing dialog: %d", rv); 00146 Gtk2Gui_Dialog_Unextend(dlg); 00147 return rv; 00148 } 00149 00150 Gtk2Gui_Dialog_Unextend(dlg); 00151 return 0; 00152 } 00153 00154 00155 00156 GWENHYWFAR_CB int GTK2_Gui_RunDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg, int untilEnd) { 00157 int rv; 00158 00159 rv=GTK2_Gui_Dialog_Run(dlg, untilEnd); 00160 if (rv<0) { 00161 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 00162 return rv; 00163 } 00164 return rv; 00165 } 00166 00167 00168 00169 GWENHYWFAR_CB int GTK2_Gui_GetFileName(GWEN_GUI *gui, 00170 const char *caption, 00171 GWEN_GUI_FILENAME_TYPE fnt, 00172 uint32_t flags, 00173 const char *patterns, 00174 GWEN_BUFFER *pathBuffer, 00175 uint32_t guiid) { 00176 char *folder=NULL; 00177 char *fileName=NULL; 00178 00179 if (GWEN_Buffer_GetUsedBytes(pathBuffer)) { 00180 folder=strdup(GWEN_Buffer_GetStart(pathBuffer)); 00181 fileName=strchr(folder, GWEN_DIR_SEPARATOR); 00182 if (fileName) { 00183 *fileName=0; 00184 fileName++; 00185 if (*fileName==0) 00186 fileName=NULL; 00187 } 00188 } 00189 00190 switch(fnt) { 00191 case GWEN_Gui_FileNameType_OpenFileName: { 00192 GtkWidget *dialog; 00193 00194 if (!(caption && *caption)) 00195 caption=I18N("Open File"); 00196 dialog=gtk_file_chooser_dialog_new (caption, 00197 NULL, 00198 GTK_FILE_CHOOSER_ACTION_OPEN, 00199 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 00200 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 00201 NULL); 00202 if (folder && *folder) 00203 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), folder); 00204 if (fileName && *fileName) 00205 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName); 00206 00207 if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { 00208 char *filename; 00209 00210 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); 00211 GWEN_Buffer_Reset(pathBuffer); 00212 GWEN_Buffer_AppendString(pathBuffer, filename); 00213 g_free (filename); 00214 gtk_widget_destroy (dialog); 00215 free(folder); 00216 return 0; 00217 } 00218 gtk_widget_destroy (dialog); 00219 free(folder); 00220 return GWEN_ERROR_USER_ABORTED; 00221 } 00222 00223 case GWEN_Gui_FileNameType_SaveFileName: { 00224 GtkWidget *dialog; 00225 00226 if (!(caption && *caption)) 00227 caption=I18N("Save File"); 00228 dialog=gtk_file_chooser_dialog_new (caption, 00229 NULL, 00230 GTK_FILE_CHOOSER_ACTION_SAVE, 00231 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 00232 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 00233 NULL); 00234 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); 00235 if (folder && *folder) 00236 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), folder); 00237 if (fileName && *fileName) 00238 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName); 00239 00240 if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { 00241 char *filename; 00242 00243 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); 00244 GWEN_Buffer_Reset(pathBuffer); 00245 GWEN_Buffer_AppendString(pathBuffer, filename); 00246 g_free(filename); 00247 gtk_widget_destroy(dialog); 00248 free(folder); 00249 return 0; 00250 } 00251 gtk_widget_destroy (dialog); 00252 free(folder); 00253 return GWEN_ERROR_USER_ABORTED; 00254 } 00255 00256 case GWEN_Gui_FileNameType_OpenDirectory: { 00257 GtkWidget *dialog; 00258 00259 if (!(caption && *caption)) 00260 caption=I18N("Select Folder"); 00261 dialog=gtk_file_chooser_dialog_new (caption, 00262 NULL, 00263 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, 00264 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 00265 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 00266 NULL); 00267 if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { 00268 char *filename; 00269 00270 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); 00271 GWEN_Buffer_Reset(pathBuffer); 00272 GWEN_Buffer_AppendString(pathBuffer, filename); 00273 g_free (filename); 00274 gtk_widget_destroy (dialog); 00275 free(folder); 00276 return 0; 00277 } 00278 gtk_widget_destroy (dialog); 00279 free(folder); 00280 return GWEN_ERROR_USER_ABORTED; 00281 } 00282 00283 default: 00284 break; 00285 } 00286 free(folder); 00287 00288 return GWEN_ERROR_USER_ABORTED; 00289 } 00290 00291 00292 00293 00294