Merge commit 'origin/master' into sso
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 24 Aug 2010 13:23:05 +0000 (15:23 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 24 Aug 2010 13:23:05 +0000 (15:23 +0200)
Conflicts:

src/ui/gui/psppire-syntax-window.c
src/ui/gui/psppire-syntax-window.h
src/ui/gui/syntax-editor.ui

1  2 
src/ui/gui/psppire-syntax-window.c
src/ui/gui/psppire-syntax-window.h
src/ui/gui/syntax-editor.ui

index 68c1546ed39cc9bf1227c7008d56806343dd6ebf,058e27c505982d1728c5076c2b5dc0f3f183163d..c162e219d143387a99d28d211a57e6557ace8eb8
  
  #include <config.h>
  
 +#include "relocatable.h"
 +
  #include <gtk/gtksignal.h>
  #include <gtk/gtkbox.h>
  #include "executor.h"
  #include "helper.h"
  
 +#include <gtksourceview/gtksourcebuffer.h>
 +#include <gtksourceview/gtksourcelanguage.h>
 +#include <gtksourceview/gtksourcelanguagemanager.h>
 +#include <gtksourceview/gtksourceprintcompositor.h>
 +
  #include <libpspp/message.h>
  #include <stdlib.h>
  
  #include "psppire.h"
 -#include "psppire-syntax-window.h"
  
  #include "psppire-data-window.h"
  #include "psppire-window-register.h"
@@@ -108,27 -102,7 +108,27 @@@ psppire_syntax_window_finalize (GObjec
  static void
  psppire_syntax_window_class_init (PsppireSyntaxWindowClass *class)
  {
 +  GtkSourceLanguageManager *lm = gtk_source_language_manager_get_default ();
 +
 +  const gchar * const *existing_paths =  gtk_source_language_manager_get_search_path (lm);
 +  gchar **new_paths = g_strdupv ((gchar **)existing_paths);
 +  int n = g_strv_length ((gchar **) existing_paths);
 +
 +  new_paths = g_realloc (new_paths, (n + 2) * sizeof (*new_paths));
 +  new_paths[n] = g_strdup (relocate (PKGDATADIR));
 +  new_paths[n+1] = NULL;
 +
 +  lm = gtk_source_language_manager_new ();
 +  gtk_source_language_manager_set_search_path (lm, new_paths);
 +
 +  class->lan = gtk_source_language_manager_get_language (lm, "pspp");
 +
 +  if (class->lan == NULL)
 +    g_warning ("pspp.lang file not found.  Syntax highlighting will not be available.");
 +
    parent_class = g_type_class_peek_parent (class);
 +
 +  g_strfreev (new_paths);
  }
  
  
@@@ -136,6 -110,7 +136,6 @@@ static voi
  psppire_syntax_window_base_init (PsppireSyntaxWindowClass *class)
  {
    GObjectClass *object_class = G_OBJECT_CLASS (class);
 -
    object_class->finalize = psppire_syntax_window_finalize;
  }
  
@@@ -154,10 -129,184 +154,184 @@@ editor_execute_syntax (const PsppireSyn
  {
    PsppireWindow *win = PSPPIRE_WINDOW (sw);
    const gchar *name = psppire_window_get_filename (win);
 -  execute_syntax (create_syntax_editor_source (sw->buffer, start, stop, name));
 +  execute_syntax (create_syntax_editor_source (GTK_TEXT_BUFFER (sw->buffer), start, stop, name));
  }
  
  
 -  if ( gtk_text_buffer_get_selection_bounds (sw->buffer, &begin, &end) )
 -    gtk_text_buffer_delete (sw->buffer, &begin, &end);
\f
+ /* Delete the currently selected text */
+ static void
+ on_edit_delete (PsppireSyntaxWindow *sw)
+ {
+   GtkTextIter begin, end;
++  GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer);
+   
 -
 -
++  if ( gtk_text_buffer_get_selection_bounds (buffer, &begin, &end) )
++    gtk_text_buffer_delete (buffer, &begin, &end);
+ }
 -  gboolean sel = gtk_text_buffer_get_has_selection (sw->buffer);
+ /* The syntax editor's clipboard deals only with text */
+ enum {
+   SELECT_FMT_NULL,
+   SELECT_FMT_TEXT,
+ };
+ static void
+ selection_changed (PsppireSyntaxWindow *sw)
+ {
 -  if ( ! gtk_text_buffer_get_selection_bounds (sw->buffer, begin, end) )
++  gboolean sel = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (sw->buffer));
+   gtk_action_set_sensitive (sw->edit_copy, sel);
+   gtk_action_set_sensitive (sw->edit_cut, sel);
+   gtk_action_set_sensitive (sw->edit_delete, sel);
+ }
+ /* The callback which runs when something request clipboard data */
+ static void
+ clipboard_get_cb (GtkClipboard     *clipboard,
+                 GtkSelectionData *selection_data,
+                 guint             info,
+                 gpointer          data)
+ {
+   PsppireSyntaxWindow *sw = data;
+   g_assert (info == SELECT_FMT_TEXT);
+   gtk_selection_data_set (selection_data, selection_data->target,
+                         8,
+                         (const guchar *) sw->cliptext, strlen (sw->cliptext));
+ }
+ static void
+ clipboard_clear_cb (GtkClipboard *clipboard,
+                   gpointer data)
+ {
+   PsppireSyntaxWindow *sw = data;
+   g_free (sw->cliptext);
+   sw->cliptext = NULL;
+ }
+ static const GtkTargetEntry targets[] = {
+   { "UTF8_STRING",   0, SELECT_FMT_TEXT },
+   { "STRING",        0, SELECT_FMT_TEXT },
+   { "TEXT",          0, SELECT_FMT_TEXT },
+   { "COMPOUND_TEXT", 0, SELECT_FMT_TEXT },
+   { "text/plain;charset=utf-8", 0, SELECT_FMT_TEXT },
+   { "text/plain",    0, SELECT_FMT_TEXT },
+ };
+ /*
+   Store a clip containing the currently selected text.
+   Returns true iff something was set.
+   As a side effect, begin and end will be set to indicate
+   the limits of the selected text.
+ */
+ static gboolean
+ set_clip (PsppireSyntaxWindow *sw, GtkTextIter *begin, GtkTextIter *end)
+ {
+   GtkClipboard *clipboard ;
++  GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer);
 -  sw->cliptext = gtk_text_buffer_get_text  (sw->buffer, begin, end, FALSE);
++  if ( ! gtk_text_buffer_get_selection_bounds (buffer, begin, end) )
+     return FALSE;
+   g_free (sw->cliptext);
 -    gtk_text_buffer_delete (sw->buffer, &begin, &end);
++  sw->cliptext = gtk_text_buffer_get_text  (buffer, begin, end, FALSE);
+   clipboard =
+     gtk_widget_get_clipboard (GTK_WIDGET (sw), GDK_SELECTION_CLIPBOARD);
+   if (!gtk_clipboard_set_with_owner (clipboard, targets,
+                                    G_N_ELEMENTS (targets),
+                                    clipboard_get_cb, clipboard_clear_cb,
+                                    G_OBJECT (sw)))
+     clipboard_clear_cb (clipboard, sw);
+   return TRUE;
+ }
+ static void
+ on_edit_cut (PsppireSyntaxWindow *sw)
+ {
+   GtkTextIter begin, end;
+   
+   if ( set_clip (sw, &begin, &end))
 -  gtk_text_buffer_insert_at_cursor (syntax_window->buffer,
++    gtk_text_buffer_delete (GTK_TEXT_BUFFER (sw->buffer), &begin, &end);
+ }
+ static void
+ on_edit_copy (PsppireSyntaxWindow *sw)
+ {
+   GtkTextIter begin, end;
+   set_clip (sw, &begin, &end);
+ }
+ /* A callback for when the clipboard contents have been received */
+ static void
+ contents_received_callback (GtkClipboard *clipboard,
+                           GtkSelectionData *sd,
+                           gpointer data)
+ {
+   gchar *c;
+   PsppireSyntaxWindow *syntax_window = data;
+   if ( sd->length < 0 )
+     return;
+   if ( sd->type != gdk_atom_intern ("UTF8_STRING", FALSE))
+     return;
+   c = (gchar *) sd->data;
++  gtk_text_buffer_insert_at_cursor (GTK_TEXT_BUFFER (syntax_window->buffer),
+                                   (gchar *) sd->data,
+                                   sd->length);
+ }
+ static void
+ on_edit_paste (PsppireSyntaxWindow *sw)
+ {
+   GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (sw));
+   GtkClipboard *clipboard =
+     gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD);
+   gtk_clipboard_request_contents (clipboard,
+                                 gdk_atom_intern ("UTF8_STRING", TRUE),
+                                 contents_received_callback,
+                                 sw);
+ }
+ static void
+ on_owner_change (GtkClipboard *clip, GdkEventOwnerChange *event, gpointer data)
+ {
+   gint i;
+   gboolean compatible_target = FALSE;
+   PsppireSyntaxWindow *sw = PSPPIRE_SYNTAX_WINDOW (data);
+   for (i = 0 ; i < sizeof (targets) / sizeof (targets[0]) ; ++i)
+     {
+       GdkAtom atom = gdk_atom_intern (targets[i].target, TRUE);
+       if ( gtk_clipboard_wait_is_target_available (clip, atom))
+       {
+         compatible_target = TRUE;
+         break;
+       }
+     }
+   gtk_action_set_sensitive (sw->edit_paste, compatible_target);
+ }
\f
  /* Parse and execute all the text in the buffer */
  static void
  on_run_all (GtkMenuItem *menuitem, gpointer user_data)
    GtkTextIter begin, end;
    PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
  
 -  gtk_text_buffer_get_iter_at_offset (se->buffer, &begin, 0);
 -  gtk_text_buffer_get_iter_at_offset (se->buffer, &end, -1);
 +  gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (se->buffer), &begin, 0);
 +  gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (se->buffer), &end, -1);
  
    editor_execute_syntax (se, begin, end);
  }
