The variable browser also shows the user type of a tlist 18/11318/3
Sylvestre Ledru [Thu, 18 Apr 2013 12:49:35 +0000 (14:49 +0200)]
Change-Id: Iedc21466073291ac3dca0d2823bd8fd6f00c9176

scilab/CHANGES_5.5.X
scilab/modules/ui_data/src/cpp/UpdateBrowseVar.cpp
scilab/modules/ui_data/src/java/org/scilab/modules/ui_data/BrowseVar.java
scilab/modules/ui_data/src/jni/BrowseVar.cpp
scilab/modules/ui_data/src/jni/BrowseVar.giws.xml
scilab/modules/ui_data/src/jni/BrowseVar.hxx

index 913be8b..212142c 100644 (file)
@@ -21,13 +21,15 @@ BDF methods with direct and preconditioned Krylov linear solvers, from ODEPACK.
 
 * Add a complete set of functions to read and write any HDF5 file from Scilab.
 
-* The Variable Browser shows also the size of integers.
-  See bug #12523
+* The Variable Browser shows also the size of integers and the user type of
+  the tlist.
+  See bug #12523 and #10409
 
 * isnum has been redesigned in native code. Up to 130x performance
   improvements. See bug #10404
 
 
+
 Syntax changes
 ===============
 
index 256ed89..2439cb3 100644 (file)
@@ -40,6 +40,7 @@ extern "C"
 using namespace org_scilab_modules_ui_data;
 
 static std::set < string > createScilabDefaultVariablesSet();
+static char * getTlistName(char * variableName);
 
 /*--------------------------------------------------------------------------*/
 void UpdateBrowseVar(BOOL update)
@@ -62,6 +63,7 @@ void UpdateBrowseVar(BOOL update)
 
     char **pstAllVariableNames = (char **)MALLOC((iLocalVariablesUsed + iGlobalVariablesUsed) * sizeof(char *));
     char **pstAllVariableVisibility = (char **)MALLOC((iLocalVariablesUsed + iGlobalVariablesUsed) * sizeof(char *));
+    char **pstAllVariableTlistTypes = (char **)MALLOC((iLocalVariablesUsed + iGlobalVariablesUsed) * sizeof(char *));
     int *piAllVariableBytes = (int *)MALLOC((iLocalVariablesUsed + iGlobalVariablesUsed) * sizeof(int));
     char **pstAllVariableSizes = (char **)MALLOC((iLocalVariablesUsed + iGlobalVariablesUsed) * sizeof(char *));
     int *piAllVariableTypes = (int *)MALLOC((iLocalVariablesUsed + iGlobalVariablesUsed) * sizeof(int));
@@ -132,6 +134,16 @@ void UpdateBrowseVar(BOOL update)
             piAllVariableIntegerTypes[i] = -1;
         }
 
+        if (piAllVariableTypes[i] == sci_tlist)
+        {
+            pstAllVariableTlistTypes[i] = getTlistName(pstAllVariableNames[i]);
+        }
+        else
+        {
+            pstAllVariableTlistTypes[i] = strdup("");
+        }
+
+
         // global / local ??
         pstAllVariableVisibility[i] = strdup("local");
 
@@ -171,6 +183,17 @@ void UpdateBrowseVar(BOOL update)
         // global / local ??
         pstAllVariableVisibility[i] = strdup("global");
 
+
+        if (piAllVariableTypes[i] == sci_tlist)
+        {
+            pstAllVariableTlistTypes[i] = getTlistName(pstAllVariableNames[i]);
+        }
+        else
+        {
+            pstAllVariableTlistTypes[i] = strdup("");
+        }
+
+
         if (scilabDefaultVariablesSet.find(string(pstAllVariableNames[i])) == scilabDefaultVariablesSet.end()
                 && piAllVariableTypes[i] != sci_c_function && piAllVariableTypes[i] != sci_lib)
         {
@@ -189,6 +212,7 @@ void UpdateBrowseVar(BOOL update)
                                    piAllVariableBytes, iLocalVariablesUsed + iGlobalVariablesUsed,
                                    piAllVariableTypes, iLocalVariablesUsed + iGlobalVariablesUsed,
                                    piAllVariableIntegerTypes, iLocalVariablesUsed + iGlobalVariablesUsed,
+                                   pstAllVariableTlistTypes, iLocalVariablesUsed + iGlobalVariablesUsed,
                                    pstAllVariableSizes, iLocalVariablesUsed + iGlobalVariablesUsed,
                                    pstAllVariableVisibility, iLocalVariablesUsed + iGlobalVariablesUsed,
                                    piAllVariableFromUser, iLocalVariablesUsed + iGlobalVariablesUsed);
