Bug 9047 fixed: edit('foo',12) now opens the function foo 12 lines after the definiti... 45/3345/3
Calixte DENIZET [Mon, 28 Feb 2011 15:20:47 +0000 (16:20 +0100)]
Change-Id: I5bb96bf21dd750214fa5a85449608888120d85be

12 files changed:
scilab/CHANGES_5.3.X
scilab/modules/core/help/en_US/edit.xml
scilab/modules/core/macros/edit.sci
scilab/modules/scinotes/help/en_US/editor.xml
scilab/modules/scinotes/includes/callscinotes.h
scilab/modules/scinotes/sci_gateway/cpp/sci_scinotes.cpp
scilab/modules/scinotes/src/cpp/callscinotes.cpp
scilab/modules/scinotes/src/java/org/scilab/modules/scinotes/SciNotes.java
scilab/modules/scinotes/src/java/org/scilab/modules/scinotes/ScilabEditorPane.java
scilab/modules/scinotes/src/jni/SciNotes.cpp
scilab/modules/scinotes/src/jni/SciNotes.giws.xml
scilab/modules/scinotes/src/jni/SciNotes.hxx

index 30cdd21..caebe97 100644 (file)
@@ -2,6 +2,13 @@
             =================================================
 
 
+Scinotes:
+=========
+
+* bug 9047 fixed - edit('foo',12) now opens the function foo 12 lines after the
+                   definition of foo.
+
+
 Bug fixes:
 ==========
 
index 122ac61..9e52666 100644 (file)
@@ -70,7 +70,7 @@
     <literal>edit</literal> opens the file with filename equals to functionname.</para>
 
     <para>
-      If linenumber is given, the file is opened at this line.
+      If linenumber is given, the file is opened at this line relatively to the definition of the macro named as the file itself. If the macro definition is not found, the file is opened at line given by linenumber.
     </para>
   </refsection>
 
@@ -81,7 +81,7 @@
 edit('edit')  //opens editor with text of this function
 edit('myfunction')  //opens editor for a new function
 edit('/home/foo/bar.sci') //opens the file bar.sci
-edit('test_run', 123) // opens the file test_run.sci at line 123
+edit('test_run', 123) // opens the file test_run.sci at line 123 relatively to the definition of test_run()
  ]]></programlisting>
   </refsection>
 
index 2ffcefc..550bb95 100644 (file)
@@ -80,7 +80,7 @@ function edit(macroname,linenumber)
 
     // call the editor with the filename
     if (rhs == 2) then
-        editor(fname, linenumber);
+        editor(fname, linenumber, macroname);
     else
         editor(fname);
     end
index 6b2f3e6..6db4850 100644 (file)
@@ -34,6 +34,7 @@
       editor(file)
       editor([file1, file2])
       editor(file, line_number)
+      editor(file, line_number, macro_name)
       editor([file1, file2], [line_number1, line_number2])
       editor(file, 'readonly')
       editor([file1, file2], 'readonly')
     
     <variablelist>
       <varlistentry>
+        <term>macro_name</term>
+       
+        <listitem>
+          <para>a string, the line number would be relative to the definition of the function macro_name</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+    <variablelist>
+      <varlistentry>
         <term>[line_number1, line_number2]</term>
 
         <listitem>