@@@ -178,7 -327,7 +352,7 @@@ on_run_selection (GtkMenuItem *menuitem
    GtkTextIter begin, end;
    PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
  
 -  if ( gtk_text_buffer_get_selection_bounds (se->buffer, &begin, &end) )
 +  if ( gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (se->buffer), &begin, &end) )
      editor_execute_syntax (se, begin, end);
  }
  
@@@ -195,17 -344,17 +369,17 @@@ on_run_to_end (GtkMenuItem *menuitem, g
    PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
  
    /* Get the current line */
 -  gtk_text_buffer_get_iter_at_mark (se->buffer,
 +  gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (se->buffer),
                                    &here,
 -                                  gtk_text_buffer_get_insert (se->buffer)
 +                                  gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (se->buffer))
                                    );
  
    line = gtk_text_iter_get_line (&here) ;
  
    /* Now set begin and end to the start of this line, and end of buffer
       respectively */
 -  gtk_text_buffer_get_iter_at_line (se->buffer, &begin, line);
 -  gtk_text_buffer_get_iter_at_line (se->buffer, &end, -1);
 +  gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &begin, line);
 +  gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &end, -1);
  
    editor_execute_syntax (se, begin, end);
  }
@@@ -223,17 -372,17 +397,17 @@@ on_run_current_line (GtkMenuItem *menui
    PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
  
    /* Get the current line */
 -  gtk_text_buffer_get_iter_at_mark (se->buffer,
 +  gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (se->buffer),
                                    &here,
 -                                  gtk_text_buffer_get_insert (se->buffer)
 +                                  gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (se->buffer))
                                    );
  
    line = gtk_text_iter_get_line (&here) ;
  
    /* Now set begin and end to the start of this line, and start of
       following line respectively */
 -  gtk_text_buffer_get_iter_at_line (se->buffer, &begin, line);
 -  gtk_text_buffer_get_iter_at_line (se->buffer, &end, line + 1);
 +  gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &begin, line);
 +  gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (se->buffer), &end, line + 1);
  
    editor_execute_syntax (se, begin, end);
  }
