diff options
-rw-r--r-- | widgets/misc/e-messagebox.c | 368 | ||||
-rw-r--r-- | widgets/misc/e-messagebox.h | 83 |
2 files changed, 451 insertions, 0 deletions
diff --git a/widgets/misc/e-messagebox.c b/widgets/misc/e-messagebox.c new file mode 100644 index 0000000000..9a52599253 --- /dev/null +++ b/widgets/misc/e-messagebox.c @@ -0,0 +1,368 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Original Author: Jay Painter + * Modified: Jeffrey Stedfast + * + * 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 + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + + +#include <config.h> +#include <stdarg.h> +#include <string.h> /* for strcmp */ + +#include "e-messagebox.h" + +#define E_MESSAGE_BOX_WIDTH 425 +#define E_MESSAGE_BOX_HEIGHT 125 + +struct _EMessageBoxPrivate { + char *id; + GtkWidget *label; + GtkWidget *checkbox; +}; + +static void e_message_box_class_init (EMessageBoxClass *klass); +static void e_message_box_init (EMessageBox *messagebox); +static void e_message_box_destroy (GtkObject *object); +static void e_message_box_finalize (GtkObject *object); + +static GnomeDialogClass *parent_class; + +GtkType +e_message_box_get_type (void) +{ + static GtkType message_box_type = 0; + + if (!message_box_type) { + GtkTypeInfo message_box_info = { + "EMessageBox", + sizeof (EMessageBox), + sizeof (EMessageBoxClass), + (GtkClassInitFunc) e_message_box_class_init, + (GtkObjectInitFunc) e_message_box_init, + NULL, + NULL + }; + + message_box_type = gtk_type_unique (gnome_dialog_get_type (), &message_box_info); + } + + return message_box_type; +} + +static void +e_message_box_class_init (EMessageBoxClass *klass) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass *)klass; + parent_class = gtk_type_class (gnome_dialog_get_type ()); + + object_class->destroy = e_message_box_destroy; + object_class->finalize = e_message_box_finalize; +} + +static void +e_message_box_init (EMessageBox *message_box) +{ + message_box->_priv = g_new0 (EMessageBoxPrivate, 1); +} + +static void +e_message_box_destroy (GtkObject *object) +{ + /* remember, destroy can be run multiple times! */ + if (GTK_OBJECT_CLASS (parent_class)->destroy) + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); +} + +static void +e_message_box_finalize (GtkObject *object) +{ + EMessageBox *mbox = E_MESSAGE_BOX (object); + + g_free (mbox->_priv->id); + + g_free (mbox->_priv); + mbox->_priv = NULL; + + if (GTK_OBJECT_CLASS (parent_class)->finalize) + (* GTK_OBJECT_CLASS (parent_class)->finalize) (object); +} + +/** + * e_message_box_construct: + * @messagebox: The message box to construct + * @message: The message to be displayed. + * @message_box_type: The type of the message + * @buttons: a NULL terminated array with the buttons to insert. + * + * For language bindings or subclassing, from C use #e_message_box_new or + * #e_message_box_newv + * + * Returns: + */ +void +e_message_box_construct (EMessageBox *messagebox, + const gchar *message, + const gchar *message_box_type, + const gchar **buttons) +{ + GtkWidget *hbox; + GtkWidget *pixmap = NULL; + GtkWidget *alignment; + char *s; + GtkStyle *style; + const gchar* title = NULL; + gint i = 0; + + g_return_if_fail (messagebox != NULL); + g_return_if_fail (E_IS_MESSAGE_BOX (messagebox)); + g_return_if_fail (message != NULL); + g_return_if_fail (message_box_type != NULL); + + style = gtk_widget_get_style (GTK_WIDGET (messagebox)); + + /* Make noises, basically */ + gnome_triggers_vdo (message, message_box_type, NULL); + + if (strcmp (E_MESSAGE_BOX_INFO, message_box_type) == 0) { + title = _("Information"); + s = gnome_unconditional_pixmap_file("gnome-info.png"); + if (s) { + pixmap = gnome_pixmap_new_from_file (s); + g_free(s); + } + } else if (strcmp (E_MESSAGE_BOX_WARNING, message_box_type) == 0) { + title = _("Warning"); + s = gnome_unconditional_pixmap_file ("gnome-warning.png"); + if (s) { + pixmap = gnome_pixmap_new_from_file (s); + g_free (s); + } + } else if (strcmp (E_MESSAGE_BOX_ERROR, message_box_type) == 0) { + title = _("Error"); + s = gnome_unconditional_pixmap_file ("gnome-error"); + if (s) { + pixmap = gnome_pixmap_new_from_file (s); + g_free(s); + } + } else if (strcmp (E_MESSAGE_BOX_QUESTION, message_box_type) == 0) { + title = _("Question"); + s = gnome_unconditional_pixmap_file ("gnome-question.png"); + if (s) { + pixmap = gnome_pixmap_new_from_file (s); + g_free (s); + } + } else { + title = _("Message"); + } + + g_assert (title != NULL); + + gtk_window_set_title (GTK_WINDOW (messagebox), title); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (messagebox)->vbox), + hbox, TRUE, TRUE, 10); + gtk_widget_show (hbox); + + if ((pixmap == NULL) || (GNOME_PIXMAP (pixmap)->pixmap == NULL)) { + if (pixmap) + gtk_widget_destroy (pixmap); + s = gnome_unconditional_pixmap_file ("gnome-default.png"); + if (s) { + pixmap = gnome_pixmap_new_from_file (s); + g_free (s); + } else + pixmap = NULL; + } + if (pixmap) { + gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, TRUE, 0); + gtk_widget_show (pixmap); + } + + messagebox->_priv->label = gtk_label_new (message); + gtk_label_set_justify (GTK_LABEL (messagebox->_priv->label), GTK_JUSTIFY_LEFT); + gtk_label_set_line_wrap (GTK_LABEL (messagebox->_priv->label), TRUE); + gtk_misc_set_padding (GTK_MISC (messagebox->_priv->label), GNOME_PAD, 0); + gtk_box_pack_start (GTK_BOX (hbox), messagebox->_priv->label, TRUE, TRUE, 0); + gtk_widget_show (messagebox->_priv->label); + + /* Add some extra space on the right to balance the pixmap */ + if (pixmap) { + alignment = gtk_alignment_new (0., 0., 0., 0.); + gtk_widget_set_usize (alignment, GNOME_PAD, -1); + gtk_widget_show (alignment); + + gtk_box_pack_start (GTK_BOX (hbox), alignment, FALSE, FALSE, 0); + } + + /* Add the "Don't show this message again." checkbox */ + messagebox->_priv->checkbox = gtk_check_button_new_with_label (_("Don't show this message again.")); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (messagebox)->vbox), + messagebox->_priv->checkbox, TRUE, TRUE, 10); + gtk_widget_show (messagebox->_priv->checkbox); + + if (buttons) { + while (buttons[i]) { + gnome_dialog_append_button (GNOME_DIALOG (messagebox), + buttons[i]); + i++; + }; + } + + if (GNOME_DIALOG (messagebox)->buttons) + gtk_widget_grab_focus (g_list_last (GNOME_DIALOG (messagebox)->buttons)->data); + + gnome_dialog_set_close (GNOME_DIALOG (messagebox), TRUE); +} + +/** + * e_message_box_new: + * @message: The message to be displayed. + * @message_box_type: The type of the message + * @...: A NULL terminated list of strings to use in each button. + * + * Creates a dialog box of type @message_box_type with @message. A number + * of buttons are inserted on it. You can use the GNOME stock identifiers + * to create gnome-stock-buttons. + * + * Returns a widget that has the dialog box. + */ +GtkWidget* +e_message_box_new (const gchar *message, + const gchar *message_box_type, ...) +{ + va_list ap; + EMessageBox *message_box; + + g_return_val_if_fail (message != NULL, NULL); + g_return_val_if_fail (message_box_type != NULL, NULL); + + va_start (ap, message_box_type); + + message_box = gtk_type_new (e_message_box_get_type ()); + + e_message_box_construct (message_box, message, message_box_type, NULL); + + /* we need to add buttons by hand here */ + while (TRUE) { + gchar * button_name; + + button_name = va_arg (ap, gchar *); + + if (button_name == NULL) { + break; + } + + gnome_dialog_append_button (GNOME_DIALOG (message_box), button_name); + } + + va_end (ap); + + gtk_widget_grab_focus (g_list_last (GNOME_DIALOG (message_box)->buttons)->data); + + return GTK_WIDGET (message_box); +} + +/** + * e_message_box_newv: + * @message: The message to be displayed. + * @message_box_type: The type of the message + * @buttons: a NULL terminated array with the buttons to insert. + * + * Creates a dialog box of type @message_box_type with @message. A number + * of buttons are inserted on it, the messages come from the @buttons array. + * You can use the GNOME stock identifiers to create gnome-stock-buttons. + * The buttons array can be NULL if you wish to add buttons yourself later. + * + * Returns a widget that has the dialog box. + */ +GtkWidget* +e_message_box_newv (const gchar *message, + const gchar *message_box_type, + const gchar **buttons) +{ + EMessageBox *message_box; + + g_return_val_if_fail (message != NULL, NULL); + g_return_val_if_fail (message_box_type != NULL, NULL); + + message_box = gtk_type_new (e_message_box_get_type ()); + + e_message_box_construct (message_box, message, + message_box_type, buttons); + + return GTK_WIDGET (message_box); +} + + +/** + * e_message_box_get_label: + * @messagebox: The message box to work on + * + * Gets the label widget of the message box. You should use this + * function instead of using the structure directly. + * + * Returns: the widget of the label with the message */ +GtkWidget * +e_message_box_get_label (EMessageBox *messagebox) +{ + g_return_val_if_fail (messagebox != NULL, NULL); + g_return_val_if_fail (E_IS_MESSAGE_BOX (messagebox), NULL); + + return messagebox->_priv->label; +} + + +/** + * e_message_box_get_checkbox: + * @messagebox: The message box to work on + * + * Gets the checkbox widget of the message box. You should use this + * function instead of using the structure directly. + * + * Returns: the checkbox widget */ +GtkWidget * +e_message_box_get_checkbox (EMessageBox *messagebox) +{ + g_return_val_if_fail (messagebox != NULL, NULL); + g_return_val_if_fail (E_IS_MESSAGE_BOX (messagebox), NULL); + + return messagebox->_priv->checkbox; +} + + +/** + * e_message_box_get_id: + * @messagebox: The message box to work on + * + * Gets the id of the message box. You should use this + * function instead of using the structure directly. + * + * Returns: the id */ +const char * +e_message_box_get_checkbox (EMessageBox *messagebox) +{ + g_return_val_if_fail (messagebox != NULL, NULL); + g_return_val_if_fail (E_IS_MESSAGE_BOX (messagebox), NULL); + + return messagebox->_priv->id; +} + + diff --git a/widgets/misc/e-messagebox.h b/widgets/misc/e-messagebox.h new file mode 100644 index 0000000000..0514aeb43f --- /dev/null +++ b/widgets/misc/e-messagebox.h @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Original Author: Jay Painter + * Modified: Jeffrey Stedfast + * + * 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 + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + + +#ifndef __E_MESSAGE_BOX_H__ +#define __E_MESSAGE_BOX_H__ + +#include <gnome.h> + +BEGIN_GNOME_DECLS + +#define E_TYPE_MESSAGE_BOX (e_message_box_get_type ()) +#define E_MESSAGE_BOX(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MESSAGE_BOX, EMessageBox)) +#define E_MESSAGE_BOX_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MESSAGE_BOX, EMessageBoxClass)) +#define E_IS_MESSAGE_BOX(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MESSAGE_BOX)) +#define E_IS_MESSAGE_BOX_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_MESSAGE_BOX)) +#define E_MESSAGE_BOX_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), E_TYPE_MESSAGE_BOX, EMessageBoxClass)) + + +#define E_MESSAGE_BOX_INFO "info" +#define E_MESSAGE_BOX_WARNING "warning" +#define E_MESSAGE_BOX_ERROR "error" +#define E_MESSAGE_BOX_QUESTION "question" +#define E_MESSAGE_BOX_GENERIC "generic" + + +typedef struct _EMessageBox EMessageBox; +typedef struct _EMessageBoxPrivate EMessageBoxPrivate; +typedef struct _EMessageBoxClass EMessageBoxClass; +typedef struct _EMessageBoxButton EMessageBoxButton; + +struct _EMessageBox +{ + GnomeDialog dialog; + /*< private >*/ + EMessageBoxPrivate *_priv; +}; + +struct _EMessageBoxClass +{ + GnomeDialogClass parent_class; +}; + + +guint e_message_box_get_type (void) G_GNUC_CONST; +GtkWidget* e_message_box_new (const gchar *message, + const gchar *messagebox_type, + ...); + +GtkWidget* e_message_box_newv (const gchar *message, + const gchar *messagebox_type, + const gchar **buttons); + +void e_message_box_construct (EMessageBox *messagebox, + const gchar *message, + const gchar *messagebox_type, + const gchar **buttons); + +GtkWidget *e_message_box_get_label (EMessageBox *messagebox); + +GtkWidget *e_message_box_get_checkbox (EMessageBox *messagebox); + +END_GNOME_DECLS + +#endif /* __E_MESSAGE_BOX_H__ */ |