reorder children in save/load from xml 62/13862/4
Antoine ELIAS [Fri, 28 Feb 2014 09:57:19 +0000 (10:57 +0100)]
Change-Id: I08ad69c4e89f6a7992c8ea6751cf972e376eb96f

scilab/modules/graphic_objects/includes/createGraphicObject.h
scilab/modules/graphic_objects/src/cpp/createGraphicObject.cpp
scilab/modules/graphic_objects/src/java/org/scilab/modules/graphic_objects/CallXmlLoader.java
scilab/modules/graphic_objects/src/java/org/scilab/modules/graphic_objects/xmlloader/XmlLoader.java
scilab/modules/graphic_objects/src/java/org/scilab/modules/graphic_objects/xmlloader/XmlSaver.java
scilab/modules/graphic_objects/src/jni/CallXmlLoader.cpp
scilab/modules/graphic_objects/src/jni/CallXmlLoader.hxx
scilab/modules/graphic_objects/src/jni/graphic_objects.giws.xml
scilab/modules/gui/sci_gateway/cpp/sci_saveGui.cpp

index a859f8e..2340058 100644 (file)
@@ -73,5 +73,5 @@ GRAPHIC_OBJECTS_IMPEXP void initSubWinTo3d(int subwin, char* legend, int* flag,
 
 GRAPHIC_OBJECTS_IMPEXP int xmlload(char* xmlfile);
 GRAPHIC_OBJECTS_IMPEXP int xmldomload(char* xmlfile);
-GRAPHIC_OBJECTS_IMPEXP char* xmlsave(int id, char* xmlfile);
+GRAPHIC_OBJECTS_IMPEXP char* xmlsave(int id, char* xmlfile, BOOL isReverse);
 #endif /* !__CREATEGRAPHICOBJECT_H__ */
index fbbe346..b9e0bad 100644 (file)
@@ -206,7 +206,7 @@ int xmldomload(char* xmlfile)
     return CallXmlLoader::DomLoad(getScilabJavaVM(), xmlfile);
 }
 
-char* xmlsave(int id, char* xmlfile)
+char* xmlsave(int id, char* xmlfile, BOOL isReverse)
 {
-    return CallXmlLoader::Save(getScilabJavaVM(), id, xmlfile);
+    return CallXmlLoader::Save(getScilabJavaVM(), id, xmlfile, isReverse == 1);
 }
index 170a6ae..d53e53a 100644 (file)
@@ -17,7 +17,7 @@ public class CallXmlLoader {
         return loader.parse();
     }
 
-    public static String Save(int figure, String filename) {
-        return XmlSaver.save(figure, filename);
+    public static String Save(int figure, String filename, boolean reverseChildren) {
+        return XmlSaver.save(figure, filename, reverseChildren);
     }
 }
