00001
00002
00003
00004
00005
00006
00007
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
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
00143 gtk_widget_hide_all(g);
00144
00145
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