@@@ -265,7 -414,7 +439,7 @@@ save_editor_to_file (PsppireSyntaxWindo
                     const gchar *filename,
                     GError **err)
  {
 -  GtkTextBuffer *buffer = se->buffer;
 +  GtkTextBuffer *buffer = GTK_TEXT_BUFFER (se->buffer);
    gboolean result ;
    GtkTextIter start, stop;
    gchar *text;
@@@ -378,21 -527,6 +552,21 @@@ on_quit (GtkMenuItem *menuitem, gpointe
  }
  
  
 +static void
 +load_and_show_syntax_window (GtkWidget *se, const gchar *filename)
 +{
 +  gboolean ok;
 +
 +  gtk_source_buffer_begin_not_undoable_action (PSPPIRE_SYNTAX_WINDOW (se)->buffer);
 +  ok = psppire_window_load (PSPPIRE_WINDOW (se), filename);
 +  gtk_source_buffer_end_not_undoable_action (PSPPIRE_SYNTAX_WINDOW (se)->buffer);
 +
 +  if (ok )
 +    gtk_widget_show (se);
 +  else
 +    gtk_widget_destroy (se);
 +}
 +
  void
  create_syntax_window (void)
  {
  }
  
  void
 -open_syntax_window (const char *file_name)
 +open_new_syntax_window (const char *file_name)
  {
    GtkWidget *se = psppire_syntax_window_new ();
  
 -  if ( psppire_window_load (PSPPIRE_WINDOW (se), file_name) )
 -    gtk_widget_show (se);
 -  else
 -    gtk_widget_destroy (se);
 +  if ( file_name)
 +    load_and_show_syntax_window (se, file_name);
  }
  
 -static void
 -on_text_changed (GtkTextBuffer *buffer, PsppireSyntaxWindow *window)
 -{
 -  gtk_statusbar_pop (GTK_STATUSBAR (window->sb), window->text_context);
 -}
 +
 +
 +static void psppire_syntax_window_print (PsppireSyntaxWindow *window);
  
  static void
  on_modified_changed (GtkTextBuffer *buffer, PsppireWindow *window)
  
  extern struct source_stream *the_source_stream ;
  
 +static void undo_redo_update (PsppireSyntaxWindow *window);
 +static void undo_last_edit (PsppireSyntaxWindow *window);
 +static void redo_last_edit (PsppireSyntaxWindow *window);
 +
 +static void
 +on_text_changed (GtkTextBuffer *buffer, PsppireSyntaxWindow *window)
 +{
 +  gtk_statusbar_pop (GTK_STATUSBAR (window->sb), window->text_context);
 +  undo_redo_update (window);
 +}
 +
  static void
  psppire_syntax_window_init (PsppireSyntaxWindow *window)
  {
    GtkWidget *menubar = get_widget_assert (xml, "menubar");
    GtkWidget *sw = get_widget_assert (xml, "scrolledwindow8");
  
 -
    GtkWidget *text_view = get_widget_assert (xml, "syntax_text_view");
  
 +  PsppireSyntaxWindowClass *class
 +    = PSPPIRE_SYNTAX_WINDOW_CLASS (G_OBJECT_GET_CLASS (window));
 +
+   GtkClipboard *clip_selection = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD);
+   GtkClipboard *clip_primary =   gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_PRIMARY);
 +  window->print_settings = NULL;
 +  window->undo_menuitem = get_action_assert (xml, "edit_undo");
 +  window->redo_menuitem = get_action_assert (xml, "edit_redo");
 +
 +  if (class->lan)
 +    window->buffer = gtk_source_buffer_new_with_language (class->lan);
 +  else
 +    window->buffer = gtk_source_buffer_new (NULL);
 +
 +  gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), GTK_TEXT_BUFFER (window->buffer));
 +
 +  g_object_set (window->buffer,
 +              "highlight-matching-brackets", TRUE,
 +              NULL);
 +
 -  window->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
 +  g_object_set (text_view,
 +              "show-line-numbers", TRUE,
 +              "show-line-marks", TRUE,
 +              "auto-indent", TRUE,
 +              "indent-width", 4,
 +              "highlight-current-line", TRUE,
 +              NULL);