@@ -196,6 +220,7 @@ void UpdateBrowseVar(BOOL update)
     freeArrayOfString(pstAllVariableNames, iLocalVariablesUsed + iGlobalVariablesUsed);
     freeArrayOfString(pstAllVariableVisibility, iLocalVariablesUsed + iGlobalVariablesUsed);
     freeArrayOfString(pstAllVariableSizes, iLocalVariablesUsed + iGlobalVariablesUsed);
+    freeArrayOfString(pstAllVariableTlistTypes, iLocalVariablesUsed + iGlobalVariablesUsed);
 
     if (piAllVariableFromUser)
     {
@@ -273,3 +298,34 @@ static std::set < string > createScilabDefaultVariablesSet()
 
     return ScilabDefaultVariables;
 }
+
+static char * getTlistName(char * variableName)
+{
+    SciErr sciErr;
+    int *piAddr = NULL;
+    int* piAddr1 = NULL;
+    int iRows = 0;
+    int iCols = 0;
+    char **pstType;
+    char *tmpChar;
+    sciErr = getVarAddressFromName(pvApiCtx, variableName, &piAddr);
+    if (sciErr.iErr)
+    {
+        return strdup("");
+    }
+
+    sciErr = getListItemAddress(pvApiCtx, piAddr, 1, &piAddr1);
+    if (sciErr.iErr)
+    {
+        return strdup("");
+    }
+
+    if (getAllocatedMatrixOfString(pvApiCtx, piAddr1, &iRows, &iCols, &pstType))
+    {
+
+        return strdup("");
+    }
+    tmpChar = strdup(pstType[0]);
+    freeAllocatedMatrixOfString(iRows, iCols, pstType);
+    return tmpChar;
+}
index 93224ee..c1b5bf2 100644 (file)
@@ -17,6 +17,7 @@ import javax.swing.JLabel;
 
 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
 import org.scilab.modules.localization.Messages;
+import org.scilab.modules.types.ScilabTypeEnum;
 import org.scilab.modules.types.ScilabTypeEnumDescription;
 import org.scilab.modules.ui_data.variablebrowser.ScilabVariableBrowser;
 
