X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fval-labs-dialog.c;h=28293808a4ee884ae2465bf73253f5e771c5202a;hb=13e7983c183d6448d09cd8ed9644351b676af4d3;hp=070a4f50da0aa93db7ea00f294bbce785a025b47;hpb=a19b858e0ac3c69e4a28c0ca6d8674427268a863;p=pspp-builds.git diff --git a/src/ui/gui/val-labs-dialog.c b/src/ui/gui/val-labs-dialog.c index 070a4f50..28293808 100644 --- a/src/ui/gui/val-labs-dialog.c +++ b/src/ui/gui/val-labs-dialog.c @@ -1,7 +1,6 @@ -/* +/* PSPPIRE --- A Graphical User Interface for PSPP Copyright (C) 2005 Free Software Foundation - Written by John Darrington 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 @@ -22,37 +21,39 @@ /* This module describes the behaviour of the Value Labels dialog box, used for input of the value labels in the variable sheet */ +#include + #include #include "helper.h" #include "val-labs-dialog.h" #include -#include "psppire-variable.h" -/* This callback occurs when the text in the label entry box +/* This callback occurs when the text in the label entry box is changed */ static void on_label_entry_change(GtkEntry *entry, gpointer data) { + union value v; + const gchar *text ; struct val_labs_dialog *dialog = data; g_assert(dialog->labs); - union value v; - const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog->value_entry)); + text = gtk_entry_get_text(GTK_ENTRY(dialog->value_entry)); - text_to_value(text, &v, - *psppire_variable_get_write_spec(dialog->pv)); + text_to_value(text, &v, + *var_get_write_format (dialog->pv)); - if ( val_labs_find (dialog->labs, v) ) + if ( val_labs_find (dialog->labs, v) ) { - gtk_widget_set_sensitive(dialog->change_button, TRUE); - gtk_widget_set_sensitive(dialog->add_button, FALSE); + gtk_widget_set_sensitive(dialog->change_button, TRUE); + gtk_widget_set_sensitive(dialog->add_button, FALSE); } else { - gtk_widget_set_sensitive(dialog->change_button, FALSE); - gtk_widget_set_sensitive(dialog->add_button, TRUE); + gtk_widget_set_sensitive(dialog->change_button, FALSE); + gtk_widget_set_sensitive(dialog->add_button, TRUE); } } @@ -61,8 +62,10 @@ on_label_entry_change(GtkEntry *entry, gpointer data) static void select_treeview_from_value(GtkTreeView *treeview, union value *val) { + GtkTreePath *path ; + /* - We do this with a linear search through the model --- hardly + We do this with a linear search through the model --- hardly efficient, but the list is short ... */ GtkTreeIter iter; @@ -73,11 +76,11 @@ select_treeview_from_value(GtkTreeView *treeview, union value *val) success; success = gtk_tree_model_iter_next(model, &iter)) { + union value v; GValue gvalue = {0}; gtk_tree_model_get_value(model, &iter, 1, &gvalue); - - union value v; + v.f = g_value_get_double(&gvalue); if ( 0 == memcmp(&v, val, sizeof (union value))) @@ -85,9 +88,9 @@ select_treeview_from_value(GtkTreeView *treeview, union value *val) break; } } - - GtkTreePath *path = gtk_tree_model_get_path(model, &iter); - if ( path ) + + path = gtk_tree_model_get_path(model, &iter); + if ( path ) { gtk_tree_view_set_cursor(treeview, path, 0, 0); gtk_tree_path_free(path); @@ -101,23 +104,24 @@ select_treeview_from_value(GtkTreeView *treeview, union value *val) static void on_value_entry_change(GtkEntry *entry, gpointer data) { + char *s; + struct val_labs_dialog *dialog = data; const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog->value_entry)); union value v; - text_to_value(text, &v, - *psppire_variable_get_write_spec(dialog->pv)); + text_to_value(text, &v, + *var_get_write_format (dialog->pv)); - g_signal_handler_block(GTK_ENTRY(dialog->label_entry), + g_signal_handler_block(GTK_ENTRY(dialog->label_entry), dialog->change_handler_id); gtk_entry_set_text(GTK_ENTRY(dialog->label_entry),""); - char *s; - if ( (s = val_labs_find (dialog->labs, v)) ) + if ( (s = val_labs_find (dialog->labs, v)) ) { gtk_entry_set_text(GTK_ENTRY(dialog->label_entry), s); gtk_widget_set_sensitive(dialog->add_button, FALSE); @@ -129,28 +133,29 @@ on_value_entry_change(GtkEntry *entry, gpointer data) gtk_widget_set_sensitive(dialog->remove_button, FALSE); gtk_widget_set_sensitive(dialog->add_button, TRUE); } - - g_signal_handler_unblock(GTK_ENTRY(dialog->label_entry), + + g_signal_handler_unblock(GTK_ENTRY(dialog->label_entry), dialog->change_handler_id); } -/* Callback for when the Value Labels dialog is closed using +/* Callback for when the Value Labels dialog is closed using the OK button.*/ static gint val_labs_ok(GtkWidget *w, gpointer data) { struct val_labs_dialog *dialog = data; - psppire_variable_set_value_labels(dialog->pv, dialog->labs); + var_set_value_labels (dialog->pv, dialog->labs); val_labs_destroy (dialog->labs); + dialog->labs = 0; return FALSE; } -/* Callback for when the Value Labels dialog is closed using +/* Callback for when the Value Labels dialog is closed using the Cancel button.*/ static gint val_labs_cancel(GtkWidget *w, gpointer data) @@ -159,7 +164,7 @@ val_labs_cancel(GtkWidget *w, gpointer data) val_labs_destroy (dialog->labs); dialog->labs = 0; - + return FALSE; } @@ -170,9 +175,9 @@ get_selected_tuple(struct val_labs_dialog *dialog) { GtkTreeView *treeview = GTK_TREE_VIEW(dialog->treeview); static struct val_lab vl; - + GtkTreeIter iter ; - GValue the_value = {0}; + GValue the_value = {0}; GtkTreeSelection* sel = gtk_tree_view_get_selection(treeview); @@ -186,7 +191,7 @@ get_selected_tuple(struct val_labs_dialog *dialog) g_value_unset(&the_value); vl.label = val_labs_find (dialog->labs, vl.value); - + return &vl; } @@ -198,18 +203,18 @@ static gint on_change(GtkWidget *w, gpointer data) { struct val_labs_dialog *dialog = data; - + const gchar *val_text = gtk_entry_get_text(GTK_ENTRY(dialog->value_entry)); - + union value v; - - text_to_value(val_text, &v, - *psppire_variable_get_write_spec(dialog->pv)); + + text_to_value(val_text, &v, + *var_get_write_format (dialog->pv)); val_labs_replace (dialog->labs, v, - gtk_entry_get_text(GTK_ENTRY(dialog->label_entry))); + gtk_entry_get_text (GTK_ENTRY(dialog->label_entry))); - gtk_widget_set_sensitive(dialog->change_button, FALSE); + gtk_widget_set_sensitive (dialog->change_button, FALSE); repopulate_dialog(dialog); @@ -226,15 +231,15 @@ on_add(GtkWidget *w, gpointer data) const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog->value_entry)); - text_to_value(text, &v, - *psppire_variable_get_write_spec(dialog->pv)); + text_to_value(text, &v, + *var_get_write_format (dialog->pv)); if ( ! val_labs_add (dialog->labs, v, - gtk_entry_get_text(GTK_ENTRY(dialog->label_entry)) ) ) + gtk_entry_get_text + ( GTK_ENTRY (dialog->label_entry)) ) ) return FALSE; - gtk_widget_set_sensitive(dialog->add_button, FALSE); repopulate_dialog(dialog); @@ -251,7 +256,7 @@ on_remove(GtkWidget *w, gpointer data) struct val_lab *vl = get_selected_tuple(dialog); val_labs_remove (dialog->labs, vl->value); - + repopulate_dialog(dialog); gtk_widget_set_sensitive(dialog->remove_button, FALSE); @@ -261,35 +266,38 @@ on_remove(GtkWidget *w, gpointer data) -/* Callback which occurs when a line item is selected in the list of +/* Callback which occurs when a line item is selected in the list of value--label pairs.*/ -static void +static void on_select_row (GtkTreeView *treeview, gpointer data) { + gchar *labeltext; struct val_labs_dialog *dialog = data; struct val_lab * vl = get_selected_tuple(dialog); - gchar *const text = value_to_text(vl->value, - *psppire_variable_get_write_spec(dialog->pv)); + gchar *const text = value_to_text(vl->value, + *var_get_write_format (dialog->pv)); - g_signal_handler_block(GTK_ENTRY(dialog->value_entry), + g_signal_handler_block(GTK_ENTRY(dialog->value_entry), dialog->value_handler_id); gtk_entry_set_text(GTK_ENTRY(dialog->value_entry), text); - g_signal_handler_unblock(GTK_ENTRY(dialog->value_entry), + g_signal_handler_unblock(GTK_ENTRY(dialog->value_entry), dialog->value_handler_id); g_free(text); - g_signal_handler_block(GTK_ENTRY(dialog->label_entry), + g_signal_handler_block(GTK_ENTRY(dialog->label_entry), dialog->change_handler_id); + labeltext = pspp_locale_to_utf8(vl->label, -1, 0); gtk_entry_set_text(GTK_ENTRY(dialog->label_entry), - vl->label); + labeltext); + g_free(labeltext); - g_signal_handler_unblock(GTK_ENTRY(dialog->label_entry), + g_signal_handler_unblock(GTK_ENTRY(dialog->label_entry), dialog->change_handler_id); gtk_widget_set_sensitive(dialog->remove_button, TRUE); @@ -297,11 +305,15 @@ on_select_row (GtkTreeView *treeview, } -/* Create a new dialog box +/* Create a new dialog box (there should normally be only one)*/ struct val_labs_dialog * val_labs_dialog_create(GladeXML *xml) { + GtkTreeViewColumn *column; + + GtkCellRenderer *renderer ; + struct val_labs_dialog *dialog = g_malloc(sizeof(*dialog)); dialog->window = get_widget_assert(xml,"val_labs_dialog"); @@ -309,7 +321,7 @@ val_labs_dialog_create(GladeXML *xml) dialog->label_entry = get_widget_assert(xml,"label_entry"); gtk_window_set_transient_for - (GTK_WINDOW(dialog->window), + (GTK_WINDOW(dialog->window), GTK_WINDOW(get_widget_assert(xml, "data_editor"))); dialog->ok = get_widget_assert(xml, "val_labs_ok"); @@ -321,10 +333,8 @@ val_labs_dialog_create(GladeXML *xml) gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dialog->treeview), FALSE); - GtkTreeViewColumn *column; + renderer = gtk_cell_renderer_text_new(); - GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes ("Title", renderer, "text", @@ -334,26 +344,26 @@ val_labs_dialog_create(GladeXML *xml) gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->treeview), column); g_signal_connect(GTK_OBJECT(get_widget_assert(xml, "val_labs_cancel")), - "clicked", + "clicked", GTK_SIGNAL_FUNC(val_labs_cancel), dialog); - dialog->change_handler_id = - g_signal_connect(GTK_OBJECT(dialog->label_entry), + dialog->change_handler_id = + g_signal_connect(GTK_OBJECT(dialog->label_entry), "changed", GTK_SIGNAL_FUNC(on_label_entry_change), dialog); - dialog->value_handler_id = - g_signal_connect(GTK_OBJECT(dialog->value_entry), + dialog->value_handler_id = + g_signal_connect(GTK_OBJECT(dialog->value_entry), "changed", GTK_SIGNAL_FUNC(on_value_entry_change), dialog); - g_signal_connect(GTK_OBJECT(dialog->change_button), + g_signal_connect(GTK_OBJECT(dialog->change_button), "clicked", GTK_SIGNAL_FUNC(on_change), dialog); g_signal_connect(GTK_OBJECT(get_widget_assert(xml, "val_labs_ok")), - "clicked", + "clicked", GTK_SIGNAL_FUNC(val_labs_ok), dialog); @@ -376,29 +386,29 @@ val_labs_dialog_create(GladeXML *xml) /* Populate the components of the dialog box, from the 'labs' member variable */ -static void +static void repopulate_dialog(struct val_labs_dialog *dialog) { struct val_labs_iterator *vli = 0; - struct val_lab *vl; + struct val_lab *vl; GtkTreeIter iter; - GtkListStore *list_store = gtk_list_store_new (2, - G_TYPE_STRING, + GtkListStore *list_store = gtk_list_store_new (2, + G_TYPE_STRING, G_TYPE_DOUBLE); - g_signal_handler_block(GTK_ENTRY(dialog->label_entry), + g_signal_handler_block(GTK_ENTRY(dialog->label_entry), dialog->change_handler_id); - g_signal_handler_block(GTK_ENTRY(dialog->value_entry), + g_signal_handler_block(GTK_ENTRY(dialog->value_entry), dialog->value_handler_id); gtk_entry_set_text(GTK_ENTRY(dialog->value_entry), ""); gtk_entry_set_text(GTK_ENTRY(dialog->label_entry), ""); - g_signal_handler_unblock(GTK_ENTRY(dialog->value_entry), + g_signal_handler_unblock(GTK_ENTRY(dialog->value_entry), dialog->value_handler_id); - g_signal_handler_unblock(GTK_ENTRY(dialog->label_entry), + g_signal_handler_unblock(GTK_ENTRY(dialog->label_entry), dialog->change_handler_id); @@ -406,26 +416,30 @@ repopulate_dialog(struct val_labs_dialog *dialog) vl; vl = val_labs_next(dialog->labs, &vli)) { - gchar *const vstr = - value_to_text(vl->value, - *psppire_variable_get_write_spec(dialog->pv)); - - + gchar *const vstr = + value_to_text(vl->value, + *var_get_write_format (dialog->pv)); + + gchar *labeltext = + pspp_locale_to_utf8(vl->label, -1, 0); + gchar *const text = g_strdup_printf("%s = \"%s\"", - vstr, vl->label); - + vstr, labeltext); + + gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, - 0, text, + 0, text, 1, vl->value.f, -1); - g_free(text); + g_free(labeltext); + g_free(text); g_free(vstr); } - gtk_tree_view_set_model(GTK_TREE_VIEW(dialog->treeview), + gtk_tree_view_set_model(GTK_TREE_VIEW(dialog->treeview), GTK_TREE_MODEL(list_store)); g_object_unref(list_store); @@ -433,15 +447,20 @@ repopulate_dialog(struct val_labs_dialog *dialog) } /* Initialise and display the dialog box */ -void +void val_labs_dialog_show(struct val_labs_dialog *dialog) { + const struct val_labs *value_labels; + g_assert(!dialog->labs); - dialog->labs = val_labs_copy( - psppire_variable_get_value_labels(dialog->pv) - ); + value_labels = var_get_value_labels (dialog->pv); + if (value_labels) + dialog->labs = val_labs_copy ( value_labels ); + else + dialog->labs = val_labs_create ( var_get_width (dialog->pv)); + gtk_widget_set_sensitive(dialog->remove_button, FALSE); gtk_widget_set_sensitive(dialog->change_button, FALSE); gtk_widget_set_sensitive(dialog->add_button, FALSE);