Xcos: fix block rendering accordingly to EXPRS 59/18159/2
Clément DAVID [Thu, 12 May 2016 14:07:46 +0000 (16:07 +0200)]
Change-Id: I8e6b4a3f823613579f37ab257dadefe0affbf536

scilab/modules/xcos/images/palettes/CBLOCK.png
scilab/modules/xcos/images/palettes/CBLOCK4.png
scilab/modules/xcos/images/palettes/CONSTRAINT2_c.png
scilab/modules/xcos/images/palettes/DEBUG.png
scilab/modules/xcos/images/palettes/c_block.png
scilab/modules/xcos/images/palettes/fortran_block.png
scilab/modules/xcos/images/palettes/scifunc_block_m.png
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/ScilabTypeCoder.java

index bedb7df..8eb47b5 100644 (file)
Binary files a/scilab/modules/xcos/images/palettes/CBLOCK.png and b/scilab/modules/xcos/images/palettes/CBLOCK.png differ
index 511805a..7474478 100644 (file)
Binary files a/scilab/modules/xcos/images/palettes/CBLOCK4.png and b/scilab/modules/xcos/images/palettes/CBLOCK4.png differ
index e85c0b3..f29140c 100644 (file)
Binary files a/scilab/modules/xcos/images/palettes/CONSTRAINT2_c.png and b/scilab/modules/xcos/images/palettes/CONSTRAINT2_c.png differ
index 4346b54..0dbb38d 100644 (file)
Binary files a/scilab/modules/xcos/images/palettes/DEBUG.png and b/scilab/modules/xcos/images/palettes/DEBUG.png differ
index 6a0644c..2829ccb 100644 (file)
Binary files a/scilab/modules/xcos/images/palettes/c_block.png and b/scilab/modules/xcos/images/palettes/c_block.png differ
index 3cdbb19..915095e 100644 (file)
Binary files a/scilab/modules/xcos/images/palettes/fortran_block.png and b/scilab/modules/xcos/images/palettes/fortran_block.png differ
index 8b82e15..c698539 100644 (file)
Binary files a/scilab/modules/xcos/images/palettes/scifunc_block_m.png and b/scilab/modules/xcos/images/palettes/scifunc_block_m.png differ
index f2dc7d8..6c6120b 100644 (file)
@@ -14,7 +14,6 @@
  * along with this program.
  *
  */
-
 package org.scilab.modules.xcos.graph;
 
 import org.scilab.modules.xcos.graph.model.XcosGraphModel;
@@ -114,6 +113,7 @@ import com.mxgraph.view.mxGraphSelectionModel;
 import com.mxgraph.view.mxMultiplicity;
 import java.lang.reflect.Constructor;
 import java.util.Hashtable;
+import org.scilab.modules.types.ScilabList;
 import org.scilab.modules.types.ScilabString;
 import org.scilab.modules.types.ScilabType;
 import org.scilab.modules.xcos.io.ScilabTypeCoder;
