gwenhywfar  4.3.1
gtk2_gui.c
Go to the documentation of this file.
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