@@ -674,6 +685,9 @@ editor(['SCI/modules/time/macros/datenum.sci','SCI/modules/time/macros/datevec.s
 // editor with a file name and the line number to highlight
 editor('SCI/modules/time/macros/datenum.sci', 5);
 
+// editor with a file name and the line number to highlight
+editor('SCI/modules/time/macros/datenum.sci', 8, 'datenum');
+
 // editor with a matrix of files name and the corresponding matrix of lines to highlight
 // the files name matrix and the lines to highlight matrix should have the same size
 editor(['SCI/modules/time/macros/datenum.sci','SCI/modules/time/macros/datevec.sci'], [5,10]);
index 033a681..eeeed25 100644 (file)
@@ -23,7 +23,7 @@
 * @return 0
 */
 SCINOTES_IMPEXP int callSciNotesW(wchar_t **_wcfilenames, int _nbfiles);
-SCINOTES_IMPEXP int callSciNotesWWithLineNumber(wchar_t **_wcfilenames, double* pdblLineNumber, int _nbfiles);
+SCINOTES_IMPEXP int callSciNotesWWithLineNumberAndFunction(wchar_t **_wcfilenames, double* pdblLineNumber, char *functionName, int _nbfiles);
 SCINOTES_IMPEXP int callSciNotesWWithOption(wchar_t **_wcfilenames, wchar_t** option, int _nbfiles);
 /*--------------------------------------------------------------------------*/
 #endif /* __CALLSCINOTES_H__ */
index ec2b560..3f73be9 100644 (file)
@@ -34,7 +34,7 @@ int
 sci_scinotes(char *fname, unsigned long fname_len)
 {
     SciErr sciErr;
-    CheckRhs(0, 2);
+    CheckRhs(0, 3);
     CheckLhs(0, 1);
 
     if (Rhs == 0)
@@ -61,6 +61,7 @@ sci_scinotes(char *fname, unsigned long fname_len)
         int *lenStVarOne = NULL;
         int i = 0;
         int iType1 = 0;
+        char *functionName = NULL;
 
         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
         if (sciErr.iErr)
@@ -146,7 +147,7 @@ sci_scinotes(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (Rhs == 2) //get line numbers
+        if (Rhs >= 2) //get line numbers
         {
             int* piAddressVarTwo = NULL;
             int m2 = 0, n2 = 0;
@@ -325,24 +326,52 @@ sci_scinotes(char *fname, unsigned long fname_len)
                     return 0;
                 }
 
+                if (Rhs == 3)
+                {
+                    int *piAddressVarThree = NULL;
+
+                    sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddressVarThree);
+                    if (sciErr.iErr)
+                    {
+                        printError(&sciErr, 0);
+                        return 0;
+                    }
+
+                    if (!isStringType(pvApiCtx, piAddressVarThree))
+                    {
+                        Scierror(
+                                 999,
+                                 _("%s: Wrong type for argument %d: A single string.\n"),
+                                 fname, 3);
+                        freeArrayOfWideString(pStVarOne, m1 * n1);
+                        FREE(lenStVarOne);
+                        return 0;
+                    }
+
+                    int ret = getAllocatedSingleString(pvApiCtx, piAddressVarThree, &functionName);
+                    if (ret)
+                    {
+                        Scierror(
+                                 999,
+                                 _("%s: Wrong type for argument %d: A single string.\n"),
+                                 fname, 3);
+                        freeArrayOfWideString(pStVarOne, m1 * n1);
+                        FREE(lenStVarOne);
+                        return 0;
+                    }
+                }
+
                 try
                 {
-                    callSciNotesWWithLineNumber(pStVarOne, pdblVarTwo, m1 * n1);
+                    callSciNotesWWithLineNumberAndFunction(pStVarOne, pdblVarTwo, functionName, m1 * n1);
                 }
                 catch (GiwsException::JniCallMethodException exception)
                 {
-                    Scierror(999, "%s: %s\n", fname,
-                            exception.getJavaDescription().c_str());
-                    freeArrayOfWideString(pStVarOne, m1 * n1);
-                    FREE(lenStVarOne);
-                    return 0;
+                    Scierror(999, "%s: %s\n", fname, exception.getJavaDescription().c_str());
                 }
                 catch (GiwsException::JniException exception)
                 {
                     Scierror(999, "%s: %s\n", fname, exception.what());
-                    freeArrayOfWideString(pStVarOne, m1 * n1);
-                    FREE(lenStVarOne);
-                    return 0;
                 }
             }
         }
@@ -354,24 +383,20 @@ sci_scinotes(char *fname, unsigned long fname_len)
             }
             catch (GiwsException::JniCallMethodException exception)
             {
-                Scierror(999, "%s: %s\n", fname,
-                        exception.getJavaDescription().c_str());
-                freeArrayOfWideString(pStVarOne, m1 * n1);
-                FREE(lenStVarOne);
-                return  0;
+                Scierror(999, "%s: %s\n", fname, exception.getJavaDescription().c_str());
             }
             catch (GiwsException::JniException exception)
             {
                 Scierror(999, "%s: %s\n", fname, exception.what());
-                freeArrayOfWideString(pStVarOne, m1 * n1);
-                FREE(lenStVarOne);
-                return  0;
             }
