X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-data-window.c;h=bdbdd085ef3de95537bd84b0ddf1682645f5059a;hb=6e097c89af440da90b43ce90864394c4d0c843d5;hp=99c0c6ac69b331e06698c4930a501b3b669b2e09;hpb=3dd0f6ae0d5eb73a2270a243e443c4ae03c2c16e;p=pspp diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index 99c0c6ac69..bdbdd085ef 100644 --- a/src/ui/gui/psppire-data-window.c +++ b/src/ui/gui/psppire-data-window.c @@ -1,5 +1,6 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation + Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014, + 2016, 2017 Free Software Foundation 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 @@ -32,12 +33,11 @@ #include "ui/gui/helper.h" #include "ui/gui/psppire-import-assistant.h" #include "ui/gui/psppire-data-window.h" +#include "ui/gui/psppire-data-editor.h" #include "ui/gui/psppire-dialog-action.h" #include "ui/gui/psppire-encoding-selector.h" #include "ui/gui/psppire-syntax-window.h" #include "ui/gui/psppire-window.h" -#include "ui/gui/psppire-data-sheet.h" -#include "ui/gui/psppire-var-sheet.h" #include "ui/gui/windows-menu.h" #include "ui/gui/goto-case-dialog.h" #include "ui/gui/psppire.h" @@ -47,6 +47,8 @@ #include "gl/c-strcasestr.h" #include "gl/xvasprintf.h" +#include "ui/gui/efficient-sheet/jmd-sheet.h" + #include "find-dialog.h" #include "options-dialog.h" #include "psppire-dialog-action-1sks.h" @@ -972,9 +974,11 @@ file_import (PsppireDataWindow *dw) g_main_loop_run (asst->main_loop); g_main_loop_unref (asst->main_loop); +#if TEXT_FILE if (!asst->file_name) goto end; + switch (asst->response) { case GTK_RESPONSE_APPLY: @@ -990,7 +994,7 @@ file_import (PsppireDataWindow *dw) default: break; } - +#endif end: gtk_widget_destroy (GTK_WIDGET (asst)); } @@ -1067,10 +1071,52 @@ static void on_cut (PsppireDataWindow *dw) { int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (dw->data_editor)); - if (p == 0) - { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - psppire_data_sheet_edit_cut (ds); + if (p == PSPPIRE_DATA_EDITOR_DATA_VIEW) + { + PsppireDict *dict = NULL; + g_object_get (dw->data_editor, "dictionary", &dict, NULL); + + gint x, y; + JmdSheet *sheet = JMD_SHEET (dw->data_editor->data_sheet); + JmdRange sel = *sheet->selection; + + GtkClipboard *clip = + gtk_clipboard_get_for_display (gtk_widget_get_display (GTK_WIDGET (dw)), + GDK_SELECTION_CLIPBOARD); + + /* Save the selected area to a string */ + GString *str = g_string_new (""); + for (y = sel.start_y ; y <= sel.end_y; ++y) + { + for (x = sel.start_x ; x <= sel.end_x; ++x) + { + const struct variable * var = psppire_dict_get_variable (dict, x); + gchar *s = psppire_data_store_get_string (dw->data_editor->data_store, + y, var, FALSE); + g_string_append (str, s); + g_string_append (str, "\t"); + g_free (s); + } + g_string_append (str, "\n"); + } + + gtk_clipboard_set_text (clip, str->str, str->len); + g_string_free (str, TRUE); + + /* Now fill the selected area with SYSMIS */ + union value sm ; + sm.f = SYSMIS; + for (x = sel.start_x ; x <= sel.end_x; ++x) + { + const struct variable * var = psppire_dict_get_variable (dict, x); + for (y = sel.start_y ; y <= sel.end_y; ++y) + { + psppire_data_store_set_value (dw->data_editor->data_store, + y, + var, &sm); + } + } + } } @@ -1078,10 +1124,13 @@ static void on_copy (PsppireDataWindow *dw) { int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (dw->data_editor)); - if (p == 0) + if (p == PSPPIRE_DATA_EDITOR_DATA_VIEW) { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - psppire_data_sheet_edit_copy (ds); + GtkClipboard *clip = + gtk_clipboard_get_for_display (gtk_widget_get_display (GTK_WIDGET (dw)), + GDK_SELECTION_CLIPBOARD); + + jmd_sheet_set_clip (JMD_SHEET (dw->data_editor->data_sheet), clip); } } @@ -1089,75 +1138,78 @@ static void on_paste (PsppireDataWindow *dw) { int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (dw->data_editor)); - if (p == 0) + if (p == PSPPIRE_DATA_EDITOR_DATA_VIEW) { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - psppire_data_sheet_edit_paste (ds); + psppire_data_editor_paste (dw->data_editor); } } - static void on_clear_cases (PsppireDataWindow *dw) { - int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (dw->data_editor)); - if (p == 0) + PsppireDataEditor *de = dw->data_editor; + int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (de)); + if (p == PSPPIRE_DATA_EDITOR_DATA_VIEW) { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - psppire_data_sheet_edit_clear_cases (ds); + JmdRange *range = JMD_SHEET(de->data_sheet)->selection; + psppire_data_store_delete_cases (de->data_store, range->start_y, + range->end_y - range->start_y + 1); + gtk_widget_queue_draw (GTK_WIDGET (de->data_sheet)); } } static void on_clear_variables (PsppireDataWindow *dw) { - int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (dw->data_editor)); - if (p == 0) + PsppireDataEditor *de = dw->data_editor; + int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (de)); + if (p == PSPPIRE_DATA_EDITOR_DATA_VIEW) { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - psppire_data_sheet_edit_clear_variables (ds); + psppire_data_editor_data_delete_variables (de); } else { - psppire_var_sheet_clear_variables (PSPPIRE_VAR_SHEET (dw->data_editor->var_sheet)); + psppire_data_editor_var_delete_variables (de); } } - static void insert_variable (PsppireDataWindow *dw) { - int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (dw->data_editor)); - if (p == 0) + PsppireDataEditor *de = dw->data_editor; + int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (de)); + + if (p == PSPPIRE_DATA_EDITOR_DATA_VIEW) { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - psppire_data_sheet_insert_variable (ds); + JmdRange *range = JMD_SHEET(de->data_sheet)->selection; + psppire_data_editor_insert_new_variable_at_posn (de, range->start_x); } else { - psppire_var_sheet_insert_variable (PSPPIRE_VAR_SHEET (dw->data_editor->var_sheet)); + JmdRange *range = JMD_SHEET(de->var_sheet)->selection; + psppire_data_editor_insert_new_variable_at_posn (de, range->start_y); } } - static void insert_case_at_row (PsppireDataWindow *dw) { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - - psppire_data_sheet_insert_case (ds); + PsppireDataEditor *de = dw->data_editor; + JmdRange *range = JMD_SHEET(de->data_sheet)->selection; + psppire_data_editor_insert_new_case_at_posn (de, range->start_y); } static void goto_case (PsppireDataWindow *dw) { - PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor); - - goto_case_dialog (ds); + PsppireDataEditor *de = dw->data_editor; + int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (de)); + if (p == PSPPIRE_DATA_EDITOR_DATA_VIEW) + { + goto_case_dialog (JMD_SHEET (de->data_sheet)); + } } - - static GtkWidget * create_file_menu (PsppireDataWindow *dw) { @@ -1290,6 +1342,7 @@ create_file_menu (PsppireDataWindow *dw) return menuitem; } + static GtkWidget * create_edit_menu (PsppireDataWindow *dw) { @@ -1375,7 +1428,6 @@ create_edit_menu (PsppireDataWindow *dw) return menuitem; } - static void psppire_data_window_finish_init (PsppireDataWindow *de, struct dataset *ds) @@ -1413,12 +1465,6 @@ psppire_data_window_finish_init (PsppireDataWindow *de, g_signal_connect_swapped (de->data_store, "case-changed", G_CALLBACK (set_unsaved), de); - g_signal_connect_swapped (de->data_store, "case-inserted", - G_CALLBACK (set_unsaved), de); - - g_signal_connect_swapped (de->data_store, "cases-deleted", - G_CALLBACK (set_unsaved), de); - dataset_set_callbacks (de->dataset, &cbs, de); connect_help (de->builder); @@ -1442,7 +1488,7 @@ psppire_data_window_finish_init (PsppireDataWindow *de, G_CALLBACK (on_split_change), de); - g_signal_connect_swapped (de->dict, "backend-changed", + g_signal_connect_swapped (de->dict, "items-changed", G_CALLBACK (enable_save), de); g_signal_connect_swapped (de->dict, "variable-inserted", G_CALLBACK (enable_save), de); @@ -1749,6 +1795,7 @@ psppire_data_window_finish_init (PsppireDataWindow *de, ll_push_head (&all_data_windows, &de->ll); } + static void psppire_data_window_dispose (GObject *object) { @@ -1851,6 +1898,7 @@ psppire_data_window_get_property (GObject *object, } + GtkWidget* psppire_data_window_new (struct dataset *ds) { @@ -1884,12 +1932,15 @@ psppire_data_window_new (struct dataset *ds) return dw; } + + bool psppire_data_window_is_empty (PsppireDataWindow *dw) { return psppire_dict_get_var_cnt (dw->dict) == 0; } + static void psppire_data_window_iface_init (PsppireWindowIface *iface) { @@ -1900,6 +1951,7 @@ psppire_data_window_iface_init (PsppireWindowIface *iface) + PsppireDataWindow * psppire_default_data_window (void) { @@ -1908,6 +1960,8 @@ psppire_default_data_window (void) return ll_data (ll_head (&all_data_windows), PsppireDataWindow, ll); } + + void psppire_data_window_set_default (PsppireDataWindow *pdw) { @@ -1922,6 +1976,8 @@ psppire_data_window_undefault (PsppireDataWindow *pdw) ll_push_tail (&all_data_windows, &pdw->ll); } + + PsppireDataWindow * psppire_data_window_for_dataset (struct dataset *ds) {