++
+   g_signal_connect_swapped (clip_primary, "owner-change", G_CALLBACK (selection_changed), window);
+   g_signal_connect (clip_selection, "owner-change", G_CALLBACK (on_owner_change), window);
+   window->cliptext = NULL;
+   window->edit_delete = get_action_assert (xml, "edit_delete");
+   window->edit_copy = get_action_assert (xml, "edit_copy");
+   window->edit_cut = get_action_assert (xml, "edit_cut");
+   window->edit_paste = get_action_assert (xml, "edit_paste");
    window->lexer = lex_create (the_source_stream);
  
    window->sb = get_widget_assert (xml, "statusbar2");
    g_signal_connect (window->buffer, "modified-changed",
                    G_CALLBACK (on_modified_changed), window);
  
 +  g_signal_connect_swapped (get_action_assert (xml, "file_print"), "activate",
 +                            G_CALLBACK (psppire_syntax_window_print), window);
 +
 +
 +  g_signal_connect_swapped (window->undo_menuitem,
 +                          "activate",
 +                            G_CALLBACK (undo_last_edit),
 +                          window);
 +
 +  g_signal_connect_swapped (window->redo_menuitem,
 +                          "activate",
 +                            G_CALLBACK (redo_last_edit),
 +                          window);
 +
 +  undo_redo_update (window);
 +
    connect_help (xml);
  
    gtk_container_add (GTK_CONTAINER (window), box);
                    G_CALLBACK (on_quit),
                    window);
  
