- value_labels_spec);
-
-
- current_case_spec =
- g_param_spec_long ("current-case",
- "Current Case",
- "Zero based number of the selected case",
- 0, CASENUMBER_MAX,
- 0,
- G_PARAM_WRITABLE | G_PARAM_READABLE);
-
- g_object_class_install_property (object_class,
- PROP_CURRENT_CASE,
- current_case_spec);
-
-
- current_var_spec =
- g_param_spec_long ("current-variable",
- "Current Variable",
- "Zero based number of the selected variable",
- 0, G_MAXINT,
- 0,
- G_PARAM_WRITABLE | G_PARAM_READABLE);
-
- g_object_class_install_property (object_class,
- PROP_CURRENT_VAR,
- current_var_spec);
-
-
- data_selected_spec =
- g_param_spec_boolean ("data-selected",
- "Data Selected",
- "True iff the data view is active and one or more cells of data have been selected.",
- FALSE,
- G_PARAM_READABLE);
-
- g_object_class_install_property (object_class,
- PROP_DATA_SELECTED,
- data_selected_spec);
-
-
-
- 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),
- G_SIGNAL_RUN_FIRST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__BOOLEAN,
- G_TYPE_NONE,
- 1,
- G_TYPE_BOOLEAN);
-
- data_editor_signals [CASES_SELECTED] =
- g_signal_new ("cases-selected",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE,
- 1,
- G_TYPE_INT);
-
-
- data_editor_signals [VARIABLES_SELECTED] =
- g_signal_new ("variables-selected",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE,
- 1,
- G_TYPE_INT);
-
-
- data_editor_signals [DATA_AVAILABLE_CHANGED] =
- g_signal_new ("data-available-changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__BOOLEAN,
- G_TYPE_NONE,
- 1,
- G_TYPE_BOOLEAN);
-}
-
-/* Update the data_ref_entry with the reference of the active cell */
-static gint
-update_data_ref_entry (const PsppireSheet *sheet,
- gint row, gint col,
- gint old_row, gint old_col,
- gpointer data)
-{
- PsppireDataEditor *de = data;
-
- PsppireDataStore *data_store =
- PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet));
-
- if (data_store)
- {
- const struct variable *var =
- psppire_dict_get_variable (data_store->dict, col);
-
- if ( var )
- {
- gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER,
- var_get_name (var));
-
- gchar *s = pspp_locale_to_utf8 (text, -1, 0);
-
- g_free (text);
-
- gtk_entry_set_text (GTK_ENTRY (de->cell_ref_entry), s);
-
- g_free (s);
- }
- else
- goto blank_entry;
-
- if ( var )
- {
- gchar *text =
- psppire_data_store_get_string (data_store, row,
- var_get_dict_index(var));
-
- if ( ! text )
- goto blank_entry;
-
- g_strchug (text);
-
- gtk_entry_set_text (GTK_ENTRY (de->datum_entry), text);
-
- g_free (text);
- }
- else
- goto blank_entry;
-
- }
-
- return FALSE;
-
- blank_entry:
- gtk_entry_set_text (GTK_ENTRY (de->datum_entry), "");
-
- return FALSE;
-}
-
-
-static void
-datum_entry_activate (GtkEntry *entry, gpointer data)
-{
- gint row, column;
- PsppireDataEditor *de = data;
-
- const gchar *text = gtk_entry_get_text (entry);
-
- psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &column);
-
- if ( row == -1 || column == -1)
- return;
-
- psppire_data_store_set_string (de->data_store, text, row, column);
-}
-
-static void on_activate (PsppireDataEditor *de);
-static gboolean on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p, gint pagenum, gpointer data);
-static void on_select_range (PsppireDataEditor *de);
-
-static void on_select_row (PsppireSheet *, gint, PsppireDataEditor *);
-static void on_select_variable (PsppireSheet *, gint, PsppireDataEditor *);
-
-
-static void on_owner_change (GtkClipboard *,
- GdkEventOwnerChange *, gpointer);
-
-static void
-on_map (GtkWidget *w)
-{
- GtkClipboard *clip = gtk_widget_get_clipboard (w, GDK_SELECTION_CLIPBOARD);
-
- g_signal_connect (clip, "owner-change", G_CALLBACK (on_owner_change), w);
-}
-
-
-static void
-init_sheet (PsppireDataEditor *de, int i,
- GtkAdjustment *hadj, GtkAdjustment *vadj,
- PsppireAxisImpl *vaxis,
- PsppireAxisImpl *haxis
- )
-{
- de->sheet_bin[i] = gtk_scrolled_window_new (hadj, vadj);
-
- de->data_sheet[i] = psppire_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 *vadj0, *hadj0;
- GtkAdjustment *vadj1, *hadj1;
- GtkWidget *sheet ;
-
- de->vaxis[0] = psppire_axis_impl_new ();
- de->vaxis[1] = psppire_axis_impl_new ();
-
- /* There's only one horizontal axis, since the
- column widths are parameters of the variables */
- de->haxis = psppire_axis_impl_new ();
-
- de->split = TRUE;
- de->paned = gtk_xpaned_new ();
-
- init_sheet (de, 0, NULL, NULL, de->vaxis[0], de->haxis);
- gtk_widget_show (de->sheet_bin[0]);
- vadj0 = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[0]));
- hadj0 = 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, vadj0, de->vaxis[0], de->haxis);
- gtk_widget_show (de->sheet_bin[1]);
- sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[1]));
- psppire_sheet_hide_row_titles (PSPPIRE_SHEET (sheet));
- hadj1 = 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, hadj0, NULL, de->vaxis[1], de->haxis);
- gtk_widget_show (de->sheet_bin[2]);
- sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[2]));
- psppire_sheet_hide_column_titles (PSPPIRE_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);
- vadj1 = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[2]));
-
- init_sheet (de, 3, hadj1, vadj1, de->vaxis[1], de->haxis);
- gtk_widget_show (de->sheet_bin[3]);
- sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[3]));
- psppire_sheet_hide_column_titles (PSPPIRE_SHEET (sheet));
- psppire_sheet_hide_row_titles (PSPPIRE_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 *hbox = gtk_hbox_new (FALSE, 0);
- GtkWidget *sw_vs = gtk_scrolled_window_new (NULL, NULL);
-
- init_data_sheet (de);
-
- 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);
-
- de->datum_entry = gtk_entry_new ();
- de->cell_ref_entry = gtk_entry_new ();
-
- g_object_set (de->cell_ref_entry,
- "sensitive", FALSE,
- "editable", FALSE,
- "width_chars", 25,
- NULL);
-
- gtk_box_pack_start (GTK_BOX (hbox), de->cell_ref_entry, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), de->datum_entry, TRUE, TRUE, 0);
-
-
- gtk_container_add (GTK_CONTAINER (sw_vs), de->var_sheet);
- gtk_widget_show_all (sw_vs);
-
-
- 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);
-
-
- psppire_data_editor_remove_split (de);
-
- 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[0], "activate",
- G_CALLBACK (update_data_ref_entry),
- de);
-
- g_signal_connect (de->datum_entry, "activate",
- G_CALLBACK (datum_entry_activate),
- de);
-
-
- g_signal_connect_swapped (de->data_sheet[0],
- "double-click-column",
- G_CALLBACK (on_data_column_clicked),
- de);
-
- g_signal_connect_swapped (de->var_sheet,
- "double-click-row",
- G_CALLBACK (on_var_row_clicked),
- de);
-
- g_signal_connect_swapped (de->data_sheet[0], "activate",
- G_CALLBACK (on_activate),
- de);
-
- g_signal_connect_swapped (de->data_sheet[0], "select-range",
- G_CALLBACK (on_select_range),
- de);
-
- g_signal_connect (de->data_sheet[0], "select-row",
- G_CALLBACK (on_select_row), de);
-
- g_signal_connect (de->data_sheet[0], "select-column",
- G_CALLBACK (on_select_variable), de);
-
-
- g_signal_connect (de->var_sheet, "select-row",
- G_CALLBACK (on_select_variable), de);
-
-
- g_signal_connect_after (de, "switch-page",
- G_CALLBACK (on_switch_page),
- NULL);
-
- g_object_set (de, "can-focus", FALSE, NULL);
-
- g_signal_connect (de, "map", G_CALLBACK (on_map), NULL);
-