]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmessagedialog.c
Fix a C99ism
[~andy/gtk] / gtk / gtkmessagedialog.c
index b0d4db49d9a46e4d7455e4883a00f7f1e16b5d25..01fef42b41e981bb1ed48f6d7327bf57be5c1fb9 100644 (file)
@@ -26,7 +26,8 @@
  */
 
 #include <config.h>
-#include "gtkalias.h"
+#include <string.h>
+
 #include "gtkmessagedialog.h"
 #include "gtklabel.h"
 #include "gtkhbox.h"
@@ -35,7 +36,8 @@
 #include "gtkstock.h"
 #include "gtkiconfactory.h"
 #include "gtkintl.h"
-#include <string.h>
+#include "gtkprivate.h"
+#include "gtkalias.h"
 
 #define GTK_MESSAGE_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_MESSAGE_DIALOG, GtkMessageDialogPrivate))
 
@@ -71,7 +73,11 @@ static void gtk_message_dialog_font_size_change (GtkWidget *widget,
 enum {
   PROP_0,
   PROP_MESSAGE_TYPE,
-  PROP_BUTTONS
+  PROP_BUTTONS,
+  PROP_TEXT,
+  PROP_USE_MARKUP,
+  PROP_SECONDARY_TEXT,
+  PROP_SECONDARY_USE_MARKUP
 };
 
 static gpointer parent_class;
@@ -96,7 +102,7 @@ gtk_message_dialog_get_type (void)
        (GInstanceInitFunc) gtk_message_dialog_init,
       };
 
-      dialog_type = g_type_register_static (GTK_TYPE_DIALOG, "GtkMessageDialog",
+      dialog_type = g_type_register_static (GTK_TYPE_DIALOG, I_("GtkMessageDialog"),
                                            &dialog_info, 0);
     }
 
