Merge commit 'origin/stable'
[pspp-builds.git] / src / ui / gui / psppire-buttonbox.c
index da39e0867d3968fbf927fb6c47cafdaf634aad20..071751ad6fdeb6372cdd590c1ea8dcf47a347a5e 100644 (file)
@@ -56,7 +56,7 @@ psppire_button_box_get_type (void)
       };
 
       button_box_type = g_type_register_static (GTK_TYPE_BUTTON_BOX,
-                                           "PsppireButtonBox", &button_box_info, 0);
+                                           "PsppireButtonBox", &button_box_info, G_TYPE_FLAG_ABSTRACT);
     }
 
   return button_box_type;
@@ -142,7 +142,7 @@ psppire_button_box_class_init (PsppireButtonBoxClass *class)
     g_param_spec_flags ("buttons",
                        _("Buttons"),
                        _("The mask that decides what buttons appear in the button box"),
-                       G_TYPE_PSPPIRE_BUTTON_MASK,
+                       PSPPIRE_TYPE_BUTTON_MASK,
                        PSPPIRE_BUTTON_OK_MASK |
                        PSPPIRE_BUTTON_CANCEL_MASK |
                        PSPPIRE_BUTTON_RESET_MASK |
@@ -225,6 +225,31 @@ refresh_clicked (GtkWidget *w, gpointer data)
 }
 
 
+
+static void
+on_validity_change (GtkWidget *toplevel, gboolean valid, gpointer data)
+{
+  PsppireButtonBox *bb = data;
+
+  /* Set the sensitivity of all the 'executive order' buttons */
+  gtk_widget_set_sensitive (GTK_WIDGET (bb->button[PSPPIRE_BUTTON_OK]), valid);
+  gtk_widget_set_sensitive (GTK_WIDGET (bb->button[PSPPIRE_BUTTON_PASTE]), valid);
+  gtk_widget_set_sensitive (GTK_WIDGET (bb->button[PSPPIRE_BUTTON_GOTO]), valid);
+  gtk_widget_set_sensitive (GTK_WIDGET (bb->button[PSPPIRE_BUTTON_CONTINUE]), valid);
+}
+
+static void
+on_realize (GtkWidget *buttonbox, gpointer data)
+{
+  GtkWidget *toplevel = gtk_widget_get_toplevel (buttonbox);
+
+  if ( PSPPIRE_IS_DIALOG (toplevel))
+    {
+      g_signal_connect (toplevel, "validity-changed",
+                       G_CALLBACK (on_validity_change), buttonbox);
+    }
+}
+
 static void
 psppire_button_box_init (PsppireButtonBox *bb)
 {
@@ -247,6 +272,12 @@ psppire_button_box_init (PsppireButtonBox *bb)
   bb->button[PSPPIRE_BUTTON_CONTINUE] =
     gtk_button_new_with_mnemonic (_("Continue"));
 
+  GTK_WIDGET_SET_FLAGS (bb->button[PSPPIRE_BUTTON_CONTINUE],
+                       GTK_CAN_DEFAULT);
+
+  g_signal_connect (bb->button[PSPPIRE_BUTTON_CONTINUE], "realize",
+        G_CALLBACK (gtk_widget_grab_default), NULL);
+
   gtk_box_pack_start_defaults (GTK_BOX (bb),
                               bb->button[PSPPIRE_BUTTON_CONTINUE]);
   g_signal_connect (bb->button[PSPPIRE_BUTTON_CONTINUE], "clicked",
@@ -299,6 +330,8 @@ psppire_button_box_init (PsppireButtonBox *bb)
     g_value_unset (&value);
   }
 
+
+  g_signal_connect (bb, "realize", G_CALLBACK (on_realize), NULL);
 }