aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc/e-messagebox.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc/e-messagebox.c')
-rw-r--r--widgets/misc/e-messagebox.c368
1 files changed, 368 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;
+}
+
+