X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fmessage-dialog.c;h=708d397e066cd8332dd72cb00ef86c489fd1d5fb;hb=3b064b5cce148b1c7d5386553a87cda37913429f;hp=624b4147de81160e6a2560190828ea72725ff482;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp-builds.git diff --git a/src/ui/gui/message-dialog.c b/src/ui/gui/message-dialog.c index 624b4147..708d397e 100644 --- a/src/ui/gui/message-dialog.c +++ b/src/ui/gui/message-dialog.c @@ -1,11 +1,9 @@ -/* - PSPPIRE --- A Graphical User Interface for PSPP - Copyright (C) 2004,2005 Free Software Foundation - Written by John Darrington +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2004, 2005 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -14,154 +12,178 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ + along with this program. If not, see . */ #include #include #include -#include "message.h" +#include +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +#include +#include #include "message-dialog.h" +#include "progname.h" #include #include +#include #include "helper.h" -extern GladeXML *xml; +static void enqueue_msg (const struct msg *m); + + +static GQueue *message_queue; + -#define _(A) A +void +message_dialog_init (struct source_stream *ss) +{ + message_queue = g_queue_new (); + msg_init (ss, enqueue_msg); +} +void +message_dialog_done (void) +{ + msg_done (); + g_queue_free (message_queue); +} -void -vmsg(int klass, const char *fmt, va_list args) +static gboolean +dequeue_message (gpointer data) { - gchar *msg = 0; - gchar *text = g_strdup_vprintf (fmt, args); + struct msg * m ; + + /* If a pointer grab is in effect, then the combination of that, and + a modal dialog box, will cause an impossible situation. + So don't pop it up just yet. + */ + if ( gdk_pointer_is_grabbed ()) + return TRUE; + + m = g_queue_pop_tail (message_queue); + + if ( m ) + { + popup_message (m); + msg_destroy (m); + return TRUE; + } + + return FALSE; +} + +static void +enqueue_msg (const struct msg *msg) +{ + struct msg *m = msg_dup (msg); + + g_queue_push_head (message_queue, m); + + g_idle_add (dequeue_message, 0); +} + + +void +popup_message (const struct msg *m) +{ + GtkWidget *dialog; + gchar *location = NULL; gint message_type; + const char *msg; - switch (klass) + switch (m->severity) { - case SE: - case IE: - case DE: - case ME: + case MSG_ERROR: message_type = GTK_MESSAGE_ERROR; + switch (m->category) + { + case MSG_SYNTAX: + msg = _("Syntax Error"); + break; + + case MSG_DATA: + msg = _("Data File Error"); + break; + + case MSG_GENERAL: + default: + msg = _("PSPP Error"); + break; + }; break; - case SW: - case DW: - case MW: + case MSG_WARNING: message_type = GTK_MESSAGE_WARNING; + switch (m->category) + { + case MSG_SYNTAX: + msg = _("Syntax Warning"); break; - case SM: - case IS: - case MM: + + case MSG_DATA: + msg = _("Data File Warning"); + break; + + case MSG_GENERAL: default: - message_type = GTK_MESSAGE_INFO; + msg = _("PSPP Warning"); break; }; - - switch (klass) - { - case SE: - case SW: - case SM: - msg = g_strdup(_("Script Error")); break; - - case IE: - case IS: - msg = g_strdup(_("Installation Error")); + case MSG_NOTE: + default: + message_type = GTK_MESSAGE_INFO; + switch (m->category) + { + case MSG_SYNTAX: + msg = _("Syntax Information"); break; - case DE: - case DW: - msg = g_strdup(_("Data File Error")); + case MSG_DATA: + msg = _("Data File Information"); break; - case ME: - case MW: - case MM: + case MSG_GENERAL: default: - msg = g_strdup(_("PSPP Error")); + msg = _("PSPP Information"); + break; + }; break; }; - - GtkWindow *parent = GTK_WINDOW(get_widget_assert(xml, "data_editor")); - GtkWidget *dialog = gtk_message_dialog_new(parent, - GTK_DIALOG_MODAL, - message_type, - GTK_BUTTONS_CLOSE, - msg); + dialog = gtk_message_dialog_new ( NULL, + GTK_DIALOG_MODAL, + message_type, + GTK_BUTTONS_CLOSE, + msg); + if ( m->where.line_number != -1) + { + location = g_strdup_printf (_("%s (line %d)"), + m->where.file_name ? m->where.file_name : "", + m->where.line_number); + } + else + { + location = g_strdup_printf (_("%s"), + m->where.file_name ? m->where.file_name : ""); } - - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), text); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("%s %s"), + location, + m->text); + g_free (location); - g_free(text); - g_free(msg); - - gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); + gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE); - gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); - -} - - -void -msg(int klass, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - vmsg(klass, fmt, ap); - va_end(ap); -} - - -void -err_vmsg (const struct error *e, const char *format, va_list args) -{ - vmsg(e->class, format, args); -} - - -void -err_assert_fail(const char *expr, const char *file, int line) -{ - msg(ME, "Assertion failed: %s:%d; (%s)\n",file,line,expr); -} - -/* The GUI is always interactive. - So this function does nothing */ -void -err_cond_fail(void) -{ -} - - -void -err_failure(void) -{ - msg(ME, _("Terminating NOW due to fatal error")); - gtk_main_quit(); -} - - -/* FIXME: This is a stub . - * A temporary workaround until getl.c is rearranged - */ -void -err_location (struct file_locator *f) -{ - f->filename = 0; - f->line_number = -1; }