+   g_signal_connect_swapped (window->edit_delete,
+                   "activate",
+                   G_CALLBACK (on_edit_delete),
+                   window);
+   g_signal_connect_swapped (window->edit_copy,
+                   "activate",
+                   G_CALLBACK (on_edit_copy),
+                   window);
+   g_signal_connect_swapped (window->edit_cut,
+                   "activate",
+                   G_CALLBACK (on_edit_cut),
+                   window);
+   g_signal_connect_swapped (window->edit_paste,
+                   "activate",
+                   G_CALLBACK (on_edit_paste),
+                   window);
    g_signal_connect (get_action_assert (xml,"run_all"),
                    "activate",
                    G_CALLBACK (on_run_all),
                    window);
  
    g_signal_connect (get_action_assert (xml,"run_selection"),
                    "activate",
                    G_CALLBACK (on_run_selection),
                    G_CALLBACK (psppire_window_minimise_all), NULL);
  
  
 +
 +
 +
    {
    GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER));
  
  }
  
  
  GtkWidget*
  psppire_syntax_window_new (void)
  {
@@@ -626,7 -746,7 +836,7 @@@ syntax_load (PsppireWindow *window, con
    gsize len_utf8 = -1;
    GtkTextIter iter;
    PsppireSyntaxWindow *sw = PSPPIRE_SYNTAX_WINDOW (window);
 -
 +  GtkTextBuffer *buffer = GTK_TEXT_BUFFER (sw->buffer);
    /* FIXME: What if it's a very big file ? */
    if ( ! g_file_get_contents (filename, &text_locale, &len_locale, &err) )
      {
        return FALSE;
      }
  
 -  gtk_text_buffer_get_iter_at_line (sw->buffer, &iter, 0);
 +  gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
  
 -  gtk_text_buffer_insert (sw->buffer, &iter, text_utf8, len_utf8);
 +  gtk_text_buffer_insert (buffer, &iter, text_utf8, len_utf8);
  
 -  gtk_text_buffer_set_modified (sw->buffer, FALSE);
 +  gtk_text_buffer_set_modified (buffer, FALSE);
  
    free (text_utf8);
  
@@@ -666,112 -786,5 +876,112 @@@ psppire_syntax_window_iface_init (Psppi
    iface->load = syntax_load;
  }
  
 +\f
 +
 +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);
 +}
index 14710df2d567bed067dbc78bfcaba218d0bd37a9,9da7c86996c6335d6b38866982f91ae0c5a9cfc0..1f97cbc7e0e4814f5fd7d40ca897b78e352c64ee
  #include "psppire-window.h"
  #include <gtk/gtk.h>
  
 +#include <gtksourceview/gtksourcelanguage.h>
 +#include <gtksourceview/gtksourcelanguagemanager.h>
 +#include <gtksourceview/gtksourcebuffer.h>
 +#include <gtksourceview/gtksourceprintcompositor.h>
 +
  G_BEGIN_DECLS
  
  #define PSPPIRE_SYNTAX_WINDOW_TYPE            (psppire_syntax_window_get_type ())
  #define PSPPIRE_SYNTAX_WINDOW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), PSPPIRE_SYNTAX_WINDOW_TYPE, PsppireSyntaxWindow))
  #define PSPPIRE_SYNTAX_WINDOW_CLASS(class)    (G_TYPE_CHECK_CLASS_CAST ((class), \
 -    PSPPIRE_SYNTAX_WINDOW_TYPE, PsppireSyntax_WindowClass))
 +    PSPPIRE_SYNTAX_WINDOW_TYPE, PsppireSyntaxWindowClass))
  #define PSPPIRE_IS_SYNTAX_WINDOW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
      PSPPIRE_SYNTAX_WINDOW_TYPE))
  #define PSPPIRE_IS_SYNTAX_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \
