+static void
+undo_redo_update (PsppireSyntaxWindow *window)
+{
+ gtk_action_set_sensitive (window->undo_menuitem,
+ gtk_source_buffer_can_undo (window->buffer));
+
+ gtk_action_set_sensitive (window->redo_menuitem,
+ gtk_source_buffer_can_redo (window->buffer));
+}
+
+static void
+undo_last_edit (PsppireSyntaxWindow *window)
+{
+ gtk_source_buffer_undo (window->buffer);
+ undo_redo_update (window);
+}
+
+static void
+redo_last_edit (PsppireSyntaxWindow *window)
+{
+ gtk_source_buffer_redo (window->buffer);
+ undo_redo_update (window);
+}
+
+
+\f
+/* Printing related stuff */
+
+
+static void
+begin_print (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ PsppireSyntaxWindow *window)
+{
+ window->compositor =
+ gtk_source_print_compositor_new (window->buffer);
+}
+
+
+static void
+end_print (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ PsppireSyntaxWindow *window)
+{
+ g_object_unref (window->compositor);
+ window->compositor = NULL;
+}
+
+
+
+static gboolean
+paginate (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ PsppireSyntaxWindow *window)
+{
+ if (gtk_source_print_compositor_paginate (window->compositor, context))
+ {
+ gint n_pages = gtk_source_print_compositor_get_n_pages (window->compositor);
+ gtk_print_operation_set_n_pages (operation, n_pages);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+draw_page (GtkPrintOperation *operation,
+ GtkPrintContext *context,
+ gint page_nr,
+ PsppireSyntaxWindow *window)
+{
+ gtk_source_print_compositor_draw_page (window->compositor,
+ context,
+ page_nr);
+}
+
+
+
+static void
+psppire_syntax_window_print (PsppireSyntaxWindow *window)
+{
+ GtkPrintOperationResult res;
+
+ GtkPrintOperation *print = gtk_print_operation_new ();
+
+ if (window->print_settings != NULL)
+ gtk_print_operation_set_print_settings (print, window->print_settings);
+
+
+ g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), window);
+ g_signal_connect (print, "end_print", G_CALLBACK (end_print), window);
+ g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), window);
+ g_signal_connect (print, "paginate", G_CALLBACK (paginate), window);
+
+ res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+ GTK_WINDOW (window), NULL);
+
+ if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
+ {
+ if (window->print_settings != NULL)
+ g_object_unref (window->print_settings);
+ window->print_settings = g_object_ref (gtk_print_operation_get_print_settings (print));
+ }
+
+ g_object_unref (print);
+}