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