changeset 16541:8ea8df0747e9

make undo button and menu item work for command window * main-window.h, main-window.cc (main_window::handle_undo_request, main_window::command_window_undo_callback): New functions. (main_window::construct_edit_menu): Connect _undo_action::triggered to main_window::handle_undo_request. * cmd-edit.h, cmd-edit.cc (command_window::redisplay, command_window::do_redisplay, command_window::undo, command_window::do_undo, gnu_readline::do_redisplay, gnu_readline::do_undo): New functions. * oct-rl-edit.h, oct-rl-edit.c (octave_rl_do_undo): New function.
author John W. Eaton <jwe@octave.org>
date Thu, 18 Apr 2013 03:19:48 -0400
parents 8e180eac78d0
children 63b144e6a3d0
files libgui/src/main-window.cc libgui/src/main-window.h liboctave/util/cmd-edit.cc liboctave/util/cmd-edit.h liboctave/util/oct-rl-edit.c liboctave/util/oct-rl-edit.h
diffstat 6 files changed, 65 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/main-window.cc
+++ b/libgui/src/main-window.cc
@@ -170,6 +170,12 @@
 }
 
 void
+main_window::handle_undo_request (void)
+{
+  octave_link::post_event (this, &main_window::command_window_undo_callback);
+}
+
+void
 main_window::handle_clear_command_window_request (void)
 {
   octave_link::post_event (this, &main_window::clear_command_window_callback);
@@ -1302,6 +1308,9 @@
 
   connect (current_dir_up, SIGNAL (triggered ()),
            this, SLOT (change_directory_up ()));
+
+  connect (_undo_action, SIGNAL (triggered ()),
+           this, SLOT (handle_undo_request ()));
 }
 
 void
@@ -1337,13 +1346,19 @@
 }
 
 void
+main_window::command_window_undo_callback (void)
+{
+  command_editor::undo ();
+  command_editor::redisplay ();
+}
+
+void
 main_window::clear_command_window_callback (void)
 {
   Fclc ();
   command_editor::interrupt (true);
 }
 
-
 void
 main_window::clear_history_callback (void)
 {
--- a/libgui/src/main-window.h
+++ b/libgui/src/main-window.h
@@ -89,6 +89,7 @@
   void handle_clear_history_request (void);
   void handle_rename_variable_request (const QString& old_name,
                                        const QString& new_name);
+  void handle_undo_request (void);
   void new_file (const QString& commands = QString ());
   void open_file (const QString& file_name = QString ());
   void open_online_documentation_page (void);
@@ -181,6 +182,8 @@
 
   void rename_variable_callback (const name_pair& names);
 
+  void command_window_undo_callback (void);
+
   void clear_command_window_callback (void);
 
   void clear_workspace_callback (void);
--- a/liboctave/util/cmd-edit.cc
+++ b/liboctave/util/cmd-edit.cc
@@ -86,6 +86,8 @@
 
   FILE *do_get_output_stream (void);
 
+  void do_redisplay (void);
+
   int do_terminal_rows (void);
 
   int do_terminal_cols (void);
@@ -143,6 +145,8 @@
 
   void do_accept_line (void);
 
+  bool do_undo (void);
+
   void do_clear_undo_list (void);
 
   void set_startup_hook (startup_hook_fcn f);
@@ -292,6 +296,12 @@
   return ::octave_rl_get_output_stream ();
 }
 
+void
+gnu_readline::do_redisplay (void)
+{
+  ::octave_rl_redisplay ();
+}
+
 // GNU readline handles SIGWINCH, so these values have a good chance
 // of being correct even if the window changes size (they may be
 // wrong if, for example, the luser changes the window size while the
@@ -530,6 +540,12 @@
   command_accept_line (1, '\n');
 }
 
+bool
+gnu_readline::do_undo (void)
+{
+  return ::octave_rl_do_undo ();
+}
+
 void
 gnu_readline::do_clear_undo_list ()
 {
@@ -961,6 +977,13 @@
     ? instance->do_get_output_stream () : 0;
 }
 
+void
+command_editor::redisplay (void)
+{
+  if (instance_ok ())
+    instance->do_redisplay ();
+}
+
 int
 command_editor::terminal_rows (void)
 {
@@ -1177,6 +1200,12 @@
     instance->do_accept_line ();
 }
 
+bool
+command_editor::undo (void)
+{
+  return instance_ok () ? instance->do_undo () : false;
+}
+
 void
 command_editor::clear_undo_list (void)
 {
--- a/liboctave/util/cmd-edit.h
+++ b/liboctave/util/cmd-edit.h
@@ -71,6 +71,8 @@
 
   static FILE *get_output_stream (void);
 
+  static void redisplay (void);
+
   static int terminal_rows (void);
 
   static int terminal_cols (void);
@@ -127,6 +129,8 @@
 
   static void accept_line (void);
 
+  static bool undo (void);
+
   static void clear_undo_list (void);
 
   static void add_startup_hook (startup_hook_fcn f);
@@ -213,6 +217,8 @@
 
   virtual FILE *do_get_output_stream (void) = 0;
 
+  virtual void do_redisplay (void) { }
+
   virtual int do_terminal_rows (void) { return 24; }
 
   virtual int do_terminal_cols (void) { return 80; }
@@ -271,6 +277,8 @@
 
   virtual void do_accept_line (void) = 0;
 
+  virtual bool do_undo (void) { return false; }
+
   virtual void do_clear_undo_list (void) { }
 
   virtual void set_startup_hook (startup_hook_fcn) { }
--- a/liboctave/util/oct-rl-edit.c
+++ b/liboctave/util/oct-rl-edit.c
@@ -141,6 +141,12 @@
   return rl_line_buffer;
 }
 
+int
+octave_rl_do_undo (void)
+{
+  return rl_do_undo ();
+}
+
 void
 octave_rl_clear_undo_list (void)
 {
--- a/liboctave/util/oct-rl-edit.h
+++ b/liboctave/util/oct-rl-edit.h
@@ -46,7 +46,7 @@
 {
 #endif
 
-  extern void octave_rl_redisplay (void);
+extern void octave_rl_redisplay (void);
 
 extern int octave_rl_screen_height (void);
 
@@ -68,6 +68,8 @@
 
 extern const char *octave_rl_line_buffer (void);
 
+extern int octave_rl_do_undo (void);
+
 extern void octave_rl_clear_undo_list (void);
 
 extern void octave_rl_set_name (const char *);