]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmessagedialog.c
New static function to set the background of all windows.
[~andy/gtk] / gtk / gtkmessagedialog.c
index f37c96e97341ff68cb49de654b877986a446ae26..66bf533fddd5df03b7b2964cd09ba06db556956d 100644 (file)
 #include "gtkstock.h"
 #include "gtkiconfactory.h"
 #include "gtkintl.h"
+#include <string.h>
 
 static void gtk_message_dialog_class_init (GtkMessageDialogClass *klass);
 static void gtk_message_dialog_init       (GtkMessageDialog      *dialog);
 static void gtk_message_dialog_style_set  (GtkWidget             *widget,
                                            GtkStyle              *prev_style);
 
+static void gtk_message_dialog_set_property (GObject          *object,
+                                            guint             prop_id,
+                                            const GValue     *value,
+                                            GParamSpec       *pspec);
+static void gtk_message_dialog_get_property (GObject          *object,
+                                            guint             prop_id,
+                                            GValue           *value,
+                                            GParamSpec       *pspec);
+static void gtk_message_dialog_add_buttons  (GtkMessageDialog *message_dialog,
+                                            GtkButtonsType    buttons);
+
+
+enum {
+  PROP_0,
+  PROP_MESSAGE_TYPE,
+  PROP_BUTTONS
+};
+
 static gpointer parent_class;
 
