gwenhywfar 4.0.3

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   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