-
         }
 
         freeArrayOfWideString(pStVarOne, m1 * n1);
         FREE(lenStVarOne);
+        if (functionName)
+        {
+            freeAllocatedSingleString(functionName);
+        }
     }
 
     LhsVar(1) = 0;
index a07e8fe..631bd8d 100644 (file)
@@ -58,7 +58,7 @@ int callSciNotesW(wchar_t **_wcfilenames, int _nbfiles)
         return 0;
 }
 
-int callSciNotesWWithLineNumber(wchar_t **_wcfilenames, double* pdblLineNumber, int _nbfiles)
+int callSciNotesWWithLineNumberAndFunction(wchar_t **_wcfilenames, double* pdblLineNumber, char *functionName, int _nbfiles)
 {
         if ( (_wcfilenames) && (_nbfiles > 0) )
         {
@@ -73,7 +73,7 @@ int callSciNotesWWithLineNumber(wchar_t **_wcfilenames, double* pdblLineNumber,
                                         char *fullFilename = wide_string_to_UTF8(wcFullFilename);
                                         if (fullFilename)
                                         {
-                                                SciNotes::scinotes(getScilabJavaVM(), fullFilename, (int)pdblLineNumber[i]);
+                                                SciNotes::scinotes(getScilabJavaVM(), fullFilename, (int)pdblLineNumber[i], functionName);
                                                 FREE(fullFilename);
                                                 fullFilename = NULL;
                                         }
index 5afcc45..66f7f5d 100644 (file)
@@ -277,12 +277,12 @@ public class SciNotes extends SwingScilabTab implements Tab {
      *
      * This method *must not* be called on the EDT thread.
      */
-    public static void scinotes(final String filePath, final int lineNumber) {
+    public static void scinotes(final String filePath, final int lineNumber, final String functionName) {
         try {
             SwingUtilities.invokeAndWait(new Runnable() {
 
                     public void run() {
-                        launchSciNotes().openFile(filePath, lineNumber, null);
+                        launchSciNotes().openFile(filePath, lineNumber, functionName);
                     }
                 });
         } catch (InterruptedException e) {
@@ -451,7 +451,11 @@ public class SciNotes extends SwingScilabTab implements Tab {
         }
 
         readFileAndWait(f);
-        getTextPane().scrollTextToLineNumber(lineNumber, true);
+        if (option == null || option.length() == 0 || "readonly".equals(option.toLowerCase())) {
+            getTextPane().scrollTextToLineNumber(lineNumber, true);
+        } else {
+            getTextPane().scrollTextToLineNumberInWhereami(lineNumber, option, true);
+        }
         if ((option != null && "readonly".equals(option.toLowerCase()))) {
             getTextPane().setReadOnly(true);
             getInfoBar().setText(getTextPane().getInfoBarText());
index b173c0a..6e72666 100644 (file)
@@ -670,6 +670,29 @@ public class ScilabEditorPane extends JEditorPane implements Highlighter.Highlig
     }
 
     /**
+     * Scroll the pane to have the line lineNumber on the top of the pane in whereami mode
+     * The line number is computed regarding the function named funname.
+     * @param lineNumber the number of the line
+     * @param funname the function name
+     * @param highlight true to highlight the line
+     */
+    public void scrollTextToLineNumberInWhereami(int lineNumber, String funname, boolean highlight) {
+        if (funname != null) {
+            Element root = getDocument().getDefaultRootElement();
+            int nlines = root.getElementCount();
+            ScilabDocument.ScilabLeafElement elem;
+            for (int i = 0; i < nlines; i++) {
+                elem = (ScilabDocument.ScilabLeafElement) root.getElement(i);
+                if (elem.getFunctionName().equals(funname)) {
+                    lineNumber += i;
+                    break;
+                }
+            }
+        }
+        scrollTextToLineNumber(lineNumber, highlight);
+    }
+
+    /**
      * @return the width of a white
      */
     public int getWhiteWidth() {
index f2d358c..8324cd3 100644 (file)
@@ -47,7 +47,9 @@ JNIEnv * SciNotes::getCurrentEnv() {
 JNIEnv * curEnv = NULL;
 jint res=this->jvm->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
 if (res != JNI_OK) {
-throw GiwsException::JniException(getCurrentEnv());
+std::cerr << "Could not retrieve the current JVM." << std::endl;
+exit(EXIT_FAILURE);
+
 }
 return curEnv;
 }
@@ -73,7 +75,9 @@ JNIEnv * curEnv = getCurrentEnv();
 
 localClass = curEnv->FindClass( this->className().c_str() ) ;
 if (localClass == NULL) {
-  throw GiwsException::JniClassNotFoundException(curEnv, this->className());
+std::cerr << "Could not get the Class " << this->className() <<  std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
 this->instanceClass = static_cast<jclass>(curEnv->NewGlobalRef(localClass));
@@ -82,23 +86,31 @@ this->instanceClass = static_cast<jclass>(curEnv->NewGlobalRef(localClass));
 curEnv->DeleteLocalRef(localClass);
 
 if (this->instanceClass == NULL) {
-throw GiwsException::JniObjectCreationException(curEnv, this->className());
+std::cerr << "Could not create a Global Ref of " << this->className() <<  std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
 
 constructObject = curEnv->GetMethodID( this->instanceClass, construct.c_str() , param.c_str() ) ;
 if(constructObject == NULL){
-throw GiwsException::JniObjectCreationException(curEnv, this->className());
+std::cerr << "Could not retrieve the constructor of the class " << this->className() << " with the profile : " << construct << param << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
 localInstance = curEnv->NewObject( this->instanceClass, constructObject ) ;
 if(localInstance == NULL){
-throw GiwsException::JniObjectCreationException(curEnv, this->className());
+std::cerr << "Could not instantiate the object " << this->className() << " with the constructor : " << construct << param << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
  
 this->instance = curEnv->NewGlobalRef(localInstance) ;
 if(this->instance == NULL){
-throw GiwsException::JniObjectCreationException(curEnv, this->className());
+std::cerr << "Could not create a new global ref of " << this->className() << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 /* localInstance not needed anymore */
 curEnv->DeleteLocalRef(localInstance);
@@ -106,7 +118,7 @@ curEnv->DeleteLocalRef(localInstance);
                 /* Methods ID set to NULL */
 voidscinotesID=NULL; 
 voidscinotesjstringID=NULL; 
-voidscinotesjstringjintID=NULL; 
+voidscinotesjstringjintjstringID=NULL; 
 voidscinotesjstringjstringID=NULL; 
 voidcloseSciNotesFromScilabID=NULL; 
 
@@ -123,17 +135,23 @@ jclass localClass = curEnv->GetObjectClass(JObj);
         curEnv->DeleteLocalRef(localClass);
 
         if (this->instanceClass == NULL) {
-throw GiwsException::JniObjectCreationException(curEnv, this->className());
+
+std::cerr << "Could not create a Global Ref of " << this->className() <<  std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
         }
 
         this->instance = curEnv->NewGlobalRef(JObj) ;
         if(this->instance == NULL){
-throw GiwsException::JniObjectCreationException(curEnv, this->className());
+
+std::cerr << "Could not create a new global ref of " << this->className() << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
         }
         /* Methods ID set to NULL */
         voidscinotesID=NULL; 
 voidscinotesjstringID=NULL; 
-voidscinotesjstringjintID=NULL; 
+voidscinotesjstringjintjstringID=NULL; 
 voidscinotesjstringjstringID=NULL; 
 voidcloseSciNotesFromScilabID=NULL; 
 
@@ -144,13 +162,17 @@ voidcloseSciNotesFromScilabID=NULL;
 
 void SciNotes::synchronize() {
 if (getCurrentEnv()->MonitorEnter(instance) != JNI_OK) {
-throw GiwsException::JniMonitorException(getCurrentEnv(), "SciNotes");
+std::cerr << "Fail to enter monitor." << std::endl;
+exit(EXIT_FAILURE);
+
 }
 }
 
 void SciNotes::endSynchronize() {
 if ( getCurrentEnv()->MonitorExit(instance) != JNI_OK) {
-throw GiwsException::JniMonitorException(getCurrentEnv(), "SciNotes");
+
+std::cerr << "Fail to exit monitor." << std::endl;
+exit(EXIT_FAILURE);
 }
 }
 // Method(s)
@@ -163,13 +185,16 @@ jclass cls = curEnv->FindClass( className().c_str() );
 
 jmethodID voidscinotesID = curEnv->GetStaticMethodID(cls, "scinotes", "()V" ) ;
 if (voidscinotesID == NULL) {
-throw GiwsException::JniMethodNotFoundException(curEnv, "scinotes");
+std::cerr << "Could not access to the method " << "scinotes" << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
                          curEnv->CallStaticVoidMethod(cls, voidscinotesID );
                         if (curEnv->ExceptionCheck()) {
-throw GiwsException::JniCallMethodException(curEnv);
+curEnv->ExceptionDescribe() ;
 }
+
 }
 
 void SciNotes::scinotes (JavaVM * jvm_, char * fileName){
@@ -180,34 +205,42 @@ jclass cls = curEnv->FindClass( className().c_str() );
 
 jmethodID voidscinotesjstringID = curEnv->GetStaticMethodID(cls, "scinotes", "(Ljava/lang/String;)V" ) ;
 if (voidscinotesjstringID == NULL) {
-throw GiwsException::JniMethodNotFoundException(curEnv, "scinotes");
+std::cerr << "Could not access to the method " << "scinotes" << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
 jstring fileName_ = curEnv->NewStringUTF( fileName );
 
                          curEnv->CallStaticVoidMethod(cls, voidscinotesjstringID ,fileName_);
                         if (curEnv->ExceptionCheck()) {
-throw GiwsException::JniCallMethodException(curEnv);
+curEnv->ExceptionDescribe() ;
 }
+
 }
 
-void SciNotes::scinotes (JavaVM * jvm_, char * fileName, int lineNumber){
+void SciNotes::scinotes (JavaVM * jvm_, char * fileName, int lineNumber, char * functionName){
 
 JNIEnv * curEnv = NULL;
 jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
 jclass cls = curEnv->FindClass( className().c_str() );
 
-jmethodID voidscinotesjstringjintID = curEnv->GetStaticMethodID(cls, "scinotes", "(Ljava/lang/String;I)V" ) ;
-if (voidscinotesjstringjintID == NULL) {
-throw GiwsException::JniMethodNotFoundException(curEnv, "scinotes");
+jmethodID voidscinotesjstringjintjstringID = curEnv->GetStaticMethodID(cls, "scinotes", "(Ljava/lang/String;ILjava/lang/String;)V" ) ;
+if (voidscinotesjstringjintjstringID == NULL) {
+std::cerr << "Could not access to the method " << "scinotes" << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
 jstring fileName_ = curEnv->NewStringUTF( fileName );
 
-                         curEnv->CallStaticVoidMethod(cls, voidscinotesjstringjintID ,fileName_, lineNumber);
+jstring functionName_ = curEnv->NewStringUTF( functionName );
+
+                         curEnv->CallStaticVoidMethod(cls, voidscinotesjstringjintjstringID ,fileName_, lineNumber, functionName_);
                         if (curEnv->ExceptionCheck()) {
-throw GiwsException::JniCallMethodException(curEnv);
+curEnv->ExceptionDescribe() ;
 }
+
 }
 
 void SciNotes::scinotes (JavaVM * jvm_, char * fileName, char * option){
@@ -218,7 +251,9 @@ jclass cls = curEnv->FindClass( className().c_str() );
 
 jmethodID voidscinotesjstringjstringID = curEnv->GetStaticMethodID(cls, "scinotes", "(Ljava/lang/String;Ljava/lang/String;)V" ) ;
 if (voidscinotesjstringjstringID == NULL) {
-throw GiwsException::JniMethodNotFoundException(curEnv, "scinotes");
+std::cerr << "Could not access to the method " << "scinotes" << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
 jstring fileName_ = curEnv->NewStringUTF( fileName );
@@ -227,8 +262,9 @@ jstring option_ = curEnv->NewStringUTF( option );
 
                          curEnv->CallStaticVoidMethod(cls, voidscinotesjstringjstringID ,fileName_, option_);
                         if (curEnv->ExceptionCheck()) {
-throw GiwsException::JniCallMethodException(curEnv);
+curEnv->ExceptionDescribe() ;
 }
+
 }
 
 void SciNotes::closeSciNotesFromScilab (JavaVM * jvm_){
@@ -239,13 +275,16 @@ jclass cls = curEnv->FindClass( className().c_str() );
 
 jmethodID voidcloseSciNotesFromScilabID = curEnv->GetStaticMethodID(cls, "closeSciNotesFromScilab", "()V" ) ;
 if (voidcloseSciNotesFromScilabID == NULL) {
-throw GiwsException::JniMethodNotFoundException(curEnv, "closeSciNotesFromScilab");
+std::cerr << "Could not access to the method " << "closeSciNotesFromScilab" << std::endl;
+curEnv->ExceptionDescribe();
+exit(EXIT_FAILURE);
 }
 
                          curEnv->CallStaticVoidMethod(cls, voidcloseSciNotesFromScilabID );
                         if (curEnv->ExceptionCheck()) {
-throw GiwsException::JniCallMethodException(curEnv);
+curEnv->ExceptionDescribe() ;
 }
+
 }
 
 }
index ff0f984..201ae1f 100644 (file)
@@ -7,6 +7,7 @@
         <method name="scinotes" returnType="void" modifier="static">
             <parameter name="fileName" type="String"/>
             <parameter name="lineNumber" type="int"/>
+           <parameter name="functionName" type="String"/>
         </method>
         <method name="scinotes" returnType="void" modifier="static">
             <parameter name="fileName" type="String"/>
index 09e0cb9..159491a 100644 (file)
@@ -47,8 +47,6 @@ knowledge of the CeCILL-B license and that you accept its terms.
 #include <stdlib.h>
 #include <jni.h>
 
-#include "GiwsException.hxx"
-
 #ifndef _MSC_VER /* Defined anyway with Visual */
 #if !defined(byte)
 typedef signed char byte;
@@ -66,7 +64,7 @@ JavaVM * jvm;
 protected:
 jmethodID voidscinotesID; // cache method id
 jmethodID voidscinotesjstringID; // cache method id
-jmethodID voidscinotesjstringjintID; // cache method id
+jmethodID voidscinotesjstringjintjstringID; // cache method id
 jmethodID voidscinotesjstringjstringID; // cache method id
 jmethodID voidcloseSciNotesFromScilabID; // cache method id
 
@@ -129,7 +127,7 @@ static void scinotes(JavaVM * jvm_);
 
 static void scinotes(JavaVM * jvm_, char * fileName);
 
-static void scinotes(JavaVM * jvm_, char * fileName, int lineNumber);
+static void scinotes(JavaVM * jvm_, char * fileName, int lineNumber, char * functionName);
 
 static void scinotes(JavaVM * jvm_, char * fileName, char * option);