1 /***************************************************************************
2     begin       : Sun May 16 2010
3     copyright   : (C) 2010 by Martin Preuss
4     email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  *          Please see toplevel file COPYING for license details           *
8  ***************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 
15 #include "gtk3_gui_p.h"
16 #include "gtk3_gui_dialog_l.h"
17 
18 #include <assert.h>
19 
20 #include <gwenhywfar/inherit.h>
21 #include <gwenhywfar/debug.h>
22 #include <gwenhywfar/gui_be.h>
23 #include <gwenhywfar/i18n.h>
24 
25 #include <gwenhywfar/text.h>
26 #include <gwenhywfar/mdigest.h>
27 #include <gwenhywfar/debug.h>
28 
29 
30 #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg)
31 
32 
33 
GWEN_INHERIT(GWEN_GUI,GTK3_GUI)34 GWEN_INHERIT(GWEN_GUI, GTK3_GUI)
35 
36 
37 
38 GWEN_GUI *Gtk3_Gui_new()
39 {
40   GWEN_GUI *gui;
41   GTK3_GUI *xgui;
42 
43   gui=GWEN_Gui_new();
44   GWEN_NEW_OBJECT(GTK3_GUI, xgui);
45   GWEN_INHERIT_SETDATA(GWEN_GUI, GTK3_GUI, gui, xgui, Gtk3_Gui_FreeData);
46 
47   GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_DIALOGSUPPORTED);
48   GWEN_Gui_UseDialogs(gui);
49   xgui->execDialogFn=GWEN_Gui_SetExecDialogFn(gui, GTK3_Gui_ExecDialog);
50   xgui->openDialogFn=GWEN_Gui_SetOpenDialogFn(gui, GTK3_Gui_OpenDialog);
51   xgui->closeDialogFn=GWEN_Gui_SetCloseDialogFn(gui, GTK3_Gui_CloseDialog);
52   xgui->runDialogFn=GWEN_Gui_SetRunDialogFn(gui, GTK3_Gui_RunDialog);
53   xgui->getFileNameDialogFn=GWEN_Gui_SetGetFileNameFn(gui, GTK3_Gui_GetFileName);
54 
55   return gui;
56 }
57 
58 
59 
Gtk3_Gui_FreeData(GWEN_UNUSED void * bp,void * p)60 GWENHYWFAR_CB void Gtk3_Gui_FreeData(GWEN_UNUSED void *bp, void *p)
61 {
62   GTK3_GUI *xgui;
63 
64   xgui=(GTK3_GUI *) p;
65 
66   GWEN_FREE_OBJECT(xgui);
67 }
68 
69 
70 
GTK3_Gui_ExecDialog(GWEN_GUI * gui,GWEN_DIALOG * dlg,uint32_t guiid)71 GWENHYWFAR_CB int GTK3_Gui_ExecDialog(GWEN_GUI *gui,
72                                       GWEN_DIALOG *dlg,
73                                       uint32_t guiid)
74 {
75   int rv;
76 
77   assert(dlg);
78   rv=GTK3_Gui_OpenDialog(gui, dlg, guiid);
79   if (rv<0) {
80     DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
81     return rv;
82   }
83 
84   rv=GTK3_Gui_RunDialog(gui, dlg, 1);
85   GTK3_Gui_CloseDialog(gui, dlg);
86   if (rv<0) {
87     DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
88     return rv;
89   }
90 
91   return rv;
92 }
93 
94 
95 
GTK3_Gui_OpenDialog(GWEN_UNUSED GWEN_GUI * gui,GWEN_DIALOG * dlg,GWEN_UNUSED uint32_t guiid)96 GWENHYWFAR_CB int GTK3_Gui_OpenDialog(GWEN_UNUSED GWEN_GUI *gui,
97                                       GWEN_DIALOG *dlg,
98                                       GWEN_UNUSED uint32_t guiid)
99 {
100   int rv;
101   GtkWidget *g;
102 
103   assert(dlg);
104   Gtk3Gui_Dialog_Extend(dlg);
105   rv=Gtk3Gui_Dialog_Setup(dlg, NULL);
106   if (rv<0) {
107     DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
108     Gtk3Gui_Dialog_Unextend(dlg);
109     return rv;
110   }
111 
112   g=Gtk3Gui_Dialog_GetMainWidget(dlg);
113   if (g==NULL) {
114     DBG_ERROR(GWEN_LOGDOMAIN, "No main widget");
115     Gtk3Gui_Dialog_Unextend(dlg);
116     return GWEN_ERROR_INVALID;
117   }
118 
119   rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeInit, "");
120   if (rv<0) {
121     DBG_INFO(GWEN_LOGDOMAIN, "Error initializing dialog: %d", rv);
122     Gtk3Gui_Dialog_Unextend(dlg);
123     return rv;
124   }
125 
126   /* show dialog */
127   gtk_widget_show_all(g);
128 
129   return 0;
130 }
131 
132 
133 
GTK3_Gui_CloseDialog(GWEN_UNUSED GWEN_GUI * gui,GWEN_DIALOG * dlg)134 GWENHYWFAR_CB int GTK3_Gui_CloseDialog(GWEN_UNUSED GWEN_GUI *gui, GWEN_DIALOG *dlg)
135 {
136   GtkWidget *g;
137   int rv;
138 
139   assert(dlg);
140   g=Gtk3Gui_Dialog_GetMainWidget(dlg);
141   if (g==NULL) {
142     DBG_ERROR(GWEN_LOGDOMAIN, "No main widget");
143     Gtk3Gui_Dialog_Unextend(dlg);
144     return GWEN_ERROR_INVALID;
145   }
146 
147   /* hide dialog */
148   gtk_widget_hide(g);
149 
150   /* send fini signal to dialog */
151   rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeFini, "");
152   if (rv<0) {
153     DBG_INFO(GWEN_LOGDOMAIN, "Error deinitializing dialog: %d", rv);
154     Gtk3Gui_Dialog_Unextend(dlg);
155     return rv;
156   }
157 
158   Gtk3Gui_Dialog_Unextend(dlg);
159   return 0;
160 }
161 
162 
163 
GTK3_Gui_RunDialog(GWEN_UNUSED GWEN_GUI * gui,GWEN_DIALOG * dlg,int untilEnd)164 GWENHYWFAR_CB int GTK3_Gui_RunDialog(GWEN_UNUSED GWEN_GUI *gui, GWEN_DIALOG *dlg, int untilEnd)
165 {
166   int rv;
167 
168   assert(dlg);
169   rv=GTK3_Gui_Dialog_Run(dlg, untilEnd);
170   if (rv<0) {
171     DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
172     return rv;
173   }
174   return rv;
175 }
176 
177 
178 
GTK3_Gui_GetFileName(GWEN_UNUSED GWEN_GUI * gui,const char * caption,GWEN_GUI_FILENAME_TYPE fnt,GWEN_UNUSED uint32_t flags,GWEN_UNUSED const char * patterns,GWEN_BUFFER * pathBuffer,GWEN_UNUSED uint32_t guiid)179 GWENHYWFAR_CB int GTK3_Gui_GetFileName(GWEN_UNUSED GWEN_GUI *gui,
180                                        const char *caption,
181                                        GWEN_GUI_FILENAME_TYPE fnt,
182                                        GWEN_UNUSED uint32_t flags,
183                                        GWEN_UNUSED const char *patterns,
184                                        GWEN_BUFFER *pathBuffer,
185                                        GWEN_UNUSED uint32_t guiid)
186 {
187   char *folder=NULL;
188   char *fileName=NULL;
189 
190   if (GWEN_Buffer_GetUsedBytes(pathBuffer)) {
191     folder=strdup(GWEN_Buffer_GetStart(pathBuffer));
192     fileName=strchr(folder, GWEN_DIR_SEPARATOR);
193     if (fileName) {
194       *fileName=0;
195       fileName++;
196       if (*fileName==0)
197         fileName=NULL;
198     }
199   }
200 
201   switch (fnt) {
202   case GWEN_Gui_FileNameType_OpenFileName: {
203     GtkWidget *dialog;
204 
205     if (!(caption && *caption))
206       caption=I18N("Open File");
207     dialog=gtk_file_chooser_dialog_new(caption,
208                                        NULL,
209                                        GTK_FILE_CHOOSER_ACTION_OPEN,
210                                        "_Cancel", GTK_RESPONSE_CANCEL,
211                                        "_Open", GTK_RESPONSE_ACCEPT,
212                                        NULL);
213     if (folder && *folder)
214       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), folder);
215     if (fileName && *fileName)
216       gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName);
217 
218     if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) {
219       char *filename;
220 
221       filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
222       GWEN_Buffer_Reset(pathBuffer);
223       GWEN_Buffer_AppendString(pathBuffer, filename);
224       g_free(filename);
225       gtk_widget_destroy(dialog);
226       free(folder);
227       return 0;
228     }
229     gtk_widget_destroy(dialog);
230     free(folder);
231     return GWEN_ERROR_USER_ABORTED;
232   }
233 
234   case GWEN_Gui_FileNameType_SaveFileName: {
235     GtkWidget *dialog;
236 
237     if (!(caption && *caption))
238       caption=I18N("Save File");
239     dialog=gtk_file_chooser_dialog_new(caption,
240                                        NULL,
241                                        GTK_FILE_CHOOSER_ACTION_SAVE,
242                                        "_Cancel", GTK_RESPONSE_CANCEL,
243                                        "_Open", GTK_RESPONSE_ACCEPT,
244                                        NULL);
245     gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
246     if (folder && *folder)
247       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), folder);
248     if (fileName && *fileName)
249       gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName);
250 
251     if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) {
252       char *filename;
253 
254       filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
255       GWEN_Buffer_Reset(pathBuffer);
256       GWEN_Buffer_AppendString(pathBuffer, filename);
257       g_free(filename);
258       gtk_widget_destroy(dialog);
259       free(folder);
260       return 0;
261     }
262     gtk_widget_destroy(dialog);
263     free(folder);
264     return GWEN_ERROR_USER_ABORTED;
265   }
266 
267   case GWEN_Gui_FileNameType_OpenDirectory: {
268     GtkWidget *dialog;
269 
270     if (!(caption && *caption))
271       caption=I18N("Select Folder");
272     dialog=gtk_file_chooser_dialog_new(caption,
273                                        NULL,
274                                        GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
275                                        "_Cancel", GTK_RESPONSE_CANCEL,
276                                        "_Open", GTK_RESPONSE_ACCEPT,
277                                        NULL);
278     if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) {
279       char *filename;
280 
281       filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
282       GWEN_Buffer_Reset(pathBuffer);
283       GWEN_Buffer_AppendString(pathBuffer, filename);
284       g_free(filename);
285       gtk_widget_destroy(dialog);
286       free(folder);
287       return 0;
288     }
289     gtk_widget_destroy(dialog);
290     free(folder);
291     return GWEN_ERROR_USER_ABORTED;
292   }
293 
294   default:
295     break;
296   }
297   free(folder);
298 
299   return GWEN_ERROR_USER_ABORTED;
300 }
301 
302 
303 
304 
305 
306