-GtkType
+GType
 gtk_message_dialog_get_type (void)
 {
-  static GtkType dialog_type = 0;
+  static GType dialog_type = 0;
 
   if (!dialog_type)
     {
-      static const GtkTypeInfo dialog_info =
+      static const GTypeInfo dialog_info =
       {
-       "GtkMessageDialog",
-       sizeof (GtkMessageDialog),
        sizeof (GtkMessageDialogClass),
-       (GtkClassInitFunc) gtk_message_dialog_class_init,
-       (GtkObjectInitFunc) gtk_message_dialog_init,
-       /* reserved_1 */ NULL,
-        /* reserved_2 */ NULL,
-        (GtkClassInitFunc) NULL,
+       NULL,           /* base_init */
+       NULL,           /* base_finalize */
+       (GClassInitFunc) gtk_message_dialog_class_init,
+       NULL,           /* class_finalize */
+       NULL,           /* class_data */
+       sizeof (GtkMessageDialog),
+       0,              /* n_preallocs */
+       (GInstanceInitFunc) gtk_message_dialog_init,
       };
 
-      dialog_type = gtk_type_unique (GTK_TYPE_DIALOG, &dialog_info);
+      dialog_type = g_type_register_static (GTK_TYPE_DIALOG, "GtkMessageDialog",
+                                           &dialog_info, 0);
     }
 
   return dialog_type;
@@ -68,12 +89,17 @@ static void
 gtk_message_dialog_class_init (GtkMessageDialogClass *class)
 {
   GtkWidgetClass *widget_class;
+  GObjectClass *gobject_class;
 
   widget_class = GTK_WIDGET_CLASS (class);
+  gobject_class = G_OBJECT_CLASS (class);
 
   parent_class = g_type_class_peek_parent (class);
   
   widget_class->style_set = gtk_message_dialog_style_set;
+
+  gobject_class->set_property = gtk_message_dialog_set_property;
+  gobject_class->get_property = gtk_message_dialog_get_property;
   
   gtk_widget_class_install_style_property (widget_class,
                                           g_param_spec_int ("message_border",
@@ -83,6 +109,23 @@ gtk_message_dialog_class_init (GtkMessageDialogClass *class)
                                                              G_MAXINT,
                                                              8,
                                                              G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_MESSAGE_TYPE,
+                                   g_param_spec_enum ("message_type",
+                                                     _("Message Type"),
+                                                     _("The type of message"),
+                                                     GTK_TYPE_MESSAGE_TYPE,
+                                                      GTK_MESSAGE_INFO,
+                                                      G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+  g_object_class_install_property (gobject_class,
+                                   PROP_BUTTONS,
+                                   g_param_spec_enum ("buttons",
+                                                     _("Message Buttons"),
+                                                     _("The buttons shown in the message dialog"),
+                                                     GTK_TYPE_BUTTONS_TYPE,
+                                                      GTK_BUTTONS_NONE,
+                                                      G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+
 }
 
 static void
@@ -92,6 +135,7 @@ gtk_message_dialog_init (GtkMessageDialog *dialog)
   
   dialog->label = gtk_label_new (NULL);
   dialog->image = gtk_image_new_from_stock (NULL, GTK_ICON_SIZE_DIALOG);
+  gtk_misc_set_alignment (GTK_MISC (dialog->image), 0.5, 0.0);
   
   gtk_label_set_line_wrap (GTK_LABEL (dialog->label), TRUE);
   gtk_label_set_selectable (GTK_LABEL (dialog->label), TRUE);
@@ -111,13 +155,39 @@ gtk_message_dialog_init (GtkMessageDialog *dialog)
   gtk_widget_show_all (hbox);
 }
 
-static void
-setup_type(GtkMessageDialog *dialog, GtkMessageType type)
+static GtkMessageType
+gtk_message_dialog_get_message_type (GtkMessageDialog *dialog)
 {
-  /* Note: this function can be called more than once,
-   * and after showing the dialog, due to object args
+  const gchar* stock_id = NULL;
+
+  g_return_val_if_fail (GTK_IS_MESSAGE_DIALOG (dialog), GTK_MESSAGE_INFO);
+  g_return_val_if_fail (GTK_IS_IMAGE(dialog->image), GTK_MESSAGE_INFO);
+
+  stock_id = GTK_IMAGE(dialog->image)->data.stock.stock_id;
+
+  /* Look at the stock id of the image to guess the
+   * GtkMessageType value that was used to choose it
+   * in setup_type()
    */
-  
+  if (strcmp (stock_id, GTK_STOCK_DIALOG_INFO) == 0)
+    return GTK_MESSAGE_INFO;
+  else if (strcmp (stock_id, GTK_STOCK_DIALOG_QUESTION) == 0)
+    return GTK_MESSAGE_QUESTION;
+  else if (strcmp (stock_id, GTK_STOCK_DIALOG_WARNING) == 0)
+    return GTK_MESSAGE_WARNING;
+  else if (strcmp (stock_id, GTK_STOCK_DIALOG_ERROR) == 0)
+    return GTK_MESSAGE_ERROR;
+  else
+    {
+      g_assert_not_reached (); 
+      return GTK_MESSAGE_INFO;
+    }
+}
+
+static void
+setup_type (GtkMessageDialog *dialog,
+           GtkMessageType    type)
+{
   const gchar *stock_id = NULL;
   GtkStockItem item;
   
@@ -158,6 +228,51 @@ setup_type(GtkMessageDialog *dialog, GtkMessageType type)
     g_warning ("Stock dialog ID doesn't exist?");  
 }
 
+static void 
+gtk_message_dialog_set_property (GObject      *object,
+                                guint         prop_id,
+                                const GValue *value,
+                                GParamSpec   *pspec)
+{
+  GtkMessageDialog *dialog;
+  
+  dialog = GTK_MESSAGE_DIALOG (object);
+  
+  switch (prop_id)
+    {
+    case PROP_MESSAGE_TYPE:
+      setup_type (dialog, g_value_get_enum (value));
+      break;
+    case PROP_BUTTONS:
+      gtk_message_dialog_add_buttons (dialog, g_value_get_enum (value));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void 
+gtk_message_dialog_get_property (GObject     *object,
+                                guint        prop_id,
+                                GValue      *value,
+                                GParamSpec  *pspec)
+{
+  GtkMessageDialog *dialog;
+  
+  dialog = GTK_MESSAGE_DIALOG (object);
+  
+  switch (prop_id)
+    {
+    case PROP_MESSAGE_TYPE:
+      g_value_set_enum (value, gtk_message_dialog_get_message_type (dialog));
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
 /**
  * gtk_message_dialog_new:
  * @parent: transient parent, or NULL for none 
@@ -185,16 +300,25 @@ gtk_message_dialog_new (GtkWindow     *parent,
 {
   GtkWidget *widget;
   GtkDialog *dialog;
-  gchar* msg;
+  gchar* msg = 0;
   va_list args;
   
-  widget = GTK_WIDGET (gtk_type_new (GTK_TYPE_MESSAGE_DIALOG));
+  widget = g_object_new (GTK_TYPE_MESSAGE_DIALOG,
+                        "message_type", type,
+                        "buttons", buttons,
+                        NULL);
   dialog = GTK_DIALOG (widget);
 
+  if (flags & GTK_DIALOG_NO_SEPARATOR)
+    {
+      g_warning ("The GTK_DIALOG_NO_SEPARATOR flag cannot be used for GtkMessageDialog");
+      flags &= ~GTK_DIALOG_NO_SEPARATOR;
+    }
+
   if (message_format)
     {
       va_start (args, message_format);
-      msg = g_strdup_vprintf(message_format, args);
+      msg = g_strdup_vprintf (message_format, args);
       va_end (args);
       
       
@@ -208,15 +332,24 @@ gtk_message_dialog_new (GtkWindow     *parent,
     gtk_window_set_transient_for (GTK_WINDOW (widget),
                                   GTK_WINDOW (parent));
   
-
   if (flags & GTK_DIALOG_MODAL)
     gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
 
   if (flags & GTK_DIALOG_DESTROY_WITH_PARENT)
     gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
-  
-  setup_type (GTK_MESSAGE_DIALOG (dialog), type);
-  
+
+  if (flags & GTK_DIALOG_NO_SEPARATOR)
+    gtk_dialog_set_has_separator (dialog, FALSE);
+
+  return widget;
+}
+
+static void
+gtk_message_dialog_add_buttons (GtkMessageDialog* message_dialog,
+                               GtkButtonsType buttons)
+{
+  GtkDialog* dialog = GTK_DIALOG (message_dialog);
+
   switch (buttons)
     {
     case GTK_BUTTONS_NONE:
@@ -225,46 +358,46 @@ gtk_message_dialog_new (GtkWindow     *parent,
 
     case GTK_BUTTONS_OK:
       gtk_dialog_add_button (dialog,
-                             GTK_STOCK_BUTTON_OK,
+                             GTK_STOCK_OK,
                              GTK_RESPONSE_OK);
       break;
 
     case GTK_BUTTONS_CLOSE:
       gtk_dialog_add_button (dialog,
-                             GTK_STOCK_BUTTON_CLOSE,
+                             GTK_STOCK_CLOSE,
                              GTK_RESPONSE_CLOSE);
       break;
 
     case GTK_BUTTONS_CANCEL:
       gtk_dialog_add_button (dialog,
-                             GTK_STOCK_BUTTON_CANCEL,
+                             GTK_STOCK_CANCEL,
                              GTK_RESPONSE_CANCEL);
       break;
 
     case GTK_BUTTONS_YES_NO:
       gtk_dialog_add_button (dialog,
-                             GTK_STOCK_BUTTON_YES,
-                             GTK_RESPONSE_YES);
-      gtk_dialog_add_button (dialog,
-                             GTK_STOCK_BUTTON_NO,
+                             GTK_STOCK_NO,
                              GTK_RESPONSE_NO);
+      gtk_dialog_add_button (dialog,
+                             GTK_STOCK_YES,
+                             GTK_RESPONSE_YES);
       break;
 
     case GTK_BUTTONS_OK_CANCEL:
       gtk_dialog_add_button (dialog,
-                             GTK_STOCK_BUTTON_OK,
-                             GTK_RESPONSE_OK);
-      gtk_dialog_add_button (dialog,
-                             GTK_STOCK_BUTTON_CANCEL,
+                             GTK_STOCK_CANCEL,
                              GTK_RESPONSE_CANCEL);
+      gtk_dialog_add_button (dialog,
+                             GTK_STOCK_OK,
+                             GTK_RESPONSE_OK);
       break;
       
     default:
       g_warning ("Unknown GtkButtonsType");
       break;
-    }
+    } 
 
-  return widget;
+  g_object_notify (G_OBJECT (message_dialog), "buttons");
 }
 
 static void