val-labs-dialog: Improve keyboard interface.
[pspp] / src / ui / gui / val-labs-dialog.c
index 094a422af002268df421eeb9749a99c568f6d84e..cc1b65494c9fbee387b4c7a934b011c7f8014128 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2005, 2009, 2010, 2011, 2012  Free Software Foundation
+   Copyright (C) 2005, 2009, 2010, 2011, 2012, 2015, 2016  Free Software Foundation
 
    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
@@ -48,6 +48,8 @@ enum
     PROP_VALUE_LABELS
   };
 
+static void do_change (PsppireValLabsDialog *);
+
 static void
 psppire_val_labs_dialog_set_property (GObject      *object,
                                       guint         prop_id,
@@ -142,7 +144,6 @@ psppire_val_labs_dialog_new (const struct variable *var)
 {
   return PSPPIRE_VAL_LABS_DIALOG (
     g_object_new (PSPPIRE_TYPE_VAL_LABS_DIALOG,
-                  "orientation", PSPPIRE_HORIZONTAL,
                   "variable", var,
                   NULL));
 }
@@ -156,6 +157,7 @@ psppire_val_labs_dialog_run (GtkWindow *parent_window,
 
   dialog = psppire_val_labs_dialog_new (var);
   gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window);
+  gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
   gtk_widget_show (GTK_WIDGET (dialog));
 
   labs = (psppire_dialog_run (PSPPIRE_DIALOG (dialog)) == GTK_RESPONSE_OK
@@ -195,6 +197,15 @@ on_label_entry_change (GtkEntry *entry, gpointer data)
   value_destroy (&v, val_labs_get_width (dialog->labs));
 }
 
+/* This callback occurs when Enter is pressed in the label entry box. */
+static void
+on_label_entry_activate (GtkEntry *entry, gpointer data)
+{
+  PsppireValLabsDialog *dialog = data;
+  do_change (dialog);
+}
+
+/* Return the value-label pair currently selected in the dialog box  */
 
 /* Set the TREEVIEW list cursor to the item which has the value VAL */
 static void
@@ -276,9 +287,16 @@ on_value_entry_change (GtkEntry *entry, gpointer data)
   value_destroy (&v, val_labs_get_width (dialog->labs));
 }
 
-
-/* Return the value-label pair currently selected in the dialog box  */
+/* This callback occurs when Enter is pressed in the value entry box. */
 static void
+on_value_entry_activate (GtkEntry *entry, gpointer data)
+{
+  PsppireValLabsDialog *dialog = data;
+
+  gtk_widget_grab_focus (dialog->label_entry);
+}
+
+static gboolean
 get_selected_tuple (PsppireValLabsDialog *dialog,
                     union value *valuep, const char **label)
 {
@@ -292,7 +310,8 @@ get_selected_tuple (PsppireValLabsDialog *dialog,
 
   GtkTreeModel * model  = gtk_tree_view_get_model (treeview);
 
-  gtk_tree_selection_get_selected (sel, &model, &iter);
+  if (! gtk_tree_selection_get_selected (sel, &model, &iter))
+    return FALSE;
 
   gtk_tree_model_get_value (model, &iter, 1, &the_value);
 
@@ -307,6 +326,8 @@ get_selected_tuple (PsppireValLabsDialog *dialog,
       if (vl != NULL)
         *label = val_lab_get_escaped_label (vl);
     }
+  
+  return TRUE;
 }
 
 
@@ -317,7 +338,12 @@ static void
 on_change (GtkWidget *w, gpointer data)
 {
   PsppireValLabsDialog *dialog = data;
+  do_change (dialog);
+}
 
+static void
+do_change (PsppireValLabsDialog *dialog)
+{
   const gchar *val_text = gtk_entry_get_text (GTK_ENTRY (dialog->value_entry));
 
   union value v;
@@ -369,7 +395,9 @@ on_remove (GtkWidget *w, gpointer data)
   union value value;
   struct val_lab *vl;
 
-  get_selected_tuple (dialog, &value, NULL);
+  if (! get_selected_tuple (dialog, &value, NULL))
+    return;
+  
   vl = val_labs_lookup (dialog->labs, &value);
   if (vl != NULL)
     val_labs_remove (dialog->labs, vl);
@@ -394,7 +422,9 @@ on_select_row (GtkTreeView *treeview, gpointer data)
 
   gchar *text;
 
-  get_selected_tuple (dialog, &value, &label);
+  if (! get_selected_tuple (dialog, &value, &label))
+    return;
+  
   text = value_to_text__ (value, &dialog->format, dialog->encoding);
 
   g_signal_handler_block (GTK_ENTRY (dialog->value_entry),
@@ -442,7 +472,7 @@ psppire_val_labs_dialog_constructor (GType                  type,
     type, n_properties, properties);
   dialog = PSPPIRE_VAL_LABS_DIALOG (obj);
 
-  content_area = GTK_CONTAINER (PSPPIRE_DIALOG (dialog)->box);
+  content_area = GTK_CONTAINER (PSPPIRE_DIALOG (dialog));
   gtk_container_add (GTK_CONTAINER (content_area),
                      get_widget_assert (xml, "val-labs-dialog"));
 
@@ -471,11 +501,15 @@ psppire_val_labs_dialog_constructor (GType                  type,
     g_signal_connect (dialog->label_entry,
                     "changed",
                     G_CALLBACK (on_label_entry_change), dialog);
+  g_signal_connect (dialog->label_entry, "activate",
+                    G_CALLBACK (on_label_entry_activate), dialog);
 
   dialog->value_handler_id  =
     g_signal_connect (dialog->value_entry,
                     "changed",
                     G_CALLBACK (on_value_entry_change), dialog);
+  g_signal_connect (dialog->value_entry, "activate",
+                    G_CALLBACK (on_value_entry_activate), dialog);
 
   g_signal_connect (dialog->change_button,
                   "clicked",