Added basic undo/redo to syntax window
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 8 Aug 2010 15:23:25 +0000 (17:23 +0200)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 11 Aug 2010 17:25:53 +0000 (10:25 -0700)
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-syntax-window.c
src/ui/gui/psppire-syntax-window.h
src/ui/gui/syntax-editor.ui

index e6d905e0b5dbfea3e534afbfa2fba9e674084ca2..a5cd15c0d5ba0dc5021d231b600bc7b8196371e9 100644 (file)
@@ -465,7 +465,7 @@ open_window (PsppireWindow *de)
        if (any_reader_may_open (sysname))
          psppire_window_load (de, name);
        else
-         open_syntax_window (name);
+         open_new_syntax_window (name);
 
        g_free (sysname);
        g_free (name);
@@ -853,8 +853,6 @@ on_recent_files_select (GtkMenuShell *menushell,   gpointer user_data)
 {
   gchar *file;
 
-  GtkWidget *se ;
-
   gchar *uri =
     gtk_recent_chooser_get_current_uri (GTK_RECENT_CHOOSER (menushell));
 
@@ -862,17 +860,13 @@ on_recent_files_select (GtkMenuShell *menushell,   gpointer user_data)
 
   g_free (uri);
 
-  se = psppire_syntax_window_new ();
-
-  if ( psppire_window_load (PSPPIRE_WINDOW (se), file) ) 
-    gtk_widget_show (se);
-  else
-    gtk_widget_destroy (se);
+  open_new_syntax_window (file);
 
   g_free (file);
 }
 
 
+
 static void
 enable_delete_cases (GtkWidget *w, gint case_num, gpointer data)
 {
index 2bdebadd52e27900e1969367fbd903a356c47b6e..f0a33dbf853e4ca5702d112203f3f7f8442d46b9 100644 (file)
@@ -376,6 +376,21 @@ on_quit (GtkMenuItem *menuitem, gpointer    user_data)
 }
 
 
+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)
 {
@@ -384,21 +399,15 @@ 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);
 
@@ -411,6 +420,17 @@ 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)
 {
@@ -426,6 +446,8 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
     = PSPPIRE_SYNTAX_WINDOW_CLASS (G_OBJECT_GET_CLASS (window));
 
   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);
@@ -459,6 +481,19 @@ psppire_syntax_window_init (PsppireSyntaxWindow *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);
@@ -629,6 +664,32 @@ psppire_syntax_window_iface_init (PsppireWindowIface *iface)
   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 */
index 2f36fd2c260ee292fc7b43ac3685388d3872397c..14710df2d567bed067dbc78bfcaba218d0bd37a9 100644 (file)
@@ -59,6 +59,8 @@ struct _PsppireSyntaxWindow
 
   GtkPrintSettings *print_settings;
   GtkSourcePrintCompositor *compositor;
+  GtkAction *undo_menuitem;
+  GtkAction *redo_menuitem;
 };
 
 struct _PsppireSyntaxWindowClass
@@ -73,7 +75,8 @@ 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 bffa173170a14e175b88d89d64bdfa58870485e6..a3450973760c578ed3df2903d33d885e1763ed1a 100644 (file)
           </object>
         </child>
         <child>
-          <object class="GtkAction" id="cut2">
+          <object class="GtkAction" id="edit_cut">
             <property name="stock-id">gtk-cut</property>
-            <property name="name">cut2</property>
+            <property name="name">cut</property>
           </object>
         </child>
         <child>
-          <object class="GtkAction" id="copy2">
+          <object class="GtkAction" id="edit_copy">
             <property name="stock-id">gtk-copy</property>
-            <property name="name">copy2</property>
+            <property name="name">copy</property>
           </object>
         </child>
         <child>
-          <object class="GtkAction" id="paste2">
+          <object class="GtkAction" id="edit_paste">
             <property name="stock-id">gtk-paste</property>
-            <property name="name">paste2</property>
+            <property name="name">paste</property>
           </object>
         </child>
         <child>
-          <object class="GtkAction" id="delete1">
+          <object class="GtkAction" id="edit_delete">
             <property name="stock-id">gtk-delete</property>
-            <property name="name">delete1</property>
+            <property name="name">delete</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>
           <menuitem action="file_quit"/>
         </menu>
         <menu action="menuitem7">
-          <menuitem action="cut2"/>
-          <menuitem action="copy2"/>
-          <menuitem action="paste2"/>
-          <menuitem action="delete1"/>
+          <menuitem action="edit_cut"/>
+          <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"/>