index ad021fb..9b693ca 100644 (file)
@@ -306,7 +306,7 @@ public class XmlLoader extends DefaultHandler {
     Integer cloneObject(Integer root) {
         Integer newGo = controller.cloneObject(root);
         Integer[] children = (Integer[]) controller.getProperty(root, __GO_CHILDREN__);
-        for (int i = 0; i < children.length; i++) {
+        for (int i = children.length - 1; i >= 0 ; i--) {
             if ((Integer)controller.getProperty(children[i], __GO_TYPE__) == __GO_AXES__) {
                 Integer go = controller.cloneObject(GraphicModel.getAxesModel().getIdentifier());
                 Builder.createLabel(go, GraphicObjectProperties.__GO_X_AXIS_LABEL__);
index 16c647f..1b1e5d6 100644 (file)
@@ -39,7 +39,7 @@ public class XmlSaver {
     static private Figure defaultFig = null;
     static private FrameBorder defaultBorder = null;
 
-    public static String save(int figure, String filename) {
+    public static String save(int figure, String filename, boolean reverseChildren) {
         try {
             //init default values
             defaultFig = GraphicModel.getFigureModel();
@@ -59,7 +59,7 @@ public class XmlSaver {
             setAttribute(header, "usedeprecatedskin", createAttribute(Console.getConsole().getUseDeprecatedLF()), "");
 
             //figure
-            Element figureElement = createFigure(doc, figure);
+            Element figureElement = createFigure(doc, figure, reverseChildren);
             header.appendChild(figureElement);
             doc.appendChild(header);
 
@@ -85,7 +85,7 @@ public class XmlSaver {
         return ""; //all good
     }
 
-    private static Element createFigure(Document doc, int figure) {
+    private static Element createFigure(Document doc, int figure, boolean reverseChildren) {
         GraphicController controller = GraphicController.getController();
         Figure fig = (Figure)controller.getObjectFromId(figure);
         Element elemFig = doc.createElement("figure");
@@ -160,20 +160,26 @@ public class XmlSaver {
 
         //children
         Integer[] children = fig.getChildren();
-        for (int i = 0 ; i < children.length ; i++) {
-            elemFig.appendChild(createElement(doc, children[i]));
-        }
 
+        if (reverseChildren) {
+            for (int i = children.length - 1; i >= 0; i--) {
+                elemFig.appendChild(createElement(doc, children[i], reverseChildren));
+            }
+        } else {
+            for (int i = 0; i < children.length; i++) {
+                elemFig.appendChild(createElement(doc, children[i], reverseChildren));
+            }
+        }
         return elemFig;
     }
 
-    private static Element createElement(Document doc, int id) {
+    private static Element createElement(Document doc, int id, boolean reverseChildren) {
         GraphicController controller = GraphicController.getController();
         Integer type = (Integer)controller.getProperty(id, __GO_TYPE__);
 
         switch (type) {
             case __GO_UICONTROL__ : {
-                return createUicontrol(doc, id);
+                return createUicontrol(doc, id, reverseChildren);
             }
             case __GO_UIMENU__ : {
                 //Uimenu uim = (Uimenu)controller.getObjectFromId(id);
@@ -281,7 +287,7 @@ public class XmlSaver {
         return elemBorders;
     }
 
-    private static Element createUicontrol(Document doc, Integer id) {
+    private static Element createUicontrol(Document doc, Integer id, boolean reverseChildren) {
         GraphicController controller = GraphicController.getController();
         Uicontrol uic = (Uicontrol)controller.getObjectFromId(id);
         initDefaultui(uic.getStyle());
@@ -387,10 +393,15 @@ public class XmlSaver {
 
         //children
         Integer[] children = uic.getChildren();
-        for (int i = 0 ; i < children.length ; i++) {
-            elemUi.appendChild(createElement(doc, children[i]));
+        if (reverseChildren) {
+            for (int i = children.length - 1 ; i >= 0 ; i--) {
+                elemUi.appendChild(createElement(doc, children[i], reverseChildren));
+            }
+        } else {
+            for (int i = 0 ; i < children.length ; i++) {
+                elemUi.appendChild(createElement(doc, children[i], reverseChildren));
+            }
         }
-
         return elemUi;
     }
 
index cb076b9..af3b8e4 100644 (file)
@@ -104,7 +104,7 @@ curEnv->DeleteLocalRef(localInstance);
 
                 /* Methods ID set to NULL */
 jintLoadjstringjava_lang_StringID=NULL;
-jstringSavejintintjstringjava_lang_StringID=NULL;
+jstringSavejintintjstringjava_lang_StringjbooleanbooleanID=NULL;
 jintDomLoadjstringjava_lang_StringID=NULL;
 
 
@@ -129,7 +129,7 @@ throw GiwsException::JniObjectCreationException(curEnv, this->className());
         }
         /* Methods ID set to NULL */
         jintLoadjstringjava_lang_StringID=NULL;
-jstringSavejintintjstringjava_lang_StringID=NULL;
+jstringSavejintintjstringjava_lang_StringjbooleanbooleanID=NULL;
 jintDomLoadjstringjava_lang_StringID=NULL;
 
 
@@ -180,7 +180,7 @@ return res;
 
 }
 
-char* CallXmlLoader::Save (JavaVM * jvm_, int figure, char const* filename){
+char* CallXmlLoader::Save (JavaVM * jvm_, int figure, char const* filename, bool isReverse){
 
 JNIEnv * curEnv = NULL;
 jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
@@ -189,8 +189,8 @@ if ( cls == NULL) {
 throw GiwsException::JniCallMethodException(curEnv);
 }
 
-static jmethodID jstringSavejintintjstringjava_lang_StringID = curEnv->GetStaticMethodID(cls, "Save", "(ILjava/lang/String;)Ljava/lang/String;" ) ;
-if (jstringSavejintintjstringjava_lang_StringID == NULL) {
+static jmethodID jstringSavejintintjstringjava_lang_StringjbooleanbooleanID = curEnv->GetStaticMethodID(cls, "Save", "(ILjava/lang/String;Z)Ljava/lang/String;" ) ;
+if (jstringSavejintintjstringjava_lang_StringjbooleanbooleanID == NULL) {
 throw GiwsException::JniMethodNotFoundException(curEnv, "Save");
 }
 
@@ -201,7 +201,9 @@ throw GiwsException::JniBadAllocException(curEnv);
 }
 
 
-                        jstring res =  static_cast<jstring>( curEnv->CallStaticObjectMethod(cls, jstringSavejintintjstringjava_lang_StringID ,figure, filename_));
+jboolean isReverse_ = (static_cast<bool>(isReverse) ? JNI_TRUE : JNI_FALSE);
+
+                        jstring res =  static_cast<jstring>( curEnv->CallStaticObjectMethod(cls, jstringSavejintintjstringjava_lang_StringjbooleanbooleanID ,figure, filename_, isReverse_));
                         if (curEnv->ExceptionCheck()) {
 throw GiwsException::JniCallMethodException(curEnv);
 }if (res != NULL) { 
index fad4c11..3ebb021 100644 (file)
@@ -77,7 +77,7 @@ JavaVM * jvm;
 
 protected:
 jmethodID jintLoadjstringjava_lang_StringID; // cache method id
-jmethodID jstringSavejintintjstringjava_lang_StringID; // cache method id
+jmethodID jstringSavejintintjstringjava_lang_StringjbooleanbooleanID; // cache method id
 jmethodID jintDomLoadjstringjava_lang_StringID; // cache method id
 
 
@@ -140,7 +140,7 @@ void endSynchronize();
 // Methods
 static int Load(JavaVM * jvm_, char const* filename);
 
-static char* Save(JavaVM * jvm_, int figure, char const* filename);
+static char* Save(JavaVM * jvm_, int figure, char const* filename, bool isReverse);
 
 static int DomLoad(JavaVM * jvm_, char const* filename);
 
index 8240309..c8430f1 100644 (file)
@@ -7,6 +7,7 @@
         <method name="Save" returnType="String" modifier="static">
             <parameter name="figure" type="int"/>
             <parameter name="filename" type="String"/>
+            <parameter name="isReverse" type="boolean"/>
         </method>
         <method name="DomLoad" returnType="int" modifier="static">
             <parameter name="filename" type="String"/>
index e3fe921..62247ca 100644 (file)
@@ -19,6 +19,7 @@ extern "C" {
 #include "getGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
 #include "HandleManagement.h"
+#include "BOOL.h"
 }
 
 int sci_saveGui(char *fname, unsigned long fname_len)
@@ -33,9 +34,12 @@ int sci_saveGui(char *fname, unsigned long fname_len)
     int* piAddr2 = NULL;
     char* pstFile = NULL;
 
+    int* piAddr3 = NULL;
+    int bReserve = 0;
+
     int iRhs = nbInputArgument(pvApiCtx);
 
-    CheckInputArgument(pvApiCtx, 2, 2);
+    CheckInputArgument(pvApiCtx, 2, 3);
     CheckOutputArgument(pvApiCtx, 1, 1);
 
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
@@ -80,11 +84,10 @@ int sci_saveGui(char *fname, unsigned long fname_len)
 
     if (isStringType(pvApiCtx, piAddr2) == 0 || isScalar(pvApiCtx, piAddr2) == 0)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
+        Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
         return 1;
     }
 
-
     if (getAllocatedSingleString(pvApiCtx, piAddr2, &pstFile))
     {
         if (pstFile)
@@ -96,7 +99,30 @@ int sci_saveGui(char *fname, unsigned long fname_len)
         return 1;
     }
 
-    char* ret = xmlsave(iFig, pstFile);
+    //reverse flag
+    if (iRhs == 3)
+    {
+        sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddr3);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 1;
+        }
+
+        if (isBooleanType(pvApiCtx, piAddr3) == 0 || isScalar(pvApiCtx, piAddr3) == 0)
+        {
+            Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 3);
+            return 1;
+        }
+
+        if (getScalarBoolean(pvApiCtx, piAddr3, &bReserve))
+        {
+            Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 3);
+            return 1;
+        }
+    }
+
+    char* ret = xmlsave(iFig, pstFile, (BOOL) bReserve);
     freeAllocatedSingleString(pstFile);
 
     if (ret[0] != '\0')
@@ -111,4 +137,4 @@ int sci_saveGui(char *fname, unsigned long fname_len)
     AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
     ReturnArguments(pvApiCtx);
     return 0;
-}
\ No newline at end of file
+}