+static struct variable *
+psppire_dict_view_iter_to_var (PsppireDictView *dict_view,
+ GtkTreeIter *top_iter)
+{
+ GtkTreeView *treeview = GTK_TREE_VIEW (dict_view);
+ GtkTreeModel *top_model = gtk_tree_view_get_model (treeview);
+
+ struct variable *var;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ get_base_model (top_model, top_iter, &model, &iter);
+ g_assert (PSPPIRE_IS_DICT (model));
+
+ gtk_tree_model_get (model,
+ &iter, DICT_TVM_COL_VAR, &var, -1);
+
+ return var;
+}
+
+static gboolean
+show_menu (PsppireDictView *dv, GdkEvent *event, gpointer data)
+{
+ GdkEventButton *button_event = (GdkEventButton *) event;
+ if (button_event->button != 3)
+ return FALSE;
+
+ dv->var_under_cursor = NULL;
+ GtkTreePath *path = NULL;
+ gboolean is_row =
+ gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (dv),
+ button_event->x, button_event->y,
+ &path, NULL, NULL, NULL);
+ if (is_row)
+ {
+ GtkTreeIter iter;
+ GtkTreeModel *top_model = gtk_tree_view_get_model (GTK_TREE_VIEW (dv));
+ gtk_tree_model_get_iter (top_model, &iter, path);
+ dv->var_under_cursor = psppire_dict_view_iter_to_var (dv, &iter);
+ }
+ gtk_tree_path_free (path);
+
+ gtk_widget_set_sensitive (GTK_WIDGET (dv->var_info_check), is_row);
+
+ gtk_menu_popup_at_pointer (GTK_MENU (dv->menu), event);
+
+ return TRUE;
+}
+
+static void
+toggle_label_preference (GtkCheckMenuItem *checkbox, gpointer data)
+{
+ PsppireDictView *dv = PSPPIRE_DICT_VIEW (data);
+
+ gboolean global_setting = TRUE;
+ psppire_conf_get_boolean (psppire_conf_new (),
+ "VariableLists", "display-labels", &global_setting);
+
+ if (gtk_check_menu_item_get_inconsistent (checkbox))
+ gtk_check_menu_item_set_active (checkbox, !global_setting);
+
+ gtk_check_menu_item_set_inconsistent (checkbox, FALSE);
+
+ gtk_widget_queue_draw (GTK_WIDGET (dv));
+}
+
+
+static void
+set_sort_criteria (GtkCheckMenuItem *checkbox, PsppireDictView *dv, GtkTreeIterCompareFunc func)
+{
+ if (!gtk_check_menu_item_get_active (checkbox))
+ {
+ gtk_widget_queue_draw (GTK_WIDGET (dv));
+ return;
+ }
+
+
+ gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (dv->sorted_model), func, 0, 0);
+
+
+ gtk_widget_queue_draw (GTK_WIDGET (dv));
+}
+
+static void
+set_sort_criteria_default (GtkCheckMenuItem *checkbox, gpointer data)
+{
+ PsppireDictView *dv = PSPPIRE_DICT_VIEW (data);
+ set_sort_criteria (checkbox, dv, default_sort);
+}
+
+
+static void
+set_sort_criteria_name (GtkCheckMenuItem *checkbox, gpointer data)
+{
+ PsppireDictView *dv = PSPPIRE_DICT_VIEW (data);
+ set_sort_criteria (checkbox, dv, sort_by_name);
+}
+
+
+static void
+set_sort_criteria_label (GtkCheckMenuItem *checkbox, gpointer data)
+{
+ PsppireDictView *dv = PSPPIRE_DICT_VIEW (data);
+ set_sort_criteria (checkbox, dv, sort_by_label);
+}
+
+
+static void
+set_sort_criteria_unsorted (GtkCheckMenuItem *checkbox, gpointer data)
+{
+ PsppireDictView *dv = PSPPIRE_DICT_VIEW (data);
+ set_sort_criteria (checkbox, dv, unsorted);
+}
+
+static void
+check_item_set_inactive (GtkCheckMenuItem *cmi)
+{
+ gtk_check_menu_item_set_active (cmi, FALSE);
+}
+
+static void
+pop_up_down_variable_information (GtkCheckMenuItem *cmi, PsppireDictView *dv)
+{
+ gboolean active;
+ g_object_get (cmi, "active", &active, NULL);
+
+ g_return_if_fail (dv->var_under_cursor);
+
+ if (!active)
+ return;
+
+ GtkWidget *dialog = psppire_dialog_new ();
+ g_object_set (dialog,
+ "title", _("Variable Details"),
+ "help-page", "Manipulating-Variables",
+ NULL);
+
+ GtkWidget *box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_add (GTK_CONTAINER (dialog), box);
+
+ GtkWidget *var_info = psppire_var_info_new ();
+ g_object_set (var_info, "variable", dv->var_under_cursor, NULL);
+ gtk_box_pack_start (GTK_BOX (box), var_info, TRUE, TRUE, 5);
+
+ GtkWidget *button_box = psppire_button_box_new ();
+ g_object_set (button_box,
+ "buttons", PSPPIRE_BUTTON_CLOSE_MASK | PSPPIRE_BUTTON_HELP_MASK,
+ NULL);
+ g_object_set (button_box, "layout-style", GTK_BUTTONBOX_SPREAD, NULL);
+ gtk_box_pack_start (GTK_BOX (box), button_box, FALSE, TRUE, 5);
+
+ g_signal_connect_swapped (dialog, "unmap",
+ G_CALLBACK (check_item_set_inactive), cmi);
+
+ gtk_widget_show_all (box);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+
+ psppire_dialog_run (PSPPIRE_DIALOG (dialog));
+}