From 35bb3727aa4d6a4dd3b04f942c7a7db3b30029ea Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20David?= Date: Tue, 16 Mar 2021 14:14:35 +0100 Subject: [PATCH] Bug #8761 fixed: Xcos masked superblocks had invalid names Change-Id: I82c5d0481c832dbdeb4bf53eae95833050351687 --- scilab/CHANGES.md | 1 + .../actions/SuperblockMaskCustomizeAction.java | 8 +++-- .../org/scilab/modules/xcos/graph/XcosDiagram.java | 14 +++++--- .../org/scilab/modules/xcos/io/scicos/Handler.java | 3 +- .../xcos/io/scicos/ScilabDirectHandler.java | 35 +++++++++----------- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/scilab/CHANGES.md b/scilab/CHANGES.md index 42a7644..5a4f552 100644 --- a/scilab/CHANGES.md +++ b/scilab/CHANGES.md @@ -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. diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/SuperblockMaskCustomizeAction.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/SuperblockMaskCustomizeAction.java index 7d4c1cb..6b8cfb2 100644 --- a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/SuperblockMaskCustomizeAction.java +++ b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/SuperblockMaskCustomizeAction.java @@ -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 context; + private final Map context; private Iterator keyIterator; /** diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java index 8e29c85..d903f61 100644 --- a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java +++ b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java @@ -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 evaluateContext() { - Map result = Collections.emptyMap(); + public Map evaluateContext() { + Map 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(); diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/Handler.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/Handler.java index a823e07..d2b6316 100644 --- a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/Handler.java +++ b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/Handler.java @@ -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 readContext(); + public abstract Map readContext(); /** * Encode an Xcos context diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/ScilabDirectHandler.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/ScilabDirectHandler.java index 124521f..7221b34 100644 --- a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/ScilabDirectHandler.java +++ b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/ScilabDirectHandler.java @@ -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 readContext() { + public synchronized Map readContext() { LOG.entering("ScilabDirectHandler", "readContext"); - final ScilabMList list; - final Map result = new LinkedHashMap(); + final Map result = new HashMap(); - 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"); -- 1.7.9.5