changeset 18236:f26d527c1a71 stable

allow the gui editor to set breakpoints in class methods (bug #41126) * file-editor-tab.h, file-editor-tab.cc (bp_info::bp_info): Construct bp_info struct from file name and line number instead of individual struct components. Change all uses. Recognize class name in file names that match /dir/@class/fcn.m.
author John W. Eaton <jwe@octave.org>
date Tue, 07 Jan 2014 16:01:44 -0500
parents 0806c9e75e08
children e42d4f152766 450f50d3eb18
files libgui/src/m-editor/file-editor-tab.cc libgui/src/m-editor/file-editor-tab.h
diffstat 2 files changed, 37 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor-tab.cc	Tue Jan 07 15:00:11 2014 -0500
+++ b/libgui/src/m-editor/file-editor-tab.cc	Tue Jan 07 16:01:44 2014 -0500
@@ -51,6 +51,8 @@
 #include "file-editor-tab.h"
 #include "file-editor.h"
 
+#include "file-ops.h"
+
 #include "debug.h"
 #include "octave-qt-link.h"
 #include "version.h"
@@ -616,17 +618,40 @@
     bp_table::remove_all_breakpoints_in_file (info.function_name, true);
 }
 
+file_editor_tab::bp_info::bp_info (const QString& fname, int l)
+  : line (l), file (fname.toStdString ())
+{
+  QFileInfo file_info (fname);
+
+  QString q_dir = file_info.absolutePath ();
+  QString q_function_name = file_info.fileName ();
+
+  // We have to cut off the suffix, because octave appends it.
+  q_function_name.chop (file_info.suffix ().length () + 1);
+
+  dir = q_dir.toStdString ();
+  function_name = q_function_name.toStdString ();
+
+  // Is the last component of DIR @foo?  If so, strip it and prepend it
+  // to the name of the function.
+
+  size_t pos = dir.rfind (file_ops::dir_sep_chars ());
+
+  if (pos != std::string::npos && pos < dir.length () - 1)
+    {
+      if (dir[pos+1] == '@')
+        {
+          function_name = file_ops::concat (dir.substr (pos+1), function_name);
+
+          dir = dir.substr (0, pos);
+        }
+    }
+}
+
 void
 file_editor_tab::request_add_breakpoint (int line)
 {
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, line+1);
+  bp_info info (_file_name, line+1);
 
   octave_link::post_event
     (this, &file_editor_tab::add_breakpoint_callback, info);
@@ -635,14 +660,7 @@
 void
 file_editor_tab::request_remove_breakpoint (int line)
 {
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, line+1);
+  bp_info info (_file_name, line+1);
 
   octave_link::post_event
     (this, &file_editor_tab::remove_breakpoint_callback, info);
@@ -703,14 +721,7 @@
   if (ID != this)
     return;
 
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, 0);
+  bp_info info (_file_name);
 
   octave_link::post_event
     (this, &file_editor_tab::remove_all_breakpoints_callback, info);
--- a/libgui/src/m-editor/file-editor-tab.h	Tue Jan 07 15:00:11 2014 -0500
+++ b/libgui/src/m-editor/file-editor-tab.h	Tue Jan 07 16:01:44 2014 -0500
@@ -165,15 +165,12 @@
 
   struct bp_info
   {
-    bp_info (const QString& f, const QString& d, const QString& fn, int l)
-      : file (f.toStdString ()), dir (d.toStdString ()),
-        function_name (fn.toStdString ()), line (l)
-    { }
+    bp_info (const QString& fname, int l = 0);
 
+    int line;
     std::string file;
     std::string dir;
     std::string function_name;
-    int line;
   };
 
   bool valid_file_name (const QString& file=QString ());