-void
-psppire_data_editor_clip_paste (PsppireDataEditor *de)
-{
- GdkDisplay *display = gtk_widget_get_display ( GTK_WIDGET (de));
- GtkClipboard *clipboard =
- gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD);
-
- gtk_clipboard_request_contents (clipboard,
- gdk_atom_intern ("UTF8_STRING", TRUE),
- data_sheet_contents_received_callback,
- de);
-}
-
-
-
-void
-psppire_data_editor_clip_cut (PsppireDataEditor *de)
-{
- gint max_rows, max_columns;
- gint r;
- GtkSheetRange range;
- PsppireDataStore *ds = de->data_store;
-
- 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[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[0]), &row, &col);
-
- range.row0 = range.rowi = row;
- range.col0 = range.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 (range.rowi >= max_rows)
- {
- if (max_rows == 0)
- return;
- range.rowi = max_rows - 1;
- }
-
- max_columns = dict_get_var_cnt (ds->dict->dict);
- if (range.coli >= max_columns)
- {
- if (max_columns == 0)
- return;
- range.coli = max_columns - 1;
- }
-
- g_return_if_fail (range.rowi >= range.row0);
- g_return_if_fail (range.row0 >= 0);
- g_return_if_fail (range.coli >= range.col0);
- g_return_if_fail (range.col0 >= 0);
-
-
- for (r = range.row0; r <= range.rowi ; ++r )
- {
- gint c;
-
- for (c = range.col0 ; c <= range.coli; ++c)
- {
- psppire_data_store_set_string (ds, "", r, c);
- }
- }
-
- /* and remove the selection */
- gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet[0]));
-}
-
-
-\f
-
-/* Popup menu related stuff */
-
-static void
-popup_variable_menu (GtkSheet *sheet, gint column,
- GdkEventButton *event, gpointer data)
-{
- GtkMenu *menu = GTK_MENU (data);
-
- PsppireDataStore *data_store =
- PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
-
- const struct variable *v =
- psppire_dict_get_variable (data_store->dict, column);
-
- if ( v && event->button == 3)
- {
- gtk_sheet_select_column (sheet, column);
-
- gtk_menu_popup (menu,
- NULL, NULL, NULL, NULL,
- event->button, event->time);
- }
-}
-
-
-static void
-popup_cases_menu (GtkSheet *sheet, gint row,
- GdkEventButton *event, gpointer data)
-{
- GtkMenu *menu = GTK_MENU (data);
-
- PsppireDataStore *data_store =
- PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
-
- if ( row <= psppire_data_store_get_case_count (data_store) &&
- event->button == 3)
- {
- gtk_sheet_select_row (sheet, row);
-
- gtk_menu_popup (menu,
- NULL, NULL, NULL, NULL,
- event->button, event->time);
- }
-}
-
-\f
-
-/* Sorting */
-
-static void
-do_sort (PsppireDataStore *ds, int var, gboolean descend)
-{
- GString *string = g_string_new ("SORT CASES BY ");
-
- const struct variable *v =
- psppire_dict_get_variable (ds->dict, var);
-
- g_string_append_printf (string, "%s", var_get_name (v));
-
- if ( descend )
- g_string_append (string, " (D)");
-
- g_string_append (string, ".");
-
- execute_syntax (create_syntax_string_source (string->str));
-
- g_string_free (string, TRUE);
-}
-
-
-/* Sort the data by the the variable which the editor has currently
- selected */
-void
-psppire_data_editor_sort_ascending (PsppireDataEditor *de)
-{
- GtkSheetRange range;
- gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet[0]), &range);
-
- do_sort (de->data_store, range.col0, FALSE);
-}
-
-
-/* Sort the data by the the variable which the editor has currently
- selected */
-void
-psppire_data_editor_sort_descending (PsppireDataEditor *de)
-{
- GtkSheetRange range;
- gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet[0]), &range);
-
- do_sort (de->data_store, range.col0, TRUE);
-}
-
-
-\f
-
-
-/* Insert a new variable before the currently selected position */
-void
-psppire_data_editor_insert_variable (PsppireDataEditor *de)
-{
- glong posn = -1;
-
- 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;
-
- if ( posn == -1 ) posn = 0;
-
- psppire_dict_insert_variable (de->data_store->dict, posn, NULL);
-}
-
-/* Insert a new case before the currently selected position */
-void
-psppire_data_editor_insert_case (PsppireDataEditor *de)
-{
- glong posn = -1;
-
- if ( de->data_sheet[0]->state == GTK_SHEET_ROW_SELECTED )
- posn = GTK_SHEET (de->data_sheet[0])->range.row0;