@@ -122,6 +122,7 @@ import org.scilab.modules.xcos.io.ScilabTypeCoder;
  * The base class for a diagram. This class contains jgraphx + Scicos data.
  */
 public class XcosDiagram extends ScilabGraph {
+
     private static final Logger LOG = Logger.getLogger(XcosDiagram.class.getName());
 
     private static final String MODIFIED = "modified";
@@ -137,11 +138,11 @@ public class XcosDiagram extends ScilabGraph {
     public static final String HASH_IDENTIFIER = "#identifier";
 
     /**
-     * Default geometry used while adding a label to a block (on the middle and below the bottom of the parent block)
+     * Default geometry used while adding a label to a block (on the middle and
+     * below the bottom of the parent block)
      */
     private static final mxGeometry DEFAULT_LABEL_GEOMETRY = new mxGeometry(0.5, 1.1, 0.0, 0.0);
 
-
     /**
      * Constructor
      *
@@ -202,14 +203,11 @@ public class XcosDiagram extends ScilabGraph {
     /*
      * Static helpers
      */
-
     /**
      * Only return the instanceof klass
      *
-     * @param selection
-     *            the selection to filter out
-     * @param klass
-     *            the class selector
+     * @param selection the selection to filter out
+     * @param klass the class selector
      * @return the selection with only klass instance.
      */
     public static Object[] filterByClass(final Object[] selection, final Class<BasicBlock> klass) {
@@ -222,12 +220,14 @@ public class XcosDiagram extends ScilabGraph {
     }
 
     /**
-     * Fill the hierarchy from the first element up to the root diagram (included)
+     * Fill the hierarchy from the first element up to the root diagram
+     * (included)
      * <p>
      * Should be used as :
      * <pre>
      *  hierarchy = fillHierarchy(new ScicosObjectOwner(getUID(), getKind()))
      * </pre>
+     *
      * @param hierarchy the collection to fill
      * @return the filled collection (the root at the end)
      */
@@ -256,8 +256,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Sort the blocks per first integer parameter value
      *
-     * @param blocks
-     *            the block list
+     * @param blocks the block list
      * @return the sorted block list (same instance)
      */
     public List<? extends BasicBlock> iparSort(final List<? extends BasicBlock> blocks) {
@@ -294,10 +293,8 @@ public class XcosDiagram extends ScilabGraph {
     }
 
     /**
-     * @param <T>
-     *            The type to work on
-     * @param klass
-     *            the class instance to work on
+     * @param <T> The type to work on
+     * @param klass the class instance to work on
      * @return list of typed block
      */
     @SuppressWarnings("unchecked")
@@ -319,10 +316,8 @@ public class XcosDiagram extends ScilabGraph {
 
     /**
      * @param <T>
-     * @param <T>
-     *            The type to work on
-     * @param klasses
-     *            the class instance list to work on
+     * @param <T> The type to work on
+     * @param klasses the class instance list to work on
      * @return list of typed block
      */
     private <T extends BasicBlock> List<T> getAllTypedBlock(Class<T>[] klasses) {
@@ -336,22 +331,21 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Fill the context with I/O port
      *
-     * @param context
-     *            the context to fill
+     * @param context the context to fill
      */
     @SuppressWarnings("unchecked")
     protected void fillContext(final Hashtable<Object, Object> context) {
         if (!context.containsKey(IN)) {
-            context.put(IN, iparSort(getAllTypedBlock(new Class[] { ExplicitInBlock.class, ImplicitInBlock.class })));
+            context.put(IN, iparSort(getAllTypedBlock(new Class[] {ExplicitInBlock.class, ImplicitInBlock.class})));
         }
         if (!context.containsKey(OUT)) {
-            context.put(OUT, iparSort(getAllTypedBlock(new Class[] { ExplicitOutBlock.class, ImplicitOutBlock.class })));
+            context.put(OUT, iparSort(getAllTypedBlock(new Class[] {ExplicitOutBlock.class, ImplicitOutBlock.class})));
         }
         if (!context.containsKey(EIN)) {
-            context.put(EIN, iparSort(getAllTypedBlock(new Class[] { EventInBlock.class })));
+            context.put(EIN, iparSort(getAllTypedBlock(new Class[] {EventInBlock.class})));
         }
         if (!context.containsKey(EOUT)) {
-            context.put(EOUT, iparSort(getAllTypedBlock(new Class[] { EventOutBlock.class })));
+            context.put(EOUT, iparSort(getAllTypedBlock(new Class[] {EventOutBlock.class})));
         }
     }
 
@@ -368,12 +362,11 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Validate I/O ports.
      *
-     * /!\ No model modification should be made in this method, this is only a validation method.
+     * /!\ No model modification should be made in this method, this is only a
+     * validation method.
      *
-     * @param cell
-     *            Cell that represents the cell to validate.
-     * @param context
-     *            Hashtable that represents the global validation state.
+     * @param cell Cell that represents the cell to validate.
+     * @param context Hashtable that represents the global validation state.
      */
     public String validateChildDiagram(final Object cell, final Hashtable<Object, Object> context) {
         String err = null;
@@ -381,7 +374,6 @@ public class XcosDiagram extends ScilabGraph {
         /*
          * Only validate I/O blocks
          */
-
         // get the key
         final String key;
         if (cell instanceof ExplicitInBlock || cell instanceof ImplicitInBlock) {
@@ -400,14 +392,12 @@ public class XcosDiagram extends ScilabGraph {
         /*
          * Prepare validation
          */
-
         // fill the context once
         fillContext(context);
 
         /*
          * Validate with ipar
          */
-
         // get the real index
         final List<? extends BasicBlock> blocks = (List<? extends BasicBlock>) context.get(key);
         final int realIndex = blocks.indexOf(block) + 1;
@@ -439,7 +429,6 @@ public class XcosDiagram extends ScilabGraph {
     /*
      * Static diagram listeners
      */
-
     /**
      * CellResizedTracker Called when mxEvents.CELLS_RESIZED is fired.
      */
@@ -466,11 +455,11 @@ public class XcosDiagram extends ScilabGraph {
         /**
          * Update the cell view
          *
-         * @param source
-         *            the source instance
-         * @param evt
-         *            the event data
-         * @see com.mxgraph.util.mxEventSource.mxIEventListener#invoke(java.lang.Object, com.mxgraph.util.mxEventObject)
+         * @param source the source instance
+         * @param evt the event data
+         * @see
+         * com.mxgraph.util.mxEventSource.mxIEventListener#invoke(java.lang.Object,
+         * com.mxgraph.util.mxEventObject)
          */
         @Override
         public void invoke(final Object source, final mxEventObject evt) {
@@ -494,6 +483,7 @@ public class XcosDiagram extends ScilabGraph {
      * Update the modified block on undo/redo
      */
     private static final class UndoUpdateTracker implements mxIEventListener {
+
         private static UndoUpdateTracker instance;
 
         /**
@@ -515,11 +505,11 @@ public class XcosDiagram extends ScilabGraph {
         /**
          * Update the block and style on undo
          *
-         * @param source
-         *            the source instance
-         * @param evt
-         *            the event data
-         * @see com.mxgraph.util.mxEventSource.mxIEventListener#invoke(java.lang.Object, com.mxgraph.util.mxEventObject)
+         * @param source the source instance
+         * @param evt the event data
+         * @see
+         * com.mxgraph.util.mxEventSource.mxIEventListener#invoke(java.lang.Object,
+         * com.mxgraph.util.mxEventObject)
          */
         @Override
         public void invoke(final Object source, final mxEventObject evt) {
@@ -583,6 +573,7 @@ public class XcosDiagram extends ScilabGraph {
      * Refresh each block on modification (update port position, etc...)
      */
     private static final class RefreshBlockTracker implements mxIEventListener {
+
         private static RefreshBlockTracker instance;
 
         /**
@@ -604,11 +595,11 @@ public class XcosDiagram extends ScilabGraph {
         /**
          * Refresh the block on port added
          *
-         * @param sender
-         *            the diagram
-         * @param evt
-         *            the event
-         * @see com.mxgraph.util.mxEventSource.mxIEventListener#invoke(java.lang.Object, com.mxgraph.util.mxEventObject)
+         * @param sender the diagram
+         * @param evt the event
+         * @see
+         * com.mxgraph.util.mxEventSource.mxIEventListener#invoke(java.lang.Object,
+         * com.mxgraph.util.mxEventObject)
          */
         @Override
         public void invoke(Object sender, mxEventObject evt) {
@@ -633,22 +624,20 @@ public class XcosDiagram extends ScilabGraph {
     }
 
     /**
-     * Hook method that creates the new edge for insertEdge. This implementation does not set the source and target of the edge, these are set when the edge is added to the model.
+     * Hook method that creates the new edge for insertEdge. This implementation
+     * does not set the source and target of the edge, these are set when the
+     * edge is added to the model.
      *
-     * @param parent
-     *            Cell that specifies the parent of the new edge.
-     * @param id
-     *            Optional string that defines the Id of the new edge.
-     * @param value
-     *            Object to be used as the user object.
-     * @param source
-     *            Cell that defines the source of the edge.
-     * @param target
-     *            Cell that defines the target of the edge.
-     * @param style
-     *            Optional string that defines the cell style.
+     * @param parent Cell that specifies the parent of the new edge.
+     * @param id Optional string that defines the Id of the new edge.
+     * @param value Object to be used as the user object.
+     * @param source Cell that defines the source of the edge.
+     * @param target Cell that defines the target of the edge.
+     * @param style Optional string that defines the cell style.
      * @return Returns the new edge to be inserted.
-     * @see com.mxgraph.view.mxGraph#createEdge(java.lang.Object, java.lang.String, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.String)
+     * @see com.mxgraph.view.mxGraph#createEdge(java.lang.Object,
+     * java.lang.String, java.lang.Object, java.lang.Object, java.lang.Object,
+     * java.lang.String)
      */
     @Override
     public Object createEdge(Object parent, String id, Object value, Object source, Object target, String style) {
@@ -703,18 +692,14 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Add an edge from a source to the target.
      *
-     * @param cell
-     *            the edge to add (may be null)
-     * @param parent
-     *            the parent of the source and the target
-     * @param source
-     *            the source cell
-     * @param target
-     *            the target cell
-     * @param index
-     *            the index of the edge
+     * @param cell the edge to add (may be null)
+     * @param parent the parent of the source and the target
+     * @param source the source cell
+     * @param target the target cell
+     * @param index the index of the edge
      * @return the added edge or null.
-     * @see com.mxgraph.view.mxGraph#addEdge(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Integer)
+     * @see com.mxgraph.view.mxGraph#addEdge(java.lang.Object, java.lang.Object,
+     * java.lang.Object, java.lang.Object, java.lang.Integer)
      */
     @Override
     public Object addCell(Object cell, Object parent, Integer index, Object source, Object target) {
@@ -780,7 +765,6 @@ public class XcosDiagram extends ScilabGraph {
         /*
          * Split management
          */
-
         // ExplicitLink -> ExplicitInputPort
         if (source instanceof ExplicitLink && target instanceof ExplicitInputPort && cell instanceof ExplicitLink) {
             SplitBlock split = addSplitEdge(((BasicLink) cell).getGeometry().getSourcePoint(), (BasicLink) source);
@@ -855,10 +839,8 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Add a split on a edge.
      *
-     * @param splitPoint
-     *            the split point (center of the split block)
-     * @param link
-     *            source link
+     * @param splitPoint the split point (center of the split block)
+     * @param link source link
      * @return split block
      */
     public SplitBlock addSplitEdge(final mxPoint splitPoint, final BasicLink link) {
@@ -904,7 +886,6 @@ public class XcosDiagram extends ScilabGraph {
             addCell(splitBlock);
 
             // Update old link
-
             // get breaking segment and related point
             mxPoint splitTr = new mxPoint(splitPoint.getX() - orig.getX(), splitPoint.getY() - orig.getY());
             final int pos = link.findNearestSegment(splitTr);
@@ -940,16 +921,13 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Connect two port together with the associated points.
      *
-     * This method perform the connection in two step in order to generate the right UndoableChangeEdits.
+     * This method perform the connection in two step in order to generate the
+     * right UndoableChangeEdits.
      *
-     * @param src
-     *            the source port
-     * @param trg
-     *            the target port
-     * @param points
-     *            the points
-     * @param orig
-     *            the origin point (may be (0,0))
+     * @param src the source port
+     * @param trg the target port
+     * @param points the points
+     * @param orig the origin point (may be (0,0))
      */
     public void connect(BasicPort src, BasicPort trg, List<mxPoint> points, mxPoint orig) {
         mxGeometry geometry;
@@ -983,7 +961,8 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Initialize component settings for a graph.
      *
-     * This method *must* be used to setup the component after any reassociation.
+     * This method *must* be used to setup the component after any
+     * reassociation.
      */
     public final void initComponent() {
         getAsComponent().setToolTips(true);
@@ -1128,6 +1107,7 @@ public class XcosDiagram extends ScilabGraph {
 
     /**
      * Translate the cell and align any split block
+     *
      * @param cell any object
      * @param dx the X delta
      * @param dy the Y delta
@@ -1147,15 +1127,12 @@ public class XcosDiagram extends ScilabGraph {
         super.translateCell(cell, dx, dy);
     }
 
-
-
     /**
-     * Removes the given cells from the graph including all connected edges if includeEdges is true. The change is carried out using cellsRemoved.
+     * Removes the given cells from the graph including all connected edges if
+     * includeEdges is true. The change is carried out using cellsRemoved.
      *
-     * @param cells
-     *            the cells to be removed
-     * @param includeEdges
-     *            true if the edges must be removed, false otherwise.
+     * @param cells the cells to be removed
+     * @param includeEdges true if the edges must be removed, false otherwise.
      * @return the deleted cells
      * @see com.mxgraph.view.mxGraph#removeCells(java.lang.Object[], boolean)
      */
@@ -1213,7 +1190,6 @@ public class XcosDiagram extends ScilabGraph {
                 /*
                  * Remove related connection or not and reconnect.
                  */
-
                 if (splitBlock.getIn().getEdgeCount() == 0 || splitBlock.getOut1().getEdgeCount() == 0 || splitBlock.getOut2().getEdgeCount() == 0) {
                     // corner case, all links will be removed
                     continue;
@@ -1291,17 +1267,14 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Add any terminal parent to the removed cells
      *
-     * @param terminal
-     *            the current terminal (instance of BasicPort)
-     * @param removedCells
-     *            the "to be removed" set
-     * @param loopCells
-     *            the "while loop" set
+     * @param terminal the current terminal (instance of BasicPort)
+     * @param removedCells the "to be removed" set
+     * @param loopCells the "while loop" set
      */
     private void addTerminalParent(mxICell terminal, Collection<Object> removedCells, Collection<Object> loopCells) {
-        assert(terminal == null || terminal instanceof BasicPort);
-        assert(removedCells != null);
-        assert(loopCells != null);
+        assert (terminal == null || terminal instanceof BasicPort);
+        assert (removedCells != null);
+        assert (loopCells != null);
 
         // getting terminal parent
         mxICell target = null;
@@ -1324,12 +1297,9 @@ public class XcosDiagram extends ScilabGraph {
      *
      * This method ensure that {source, target} are not child of removed blocks.
      *
-     * @param linkSource
-     *            the normal source link
-     * @param linkTerminal
-     *            the normal target link
-     * @param removedCells
-     *            the set of removed objects
+     * @param linkSource the normal source link
+     * @param linkTerminal the normal target link
+     * @param removedCells the set of removed objects
      * @return the {source, target} connection
      */
     private BasicPort[] findTerminals(final mxICell linkSource, final mxICell linkTerminal, final Set<Object> removedCells) {
@@ -1344,18 +1314,15 @@ public class XcosDiagram extends ScilabGraph {
             }
         }
 
-        return new BasicPort[] { src, tgt };
+        return new BasicPort[] {src, tgt};
     }
 
     /**
      * Get the direct points from inLink.getSource() to outLink.getTarget().
      *
-     * @param splitBlock
-     *            the current splitblock (added as a mid-point)
-     * @param inLink
-     *            the link before the split
-     * @param outLink
-     *            the link after the split
+     * @param splitBlock the current splitblock (added as a mid-point)
+     * @param inLink the link before the split
+     * @param outLink the link after the split
      * @return the points
      */
     private List<mxPoint> getDirectPoints(final SplitBlock splitBlock, final mxICell inLink, final mxICell outLink) {
@@ -1378,12 +1345,12 @@ public class XcosDiagram extends ScilabGraph {
     }
 
     /**
-     * Manage Group to be CellFoldable i.e with a (-) to reduce and a (+) to expand them. Labels (mxCell instance with value) should not have a visible foldable sign.
+     * Manage Group to be CellFoldable i.e with a (-) to reduce and a (+) to
+     * expand them. Labels (mxCell instance with value) should not have a
+     * visible foldable sign.
      *
-     * @param cell
-     *            the selected cell
-     * @param collapse
-     *            the collapse settings
+     * @param cell the selected cell
+     * @param collapse the collapse settings
      * @return always <code>false</code>
      * @see com.mxgraph.view.mxGraph#isCellFoldable(java.lang.Object, boolean)
      */
@@ -1395,8 +1362,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Not BasicBLock cell have a moveable label.
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return true if the corresponding label is moveable
      * @see com.mxgraph.view.mxGraph#isLabelMovable(java.lang.Object)
      */
@@ -1408,8 +1374,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Return true if selectable
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return status
      * @see com.mxgraph.view.mxGraph#isCellSelectable(java.lang.Object)
      */
@@ -1424,8 +1389,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Return true if movable
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return status
      * @see com.mxgraph.view.mxGraph#isCellMovable(java.lang.Object)
      */
@@ -1452,8 +1416,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Return true if resizable
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return status
      * @see com.mxgraph.view.mxGraph#isCellResizable(java.lang.Object)
      */
@@ -1468,8 +1431,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * A cell is deletable if it is not a locked block or an identifier cell
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return status
      * @see com.mxgraph.view.mxGraph#isCellDeletable(java.lang.Object)
      */
@@ -1491,8 +1453,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Return true if editable
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return status
      * @see com.mxgraph.view.mxGraph#isCellEditable(java.lang.Object)
      */
@@ -1504,8 +1465,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Return or create the identifier for the cell
      *
-     * @param cell
-     *            the cell to check
+     * @param cell the cell to check
      * @return the identifier cell
      */
     public mxCell getOrCreateCellIdentifier(final mxCell cell) {
@@ -1532,8 +1492,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Return the identifier for the cell
      *
-     * @param cell
-     *            the cell to check
+     * @param cell the cell to check
      * @return the identifier cell
      */
     public mxCell getCellIdentifier(final mxCell cell) {
@@ -1546,8 +1505,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Create a cell identifier for a specific cell
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return the cell identifier.
      */
     public mxCell createCellIdentifier(final mxCell cell) {
@@ -1566,9 +1524,9 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Get the label for the cell according to its style.
      *
-     * @param cell
-     *            the cell object
-     * @return a representative the string (block name) or a style specific style.
+     * @param cell the cell object
+     * @return a representative the string (block name) or a style specific
+     * style.
      * @see com.mxgraph.view.mxGraph#convertValueToString(java.lang.Object)
      */
     @Override
@@ -1586,21 +1544,10 @@ public class XcosDiagram extends ScilabGraph {
                     VectorOfDouble v = new VectorOfDouble();
                     controller.getObjectProperty(block.getUID(), block.getKind(), ObjectProperties.EXPRS, v);
 
-                    ScilabType var = new ScilabTypeCoder().vec2var(v);
-                    if (var instanceof ScilabString) {
-                        ScilabString str = (ScilabString) var;
-                        Object[] exprs = new String[str.getHeight() * str.getWidth()];
-                        for (int i = 0; i < str.getHeight() ; i++)
-                            for (int j = 0; j < str.getWidth() ; j++) {
-                                exprs[i + j * str.getHeight()] = str.getData()[i][j];
-                            }
-                        try {
-                            ret = String.format(displayedLabel, exprs);
-                        } catch (IllegalFormatException e) {
-                            LOG.severe(e.toString());
-                            ret = displayedLabel;
-                        }
-                    } else {
+                    try {
+                        ret = new ScilabTypeCoder().format(displayedLabel, v);
+                    } catch (IllegalFormatException e) {
+                        LOG.severe(e.toString());
                         ret = displayedLabel;
                     }
                 } else {
@@ -1626,8 +1573,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Return true if auto sized
      *
-     * @param cell
-     *            the cell
+     * @param cell the cell
      * @return status
      * @see com.mxgraph.view.mxGraph#isAutoSizeCell(java.lang.Object)
      */
@@ -1679,8 +1625,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Manage the visibility of the grid and the associated menu
      *
-     * @param status
-     *            new status
+     * @param status new status
      */
     public void setGridVisible(final boolean status) {
         setGridEnabled(status);
@@ -1696,8 +1641,7 @@ public class XcosDiagram extends ScilabGraph {
     }
 
     /**
-     * @param fileName
-     *            diagram filename
+     * @param fileName diagram filename
      * @return save status
      */
     public boolean saveDiagramAs(final File fileName) {
@@ -1748,7 +1692,6 @@ public class XcosDiagram extends ScilabGraph {
         }
 
         /* Extension/format update */
-
         // using a String filename also works on a non-existing file
         final String filename = writeFile.getName();
 
@@ -1806,8 +1749,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Perform post loading initialization.
      *
-     * @param file
-     *            the loaded file
+     * @param file the loaded file
      */
     public void postLoad(final File file) {
         final String name = file.getName();
@@ -1834,12 +1776,10 @@ public class XcosDiagram extends ScilabGraph {
         }
     }
 
-
     /**
      * Set the title of the diagram
      *
-     * @param title
-     *            the title
+     * @param title the title
      * @see org.scilab.modules.graph.ScilabGraph#setTitle(java.lang.String)
      */
     @Override
@@ -1893,10 +1833,8 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Load a file with different method depending on it extension
      *
-     * @param controller
-     *            the used controller
-     * @param file
-     *            File to load (can be null)
+     * @param controller the used controller
+     * @param file File to load (can be null)
      */
     public void transformAndLoadFile(final JavaController controller, final String file) {
         final File f;
@@ -1997,8 +1935,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Returns the tooltip to be used for the given cell.
      *
-     * @param cell
-     *            block
+     * @param cell block
      * @return cell tooltip
      */
     @Override
@@ -2167,8 +2104,7 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Display the message in info bar.
      *
-     * @param message
-     *            Information
+     * @param message Information
      */
     public void info(final String message) {
         final XcosTab tab = XcosTab.get(this);
@@ -2181,20 +2117,18 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Display the message into an error popup
      *
-     * @param message
-     *            Error of the message
+     * @param message Error of the message
      */
     public void error(final String message) {
         JOptionPane.showMessageDialog(getAsComponent(), message, XcosMessages.XCOS, JOptionPane.ERROR_MESSAGE);
     }
 
     /**
-     * Find the block corresponding to the given uid and display a warning message.
+     * Find the block corresponding to the given uid and display a warning
+     * message.
      *
-     * @param uid
-     *            - A String as UID.
-     * @param message
-     *            - The message to display.
+     * @param uid - A String as UID.
+     * @param message - The message to display.
      */
     public void warnCellByUID(final String uid, final String message) {
         final Object cell = ((mxGraphModel) getModel()).getCell(uid);
@@ -2232,6 +2166,7 @@ public class XcosDiagram extends ScilabGraph {
      * Read the applicable context on this diagram.
      * <p>
      * This function retrieve the current diagram's context and all its parent
+     *
      * @return the full context
      */
     public String[] getContext() {
@@ -2254,11 +2189,11 @@ public class XcosDiagram extends ScilabGraph {
         return allContext.toArray(new String[allContext.size()]);
     }
 
-
     /**
      * Evaluate the current context
      *
-     * @return The resulting data. Keys are variable names and Values are evaluated values.
+     * @return The resulting data. Keys are variable names and Values are
+     * evaluated values.
      */
     public Map<String, String> evaluateContext() {
         Map<String, String> result = Collections.emptyMap();
@@ -2289,12 +2224,11 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * Returns true if the given cell is a not a block nor a port.
      *
-     * @param cell
-     *            the drop target
-     * @param cells
-     *            the cells to be dropped
+     * @param cell the drop target
+     * @param cells the cells to be dropped
      * @return the drop status
-     * @see com.mxgraph.view.mxGraph#isValidDropTarget(java.lang.Object, java.lang.Object[])
+     * @see com.mxgraph.view.mxGraph#isValidDropTarget(java.lang.Object,
+     * java.lang.Object[])
      */
     @Override
     public boolean isValidDropTarget(final Object cell, final Object[] cells) {
@@ -2311,11 +2245,12 @@ public class XcosDiagram extends ScilabGraph {
     protected mxGraphSelectionModel createSelectionModel() {
         return new mxGraphSelectionModel(this) {
             /**
-             * When we only want to select a cell which is a port, select the parent block.
+             * When we only want to select a cell which is a port, select the
+             * parent block.
              *
-             * @param cell
-             *            the cell
-             * @see com.mxgraph.view.mxGraphSelectionModel#setCell(java.lang.Object)
+             * @param cell the cell
+             * @see
+             * com.mxgraph.view.mxGraphSelectionModel#setCell(java.lang.Object)
              */
             @Override
             public void setCell(final Object cell) {
index 896f052..c28e768 100644 (file)
@@ -12,7 +12,6 @@
  * along with this program.
  *
  */
-
 package org.scilab.modules.xcos.io;
 
 import java.nio.ByteBuffer;
@@ -23,6 +22,8 @@ import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.IllegalFormatException;
+import java.util.function.Consumer;
 import org.scilab.modules.types.ScilabBoolean;
 import org.scilab.modules.types.ScilabDouble;
 import org.scilab.modules.types.ScilabInteger;
@@ -44,14 +45,17 @@ import java.util.logging.Logger;
  * Encode and decode using a var2vec / vec2var compatible encoding.
  *
  * <p>
- * This encoder is used to store arbitrary data to the model. Usually some properties are hard to map to both Java and C++ STL type system, using a shared encoding let us provide an implementation
- * whatever the language is without sharing too low-level information.
+ * This encoder is used to store arbitrary data to the model. Usually some
+ * properties are hard to map to both Java and C++ STL type system, using a
+ * shared encoding let us provide an implementation whatever the language is
+ * without sharing too low-level information.
  */
 public class ScilabTypeCoder {
 
     private static final Logger LOG = Logger.getLogger("org.scilab.modules.xcos.io");
 
     class JavaScilabType {
+
         final ScilabTypeEnum type;
         final ScilabIntegerTypeEnum intType;
 
@@ -61,7 +65,9 @@ public class ScilabTypeCoder {
         }
     }
 
-    /** current position in the vec buffer */
+    /**
+     * current position in the vec buffer
+     */
     int position = 0;
 
     public ScilabTypeCoder() {
@@ -70,12 +76,10 @@ public class ScilabTypeCoder {
     /*
      * var2vec implementation
      */
-
     /**
      * Encode any scilab type to a buffer
      *
-     * @param var
-     *            the Scilab value to encode
+     * @param var the Scilab value to encode
      * @return the encoded buffer
      */
     public VectorOfDouble var2vec(ScilabType var) {
@@ -139,10 +143,8 @@ public class ScilabTypeCoder {
     /**
      * Encode the double data
      *
-     * @param var
-     *            the data to encode
-     * @param vec
-     *            the resulting buffer
+     * @param var the data to encode
+     * @param vec the resulting buffer
      */
     private void encode(ScilabDouble var, VectorOfDouble vec) {
         // Header
@@ -156,17 +158,20 @@ public class ScilabTypeCoder {
         }
 
         // push the data
-        for (int i = 0; i < var.getHeight(); i++)
+        for (int i = 0; i < var.getHeight(); i++) {
             for (int j = 0; j < var.getWidth(); j++) {
                 vec.add(var.getRealElement(i, j));
             }
+        }
 
         // push the complex data
-        if (!var.isReal())
-            for (int i = 0; i < var.getHeight(); i++)
+        if (!var.isReal()) {
+            for (int i = 0; i < var.getHeight(); i++) {
                 for (int j = 0; j < var.getWidth(); j++) {
                     vec.add(var.getImaginaryElement(i, j));
                 }
+            }
+        }
     }
 
     private void encode(ScilabInteger var, VectorOfDouble vec) {
@@ -274,11 +279,9 @@ public class ScilabTypeCoder {
                 final int doubleLen = (requiredBytes + Double.BYTES - 1) / Double.BYTES;
 
                 // set the offset
-
                 offsetTableAccumulated += doubleLen;
                 vec.set(offsetTableStart++, offsetTableAccumulated);
 
-
                 // push the data through a temporary byte buffer
                 int index = vec.size();
                 vec.resize(index + doubleLen);
@@ -301,16 +304,12 @@ public class ScilabTypeCoder {
     /**
      * Helper method to add an header of the detected type
      *
-     * @param var
-     *            the scilab matrix type to encode
-     * @param vec
-     *            the raw encoded data container
-     * @param as
-     *            the type to encode
-     * @param detected
-     *            the detected type
+     * @param var the scilab matrix type to encode
+     * @param vec the raw encoded data container
+     * @param as the type to encode
+     * @param detected the detected type
      */
-    @SuppressWarnings({ "unchecked", "fallthrough" })
+    @SuppressWarnings({"unchecked", "fallthrough"})
     private void encodeHeader(Object var, VectorOfDouble vec, final ScilabTypeEnum as) {
         ScilabType matrix = null;
         ArrayList<ScilabType> list = null;
@@ -350,12 +349,10 @@ public class ScilabTypeCoder {
     /*
      * vec2var implementation
      */
-
     /**
      * Decode a scilab type from a buffer
      *
-     * @param vec
-     *            the buffer containing encoded scilab types
+     * @param vec the buffer containing encoded scilab types
      * @return the decoded scilab type
      */
     public ScilabType vec2var(VectorOfDouble vec) {
@@ -380,6 +377,11 @@ public class ScilabTypeCoder {
         return var;
     }
 
+    @FunctionalInterface
+    private static interface StoreFunction<R, C, V> {
+        public void apply(R r, C c, V v);
+    }
+
     @SuppressWarnings("unchecked")
     private ScilabType decode(VectorOfDouble vec, ScilabType var) {
         switch (var.getType()) {
@@ -412,18 +414,20 @@ public class ScilabTypeCoder {
 
     private ScilabType decode(VectorOfDouble vec, ScilabDouble var) {
         double[][] realPart = var.getRealPart();
-        for (int i = 0; i < var.getHeight(); i++)
+        for (int i = 0; i < var.getHeight(); i++) {
             for (int j = 0; j < var.getWidth(); j++) {
                 realPart[i][j] = vec.get(position++);
             }
+        }
 
         if (!var.isReal()) {
             double[][] imaginaryPart = var.getImaginaryPart();
 
-            for (int i = 0; i < var.getHeight(); i++)
+            for (int i = 0; i < var.getHeight(); i++) {
                 for (int j = 0; j < var.getWidth(); j++) {
                     imaginaryPart[i][j] = vec.get(position++);
                 }
+            }
         }
         return var;
     }
@@ -507,21 +511,24 @@ public class ScilabTypeCoder {
 
     private ScilabType decode(VectorOfDouble vec, ScilabString var) {
         final String[][] data = var.getData();
+        decodeString(var.getHeight(), var.getWidth(), vec, (i, j, str) -> data[i][j] = str);
+        return var;
+    }
 
+    private void decodeString(int height, int width, VectorOfDouble vec, StoreFunction<Integer, Integer, String> store) {
         // reconstruct the offset
-        int[][] offset = new int[var.getHeight()][var.getWidth()];
-        for (int i = 0; i < var.getHeight(); i++) {
-            for (int j = 0; j < var.getWidth(); j++) {
+        int[][] offset = new int[height][width];
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
                 offset[i][j] = (int) vec.get(position++);
             }
         }
 
         Charset utf8 = Charset.forName("UTF-8");
         int accumulatedOffset = 0;
-
         // reconstruct each String object
-        for (int i = 0; i < var.getHeight(); i++) {
-            for (int j = 0; j < var.getWidth(); j++) {
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
                 final int nbOfDouble = offset[i][j] - accumulatedOffset;
                 ByteBuffer view = vec.asByteBuffer(position, nbOfDouble);
                 byte[] bytes = new byte[nbOfDouble * Double.BYTES];
@@ -534,14 +541,12 @@ public class ScilabTypeCoder {
                     strlen++;
                 }
 
-                data[i][j] = new String(bytes, 0, strlen, utf8);
+                store.apply(i, j, new String(bytes, 0, strlen, utf8));
 
                 accumulatedOffset += nbOfDouble;
                 position += nbOfDouble;
             }
         }
-
-        return var;
     }
 
     private ScilabType decode(VectorOfDouble vec, ArrayList<ScilabType> var) {
@@ -616,7 +621,7 @@ public class ScilabTypeCoder {
             case sci_ints:
                 if (height * width == 0) {
                     return new ScilabInteger();
-                } else
+                } else {
                     switch (ScilabIntegerTypeEnum.swigToEnum(precision)) {
                         case sci_int8:
                             return new ScilabInteger(new byte[height][width], false);
@@ -636,6 +641,7 @@ public class ScilabTypeCoder {
                             return new ScilabInteger(new long[height][width], true);
 
                     }
+                }
             case sci_strings:
                 if (height * width == 0) {
                     return new ScilabString();
@@ -655,6 +661,159 @@ public class ScilabTypeCoder {
     }
 
     /**
+     * Format the encoded value accordingly to the Java format string
+     *
+     * @param format a
+     * {@link String#format(java.lang.String, java.lang.Object...)} compatible
+     * argument
+     * @param vec the buffer containing encoded scilab types
+     * @throws IllegalFormatException when the underlying formatting failed
+     * @throws IllegalArgumentException when the vec argument is wrongly encoded
+     * @return A formatted string
+     */
+    public String format(String format, VectorOfDouble vec) throws IllegalFormatException, IllegalArgumentException {
+        ArrayList<Object> arguments = new ArrayList<>();
+        decodeToJava(vec, arguments);
+        return String.format(format, arguments.toArray());
+    }
+
+    private void decodeToJava(VectorOfDouble vec, ArrayList<Object> arguments) {
+        int nativeScilabType = (int) vec.get(position++);
+
+        // specific integer sub-type
+        int precision = 0;
+
+        // for data[][]-based type
+        int height = 0;
+        int width = 0;
+
+        // for ArrayList-based type
+        int listLen = 0;
+
+        final ScilabTypeEnum type = ScilabTypeEnum.swigToEnum(nativeScilabType);
+        switch (type) {
+            case sci_ints:
+                // special case for integer precision
+                precision = (int) vec.get(position++);
+            case sci_matrix:
+            case sci_boolean:
+            case sci_strings:
+                position++; // n-Dims not managed
+                height = (int) vec.get(position++);
+                width = (int) vec.get(position++);
+                break;
+            case sci_list:
+            case sci_mlist:
+            case sci_tlist:
+                listLen = (int) vec.get(position++);
+                break;
+            default:
+                throw new IllegalArgumentException();
+        }
+
+        // special case for complex double matrix
+        boolean isComplex = false;
+        if (type == ScilabTypeEnum.sci_matrix) {
+            isComplex = vec.get(position++) != 0;
+        }
+
+        // allocate the right type with the decoded properties
+        switch (type) {
+            case sci_matrix:
+                for (int i = 0; i < height; i++) {
+                    for (int j = 0; j < width; j++) {
+                        arguments.add(vec.get(position++));
+                    }
+                }
+
+                if (isComplex) {
+                    for (int i = 0; i < height; i++) {
+                        for (int j = 0; j < width; j++) {
+                            arguments.add(vec.get(position++));
+                        }
+                    }
+                }
+                break;
+            case sci_boolean: {
+                final int doubleLen = (Integer.BYTES * height * width) / Double.BYTES + 1;
+                ByteBuffer view = vec.asByteBuffer(position, doubleLen);
+                for (int i = 0; i < height; i++) {
+                    for (int j = 0; j < width; j++) {
+                        arguments.add(view.getInt() != 0);
+                    }
+                }
+                position += doubleLen;
+            }
+            break;
+            case sci_ints:
+                switch (ScilabIntegerTypeEnum.swigToEnum(precision)) {
+                    case sci_int8:
+                    case sci_uint8: {
+                        final int sizeof = Byte.BYTES;
+                        final int doubleLen = (sizeof * height * width) / Double.BYTES + 1;
+                        ByteBuffer view = vec.asByteBuffer(position, doubleLen);
+                        for (int i = 0; i < height; i++) {
+                            for (int j = 0; j < width; j++) {
+                                arguments.add(view.get());
+                            }
+                        }
+                    }
+                    break;
+                    case sci_int16:
+                    case sci_uint16: {
+                        final int sizeof = Short.BYTES;
+                        final int doubleLen = (sizeof * height * width) / Double.BYTES + 1;
+                        ByteBuffer view = vec.asByteBuffer(position, doubleLen);
+                        for (int i = 0; i < height; i++) {
+                            for (int j = 0; j < width; j++) {
+                                arguments.add(view.getShort());
+                            }
+                        }
+                    }
+                    break;
+                    case sci_int32:
+                    case sci_uint32: {
+                        final int sizeof = Integer.BYTES;
+                        final int doubleLen = (sizeof * height * width) / Double.BYTES + 1;
+                        ByteBuffer view = vec.asByteBuffer(position, doubleLen);
+                        for (int i = 0; i < height; i++) {
+                            for (int j = 0; j < width; j++) {
+                                arguments.add(view.getInt());
+                            }
+                        }
+                    }
+                    break;
+                    case sci_int64:
+                    case sci_uint64: {
+                        final int sizeof = Long.BYTES;
+                        final int doubleLen = (sizeof * height * width) / Double.BYTES + 1;
+                        ByteBuffer view = vec.asByteBuffer(position, doubleLen);
+                        for (int i = 0; i < height; i++) {
+                            for (int j = 0; j < width; j++) {
+                                arguments.add(view.getLong());
+                            }
+                        }
+                    }
+                    break;
+                }
+                break;
+            case sci_strings:
+                decodeString(height, width, vec, (i, j, v) -> arguments.add(v));
+                break;
+            case sci_list:
+            case sci_mlist:
+            case sci_tlist: {
+                for (int i = 0; i < listLen; i++) {
+                    decodeToJava(vec, arguments);
+                }
+            }
+            break;
+            default:
+                throw new IllegalArgumentException();
+        }
+    }
+
+    /**
      * Utility to display a vec on debug
      *
      * @param vec the vector to convert