Merge remote-tracking branch 'origin/master' into sheet
[pspp] / src / ui / gui / psppire-data-window.c
index aa48d0e02c409c74ad89a7496ad4fe412454a28b..b4c9b09dac21251a56d6bbe2b651742e79dbed18 100644 (file)
@@ -45,6 +45,8 @@
 #include "gl/c-strcasestr.h"
 #include "gl/xvasprintf.h"
 
+#include "ui/gui/efficient-sheet/jmd-sheet.h"
+
 #include "find-dialog.h"
 #include "psppire-dialog-action-1sks.h"
 #include "psppire-dialog-action-aggregate.h"
@@ -786,7 +788,9 @@ fonts_activate (PsppireDataWindow  *de)
   GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (de));
   GtkWidget *dialog =  gtk_font_chooser_dialog_new (NULL, GTK_WINDOW (toplevel));
   GtkStyleContext *style = gtk_widget_get_style_context (GTK_WIDGET(de->data_editor));
-  const PangoFontDescription *current_font = gtk_style_context_get_font (style, GTK_STATE_FLAG_NORMAL);
+  const PangoFontDescription *current_font ;
+  
+  gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL, "font", &current_font, NULL);
 
   gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (dialog), current_font);
 
@@ -1061,14 +1065,54 @@ set_data_page (PsppireDataWindow *dw)
 static void
 on_cut (PsppireDataWindow *dw)
 {
-#if SHEET_MERGE
   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);
+      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);
+           }
+       }
+
     }
-#endif
 }
 
 
@@ -1076,27 +1120,43 @@ on_cut (PsppireDataWindow *dw)
 static void
 on_copy (PsppireDataWindow *dw)
 {
-#if SHEET_MERGE
   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_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);
+    }
+}
+
+
+static void
+trf (GtkClipboard *clip,
+         GdkAtom *atoms,
+         gint n_atoms,
+         gpointer data)
+{
+  int i;
+  for (i = 0; i < n_atoms; ++i)
+    {
+      g_print ("%s\n", gdk_atom_name (atoms[i]));
     }
-#endif
 }
 
 static void
 on_paste (PsppireDataWindow *dw)
 {
-#if SHEET_MERGE
   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_paste (ds);
+      GtkClipboard *clip =
+       gtk_clipboard_get_for_display (gtk_widget_get_display (GTK_WIDGET (dw)),
+                                  GDK_SELECTION_CLIPBOARD);
+
+      gtk_clipboard_request_targets (clip, trf, dw);
     }
-#endif
 }
 
 
@@ -1166,11 +1226,11 @@ insert_case_at_row (PsppireDataWindow *dw)
 static void
 goto_case (PsppireDataWindow *dw)
 {
-#if SHEET_MERGE
-  PsppireDataSheet *ds = psppire_data_editor_get_active_data_sheet (dw->data_editor);
-
-  goto_case_dialog (ds);
-#endif
+  int p = gtk_notebook_get_current_page (GTK_NOTEBOOK (dw->data_editor));
+  if (p == 0)
+    {
+      goto_case_dialog (JMD_SHEET (dw->data_editor->data_sheet));
+    }
 }
 
 
@@ -1953,22 +2013,6 @@ psppire_data_window_for_dataset (struct dataset *ds)
   return NULL;
 }
 
-#if SHEET_MERGE
-
-PsppireDataWindow *
-psppire_data_window_for_data_store (PsppireDataStore *data_store)
-{
-  PsppireDataWindow *pdw;
-
-  ll_for_each (pdw, PsppireDataWindow, ll, &all_data_windows)
-    if (pdw->data_store == data_store)
-      return pdw;
-
-  return NULL;
-}
-
-#endif
-
 GtkWindow *
 create_data_window (void)
 {
@@ -1979,9 +2023,7 @@ create_data_window (void)
   return GTK_WINDOW (w);
 }
 
-
-
-void
+GtkWindow *
 open_data_window (PsppireWindow *victim, const char *file_name,
                   const char *encoding, gpointer hint)
 {
@@ -1998,4 +2040,5 @@ open_data_window (PsppireWindow *victim, const char *file_name,
 
   psppire_window_load (PSPPIRE_WINDOW (window), file_name, encoding, hint);
   gtk_widget_show_all (window);
+  return GTK_WINDOW (window);
 }