diff options
Diffstat (limited to 'iup/src/gtk/iupgtk_messagedlg.c')
-rwxr-xr-x | iup/src/gtk/iupgtk_messagedlg.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/iup/src/gtk/iupgtk_messagedlg.c b/iup/src/gtk/iupgtk_messagedlg.c new file mode 100755 index 0000000..a036af6 --- /dev/null +++ b/iup/src/gtk/iupgtk_messagedlg.c @@ -0,0 +1,128 @@ +/** \file + * \brief GTK IupMessageDlg pre-defined dialog + * + * See Copyright Notice in "iup.h" + */ + +#include <gtk/gtk.h> + +#include "iup.h" + +#include "iup_object.h" +#include "iup_attrib.h" +#include "iup_str.h" +#include "iup_dialog.h" + +#include "iupgtk_drv.h" + +/* Sometimes GTK decides to invert the buttons position because of the GNOME Guidelines. + To avoid that we define different Ids for the buttons. */ +#define IUP_RESPONSE_1 -100 +#define IUP_RESPONSE_2 -200 +#define IUP_RESPONSE_HELP -300 + +#ifndef GTK_MESSAGE_OTHER +#define GTK_MESSAGE_OTHER GTK_MESSAGE_INFO +#endif + +static int gtkMessageDlgPopup(Ihandle* ih, int x, int y) +{ + InativeHandle* parent = iupDialogGetNativeParent(ih); + GtkMessageType type = GTK_MESSAGE_OTHER; + GtkWidget* dialog; + char *icon, *buttons, *title; + int response, num_but = 2; + + iupAttribSetInt(ih, "_IUPDLG_X", x); /* used in iupDialogUpdatePosition */ + iupAttribSetInt(ih, "_IUPDLG_Y", y); + + icon = iupAttribGetStr(ih, "DIALOGTYPE"); + if (iupStrEqualNoCase(icon, "ERROR")) + type = GTK_MESSAGE_ERROR; + else if (iupStrEqualNoCase(icon, "WARNING")) + type = GTK_MESSAGE_WARNING; + else if (iupStrEqualNoCase(icon, "INFORMATION")) + type = GTK_MESSAGE_INFO; + else if (iupStrEqualNoCase(icon, "QUESTION")) + type = GTK_MESSAGE_QUESTION; + + dialog = gtk_message_dialog_new((GtkWindow*)parent, + 0, + type, + GTK_BUTTONS_NONE, + iupgtkStrConvertToUTF8(iupAttribGet(ih, "VALUE"))); + if (!dialog) + return IUP_ERROR; + + title = iupAttribGet(ih, "TITLE"); + if (title) + gtk_window_set_title(GTK_WINDOW(dialog), iupgtkStrConvertToUTF8(title)); + + buttons = iupAttribGetStr(ih, "BUTTONS"); + if (iupStrEqualNoCase(buttons, "OKCANCEL")) + { + gtk_dialog_add_button(GTK_DIALOG(dialog), + GTK_STOCK_OK, + IUP_RESPONSE_1); + gtk_dialog_add_button(GTK_DIALOG(dialog), + GTK_STOCK_CANCEL, + IUP_RESPONSE_2); + } + else if (iupStrEqualNoCase(buttons, "YESNO")) + { + gtk_dialog_add_button(GTK_DIALOG(dialog), + GTK_STOCK_YES, + IUP_RESPONSE_1); + gtk_dialog_add_button(GTK_DIALOG(dialog), + GTK_STOCK_NO, + IUP_RESPONSE_2); + } + else /* OK */ + { + gtk_dialog_add_button(GTK_DIALOG(dialog), + GTK_STOCK_OK, + IUP_RESPONSE_1); + num_but = 1; + } + + if (IupGetCallback(ih, "HELP_CB")) + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_HELP, IUP_RESPONSE_HELP); + + if (num_but == 2 && iupAttribGetInt(ih, "BUTTONDEFAULT") == 2) + gtk_dialog_set_default_response(GTK_DIALOG(dialog), IUP_RESPONSE_2); + else + gtk_dialog_set_default_response(GTK_DIALOG(dialog), IUP_RESPONSE_1); + + /* initialize the widget */ + gtk_widget_realize(dialog); + + ih->handle = dialog; + iupDialogUpdatePosition(ih); + ih->handle = NULL; + + do + { + response = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (response == IUP_RESPONSE_HELP) + { + Icallback cb = IupGetCallback(ih, "HELP_CB"); + if (cb && cb(ih) == IUP_CLOSE) + response = (num_but == 2)? IUP_RESPONSE_2: IUP_RESPONSE_1; + } + } while (response == IUP_RESPONSE_HELP); + + if (response == IUP_RESPONSE_1) + IupSetAttribute(ih, "BUTTONRESPONSE", "1"); + else + IupSetAttribute(ih, "BUTTONRESPONSE", "2"); + + gtk_widget_destroy(dialog); + + return IUP_NOERROR; +} + +void iupdrvMessageDlgInitClass(Iclass* ic) +{ + ic->DlgPopup = gtkMessageDlgPopup; +} |