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=76612b5e9461fe7296a3c201ab791ef48cf353f3;hpb=5023955f3e48b1b0a703a38d654467360c0794a6;p=pspp diff --git a/src/ui/gui/data-editor.c b/src/ui/gui/data-editor.c index 76612b5e94..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,25 @@ #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); + /* Switch between the VAR SHEET and the DATA SHEET */ enum {PAGE_DATA_SHEET = 0, PAGE_VAR_SHEET}; @@ -52,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, @@ -97,6 +110,7 @@ disable_edit_clear (GtkWidget *w, gint x, gint y, gpointer data) return FALSE; } +static void weight_cases_dialog (GObject *o, gpointer data); /* @@ -107,6 +121,8 @@ new_data_editor (void) { struct data_editor *de ; struct editor_window *e; + GtkSheet *var_sheet ; + PsppireVarStore *vs; de = g_malloc (sizeof (*de)); @@ -114,8 +130,35 @@ new_data_editor (void) de->xml = glade_xml_new (PKGDATADIR "/data-editor.glade", NULL, NULL); + + var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); + + vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet)); + + g_signal_connect (vs->dict, "weight-changed", + 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"), @@ -145,6 +188,22 @@ new_data_editor (void) de); + g_signal_connect (get_widget_assert (de->xml,"data_insert-variable"), + "activate", + 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", @@ -225,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); @@ -235,6 +298,7 @@ new_data_editor (void) G_CALLBACK (minimise_all_windows), NULL); + select_sheet (de, PAGE_DATA_SHEET); return de; @@ -285,8 +349,6 @@ click2column (GtkWidget *w, gint col, gpointer data) } - - void new_data_window (GtkMenuItem *menuitem, gpointer parent) { @@ -297,7 +359,7 @@ new_data_window (GtkMenuItem *menuitem, gpointer parent) static void select_sheet (struct data_editor *de, guint page_num) { - GtkWidget *insert_variable = get_widget_assert (de->xml, "insert-variable"); + GtkWidget *insert_variable = get_widget_assert (de->xml, "data_insert-variable"); GtkWidget *insert_cases = get_widget_assert (de->xml, "insert-cases"); GtkWidget *view_data = get_widget_assert (de->xml, "view_data"); @@ -314,8 +376,9 @@ select_sheet (struct data_editor *de, guint page_num) case PAGE_DATA_SHEET: gtk_widget_show (view_variables); gtk_widget_hide (view_data); - gtk_widget_set_sensitive (insert_variable, FALSE); +#if 0 gtk_widget_set_sensitive (insert_cases, TRUE); +#endif break; default: g_assert_not_reached (); @@ -405,7 +468,7 @@ static void status_bar_activate (GtkCheckMenuItem *menuitem, gpointer data) { struct data_editor *de = data; - GtkWidget *statusbar = get_widget_assert (de->xml, "statusbar"); + GtkWidget *statusbar = get_widget_assert (de->xml, "status-bar"); if ( gtk_check_menu_item_get_active (menuitem) ) gtk_widget_show (statusbar); @@ -414,8 +477,6 @@ status_bar_activate (GtkCheckMenuItem *menuitem, gpointer data) } - - static void grid_lines_activate (GtkCheckMenuItem *menuitem, gpointer data) { @@ -579,3 +640,227 @@ on_clear_activate (GtkMenuItem *menuitem, gpointer data) g_assert_not_reached (); } } + + +/* Insert a new variable before the current row in the variable sheet, + or before the current column in the data sheet, whichever is selected */ +static void +insert_variable (GtkCheckMenuItem *m, gpointer data) +{ + struct data_editor *de = data; + gint posn; + + GtkWidget *notebook = get_widget_assert (de->xml, "notebook"); + + 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: + posn = var_sheet->active_cell.row; + break; + case PAGE_DATA_SHEET: + { + GtkSheet *data_sheet = + GTK_SHEET (get_widget_assert (de->xml, "data_sheet")); + + if ( data_sheet->state == GTK_SHEET_COLUMN_SELECTED ) + posn = data_sheet->range.col0; + else + posn = data_sheet->active_cell.col; + } + break; + default: + g_assert_not_reached (); + } + + 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; + } +} + +