@@@ -52,31 -47,30 +52,38 @@@ struct _PsppireSyntaxWindo
  
    /* <private> */
  
 -  GtkTextBuffer *buffer;  /* The buffer which contains the text */
 +  GtkSourceBuffer *buffer;  /* The buffer which contains the text */
    struct lexer *lexer;    /* Lexer to parse syntax */
    GtkWidget *sb;
    guint text_context;
  
 +  GtkPrintSettings *print_settings;
 +  GtkSourcePrintCompositor *compositor;
 +  GtkAction *undo_menuitem;
 +  GtkAction *redo_menuitem;
++
+   gchar *cliptext;
+   GtkAction *edit_cut;
+   GtkAction *edit_copy;
+   GtkAction *edit_delete;
+   GtkAction *edit_paste;
  };
  
  struct _PsppireSyntaxWindowClass
  {
    PsppireWindowClass parent_class;
  
 +
 +  GtkSourceLanguage *lan ;
  };
  
  GType      psppire_syntax_window_get_type        (void);
  GtkWidget* psppire_syntax_window_new             (void);
  
  void create_syntax_window (void);
 -void open_syntax_window (const char *file_name);
 +void open_new_syntax_window (const char *file_name);
 +
  
  G_END_DECLS
  
index a3450973760c578ed3df2903d33d885e1763ed1a,c9436629e58779d6922bf4e795afbd35d675ca30..4f134c2e1cb51b966674a5c0dc764941b7a5b93e
              <property name="name">file_save_as</property>
            </object>
          </child>
 +        <child>
 +          <object class="GtkAction" id="file_print">
 +            <property name="name">file_print</property>
 +            <property name="stock-id">gtk-print</property>
 +          </object>
 +        </child>
          <child>
            <object class="GtkAction" id="file_quit">
              <property name="stock-id">gtk-quit</property>
          <child>
            <object class="GtkAction" id="edit_cut">
              <property name="stock-id">gtk-cut</property>
-             <property name="name">cut</property>
+             <property name="name">edit_cut</property>
+             <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_copy">
              <property name="stock-id">gtk-copy</property>
-             <property name="name">copy</property>
+             <property name="name">edit_copy</property>
+             <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_paste">
              <property name="stock-id">gtk-paste</property>
-             <property name="name">paste</property>
+             <property name="name">edit_paste</property>
+             <property name="sensitive">false</property>
            </object>
          </child>
          <child>
            <object class="GtkAction" id="edit_delete">
              <property name="stock-id">gtk-delete</property>
-             <property name="name">delete</property>
+             <property name="name">edit_delete</property>
+             <property name="sensitive">false</property>
            </object>
          </child>
 +        <child>
 +          <object class="GtkAction" id="edit_undo">
 +            <property name="stock-id">gtk-undo</property>
 +            <property name="name">edit_undo</property>
 +          </object>
 +        </child>
 +        <child>
 +          <object class="GtkAction" id="edit_redo">
 +            <property name="stock-id">gtk-redo</property>
 +            <property name="name">edit_redo</property>
 +          </object>
 +        </child>
          <child>
            <object class="GtkAction" id="run1">
              <property name="name">run1</property>
            <menuitem action="file_save"/>
            <menuitem action="file_save_as"/>
            <separator/>
 +          <menuitem action="file_print"/>
 +          <separator/>
            <menuitem action="file_quit"/>
          </menu>
          <menu action="menuitem7">
            <menuitem action="edit_copy"/>
            <menuitem action="edit_paste"/>
            <menuitem action="edit_delete"/>
 +          <separator/>
 +          <menuitem action="edit_undo"/>
 +          <menuitem action="edit_redo"/>
          </menu>
          <menu action="run1">
            <menuitem action="run_all"/>
      <property name="shadow_type">GTK_SHADOW_IN</property>
      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
      <child>
 -      <object class="GtkTextView" id="syntax_text_view">
 +      <object class="GtkSourceView" id="syntax_text_view">
          <property name="visible">True</property>
          <property name="can_focus">True</property>
          <property name="editable">True</property>