aboutsummaryrefslogblamecommitdiffstats
path: root/widgets/misc/e-messagebox.c
blob: 6549476e1dcdd4a13753d42e609be516449bd493 (plain) (tree)

























                                                                           










                                    





                                































































                                                                                                 
























































































































































































































































                                                                                                            
/* -*- 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 <glib.h>
#include <gtk/gtkalignment.h>
#include <gtk/gtkcheckbutton.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtklabel.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>
#include <libgnome/gnome-triggers.h>
#include <libgnome/gnome-util.h>
#include <libgnomeui/gnome-pixmap.h>
#include <libgnomeui/gnome-uidefs.h>
#include "e-messagebox.h"

#define E_MESSAGE_BOX_WIDTH  425
#define E_MESSAGE_BOX_HEIGHT 125

struct _EMessageBoxPrivate {
    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);
    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;
}