@@ -120,13 +126,13 @@ gtk_message_dialog_class_init (GtkMessageDialogClass *class)
   gobject_class->get_property = gtk_message_dialog_get_property;
   
   gtk_widget_class_install_style_property (widget_class,
-                                          g_param_spec_int ("message_border",
+                                          g_param_spec_int ("message-border",
                                                              P_("Image/label border"),
                                                              P_("Width of border around the label and image in the message dialog"),
                                                              0,
                                                              G_MAXINT,
                                                              12,
-                                                             G_PARAM_READABLE));
+                                                             GTK_PARAM_READABLE));
   /**
    * GtkMessageDialog::use_separator
    *
@@ -136,19 +142,19 @@ gtk_message_dialog_class_init (GtkMessageDialogClass *class)
    * Since: 2.4
    */
   gtk_widget_class_install_style_property (widget_class,
-                                          g_param_spec_boolean ("use_separator",
+                                          g_param_spec_boolean ("use-separator",
                                                                 P_("Use separator"),
                                                                 P_("Whether to put a separator between the message dialog's text and the buttons"),
                                                                 FALSE,
-                                                                G_PARAM_READABLE));
+                                                                GTK_PARAM_READABLE));
   g_object_class_install_property (gobject_class,
                                    PROP_MESSAGE_TYPE,
-                                   g_param_spec_enum ("message_type",
+                                   g_param_spec_enum ("message-type",
                                                      P_("Message Type"),
                                                      P_("The type of message"),
                                                      GTK_TYPE_MESSAGE_TYPE,
                                                       GTK_MESSAGE_INFO,
-                                                      G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+                                                      GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   g_object_class_install_property (gobject_class,
                                    PROP_BUTTONS,
                                    g_param_spec_enum ("buttons",
@@ -156,7 +162,71 @@ gtk_message_dialog_class_init (GtkMessageDialogClass *class)
                                                      P_("The buttons shown in the message dialog"),
                                                      GTK_TYPE_BUTTONS_TYPE,
                                                       GTK_BUTTONS_NONE,
-                                                      G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+                                                      GTK_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+
+  /**
+   * GtkMessageDialog:text:
+   * 
+   * The primary text of the message dialog. If the dialog has 
+   * a secondary text, this will appear as the title.
+   *
+   * Since: 2.10
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_TEXT,
+                                   g_param_spec_string ("text",
+                                                        P_("Text"),
+                                                        P_("The primary text of the message dialog"),
+                                                        NULL,
+                                                        GTK_PARAM_READWRITE));
+
+  /**
+   * GtkMessageDialog:use-markup:
+   * 
+   * %TRUE if the primary text of the dialog includes Pango markup. 
+   * See pango_parse_markup(). 
+   *
+   * Since: 2.10
+   */
+  g_object_class_install_property (gobject_class,
+                                  PROP_USE_MARKUP,
+                                  g_param_spec_boolean ("use-markup",
+                                                        P_("Use Markup"),
+                                                        P_("The primary text of the title includes Pango markup."),
+                                                        FALSE,
+                                                        GTK_PARAM_READWRITE));
+  
+  /**
+   * GtkMessageDialog:secondary-text:
+   * 
+   * The secondary text of the message dialog. 
+   *
+   * Since: 2.10
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_SECONDARY_TEXT,
+                                   g_param_spec_string ("secondary-text",
+                                                        P_("Secondary Text"),
+                                                        P_("The secondary text of the message dialog"),
+                                                        NULL,
+                                                        GTK_PARAM_READWRITE));
+
+  /**
+   * GtkMessageDialog:secondary-use-markup:
+   * 
+   * %TRUE if the secondary text of the dialog includes Pango markup. 
+   * See pango_parse_markup(). 
+   *
+   * Since: 2.10
+   */
+  g_object_class_install_property (gobject_class,
+                                  PROP_SECONDARY_USE_MARKUP,
+                                  g_param_spec_boolean ("secondary-use-markup",
+                                                        P_("Use Markup in secondary"),
+                                                        P_("The secondary text includes Pango markup."),
+                                                        FALSE,
+                                                        GTK_PARAM_READWRITE));
+
   g_type_class_add_private (gobject_class,
                            sizeof (GtkMessageDialogPrivate));
 }
@@ -170,11 +240,14 @@ gtk_message_dialog_init (GtkMessageDialog *dialog)
   priv = GTK_MESSAGE_DIALOG_GET_PRIVATE (dialog);
 
   gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+  gtk_window_set_title (GTK_WINDOW (dialog), "");
+  gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), TRUE);
 
   priv->has_primary_markup = FALSE;
   priv->has_secondary_text = FALSE;
   priv->secondary_label = gtk_label_new (NULL);
-
+  gtk_widget_set_no_show_all (priv->secondary_label, TRUE);
+  
   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);
@@ -252,13 +325,10 @@ setup_primary_label_font (GtkMessageDialog *dialog)
 
   priv = GTK_MESSAGE_DIALOG_GET_PRIVATE (dialog);
 
-  if (priv->has_primary_markup)
-    return;
-
   /* unset the font settings */
   gtk_widget_modify_font (dialog->label, NULL);
 
-  if (priv->has_secondary_text)
+  if (priv->has_secondary_text && !priv->has_primary_markup)
     {
       size = pango_font_description_get_size (dialog->label->style->font_desc);
       font_desc = pango_font_description_new ();
@@ -303,12 +373,8 @@ setup_type (GtkMessageDialog *dialog,
     stock_id = GTK_STOCK_DIALOG_INFO;
 
   if (gtk_stock_lookup (stock_id, &item))
-    {
-      gtk_image_set_from_stock (GTK_IMAGE (dialog->image), stock_id,
-                                GTK_ICON_SIZE_DIALOG);
-      
-      gtk_window_set_title (GTK_WINDOW (dialog), item.label);
-    }
+    gtk_image_set_from_stock (GTK_IMAGE (dialog->image), stock_id,
+                              GTK_ICON_SIZE_DIALOG);
   else
     g_warning ("Stock dialog ID doesn't exist?");  
 }
@@ -320,8 +386,10 @@ gtk_message_dialog_set_property (GObject      *object,
                                 GParamSpec   *pspec)
 {
   GtkMessageDialog *dialog;
-  
+  GtkMessageDialogPrivate *priv;
+
   dialog = GTK_MESSAGE_DIALOG (object);
+  priv = GTK_MESSAGE_DIALOG_GET_PRIVATE (dialog);
   
   switch (prop_id)
     {
@@ -331,6 +399,47 @@ gtk_message_dialog_set_property (GObject      *object,
     case PROP_BUTTONS:
       gtk_message_dialog_add_buttons (dialog, g_value_get_enum (value));
       break;
+    case PROP_TEXT:
+      if (priv->has_primary_markup)
+       gtk_label_set_markup (GTK_LABEL (dialog->label), 
+                             g_value_get_string (value));
+      else
+       gtk_label_set_text (GTK_LABEL (dialog->label), 
+                           g_value_get_string (value));
+      break;
+    case PROP_USE_MARKUP:
+      priv->has_primary_markup = g_value_get_boolean (value);
+      gtk_label_set_use_markup (GTK_LABEL (dialog->label), 
+                               priv->has_primary_markup);
+      setup_primary_label_font (dialog);
+      break;
+    case PROP_SECONDARY_TEXT:
+      {
+       const gchar *txt = g_value_get_string (value);
+       
+       if (gtk_label_get_use_markup (GTK_LABEL (priv->secondary_label)))
+         gtk_label_set_markup (GTK_LABEL (priv->secondary_label), txt);
+       else
+         gtk_label_set_text (GTK_LABEL (priv->secondary_label), txt);
+
+       if (txt)
+         {
+           priv->has_secondary_text = TRUE;
+           gtk_widget_show (priv->secondary_label);
+         }
+       else
+         {
+           priv->has_secondary_text = FALSE;
+           gtk_widget_hide (priv->secondary_label);
+         }
+       setup_primary_label_font (dialog);
+      }
+      break;
+    case PROP_SECONDARY_USE_MARKUP:
+      gtk_label_set_use_markup (GTK_LABEL (priv->secondary_label), 
+                               g_value_get_boolean (value));
+      break;
+      
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -344,14 +453,36 @@ gtk_message_dialog_get_property (GObject     *object,
                                 GParamSpec  *pspec)
 {
   GtkMessageDialog *dialog;
-  
+  GtkMessageDialogPrivate *priv;
+
   dialog = GTK_MESSAGE_DIALOG (object);
-  
+  priv = GTK_MESSAGE_DIALOG_GET_PRIVATE (dialog);
+    
   switch (prop_id)
     {
     case PROP_MESSAGE_TYPE:
       g_value_set_enum (value, gtk_message_dialog_get_message_type (dialog));
       break;
+    case PROP_TEXT:
+      g_value_set_string (value, gtk_label_get_label (GTK_LABEL (dialog->label)));
+      break;
+    case PROP_USE_MARKUP:
+      g_value_set_boolean (value, priv->has_primary_markup);
+      break;
+    case PROP_SECONDARY_TEXT:
+      if (priv->has_secondary_text)
+      g_value_set_string (value, 
+                         gtk_label_get_label (GTK_LABEL (priv->secondary_label)));
+      else
+       g_value_set_string (value, NULL);
+      break;
+    case PROP_SECONDARY_USE_MARKUP:
+      if (priv->has_secondary_text)
+       g_value_set_boolean (value, 
+                            gtk_label_get_use_markup (GTK_LABEL (priv->secondary_label)));
+      else
+       g_value_set_boolean (value, FALSE);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -369,11 +500,11 @@ gtk_message_dialog_font_size_change (GtkWidget *widget,
 
 /**
  * gtk_message_dialog_new:
- * @parent: transient parent, or NULL for none 
+ * @parent: transient parent, or %NULL for none 
  * @flags: flags
  * @type: type of message
  * @buttons: set of buttons to use
- * @message_format: printf()-style format string, or NULL
+ * @message_format: printf()-style format string, or %NULL
  * @Varargs: arguments for @message_format
  * 
  * Creates a new message dialog, which is a simple dialog with an icon
@@ -400,7 +531,7 @@ gtk_message_dialog_new (GtkWindow     *parent,
   g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
 
   widget = g_object_new (GTK_TYPE_MESSAGE_DIALOG,
-                        "message_type", type,
+                        "message-type", type,
                         "buttons", buttons,
                         NULL);
   dialog = GTK_DIALOG (widget);
@@ -433,9 +564,6 @@ gtk_message_dialog_new (GtkWindow     *parent,
   if (flags & GTK_DIALOG_DESTROY_WITH_PARENT)
     gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
 
-  if (flags & GTK_DIALOG_NO_SEPARATOR)
-    gtk_dialog_set_has_separator (dialog, FALSE);
-
   return widget;
 }
 
@@ -469,7 +597,7 @@ gtk_message_dialog_new (GtkWindow     *parent,
  *  dialog = gtk_message_dialog_new (main_application_window,
  *                                   GTK_DIALOG_DESTROY_WITH_PARENT,
  *                                   GTK_MESSAGE_ERROR,
- *                                   GTK_BUTTON_CLOSE,
+ *                                   GTK_BUTTONS_CLOSE,
  *                                   NULL);
  *  gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog),
  *                                 markup);
@@ -596,6 +724,19 @@ gtk_message_dialog_format_secondary_text (GtkMessageDialog *message_dialog,
  * Note that setting a secondary text makes the primary text become
  * bold, unless you have provided explicit markup.
  *
+ * Due to an oversight, this function does not escape special XML characters
+ * like gtk_message_dialog_new_with_markup() does. Thus, if the arguments 
+ * may contain special XML characters, you should use g_markup_printf_escaped()
+ * to escape it.
+
+ * <informalexample><programlisting>
+ * gchar *msg;
+ *  
+ * msg = g_markup_printf_escaped (message_format, ...);
+ * gtk_message_dialog_format_secondary_markup (message_dialog, "&percnt;s", msg);
+ * g_free (msg);
+ * </programlisting></informalexample>
+ *
  * Since: 2.6
  **/
 void
@@ -709,7 +850,7 @@ gtk_message_dialog_style_set (GtkWidget *widget,
 
   if (parent)
     {
-      gtk_widget_style_get (widget, "message_border",
+      gtk_widget_style_get (widget, "message-border",
                             &border_width, NULL);
       
       gtk_container_set_border_width (GTK_CONTAINER (parent),
@@ -717,7 +858,7 @@ gtk_message_dialog_style_set (GtkWidget *widget,
     }
 
   gtk_widget_style_get (widget,
-                       "use_separator", &use_separator,
+                       "use-separator", &use_separator,
                        NULL);
   _gtk_dialog_set_ignore_separator (GTK_DIALOG (widget), FALSE);
   gtk_dialog_set_has_separator (GTK_DIALOG (widget), use_separator);
@@ -726,3 +867,6 @@ gtk_message_dialog_style_set (GtkWidget *widget,
   if (GTK_WIDGET_CLASS (parent_class)->style_set)
     (GTK_WIDGET_CLASS (parent_class)->style_set) (widget, prev_style);
 }
+
+#define __GTK_MESSAGE_DIALOG_C__
+#include "gtkaliasdef.c"