@@ -128,17 +129,21 @@ public class BrowseVar {
      * @param dataVisibility : local or global variable
      * @param dataFromUser : Scilab data or user data
      */
-    public static void openVariableBrowser(boolean update, String[] dataNames, int[] dataBytes, int[] dataTypes, int[] dataIntegerTypes, String[] dataSizes, String[] dataVisibility, boolean[] dataFromUser) {
+    public static void openVariableBrowser(boolean update, String[] dataNames, int[] dataBytes, int[] dataTypes, int[] dataIntegerTypes, String[] variableTlistTypes, String[] dataSizes, String[] dataVisibility, boolean[] dataFromUser) {
         Object[][] data = new Object[dataNames.length][COLUMNNAMES.length];
         for (int i = 0; i < dataNames.length; ++i) {
             data[i][ICON_COLUMN_INDEX] = getIconFromType(dataTypes[i]);
             data[i][NAME_COLUMN_INDEX] = dataNames[i];
             data[i][SIZE_COLUMN_INDEX] = dataSizes[i];
             data[i][TYPE_DESC_COLUMN_INDEX] = ScilabTypeEnumDescription.getTypeDescriptionFromId(dataTypes[i]);
-            if (dataTypes[i] == 8 && dataIntegerTypes[i] != 0) {
-                // It is an integer
+            if (dataTypes[i] == ScilabTypeEnum.sci_ints.swigValue() && dataIntegerTypes[i] != 0) {
+                // It is an integer. We want to detail the precision of the int
                 data[i][TYPE_DESC_COLUMN_INDEX] = data[i][TYPE_DESC_COLUMN_INDEX] + " " + dataIntegerTypes[i];
             }
+            if (dataTypes[i] == ScilabTypeEnum.sci_tlist.swigValue() && !variableTlistTypes[i].equals("")) {
+                // It is a tlist and we want to display the user datatype
+                data[i][TYPE_DESC_COLUMN_INDEX] = variableTlistTypes[i] + " (" + data[i][TYPE_DESC_COLUMN_INDEX] + ")";
+            }
             data[i][VISIBILITY_COLUMN_INDEX] = dataVisibility[i];
             data[i][BYTES_COLUMN_INDEX] = dataBytes[i];
             data[i][FROM_SCILAB_COLUMN_INDEX] = dataFromUser[i]; /* Tag if it is a variable from the user or from Scilab (%pi, %eps, etc) */
index cf84706..44206f1 100644 (file)
@@ -104,7 +104,7 @@ throw GiwsException::JniObjectCreationException(curEnv, this->className());
 curEnv->DeleteLocalRef(localInstance);
 
                 /* Methods ID set to NULL */
-voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID=NULL;
+voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID=NULL;
 jbooleanisVariableBrowserOpenedID=NULL;
 voidcloseVariableBrowserID=NULL;
 
@@ -129,7 +129,7 @@ throw GiwsException::JniObjectCreationException(curEnv, this->className());
 throw GiwsException::JniObjectCreationException(curEnv, this->className());
         }
         /* Methods ID set to NULL */
-        voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID=NULL;
+        voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID=NULL;
 jbooleanisVariableBrowserOpenedID=NULL;
 voidcloseVariableBrowserID=NULL;
 
@@ -151,14 +151,14 @@ throw GiwsException::JniMonitorException(getCurrentEnv(), "BrowseVar");
 }
 // Method(s)
 
-void BrowseVar::openVariableBrowser (JavaVM * jvm_, bool update, char const* const* variableNames, int variableNamesSize, int const* variableBytes, int variableBytesSize, int const* variableTypes, int variableTypesSize, int const* variableIntegerTypes, int variableIntegerTypesSize, char const* const* variableSize, int variableSizeSize, char const* const* variableVisibility, int variableVisibilitySize, bool const* variableFromUser, int variableFromUserSize){
+void BrowseVar::openVariableBrowser (JavaVM * jvm_, bool update, char const* const* variableNames, int variableNamesSize, int const* variableBytes, int variableBytesSize, int const* variableTypes, int variableTypesSize, int const* variableIntegerTypes, int variableIntegerTypesSize, char const* const* variableTlistTypes, int variableTlistTypesSize, char const* const* variableSize, int variableSizeSize, char const* const* variableVisibility, int variableVisibilitySize, bool const* variableFromUser, int variableFromUserSize){
 
 JNIEnv * curEnv = NULL;
 jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
 jclass cls = curEnv->FindClass( className().c_str() );
 
-jmethodID voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID = curEnv->GetStaticMethodID(cls, "openVariableBrowser", "(Z[Ljava/lang/String;[I[I[I[Ljava/lang/String;[Ljava/lang/String;[Z)V" ) ;
-if (voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID == NULL) {
+jmethodID voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID = curEnv->GetStaticMethodID(cls, "openVariableBrowser", "(Z[Ljava/lang/String;[I[I[I[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Z)V" ) ;
+if (voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID == NULL) {
 throw GiwsException::JniMethodNotFoundException(curEnv, "openVariableBrowser");
 }
 
@@ -221,6 +221,28 @@ curEnv->SetIntArrayRegion( variableIntegerTypes_, 0, variableIntegerTypesSize, (
 
 
 // create java array of strings.
+jobjectArray variableTlistTypes_ = curEnv->NewObjectArray( variableTlistTypesSize, stringArrayClass, NULL);
+if (variableTlistTypes_ == NULL)
+{
+throw GiwsException::JniBadAllocException(curEnv);
+}
+
+// convert each char * to java strings and fill the java array.
+for ( int i = 0; i < variableTlistTypesSize; i++)
+{
+jstring TempString = curEnv->NewStringUTF( variableTlistTypes[i] );
+if (TempString == NULL)
+{
+throw GiwsException::JniBadAllocException(curEnv);
+}
+
+curEnv->SetObjectArrayElement( variableTlistTypes_, i, TempString);
+
+// avoid keeping reference on to many strings
+curEnv->DeleteLocalRef(TempString);
+}
+
+// create java array of strings.
 jobjectArray variableSize_ = curEnv->NewObjectArray( variableSizeSize, stringArrayClass, NULL);
 if (variableSize_ == NULL)
 {
@@ -266,12 +288,13 @@ curEnv->DeleteLocalRef(TempString);
 jbooleanArray variableFromUser_ = curEnv->NewBooleanArray( variableFromUserSize ) ;
 curEnv->SetBooleanArrayRegion( variableFromUser_, 0, variableFromUserSize, (jboolean*)variableFromUser ) ;
 
-                         curEnv->CallStaticVoidMethod(cls, voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID ,update_, variableNames_, variableBytes_, variableTypes_, variableIntegerTypes_, variableSize_, variableVisibility_, variableFromUser_);
+                         curEnv->CallStaticVoidMethod(cls, voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID ,update_, variableNames_, variableBytes_, variableTypes_, variableIntegerTypes_, variableTlistTypes_, variableSize_, variableVisibility_, variableFromUser_);
                         curEnv->DeleteLocalRef(stringArrayClass);
 curEnv->DeleteLocalRef(variableNames_);
 curEnv->DeleteLocalRef(variableBytes_);
 curEnv->DeleteLocalRef(variableTypes_);
 curEnv->DeleteLocalRef(variableIntegerTypes_);
+curEnv->DeleteLocalRef(variableTlistTypes_);
 curEnv->DeleteLocalRef(variableSize_);
 curEnv->DeleteLocalRef(variableVisibility_);
 curEnv->DeleteLocalRef(variableFromUser_);
index 0f5759c..6a5dc3c 100644 (file)
@@ -7,6 +7,7 @@
             <parameter type="int[]" name="variableBytes"/>
             <parameter type="int[]" name="variableTypes"/>
             <parameter type="int[]" name="variableIntegerTypes"/>
+            <parameter type="String[]" name="variableTlistTypes"/>
             <parameter type="String[]" name="variableSize"/>
             <parameter type="String[]" name="variableVisibility"/>
             <parameter type="boolean[]" name="variableFromUser"/>
index e6512dd..a8257fa 100644 (file)
@@ -46,10 +46,10 @@ knowledge of the CeCILL-B license and that you accept its terms.
 
 #include "GiwsException.hxx"
 
-        #if defined(_MSC_VER) /* Defined anyway with Visual */
-            #include <Windows.h>
+        #if !defined(byte) | !defined(_MSC_VER) /* Defined anyway with Visual */
+                typedef signed char byte;
         #else
-            typedef signed char byte;
+                #pragma message("Byte has been redefined elsewhere. Some problems can happen")
         #endif
 
 
@@ -76,7 +76,7 @@ private:
 JavaVM * jvm;
 
 protected:
-jmethodID voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID; // cache method id
+jmethodID voidopenVariableBrowserjbooleanbooleanjobjectArray_java_lang_Stringjava_lang_StringjintArray_intintjintArray_intintjintArray_intintjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjobjectArray_java_lang_Stringjava_lang_StringjbooleanArray_booleanbooleanID; // cache method id
 jclass stringArrayClass;
 jmethodID jbooleanisVariableBrowserOpenedID; // cache method id
 jmethodID voidcloseVariableBrowserID; // cache method id
@@ -139,7 +139,7 @@ void synchronize();
 void endSynchronize();
 
 // Methods
-static void openVariableBrowser(JavaVM * jvm_, bool update, char const* const* variableNames, int variableNamesSize, int const* variableBytes, int variableBytesSize, int const* variableTypes, int variableTypesSize, int const* variableIntegerTypes, int variableIntegerTypesSize, char const* const* variableSize, int variableSizeSize, char const* const* variableVisibility, int variableVisibilitySize, bool const* variableFromUser, int variableFromUserSize);
+static void openVariableBrowser(JavaVM * jvm_, bool update, char const* const* variableNames, int variableNamesSize, int const* variableBytes, int variableBytesSize, int const* variableTypes, int variableTypesSize, int const* variableIntegerTypes, int variableIntegerTypesSize, char const* const* variableTlistTypes, int variableTlistTypesSize, char const* const* variableSize, int variableSizeSize, char const* const* variableVisibility, int variableVisibilitySize, bool const* variableFromUser, int variableFromUserSize);
 
 static bool isVariableBrowserOpened(JavaVM * jvm_);