#include "psppire-data-store.h"
#include <data/casereader.h>
#include <data/case-map.h>
-#include <libpspp/alloc.h>
#include <data/casewriter.h>
#include <data/format.h>
#include <data/data-out.h>
+#include "helper.h"
#include <stdlib.h>
+#include "data-editor.h"
+#include "xalloc.h"
/* A casereader and dictionary holding the data currently in the clip */
static struct casereader *clip_datasheet = NULL;
const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
+ const size_t var_cnt = dict_get_var_cnt (clip_dict);
string = g_string_sized_new (10 * val_cnt * case_cnt);
break;
}
- for (c = 0 ; c < val_cnt ; ++c)
+ for (c = 0 ; c < var_cnt ; ++c)
{
const struct variable *v = dict_get_var (clip_dict, c);
data_out_g_string (string, v, &cc);
const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
+ const size_t var_cnt = dict_get_var_cnt (clip_dict);
+
/* Guestimate the size needed */
string = g_string_sized_new (20 * val_cnt * case_cnt);
}
g_string_append (string, "<tr>\n");
- for (c = 0 ; c < val_cnt ; ++c)
+ for (c = 0 ; c < var_cnt ; ++c)
{
const struct variable *v = dict_get_var (clip_dict, c);
g_string_append (string, "<td>");
clipboard_clear_cb (clipboard, sheet);
}
+
+
+/* A callback for when clipboard contents have been received */
+void
+data_sheet_contents_received_callback (GtkClipboard *clipboard,
+ GtkSelectionData *sd,
+ gpointer data)
+{
+ struct data_editor *de = data;
+
+ gint count = 0;
+ gint row, column;
+ gint next_row, next_column;
+ gint first_column;
+ char *c;
+ GtkSheet *data_sheet ;
+ PsppireDataStore *data_store;
+
+ if ( sd->length < 0 )
+ return;
+
+ if ( sd->type != gdk_atom_intern ("UTF8_STRING", FALSE))
+ return;
+
+ c = (char *) sd->data;
+
+ /* Paste text to selected position */
+ data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
+ data_store = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
+
+ gtk_sheet_get_active_cell (data_sheet, &row, &column);
+
+ g_return_if_fail (row >= 0);
+ g_return_if_fail (column >= 0);
+
+ first_column = column;
+ next_row = row;
+ next_column = column;
+ while (count < sd->length)
+ {
+ char *s = c;
+
+ row = next_row;
+ column = next_column;
+ while (*c != '\t' && *c != '\n' && count < sd->length)
+ {
+ c++;
+ count++;
+ }
+ if ( *c == '\t')
+ {
+ next_row = row ;
+ next_column = column + 1;
+ }
+ else if ( *c == '\n')
+ {
+ next_row = row + 1;
+ next_column = first_column;
+ }
+ *c++ = '\0';
+ count++;
+
+ /* Append some new cases if pasting beyond the last row */
+ if ( row >= psppire_data_store_get_case_count (data_store))
+ psppire_data_store_insert_new_case (data_store, row);
+
+ gtk_sheet_set_cell_text (data_sheet, row, column, s);
+ }
+}