X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fdata-editor.c;h=12bfa67c92b4f5120ee26976338aeaa692bf1781;hb=1ef647e1f18761552b1acce7b94547ae2abec49a;hp=5a0f83581953d82d1d671f4ef1c963022dbf00d3;hpb=fe3a0a8896cc9f099196f0d0228bb0cfa688c34a;p=pspp-builds.git diff --git a/src/ui/gui/data-editor.c b/src/ui/gui/data-editor.c index 5a0f8358..12bfa67c 100644 --- a/src/ui/gui/data-editor.c +++ b/src/ui/gui/data-editor.c @@ -35,6 +35,9 @@ #include "split-file-dialog.h" #include "transpose-dialog.h" #include "sort-cases-dialog.h" +#include "compute-dialog.h" +#include "comments-dialog.h" +#include "variable-info-dialog.h" #include "dict-display.h" #define _(msgid) gettext (msgid) @@ -49,14 +52,17 @@ #include "psppire-data-store.h" #include "psppire-var-store.h" -static void register_data_editor_actions (struct data_editor *de); -static void insert_variable (GtkCheckMenuItem *m, gpointer data); +/* Update the data_ref_entry with the reference of the active cell */ +static gint update_data_ref_entry (const GtkSheet *sheet, + gint row, gint col, gpointer data); + +static void register_data_editor_actions (struct data_editor *de); +static void insert_variable (GtkAction *, gpointer data); /* Switch between the VAR SHEET and the DATA SHEET */ -enum {PAGE_DATA_SHEET = 0, PAGE_VAR_SHEET}; static gboolean click2column (GtkWidget *w, gint col, gpointer data); @@ -165,7 +171,22 @@ on_recent_files_select (GtkMenuShell *menushell, gpointer user_data) #endif +static void +datum_entry_activate (GtkEntry *entry, gpointer data) +{ + gint row, column; + GtkSheet *data_sheet = GTK_SHEET (data); + PsppireDataStore *store = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet)); + const char *text = gtk_entry_get_text (entry); + + gtk_sheet_get_active_cell (data_sheet, &row, &column); + + if ( row == -1 || column == -1) + return; + + psppire_data_store_set_string (store, text, row, column); +} /* Create a new data editor. @@ -176,7 +197,9 @@ new_data_editor (void) struct data_editor *de ; struct editor_window *e; GtkSheet *var_sheet ; + GtkSheet *data_sheet ; PsppireVarStore *vs; + GtkWidget *datum_entry; de = g_malloc0 (sizeof (*de)); @@ -185,11 +208,22 @@ new_data_editor (void) de->xml = XML_NEW ("data-editor.glade"); var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet")); + data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet")); vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet)); g_assert(vs); /* Traps a possible bug in win32 build */ + g_signal_connect (G_OBJECT (data_sheet), "activate", + G_CALLBACK (update_data_ref_entry), + de->xml); + + datum_entry = get_widget_assert (de->xml, "datum_entry"); + + g_signal_connect (G_OBJECT (datum_entry), "activate", + G_CALLBACK (datum_entry_activate), + data_sheet); + g_signal_connect (vs->dict, "weight-changed", G_CALLBACK (on_weight_change), de); @@ -207,6 +241,24 @@ new_data_editor (void) register_data_editor_actions (de); + de->insert_variable = + gtk_action_new ("insert-variable", + _("Insert Variable"), + _("Create a new variable at the current position"), + "pspp-insert-variable"); + + g_signal_connect (de->insert_variable, "activate", + G_CALLBACK (insert_variable), de); + + + gtk_action_connect_proxy (de->insert_variable, + get_widget_assert (de->xml, "button-insert-variable") + ); + + gtk_action_connect_proxy (de->insert_variable, + get_widget_assert (de->xml, "data_insert-variable") + ); + de->invoke_weight_cases_dialog = gtk_action_new ("weight-cases-dialog", _("Weights"), @@ -250,6 +302,33 @@ new_data_editor (void) G_CALLBACK (sort_cases_dialog), de); + de->invoke_compute_dialog = + gtk_action_new ("compute-dialog", + _("Compute"), + _("Compute new values for a variable"), + "pspp-compute"); + + g_signal_connect (de->invoke_compute_dialog, "activate", + G_CALLBACK (compute_dialog), de); + + de->invoke_comments_dialog = + gtk_action_new ("commments-dialog", + _("Data File Comments"), + _("Commentary text for the data file"), + NULL); + + g_signal_connect (de->invoke_comments_dialog, "activate", + G_CALLBACK (comments_dialog), de); + + de->invoke_variable_info_dialog = + gtk_action_new ("variable-info-dialog", + _("Variables"), + _("Jump to Variable"), + "pspp-goto-variable"); + + g_signal_connect (de->invoke_variable_info_dialog, "activate", + G_CALLBACK (variable_info_dialog), de); + e->window = GTK_WINDOW (get_widget_assert (de->xml, "data_editor")); g_signal_connect_swapped (get_widget_assert (de->xml,"file_new_data"), @@ -328,10 +407,6 @@ 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") @@ -349,6 +424,17 @@ new_data_editor (void) get_widget_assert (de->xml, "data_sort-cases") ); + gtk_action_connect_proxy (de->invoke_compute_dialog, + get_widget_assert (de->xml, "transform_compute") + ); + + gtk_action_connect_proxy (de->invoke_comments_dialog, + get_widget_assert (de->xml, "utilities_comments") + ); + + gtk_action_connect_proxy (de->invoke_variable_info_dialog, + get_widget_assert (de->xml, "utilities_variables") + ); g_signal_connect (get_widget_assert (de->xml,"help_about"), "activate", @@ -361,20 +447,16 @@ new_data_editor (void) G_CALLBACK (reference_manual), e->window); - - g_signal_connect (get_widget_assert (de->xml,"data_sheet"), "double-click-column", G_CALLBACK (click2column), de); - g_signal_connect (get_widget_assert (de->xml, "variable_sheet"), "double-click-row", GTK_SIGNAL_FUNC (click2row), de); - g_signal_connect (get_widget_assert (de->xml, "variable_sheet"), "select-row", GTK_SIGNAL_FUNC (enable_edit_clear), @@ -436,6 +518,10 @@ new_data_editor (void) get_widget_assert (de->xml, "button-save") ); + gtk_action_connect_proxy (de->invoke_variable_info_dialog, + get_widget_assert (de->xml, "button-goto-variable") + ); + gtk_action_connect_proxy (de->invoke_weight_cases_dialog, get_widget_assert (de->xml, "button-weight-cases") ); @@ -466,6 +552,7 @@ static gboolean click2row (GtkWidget *w, gint row, gpointer data) { struct data_editor *de = data; + GtkSheetRange visible_range; gint current_row, current_column; @@ -478,6 +565,14 @@ click2row (GtkWidget *w, gint row, gpointer data) gtk_sheet_set_active_cell (GTK_SHEET (data_sheet), current_row, row); + gtk_sheet_get_visible_range (GTK_SHEET (data_sheet), &visible_range); + + if ( row < visible_range.col0 || row > visible_range.coli) + { + gtk_sheet_moveto (GTK_SHEET (data_sheet), + current_row, row, 0, 0); + } + return FALSE; } @@ -747,10 +842,10 @@ on_clear_activate (GtkMenuItem *menuitem, gpointer data) /* 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) +insert_variable (GtkAction *action, gpointer data) { struct data_editor *de = data; - gint posn; + gint posn = -1; GtkWidget *notebook = get_widget_assert (de->xml, "notebook"); @@ -780,6 +875,8 @@ insert_variable (GtkCheckMenuItem *m, gpointer data) g_assert_not_reached (); } + if ( posn == -1 ) posn = 0; + psppire_dict_insert_variable (vs->dict, posn, NULL); } @@ -1181,3 +1278,64 @@ open_data_dialog (GtkAction *action, struct data_editor *de) gtk_widget_destroy (dialog); } + + + +/* Update the data_ref_entry with the reference of the active cell */ +static gint +update_data_ref_entry (const GtkSheet *sheet, gint row, gint col, gpointer data) +{ + GladeXML *data_editor_xml = data; + + PsppireDataStore *data_store = + PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet)); + + g_return_val_if_fail (data_editor_xml, FALSE); + + if (data_store) + { + const struct variable *var = + psppire_dict_get_variable (data_store->dict, col); + + /* The entry where the reference to the current cell is displayed */ + GtkEntry *cell_ref_entry = + GTK_ENTRY (get_widget_assert (data_editor_xml, + "cell_ref_entry")); + GtkEntry *datum_entry = + GTK_ENTRY (get_widget_assert (data_editor_xml, + "datum_entry")); + + if ( var ) + { + gchar *text = g_strdup_printf ("%d: %s", row, + var_get_name (var)); + + gchar *s = pspp_locale_to_utf8 (text, -1, 0); + + g_free (text); + + gtk_entry_set_text (cell_ref_entry, s); + + g_free (s); + } + else + gtk_entry_set_text (cell_ref_entry, ""); + + + if ( var ) + { + gchar *text = + psppire_data_store_get_string (data_store, row, + var_get_dict_index(var)); + g_strchug (text); + + gtk_entry_set_text (datum_entry, text); + + free (text); + } + else + gtk_entry_set_text (datum_entry, ""); + } + + return FALSE; +}