- set_font (GTK_WIDGET (de), font_desc);
-}
-
-
-\f
-
-
-static void
-emit_selected_signal (PsppireDataEditor *de)
-{
- gboolean data_selected = data_is_selected (de);
-
- g_signal_emit (de, data_editor_signals[DATA_SELECTION_CHANGED], 0, data_selected);
-}
-
-
-static void
-on_activate (PsppireDataEditor *de)
-{
- gint row, col;
- psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &col);
-
-
- if ( row < psppire_data_store_get_case_count (de->data_store)
- &&
- col < psppire_var_store_get_var_cnt (de->var_store))
- {
- emit_selected_signal (de);
- return ;
- }
-
- emit_selected_signal (de);
-}
-
-
-static void
-on_select_range (PsppireDataEditor *de)
-{
- PsppireSheetRange range;
-
- psppire_sheet_get_selected_range (PSPPIRE_SHEET (de->data_sheet[0]), &range);
-
- if ( range.rowi < psppire_data_store_get_case_count (de->data_store)
- &&
- range.coli < psppire_var_store_get_var_cnt (de->var_store))
- {
- emit_selected_signal (de);
- return;
- }
-
- emit_selected_signal (de);
-}
-
-
-static gboolean
-on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p,
- gint pagenum, gpointer data)
-{
- switch (pagenum)
- {
- case PSPPIRE_DATA_EDITOR_DATA_VIEW:
- gtk_widget_grab_focus (de->data_vbox);
- on_select_range (de);
- break;
- case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
- gtk_widget_grab_focus (de->var_sheet);
- emit_selected_signal (de);
- break;
- default:
- break;
- };
-
- return TRUE;
-}
-
-
-
-static gboolean
-data_is_selected (PsppireDataEditor *de)
-{
- PsppireSheetRange range;
- gint row, col;
-
- if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (de)) != PSPPIRE_DATA_EDITOR_DATA_VIEW)
- return FALSE;
-
- psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &col);
-
- if ( row >= psppire_data_store_get_case_count (de->data_store)
- ||
- col >= psppire_var_store_get_var_cnt (de->var_store))
- {
- return FALSE;
- }
-
- psppire_sheet_get_selected_range (PSPPIRE_SHEET (de->data_sheet[0]), &range);
-
- if ( range.rowi >= psppire_data_store_get_case_count (de->data_store)
- ||
- range.coli >= psppire_var_store_get_var_cnt (de->var_store))
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-static void
-on_select_row (PsppireSheet *sheet, gint row, PsppireDataEditor *de)
-{
- g_signal_emit (de, data_editor_signals[CASES_SELECTED], 0, row);
-}
-
-
-static void
-on_select_variable (PsppireSheet *sheet, gint var, PsppireDataEditor *de)
-{
- g_signal_emit (de, data_editor_signals[VARIABLES_SELECTED], 0, var);
-}
-
-
-\f
-
-/* Clipboard stuff */
-
-
-#include <data/casereader.h>
-#include <data/case-map.h>
-#include <data/casewriter.h>
-
-#include <data/data-out.h>
-#include "xalloc.h"
-
-/* A casereader and dictionary holding the data currently in the clip */
-static struct casereader *clip_datasheet = NULL;
-static struct dictionary *clip_dict = NULL;
-
-
-static void data_sheet_update_clipboard (PsppireSheet *);
-
-/* Set the clip according to the currently
- selected range in the data sheet */
-static void
-data_sheet_set_clip (PsppireSheet *sheet)
-{
- int i;
- struct casewriter *writer ;
- PsppireSheetRange range;
- PsppireDataStore *ds;
- struct case_map *map = NULL;
- casenumber max_rows;
- size_t max_columns;
- gint row0, rowi;
- gint col0, coli;
-
- ds = PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet));
-
- psppire_sheet_get_selected_range (sheet, &range);
-
- col0 = MIN (range.col0, range.coli);
- coli = MAX (range.col0, range.coli);
- row0 = MIN (range.row0, range.rowi);
- rowi = MAX (range.row0, range.rowi);
-
- /* If nothing selected, then use active cell */
- if ( row0 < 0 || col0 < 0 )
- {
- gint row, col;
- psppire_sheet_get_active_cell (sheet, &row, &col);
-
- row0 = rowi = row;
- col0 = coli = col;
- }
-
- /* The sheet range can include cells that do not include data.
- Exclude them from the range. */
- max_rows = psppire_data_store_get_case_count (ds);
- if (rowi >= max_rows)
- {
- if (max_rows == 0)
- return;
- rowi = max_rows - 1;
- }
- max_columns = dict_get_var_cnt (ds->dict->dict);
- if (coli >= max_columns)
- {
- if (max_columns == 0)
- return;
- coli = max_columns - 1;
- }
-
- /* Destroy any existing clip */
- if ( clip_datasheet )
- {
- casereader_destroy (clip_datasheet);
- clip_datasheet = NULL;
- }
-
- if ( clip_dict )
- {
- dict_destroy (clip_dict);
- clip_dict = NULL;
- }
-
- /* Construct clip dictionary. */
- clip_dict = dict_create (dict_get_encoding (ds->dict->dict));
- for (i = col0; i <= coli; i++)
- dict_clone_var_assert (clip_dict, dict_get_var (ds->dict->dict, i));
-
- /* Construct clip data. */
- map = case_map_by_name (ds->dict->dict, clip_dict);
- writer = autopaging_writer_create (dict_get_proto (clip_dict));
- for (i = row0; i <= rowi ; ++i )
- {
- struct ccase *old = psppire_data_store_get_case (ds, i);
- if (old != NULL)
- casewriter_write (writer, case_map_execute (map, old));
- else
- casewriter_force_error (writer);
- }
- case_map_destroy (map);
-
- clip_datasheet = casewriter_make_reader (writer);
-
- data_sheet_update_clipboard (sheet);
-}
-
-enum {
- SELECT_FMT_NULL,
- SELECT_FMT_TEXT,
- SELECT_FMT_HTML
-};
-
-
-/* Perform data_out for case CC, variable V, appending to STRING */
-static void
-data_out_g_string (GString *string, const struct variable *v,
- const struct ccase *cc)
-{
- const struct fmt_spec *fs = var_get_print_format (v);
- const union value *val = case_data (cc, v);