X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-data-editor.c;h=02130f699f994b64926bcbf8aa7164be37471d31;hb=bc632e6f82af2edb7e1c3f9feb9901deaa5038c0;hp=1db96b155652fdd04198e4c3ef8bd3dab6a7975a;hpb=81622911cfbb5f21b20c04dc88c711ecb45a9504;p=pspp-builds.git diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c index 1db96b15..02130f69 100644 --- a/src/ui/gui/psppire-data-editor.c +++ b/src/ui/gui/psppire-data-editor.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyrigght (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008 Free Software Foundation, Inc. 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 @@ -17,20 +17,25 @@ #include #include #include -#include +#include #include "psppire-data-editor.h" #include "psppire-var-sheet.h" -#include #include #include "psppire-data-store.h" +#include +#include #include "helper.h" +#include #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid +static void psppire_data_editor_remove_split (PsppireDataEditor *de); +static void psppire_data_editor_set_split (PsppireDataEditor *de); + enum { DATA_SELECTION_CHANGED, DATA_AVAILABLE_CHANGED, @@ -118,16 +123,24 @@ static void popup_cases_menu (GtkSheet *sheet, gint row, static gboolean on_data_column_clicked (PsppireDataEditor *de, gint col, gpointer data) { - + GtkSheetRange visible_range; gint current_row, current_column; - gtk_notebook_set_current_page (GTK_NOTEBOOK (de), PSPPIRE_DATA_EDITOR_VARIABLE_VIEW); + gtk_notebook_set_current_page (GTK_NOTEBOOK (de), + PSPPIRE_DATA_EDITOR_VARIABLE_VIEW); gtk_sheet_get_active_cell (GTK_SHEET (de->var_sheet), ¤t_row, ¤t_column); gtk_sheet_set_active_cell (GTK_SHEET (de->var_sheet), col, current_column); + + gtk_sheet_get_visible_range (GTK_SHEET (de->var_sheet), &visible_range); + + if ( col < visible_range.row0 || col > visible_range.rowi) + gtk_sheet_moveto (GTK_SHEET (de->var_sheet), col, current_column, 0.5, 0.5); + + return FALSE; } @@ -143,23 +156,37 @@ on_var_row_clicked (PsppireDataEditor *de, gint row, gpointer data) gtk_notebook_set_current_page (GTK_NOTEBOOK(de), PSPPIRE_DATA_EDITOR_DATA_VIEW); - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), ¤t_row, ¤t_column); - gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet), current_row, row); + gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet[0]), current_row, row); - gtk_sheet_get_visible_range (GTK_SHEET (de->data_sheet), &visible_range); + gtk_sheet_get_visible_range (GTK_SHEET (de->data_sheet[0]), &visible_range); if ( row < visible_range.col0 || row > visible_range.coli) - { - gtk_sheet_moveto (GTK_SHEET (de->data_sheet), - current_row, row, 0, 0); - } + gtk_sheet_moveto (GTK_SHEET (de->data_sheet[0]), -1, row, 0.5, 0.5); return FALSE; } +/* Moves the focus to a new cell. + Returns TRUE iff the move should be disallowed */ +static gboolean +traverse_cell_callback (GtkSheet *sheet, + GtkSheetCell *existing_cell, + GtkSheetCell *new_cell, + gpointer data) +{ + PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); + const PsppireDict *dict = de->data_store->dict; + + if ( new_cell->col >= psppire_dict_get_var_cnt (dict)) + return TRUE; + + return FALSE; +} + enum { @@ -171,29 +198,153 @@ enum PROP_VALUE_LABELS, PROP_CURRENT_CASE, PROP_CURRENT_VAR, - PROP_DATA_SELECTED + PROP_DATA_SELECTED, + PROP_SPLIT_WINDOW }; + +#define WIDTH_OF_M 10 +#define DEFAULT_ROW_HEIGHT 25 + +static void +new_data_callback (PsppireDataStore *ds, gpointer data) +{ + PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); + gint i; + for (i = 0 ; i < 4 ; ++i) + { + PsppireAxisUniform *vaxis; + casenumber n_cases = psppire_case_file_get_case_count (ds->case_file); + + g_object_get (de->data_sheet[i], "vertical-axis", &vaxis, NULL); + + psppire_axis_uniform_set_count (vaxis, n_cases); + } +} + +static void +new_variables_callback (PsppireDict *dict, gpointer data) +{ + gint v, i; + PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); + + PsppireAxisHetero *vaxis; + g_object_get (de->var_sheet, "vertical-axis", &vaxis, NULL); + + psppire_axis_hetero_clear (vaxis); + + for (v = 0 ; v < psppire_dict_get_var_cnt (dict); ++v) + psppire_axis_hetero_append (vaxis, DEFAULT_ROW_HEIGHT); + + for (i = 0 ; i < 4 ; ++i) + { + PsppireAxisHetero *haxis; + g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL); + + psppire_axis_hetero_clear (haxis); + + for (v = 0 ; v < psppire_dict_get_var_cnt (dict); ++v) + { + const struct variable *var = psppire_dict_get_variable (dict, v); + + psppire_axis_hetero_append (haxis, 10 * var_get_display_width (var)); + } + } +} + +static void +insert_variable_callback (PsppireDict *dict, gint x, gpointer data) +{ + gint i; + PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); + + PsppireAxisHetero *var_vaxis; + g_object_get (de->var_sheet, "vertical-axis", &var_vaxis, NULL); + + psppire_axis_hetero_insert (var_vaxis, DEFAULT_ROW_HEIGHT, x); + + for (i = 0 ; i < 4 ; ++i) + { + const struct variable *var = psppire_dict_get_variable (dict, x); + PsppireAxisHetero *haxis; + g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL); + + psppire_axis_hetero_insert (haxis, WIDTH_OF_M * var_get_display_width (var), x); + } +} + + +static void +delete_variable_callback (PsppireDict *dict, gint posn, + gint x UNUSED, gint y UNUSED, gpointer data) +{ + gint i; + PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); + + PsppireAxisHetero *var_vaxis; + g_object_get (de->var_sheet, "vertical-axis", &var_vaxis, NULL); + + psppire_axis_hetero_remove (var_vaxis, posn); + + for (i = 0 ; i < 4 ; ++i) + { + PsppireAxisHetero *haxis; + g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL); + + psppire_axis_hetero_remove (haxis, posn); + } +} + + +static void +rewidth_variable_callback (PsppireDict *dict, gint posn, gpointer data) +{ + gint i; + PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); + + for (i = 0 ; i < 4 ; ++i) + { + const struct variable *var = psppire_dict_get_variable (dict, posn); + PsppireAxisHetero *haxis; + g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL); + + psppire_axis_hetero_resize_unit (haxis, + WIDTH_OF_M * + var_get_display_width (var), posn); + } +} + + static void psppire_data_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { + int i; PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (object); switch (prop_id) { + case PROP_SPLIT_WINDOW: + psppire_data_editor_split_window (de, g_value_get_boolean (value)); + break; case PROP_DATA_STORE: if ( de->data_store) g_object_unref (de->data_store); de->data_store = g_value_get_pointer (value); g_object_ref (de->data_store); - g_object_set (de->data_sheet, - "row-geometry", de->data_store, - "column-geometry", de->data_store, - "model", de->data_store, - NULL); + for (i = 0 ; i < 4 ; ++i ) + g_object_set (de->data_sheet[i], + "model", de->data_store, + NULL); + + g_signal_connect (de->data_store->dict, "backend-changed", G_CALLBACK (new_variables_callback), de); + g_signal_connect (de->data_store->dict, "variable-inserted", G_CALLBACK (insert_variable_callback), de); + g_signal_connect (de->data_store->dict, "variable-deleted", G_CALLBACK (delete_variable_callback), de); + g_signal_connect (de->data_store->dict, "variable-display-width-changed", G_CALLBACK (rewidth_variable_callback), de); + + g_signal_connect (de->data_store, "backend-changed", G_CALLBACK (new_data_callback), de); break; case PROP_VAR_STORE: if ( de->var_store) g_object_unref (de->var_store); @@ -201,7 +352,6 @@ psppire_data_editor_set_property (GObject *object, g_object_ref (de->var_store); g_object_set (de->var_sheet, - "row-geometry", de->var_store, "model", de->var_store, NULL); break; @@ -209,7 +359,7 @@ psppire_data_editor_set_property (GObject *object, { GObject *menu = g_value_get_object (value); - g_signal_connect (de->data_sheet, "button-event-column", + g_signal_connect (de->data_sheet[0], "button-event-column", G_CALLBACK (popup_variable_menu), menu); } break; @@ -217,7 +367,7 @@ psppire_data_editor_set_property (GObject *object, { GObject *menu = g_value_get_object (value); - g_signal_connect (de->data_sheet, "button-event-row", + g_signal_connect (de->data_sheet[0], "button-event-row", G_CALLBACK (popup_cases_menu), menu); } break; @@ -228,14 +378,14 @@ psppire_data_editor_set_property (GObject *object, switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (object))) { case PSPPIRE_DATA_EDITOR_DATA_VIEW: - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col); - gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet), row, var); - gtk_sheet_moveto (GTK_SHEET (de->data_sheet), row, var, 0.5, 0.5); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col); + gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet[0]), row, var); + gtk_sheet_moveto (GTK_SHEET (de->data_sheet[0]), -1, var, 0.5, 0.5); break; case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW: gtk_sheet_get_active_cell (GTK_SHEET (de->var_sheet), &row, &col); gtk_sheet_set_active_cell (GTK_SHEET (de->var_sheet), var, col); - gtk_sheet_moveto (GTK_SHEET (de->var_sheet), var, col, 0.5, 0.5); + gtk_sheet_moveto (GTK_SHEET (de->var_sheet), var, -1, 0.5, 0.5); break; default: g_assert_not_reached (); @@ -247,9 +397,9 @@ psppire_data_editor_set_property (GObject *object, { gint row, col; gint case_num = g_value_get_long (value); - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col); - gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet), case_num, col); - gtk_sheet_moveto (GTK_SHEET (de->data_sheet), case_num, col, 0.5, 0.5); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col); + gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet[0]), case_num, col); + gtk_sheet_moveto (GTK_SHEET (de->data_sheet[0]), case_num, -1, 0.5, 0.5); } break; case PROP_VALUE_LABELS: @@ -274,6 +424,9 @@ psppire_data_editor_get_property (GObject *object, switch (prop_id) { + case PROP_SPLIT_WINDOW: + g_value_set_boolean (value, de->split); + break; case PROP_DATA_STORE: g_value_set_pointer (value, de->data_store); break; @@ -283,14 +436,14 @@ psppire_data_editor_get_property (GObject *object, case PROP_CURRENT_CASE: { gint row, column; - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &column); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &column); g_value_set_long (value, row); } break; case PROP_CURRENT_VAR: { gint row, column; - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &column); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &column); g_value_set_long (value, column); } break; @@ -315,6 +468,7 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass) GParamSpec *current_case_spec; GParamSpec *current_var_spec; GParamSpec *data_selected_spec; + GParamSpec *split_window_spec; GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); @@ -419,6 +573,17 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass) + split_window_spec = + g_param_spec_boolean ("split", + "Split Window", + "True iff the data sheet is split", + FALSE, + G_PARAM_READABLE | G_PARAM_WRITABLE); + + g_object_class_install_property (object_class, + PROP_SPLIT_WINDOW, + split_window_spec); + data_editor_signals [DATA_SELECTION_CHANGED] = g_signal_new ("data-selection-changed", G_TYPE_FROM_CLASS (klass), @@ -468,7 +633,10 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass) /* 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) +update_data_ref_entry (const GtkSheet *sheet, + gint row, gint col, + gint old_row, gint old_col, + gpointer data) { PsppireDataEditor *de = data; @@ -533,7 +701,7 @@ datum_entry_activate (GtkEntry *entry, gpointer data) const gchar *text = gtk_entry_get_text (entry); - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &column); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &column); if ( row == -1 || column == -1) return; @@ -541,9 +709,7 @@ datum_entry_activate (GtkEntry *entry, gpointer data) psppire_data_store_set_string (de->data_store, text, row, column); } - static void on_activate (PsppireDataEditor *de); -static void on_deactivate (PsppireDataEditor *de); static gboolean on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p, gint pagenum, gpointer data); static void on_select_range (PsppireDataEditor *de); @@ -563,16 +729,99 @@ on_map (GtkWidget *w) } +static void +init_sheet (PsppireDataEditor *de, int i, + GtkAdjustment *hadj, GtkAdjustment *vadj) +{ + PsppireAxisHetero *haxis = psppire_axis_hetero_new (); + PsppireAxisUniform *vaxis = psppire_axis_uniform_new (); + de->sheet_bin[i] = gtk_scrolled_window_new (hadj, vadj); + + de->data_sheet[i] = gtk_sheet_new (NULL); + + g_object_set (de->sheet_bin[i], + "border-width", 3, + "shadow-type", GTK_SHADOW_ETCHED_IN, + NULL); + + g_object_set (haxis, "default-size", 75, NULL); + g_object_set (vaxis, "default-size", 25, NULL); + + g_object_set (de->data_sheet[i], + "horizontal-axis", haxis, + "vertical-axis", vaxis, + NULL); + + gtk_container_add (GTK_CONTAINER (de->sheet_bin[i]), de->data_sheet[i]); + + g_signal_connect (de->data_sheet[i], "traverse", + G_CALLBACK (traverse_cell_callback), de); + + gtk_widget_show (de->sheet_bin[i]); +} + + +static void +init_data_sheet (PsppireDataEditor *de) +{ + GtkAdjustment *va0, *ha0; + GtkAdjustment *va1, *ha1; + GtkWidget *sheet ; + + de->split = TRUE; + de->paned = gtk_xpaned_new (); + + init_sheet (de, 0, NULL, NULL); + gtk_widget_show (de->sheet_bin[0]); + va0 = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[0])); + ha0 = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[0])); + + g_object_set (de->sheet_bin[0], "vscrollbar-policy", GTK_POLICY_NEVER, NULL); + g_object_set (de->sheet_bin[0], "hscrollbar-policy", GTK_POLICY_NEVER, NULL); + + init_sheet (de, 1, NULL, va0); + gtk_widget_show (de->sheet_bin[1]); + sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[1])); + gtk_sheet_hide_row_titles (GTK_SHEET (sheet)); + ha1 = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[1])); + g_object_set (de->sheet_bin[1], "vscrollbar-policy", GTK_POLICY_ALWAYS, NULL); + g_object_set (de->sheet_bin[1], "hscrollbar-policy", GTK_POLICY_NEVER, NULL); + + init_sheet (de, 2, ha0, NULL); + gtk_widget_show (de->sheet_bin[2]); + sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[2])); + gtk_sheet_hide_column_titles (GTK_SHEET (sheet)); + g_object_set (de->sheet_bin[2], "vscrollbar-policy", GTK_POLICY_NEVER, NULL); + g_object_set (de->sheet_bin[2], "hscrollbar-policy", GTK_POLICY_ALWAYS, NULL); + va1 = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[2])); + + init_sheet (de, 3, ha1, va1); + gtk_widget_show (de->sheet_bin[3]); + sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[3])); + gtk_sheet_hide_column_titles (GTK_SHEET (sheet)); + gtk_sheet_hide_row_titles (GTK_SHEET (sheet)); + g_object_set (de->sheet_bin[3], "vscrollbar-policy", GTK_POLICY_ALWAYS, NULL); + g_object_set (de->sheet_bin[3], "hscrollbar-policy", GTK_POLICY_ALWAYS, NULL); + + gtk_xpaned_pack_top_left (GTK_XPANED (de->paned), de->sheet_bin[0], TRUE, TRUE); + gtk_xpaned_pack_top_right (GTK_XPANED (de->paned), de->sheet_bin[1], TRUE, TRUE); + gtk_xpaned_pack_bottom_left (GTK_XPANED (de->paned), de->sheet_bin[2], TRUE, TRUE); + gtk_xpaned_pack_bottom_right (GTK_XPANED (de->paned), de->sheet_bin[3], TRUE, TRUE); + + gtk_xpaned_set_position_y (GTK_XPANED (de->paned), 150); + gtk_xpaned_set_position_x (GTK_XPANED (de->paned), 350); +} + + static void psppire_data_editor_init (PsppireDataEditor *de) { - GtkWidget *vbox = gtk_vbox_new (FALSE, 0); GtkWidget *hbox = gtk_hbox_new (FALSE, 0); - GtkWidget *sw_ds = gtk_scrolled_window_new (NULL, NULL); GtkWidget *sw_vs = gtk_scrolled_window_new (NULL, NULL); + init_data_sheet (de); - de->data_sheet = gtk_sheet_new (NULL, NULL, NULL); + de->data_vbox = gtk_vbox_new (FALSE, 0); de->var_sheet = psppire_var_sheet_new (); g_object_set (de, "tab-pos", GTK_POS_BOTTOM, NULL); @@ -594,19 +843,21 @@ psppire_data_editor_init (PsppireDataEditor *de) gtk_widget_show_all (sw_vs); - gtk_container_add (GTK_CONTAINER (sw_ds), de->data_sheet); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), sw_ds, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (de->data_vbox), hbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (de->data_vbox), de->paned, TRUE, TRUE, 0); + - gtk_widget_show_all (vbox); + psppire_data_editor_remove_split (de); - gtk_notebook_append_page (GTK_NOTEBOOK (de), vbox, + gtk_widget_show_all (de->data_vbox); + + gtk_notebook_append_page (GTK_NOTEBOOK (de), de->data_vbox, gtk_label_new_with_mnemonic (_("Data View"))); gtk_notebook_append_page (GTK_NOTEBOOK (de), sw_vs, gtk_label_new_with_mnemonic (_("Variable View"))); - g_signal_connect (de->data_sheet, "activate", + g_signal_connect (de->data_sheet[0], "activate", G_CALLBACK (update_data_ref_entry), de); @@ -615,7 +866,7 @@ psppire_data_editor_init (PsppireDataEditor *de) de); - g_signal_connect_swapped (de->data_sheet, + g_signal_connect_swapped (de->data_sheet[0], "double-click-column", G_CALLBACK (on_data_column_clicked), de); @@ -625,22 +876,18 @@ psppire_data_editor_init (PsppireDataEditor *de) G_CALLBACK (on_var_row_clicked), de); - g_signal_connect_swapped (de->data_sheet, "activate", + g_signal_connect_swapped (de->data_sheet[0], "activate", G_CALLBACK (on_activate), de); - g_signal_connect_swapped (de->data_sheet, "deactivate", - G_CALLBACK (on_deactivate), - de); - - g_signal_connect_swapped (de->data_sheet, "select-range", + g_signal_connect_swapped (de->data_sheet[0], "select-range", G_CALLBACK (on_select_range), de); - g_signal_connect (de->data_sheet, "select-row", + g_signal_connect (de->data_sheet[0], "select-row", G_CALLBACK (on_select_row), de); - g_signal_connect (de->data_sheet, "select-column", + g_signal_connect (de->data_sheet[0], "select-column", G_CALLBACK (on_select_variable), de); @@ -655,6 +902,12 @@ psppire_data_editor_init (PsppireDataEditor *de) g_signal_connect (de, "map", G_CALLBACK (on_map), NULL); + + + // gtk_sheet_hide_column_titles (de->var_sheet); + // gtk_sheet_hide_row_titles (de->data_sheet); + + de->dispose_has_run = FALSE; } @@ -663,14 +916,71 @@ GtkWidget* psppire_data_editor_new (PsppireVarStore *var_store, PsppireDataStore *data_store) { - GtkWidget *widget; + return g_object_new (PSPPIRE_DATA_EDITOR_TYPE, + "var-store", var_store, + "data-store", data_store, + NULL); +} + + +static void +psppire_data_editor_remove_split (PsppireDataEditor *de) +{ + if ( !de->split ) return; + de->split = FALSE; + + g_object_ref (de->sheet_bin[0]); + gtk_container_remove (GTK_CONTAINER (de->paned), de->sheet_bin[0]); + + g_object_ref (de->paned); + gtk_container_remove (GTK_CONTAINER (de->data_vbox), de->paned); - widget = g_object_new (PSPPIRE_DATA_EDITOR_TYPE, - "var-store", var_store, - "data-store", data_store, - NULL); + gtk_box_pack_start (GTK_BOX (de->data_vbox), de->sheet_bin[0], + TRUE, TRUE, 0); - return widget; + g_object_unref (de->sheet_bin[0]); + + g_object_set (de->sheet_bin[0], "vscrollbar-policy", + GTK_POLICY_ALWAYS, NULL); + + g_object_set (de->sheet_bin[0], "hscrollbar-policy", + GTK_POLICY_ALWAYS, NULL); +} + + +static void +psppire_data_editor_set_split (PsppireDataEditor *de) +{ + if ( de->split ) return; + de->split = TRUE; + + g_object_ref (de->sheet_bin[0]); + gtk_container_remove (GTK_CONTAINER (de->data_vbox), de->sheet_bin[0]); + + gtk_xpaned_pack_top_left (GTK_XPANED (de->paned), de->sheet_bin [0], + TRUE, TRUE); + + gtk_box_pack_start (GTK_BOX (de->data_vbox), de->paned, + TRUE, TRUE, 0); + + g_object_unref (de->paned); + + g_object_set (de->sheet_bin[0], "vscrollbar-policy", + GTK_POLICY_NEVER, NULL); + + g_object_set (de->sheet_bin[0], "hscrollbar-policy", + GTK_POLICY_NEVER, NULL); +} + +void +psppire_data_editor_split_window (PsppireDataEditor *de, gboolean split) +{ + if (split ) + psppire_data_editor_set_split (de); + else + psppire_data_editor_remove_split (de); + + gtk_widget_show_all (de->data_vbox); } static void data_sheet_set_clip (GtkSheet *sheet); @@ -682,7 +992,7 @@ static void data_sheet_contents_received_callback (GtkClipboard *clipboard, void psppire_data_editor_clip_copy (PsppireDataEditor *de) { - data_sheet_set_clip (GTK_SHEET (de->data_sheet)); + data_sheet_set_clip (GTK_SHEET (de->data_sheet[0])); } void @@ -708,16 +1018,16 @@ psppire_data_editor_clip_cut (PsppireDataEditor *de) GtkSheetRange range; PsppireDataStore *ds = de->data_store; - data_sheet_set_clip (GTK_SHEET (de->data_sheet)); + data_sheet_set_clip (GTK_SHEET (de->data_sheet[0])); /* Now blank all the cells */ - gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet), &range); + gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet[0]), &range); /* If nothing selected, then use active cell */ if ( range.row0 < 0 || range.col0 < 0 ) { gint row, col; - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col); range.row0 = range.rowi = row; range.col0 = range.coli = col; @@ -758,7 +1068,7 @@ psppire_data_editor_clip_cut (PsppireDataEditor *de) } /* and remove the selection */ - gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet)); + gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet[0])); } @@ -840,7 +1150,7 @@ void psppire_data_editor_sort_ascending (PsppireDataEditor *de) { GtkSheetRange range; - gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet), &range); + gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet[0]), &range); do_sort (de->data_store, range.col0, FALSE); } @@ -852,7 +1162,7 @@ void psppire_data_editor_sort_descending (PsppireDataEditor *de) { GtkSheetRange range; - gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet), &range); + gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet[0]), &range); do_sort (de->data_store, range.col0, TRUE); } @@ -865,14 +1175,26 @@ psppire_data_editor_sort_descending (PsppireDataEditor *de) void psppire_data_editor_insert_variable (PsppireDataEditor *de) { - glong posn = -1; - - if ( de->data_sheet->state == GTK_SHEET_COLUMN_SELECTED ) - posn = GTK_SHEET (de->data_sheet)->range.col0; - else - posn = GTK_SHEET (de->data_sheet)->active_cell.col; + glong posn = 0; - if ( posn == -1 ) posn = 0; + switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (de))) + { + case PSPPIRE_DATA_EDITOR_DATA_VIEW: + if ( de->data_sheet[0]->state == GTK_SHEET_COLUMN_SELECTED ) + posn = GTK_SHEET (de->data_sheet[0])->range.col0; + else + posn = GTK_SHEET (de->data_sheet[0])->active_cell.col; + break; + case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW: + if ( de->var_sheet->state == GTK_SHEET_ROW_SELECTED ) + posn = GTK_SHEET (de->var_sheet)->range.row0; + else + posn = GTK_SHEET (de->var_sheet)->active_cell.row; + break; + default: + g_assert_not_reached (); + break; + }; psppire_dict_insert_variable (de->data_store->dict, posn, NULL); } @@ -883,10 +1205,10 @@ psppire_data_editor_insert_case (PsppireDataEditor *de) { glong posn = -1; - if ( de->data_sheet->state == GTK_SHEET_ROW_SELECTED ) - posn = GTK_SHEET (de->data_sheet)->range.row0; + if ( de->data_sheet[0]->state == GTK_SHEET_ROW_SELECTED ) + posn = GTK_SHEET (de->data_sheet[0])->range.row0; else - posn = GTK_SHEET (de->data_sheet)->active_cell.row; + posn = GTK_SHEET (de->data_sheet[0])->active_cell.row; if ( posn == -1 ) posn = 0; @@ -897,12 +1219,12 @@ psppire_data_editor_insert_case (PsppireDataEditor *de) void psppire_data_editor_delete_cases (PsppireDataEditor *de) { - gint first = GTK_SHEET (de->data_sheet)->range.row0; - gint n = GTK_SHEET (de->data_sheet)->range.rowi - first + 1; + gint first = GTK_SHEET (de->data_sheet[0])->range.row0; + gint n = GTK_SHEET (de->data_sheet[0])->range.rowi - first + 1; psppire_data_store_delete_cases (de->data_store, first, n); - gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet)); + gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet[0])); } /* Delete the variables currently selected in the @@ -915,8 +1237,8 @@ psppire_data_editor_delete_variables (PsppireDataEditor *de) switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (de))) { case PSPPIRE_DATA_EDITOR_DATA_VIEW: - first = GTK_SHEET (de->data_sheet)->range.col0; - n = GTK_SHEET (de->data_sheet)->range.coli - first + 1; + first = GTK_SHEET (de->data_sheet[0])->range.col0; + n = GTK_SHEET (de->data_sheet[0])->range.coli - first + 1; break; case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW: first = GTK_SHEET (de->var_sheet)->range.row0; @@ -929,7 +1251,7 @@ psppire_data_editor_delete_variables (PsppireDataEditor *de) psppire_dict_delete_variables (de->var_store->dict, first, n); - gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet)); + gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet[0])); gtk_sheet_unselect_range (GTK_SHEET (de->var_sheet)); } @@ -938,14 +1260,30 @@ void psppire_data_editor_show_grid (PsppireDataEditor *de, gboolean grid_visible) { gtk_sheet_show_grid (GTK_SHEET (de->var_sheet), grid_visible); - gtk_sheet_show_grid (GTK_SHEET (de->data_sheet), grid_visible); + gtk_sheet_show_grid (GTK_SHEET (de->data_sheet[0]), grid_visible); +} + + +static void +set_font (GtkWidget *w, gpointer data) +{ + PangoFontDescription *font_desc = data; + GtkRcStyle *style = gtk_widget_get_modifier_style (w); + + pango_font_description_free (style->font_desc); + style->font_desc = pango_font_description_copy (font_desc); + + gtk_widget_modify_style (w, style); + + if ( GTK_IS_CONTAINER (w)) + gtk_container_foreach (w, set_font, font_desc); } void psppire_data_editor_set_font (PsppireDataEditor *de, PangoFontDescription *font_desc) { - psppire_data_store_set_font (de->data_store, font_desc); - psppire_var_store_set_font (de->var_store, font_desc); + set_font (de, font_desc); + gtk_container_foreach (GTK_CONTAINER (de), set_font, font_desc); } @@ -960,11 +1298,13 @@ emit_selected_signal (PsppireDataEditor *de) g_signal_emit (de, data_editor_signals[DATA_SELECTION_CHANGED], 0, data_selected); } + static void on_activate (PsppireDataEditor *de) { gint row, col; - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col); + if ( row < psppire_data_store_get_case_count (de->data_store) && @@ -978,18 +1318,12 @@ on_activate (PsppireDataEditor *de) } -static void -on_deactivate (PsppireDataEditor *de) -{ - emit_selected_signal (de); -} - static void on_select_range (PsppireDataEditor *de) { GtkSheetRange range; - gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet), &range); + gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet[0]), &range); if ( range.rowi < psppire_data_store_get_case_count (de->data_store) && @@ -1004,7 +1338,8 @@ on_select_range (PsppireDataEditor *de) static gboolean -on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p, gint pagenum, gpointer data) +on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p, + gint pagenum, gpointer data) { if ( pagenum != PSPPIRE_DATA_EDITOR_DATA_VIEW ) { @@ -1028,7 +1363,7 @@ data_is_selected (PsppireDataEditor *de) if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (de)) != PSPPIRE_DATA_EDITOR_DATA_VIEW) return FALSE; - gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col); + gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col); if ( row >= psppire_data_store_get_case_count (de->data_store) || @@ -1037,7 +1372,7 @@ data_is_selected (PsppireDataEditor *de) return FALSE; } - gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet), &range); + gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet[0]), &range); if ( range.rowi >= psppire_data_store_get_case_count (de->data_store) || @@ -1377,7 +1712,7 @@ data_sheet_contents_received_callback (GtkClipboard *clipboard, c = (char *) sd->data; /* Paste text to selected position */ - gtk_sheet_get_active_cell (GTK_SHEET (data_editor->data_sheet), + gtk_sheet_get_active_cell (GTK_SHEET (data_editor->data_sheet[0]), &row, &column); g_return_if_fail (row >= 0); @@ -1440,3 +1775,5 @@ on_owner_change (GtkClipboard *clip, GdkEventOwnerChange *event, gpointer data) g_signal_emit (de, data_editor_signals[DATA_AVAILABLE_CHANGED], 0, compatible_target); } + +