Bug #8761 fixed: Xcos masked superblocks had invalid names 09/21709/2
Clément David [Tue, 16 Mar 2021 13:14:35 +0000 (14:14 +0100)]
Change-Id: I82c5d0481c832dbdeb4bf53eae95833050351687

scilab/CHANGES.md
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/SuperblockMaskCustomizeAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/Handler.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/ScilabDirectHandler.java

index 42a7644..5a4f552 100644 (file)
@@ -333,6 +333,7 @@ Bug Fixes
 * [#8059](https://bugzilla.scilab.org/8059): A local `.wgetrc` config file could make troubles in `atomsDownload`.
 * [#8100](https://bugzilla.scilab.org/8100): `cumsum()` on sparse documented.
 * [#8378](https://bugzilla.scilab.org/8378): Datatip `ContextMenu => Delete last datatip` was useless.
+* [#8761](https://bugzilla.scilab.org/8761): Xcos masked superblocks had invalid names.
 * [#9221](https://bugzilla.scilab.org/9221): There was no way in Scilab to easily access to sets of unicode symbols like greek letters, etc.
 * [#9909](https://bugzilla.scilab.org/9909): In the help browser, add a way to open the online version of the current page.
 * [#10046](https://bugzilla.scilab.org/10046): By default, the `MAXMIN` block did not propose 2 input ports to work in an element-wise way (unlike MIN_f and MAX_f), which is its most original working mode.
index 7d4c1cb..6b8cfb2 100644 (file)
@@ -29,6 +29,7 @@ import java.util.logging.Logger;
 
 import javax.swing.BorderFactory;
 import javax.swing.DefaultCellEditor;
+import javax.swing.ImageIcon;
 import javax.swing.JComboBox;
 import javax.swing.JFrame;
 import javax.swing.WindowConstants;
@@ -41,6 +42,7 @@ import javax.swing.event.TableModelListener;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableColumn;
 
+import org.scilab.modules.commons.gui.FindIconHelper;
 import org.scilab.modules.graph.ScilabComponent;
 import org.scilab.modules.graph.ScilabGraph;
 import org.scilab.modules.graph.actions.base.DefaultAction;
@@ -160,6 +162,8 @@ public final class SuperblockMaskCustomizeAction extends DefaultAction {
         public CustomizeFrame(XcosDiagram diagram) {
             setTitle(XcosMessages.MASK_TITLE);
             setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
+            ImageIcon scilabIcon = new ImageIcon(FindIconHelper.findIcon("scilab"));
+            setIconImage(scilabIcon.getImage());
             controler = new CustomizeFrameControler(diagram);
             initComponents();
         }
@@ -686,7 +690,7 @@ public final class SuperblockMaskCustomizeAction extends DefaultAction {
                     switch (e.getType()) {
                         case TableModelEvent.INSERT:
                             String key = (String) customModel.getValueAt(row, 0);
-                            String value = context.get(key);
+                            String value = context.get(key).toString();
                             valuesModel.addRow(new Object[] { key, value });
                             break;
 
@@ -717,7 +721,7 @@ public final class SuperblockMaskCustomizeAction extends DefaultAction {
                 }
             };
 
-            private final Map<String, String> context;
+            private final Map<String, ScilabType> context;
             private Iterator<String> keyIterator;
 
             /**
index 8e29c85..d903f61 100644 (file)
@@ -117,6 +117,7 @@ import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Optional;
 import java.util.stream.Collectors;
+import org.scilab.modules.types.ScilabType;
 import org.scilab.modules.xcos.VectorOfBool;
 import org.scilab.modules.xcos.VectorOfScicosID;
 import org.scilab.modules.xcos.block.SuperBlock;
@@ -2414,8 +2415,8 @@ public class XcosDiagram extends ScilabGraph {
      * @return The resulting data. Keys are variable names and Values are
      * evaluated values.
      */
-    public Map<String, String> evaluateContext() {
-        Map<String, String> result = Collections.emptyMap();
+    public Map<String, ScilabType> evaluateContext() {
+        Map<String, ScilabType> result = Collections.emptyMap();
         final ScilabDirectHandler handler = ScilabDirectHandler.acquire();
         if (handler == null) {
             return result;
@@ -2425,8 +2426,13 @@ public class XcosDiagram extends ScilabGraph {
             // first write the context strings
             handler.writeContext(getContext());
 
-            // evaluate using script2var
-            ScilabInterpreterManagement.synchronousScilabExec(ScilabDirectHandler.CONTEXT + " = script2var(" + ScilabDirectHandler.CONTEXT + ", struct());");
+            // evaluate using script2var and convert to string keys and list of values
+            ScilabInterpreterManagement.synchronousScilabExec(ScilabDirectHandler.CONTEXT + " = script2var(" + ScilabDirectHandler.CONTEXT + ", struct()); "
+                 + ScilabDirectHandler.CONTEXT + "_names = fieldnames("+ScilabDirectHandler.CONTEXT+")'; "
+                 + ScilabDirectHandler.CONTEXT + "_values = list(); "
+                 + "for i=1:size(" + ScilabDirectHandler.CONTEXT + "_names, '*') ;"
+                 + "   " + ScilabDirectHandler.CONTEXT + "_values(i) = " + ScilabDirectHandler.CONTEXT + "(" +  ScilabDirectHandler.CONTEXT + "_names(i));"
+                 + "end");
 
             // read the structure
             result = handler.readContext();
index a823e07..d2b6316 100644 (file)
@@ -16,6 +16,7 @@
 package org.scilab.modules.xcos.io.scicos;
 
 import java.util.Map;
+import org.scilab.modules.types.ScilabType;
 
 public interface Handler {
 
@@ -24,7 +25,7 @@ public interface Handler {
      *
      * @return the decoded context
      */
-    public abstract Map<String, String> readContext();
+    public abstract Map<String, ScilabType> readContext();
 
     /**
      * Encode an Xcos context
index 124521f..7221b34 100644 (file)
@@ -15,7 +15,7 @@
 
 package org.scilab.modules.xcos.io.scicos;
 
-import java.util.LinkedHashMap;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
@@ -23,7 +23,7 @@ import java.util.logging.Logger;
 
 import org.scilab.modules.javasci.JavasciException;
 import org.scilab.modules.javasci.Scilab;
-import org.scilab.modules.types.ScilabMList;
+import org.scilab.modules.types.ScilabList;
 import org.scilab.modules.types.ScilabString;
 import org.scilab.modules.types.ScilabType;
 
@@ -117,34 +117,31 @@ public class ScilabDirectHandler implements Handler {
      */
 
     @Override
-    public synchronized Map<String, String> readContext() {
+    public synchronized Map<String, ScilabType> readContext() {
         LOG.entering("ScilabDirectHandler", "readContext");
-        final ScilabMList list;
-        final Map<String, String> result = new LinkedHashMap<String, String>();
+        final Map<String, ScilabType> result = new HashMap<String, ScilabType>();
 
-        final ScilabType data;
+        final ScilabType keys;
+        final ScilabType values;
         try {
-            data = Scilab.getInCurrentScilabSession(CONTEXT);
+            keys = Scilab.getInCurrentScilabSession(CONTEXT + "_names");
+            values = Scilab.getInCurrentScilabSession(CONTEXT + "_values");
         } catch (JavasciException e) {
             throw new RuntimeException(e);
         }
-        if (data instanceof ScilabMList) {
-            list = (ScilabMList) data;
+        final ScilabString k;
+        final ScilabList v;
+        if (keys instanceof ScilabString && values instanceof ScilabList) {
+            k = (ScilabString) keys;
+            v = (ScilabList) values;
             LOG.finer("data available");
         } else {
-            list = new ScilabMList();
             LOG.finer("data unavailable");
+            return result;
         }
 
-        // We are starting at 2 because a struct is composed of
-        // - the fields names (ScilabString)
-        // - the dimension
-        // - variables values...
-        for (int index = 2; index < list.size(); index++) {
-            String key = ((ScilabString) list.get(0)).getData()[0][index];
-            String value = list.get(index).toString();
-
-            result.put(key, value);
+        for (int i = 0; i < Math.min(k.getWidth(), v.size()); i++) {
+            result.put(k.getData()[0][i], v.get(i));
         }
 
         LOG.exiting("ScilabDirectHandler", "readContext");