X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fdata-editor.c;h=262ae543ac59e8f98766aac8558ac37fe3734ea0;hb=8f157150f5fe225224e407161fb7f899d34b8b18;hp=7e320bbdfd1603826225a7a972f576510b737384;hpb=cda91450a687e3f520ec4614dcc2d09f6f7c82bb;p=pspp diff --git a/src/ui/gui/data-editor.c b/src/ui/gui/data-editor.c index 7e320bbdfd..262ae543ac 100644 --- a/src/ui/gui/data-editor.c +++ b/src/ui/gui/data-editor.c @@ -1,6 +1,6 @@ /* PSPPIRE --- A Graphical User Interface for PSPP - Copyright (C) 2006 Free Software Foundation + Copyright (C) 2006, 2007 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 @@ -29,17 +29,22 @@ #include "helper.h" #include "about.h" +#include "psppire-dialog.h" +#include "psppire-var-select.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid #include "data-editor.h" #include "syntax-editor.h" +#include #include "window-manager.h" #include "psppire-data-store.h" #include "psppire-var-store.h" +#include "weight-cases-dialog.h" + static void insert_variable (GtkCheckMenuItem *m, gpointer data); @@ -55,6 +60,11 @@ static gboolean click2row (GtkWidget *w, gint row, gpointer data); static void select_sheet (struct data_editor *de, guint page_num); +/* Callback for when the dictionary changes properties*/ +static void on_weight_change (GObject *, gint, gpointer); +static void on_filter_change (GObject *, gint, gpointer); +static void on_split_change (PsppireDict *, gpointer); + static void data_var_select (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, @@ -100,37 +110,7 @@ disable_edit_clear (GtkWidget *w, gint x, gint y, gpointer data) return FALSE; } - -/* Callback for when the dictionary changes its weights */ -static void -on_weight_change (GObject *o, gint weight_index, gpointer data) -{ - struct data_editor *de = data; - GtkWidget *weight_status_area = - get_widget_assert (de->xml, "weight-status-area"); - - if ( weight_index == -1 ) - { - gtk_label_set_text (GTK_LABEL (weight_status_area), _("Weights off")); - } - else - { - GtkSheet *var_sheet = - GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); - - PsppireVarStore *vs = PSPPIRE_VAR_STORE - (gtk_sheet_get_model (var_sheet) ); - - struct variable *var = psppire_dict_get_variable (vs->dict, - weight_index); - - gchar *text = g_strdup_printf (_("Weight by %s"), var_get_name (var)); - - gtk_label_set_text (GTK_LABEL (weight_status_area), text); - - g_free (text); - } -} +static void weight_cases_dialog (GObject *o, gpointer data); /* @@ -159,8 +139,26 @@ new_data_editor (void) G_CALLBACK (on_weight_change), de); + g_signal_connect (vs->dict, "filter-changed", + G_CALLBACK (on_filter_change), + de); + + g_signal_connect (vs->dict, "split-changed", + G_CALLBACK (on_split_change), + de); + connect_help (de->xml); + de->invoke_weight_cases_dialog = + gtk_action_new ("weight-cases-dialog", + _("Weights"), + _("Weight cases by variable"), + "pspp-weight-cases"); + + + g_signal_connect (de->invoke_weight_cases_dialog, "activate", + G_CALLBACK (weight_cases_dialog), de); + e->window = GTK_WINDOW (get_widget_assert (de->xml, "data_editor")); g_signal_connect (get_widget_assert (de->xml,"file_new_data"), @@ -195,6 +193,17 @@ new_data_editor (void) G_CALLBACK (insert_variable), de); + gtk_action_connect_proxy (de->invoke_weight_cases_dialog, + get_widget_assert (de->xml, "data_weight-cases") + ); + + /* + g_signal_connect (get_widget_assert (de->xml,"data_weight-cases"), + "activate", + G_CALLBACK (weight_cases_dialog), + de); + */ + g_signal_connect (get_widget_assert (de->xml,"help_about"), "activate", @@ -275,6 +284,10 @@ new_data_editor (void) G_CALLBACK (value_labels_toggled), de); + gtk_action_connect_proxy (de->invoke_weight_cases_dialog, + get_widget_assert (de->xml, "button-weight-cases") + ); + g_signal_connect (get_widget_assert (de->xml, "file_quit"), "activate", G_CALLBACK (file_quit), de); @@ -336,8 +349,6 @@ click2column (GtkWidget *w, gint col, gpointer data) } - - void new_data_window (GtkMenuItem *menuitem, gpointer parent) { @@ -644,12 +655,9 @@ insert_variable (GtkCheckMenuItem *m, gpointer data) GtkSheet *var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); - - PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet) ); - switch ( gtk_notebook_get_current_page ( GTK_NOTEBOOK (notebook)) ) { case PAGE_VAR_SHEET: @@ -671,7 +679,188 @@ insert_variable (GtkCheckMenuItem *m, gpointer data) } psppire_dict_insert_variable (vs->dict, posn, NULL); +} + +/* Callback for when the dictionary changes its split variables */ +static void +on_split_change (PsppireDict *dict, gpointer data) +{ + struct data_editor *de = data; + + size_t n_split_vars = dict_get_split_cnt (dict->dict); + + GtkWidget *split_status_area = + get_widget_assert (de->xml, "split-file-status-area"); + + if ( n_split_vars == 0 ) + { + gtk_label_set_text (GTK_LABEL (split_status_area), _("No Split")); + } + else + { + gint i; + GString *text; + struct variable *const * split_vars = dict_get_split_vars (dict->dict); + + text = g_string_new (_("Split by ")); + + for (i = 0 ; i < n_split_vars - 1; ++i ) + { + g_string_append_printf (text, "%s, ", var_get_name (split_vars[i])); + } + g_string_append (text, var_get_name (split_vars[i])); + + gtk_label_set_text (GTK_LABEL (split_status_area), text->str); + + g_string_free (text, TRUE); + } +} + + +/* Callback for when the dictionary changes its filter variable */ +static void +on_filter_change (GObject *o, gint filter_index, gpointer data) +{ + struct data_editor *de = data; + GtkWidget *filter_status_area = + get_widget_assert (de->xml, "filter-use-status-area"); + + if ( filter_index == -1 ) + { + gtk_label_set_text (GTK_LABEL (filter_status_area), _("Filter off")); + } + else + { + GtkSheet *var_sheet = + GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); + + PsppireVarStore *vs = PSPPIRE_VAR_STORE + (gtk_sheet_get_model (var_sheet) ); + + struct variable *var = psppire_dict_get_variable (vs->dict, + filter_index); + + gchar *text = g_strdup_printf (_("Filter by %s"), var_get_name (var)); + + gtk_label_set_text (GTK_LABEL (filter_status_area), text); + + g_free (text); + } +} + +/* Callback for when the dictionary changes its weights */ +static void +on_weight_change (GObject *o, gint weight_index, gpointer data) +{ + struct data_editor *de = data; + GtkWidget *weight_status_area = + get_widget_assert (de->xml, "weight-status-area"); + + if ( weight_index == -1 ) + { + gtk_label_set_text (GTK_LABEL (weight_status_area), _("Weights off")); + } + else + { + GtkSheet *var_sheet = + GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); + + PsppireVarStore *vs = PSPPIRE_VAR_STORE + (gtk_sheet_get_model (var_sheet) ); + + struct variable *var = psppire_dict_get_variable (vs->dict, + weight_index); + + gchar *text = g_strdup_printf (_("Weight by %s"), var_get_name (var)); + + gtk_label_set_text (GTK_LABEL (weight_status_area), text); + + g_free (text); + } +} + +static void +weight_cases_dialog (GObject *o, gpointer data) +{ + gint response; + struct data_editor *de = data; + GtkSheet *var_sheet = + GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); + + + GladeXML *xml = glade_xml_new (PKGDATADIR "/psppire.glade", + "weight-cases-dialog", NULL); + + + GtkWidget *treeview = get_widget_assert (xml, "treeview"); + GtkWidget *entry = get_widget_assert (xml, "entry1"); + + + PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet)); + + PsppireVarSelect *select = psppire_var_select_new (treeview, + entry, vs->dict); + + + PsppireDialog *dialog = create_weight_dialog (select, xml); + + response = psppire_dialog_run (dialog); + + g_object_unref (xml); + switch (response) + { + case GTK_RESPONSE_OK: + { + struct getl_interface *sss ; + const GList *list = psppire_var_select_get_variables (select); + + g_assert ( g_list_length ((GList *)list) <= 1 ); + + if ( list == NULL) + { + sss = create_syntax_string_source ("WEIGHT OFF."); + } + else + { + struct variable *var = list->data; + + sss = create_syntax_string_source ("WEIGHT BY %s.\n", + var_get_name (var)); + } + + execute_syntax (sss); + } + break; + case PSPPIRE_RESPONSE_PASTE: + { + struct syntax_editor *se = (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL); + + const GList *list = psppire_var_select_get_variables (select); + + g_assert ( g_list_length ((GList *)list) <= 1 ); + + if ( list == NULL) + { + gtk_text_buffer_insert_at_cursor (se->buffer, "WEIGHT OFF.", -1); + } + else + { + struct variable *var = list->data; + + gchar *text = g_strdup_printf ("WEIGHT BY %s.", + var_get_name (var)); + + gtk_text_buffer_insert_at_cursor (se->buffer, + text, -1); + + g_free (text); + } + } + break; + default: + break; + } }