+
+/* Create a deep copy of SRC */
+GtkListStore *
+clone_list_store (const GtkListStore *src)
+{
+ GtkTreeIter src_iter;
+ gboolean ok;
+ gint i;
+ const gint n_cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (src));
+ GType *types = g_malloc (sizeof (*types) * n_cols);
+
+ int row = 0;
+ GtkListStore *dest;
+
+ for (i = 0 ; i < n_cols; ++i )
+ types[i] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (src), i);
+
+ dest = gtk_list_store_newv (n_cols, types);
+
+ for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (src),
+ &src_iter);
+ ok;
+ ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (src), &src_iter))
+ {
+ GtkTreeIter dest_iter;
+ gtk_list_store_append (dest, &dest_iter);
+
+ for (i = 0 ; i < n_cols; ++i )
+ {
+ GValue val = {0};
+
+ gtk_tree_model_get_value (GTK_TREE_MODEL (src), &src_iter, i, &val);
+ gtk_list_store_set_value (dest, &dest_iter, i, &val);
+
+ g_value_unset (&val);
+ }
+ row++;
+ }
+
+ g_free (types);
+
+ return dest;
+}
+
+
+
+
+static gboolean
+on_delete (GtkWindow *window, GdkEvent *e, GtkWindow **addr)
+{
+ *addr = NULL;
+
+ return FALSE;
+}
+
+void
+paste_syntax_to_window (const gchar *syntax)
+{
+ static GtkWidget *the_syntax_pasteboard = NULL;
+
+ GtkTextBuffer *buffer = NULL;
+
+ if ( NULL == the_syntax_pasteboard)
+ {
+ the_syntax_pasteboard = psppire_syntax_window_new ();
+ g_signal_connect (the_syntax_pasteboard, "delete-event", G_CALLBACK (on_delete),
+ &the_syntax_pasteboard);
+ }
+
+ buffer = GTK_TEXT_BUFFER (PSPPIRE_SYNTAX_WINDOW (the_syntax_pasteboard)->buffer);
+
+ gtk_text_buffer_begin_user_action (buffer);
+ gtk_text_buffer_insert_at_cursor (buffer, syntax, -1);
+ gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
+ gtk_text_buffer_end_user_action (buffer);
+
+ gtk_widget_show (the_syntax_pasteboard);
+}
+
+
+/* gtk_box_pack_start_defaults is deprecated.
+ Therefore we roll our own until a better solution is found */
+void
+psppire_box_pack_start_defaults (GtkBox *box, GtkWidget *widget)
+{
+ gtk_box_pack_start (box, widget, TRUE, TRUE, 0);
+}