Xcos GUI: DnD of blocks now works 29/17229/5
Clément DAVID [Mon, 21 Sep 2015 14:30:59 +0000 (16:30 +0200)]
Change-Id: I7a4ab2bf3a29cd71890cdd13d242edc45ada490b

45 files changed:
scilab/modules/scicos/src/cpp/Controller.cpp
scilab/modules/xcos/src/java/org/scilab/modules/xcos/BrowserView.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/UpdateStyleFromInterfunctionAdapter.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/Xcos.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/XcosTab.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/XcosView.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/actions/ExportAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/actions/ExportAllAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/actions/dialog/SetupDialog.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/AfficheBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/BasicBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/BlockFactory.java [deleted file]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/SplitBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/TextBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/RegionToSuperblockAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/SuperblockMaskCustomizeAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/listener/ProdPortLabelingListener.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/listener/SumPortLabelingListener.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/positionning/RoundBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/positionning/VoltageSensorBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/configuration/ConfigurationManager.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/PaletteDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCell.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCellFactory.java [new file with mode: 0644]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/swing/handler/GraphHandler.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/codec/BasicBlockCodec.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/BasicBlockInfo.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/Palette.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/PaletteBlockCtrl.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/listener/PaletteBlockMouseListener.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/listener/PaletteManagerMouseListener.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/view/PaletteConfiguratorListView.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/BasicPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/command/CommandPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/control/ControlPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/input/ExplicitInputPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/input/ImplicitInputPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/input/InputPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/output/ExplicitOutputPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/output/ImplicitOutputPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/port/output/OutputPort.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/BlockPositioning.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/FileUtils.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/XcosDelegates.java

index 2e27d63..a6e05ab 100644 (file)
@@ -162,6 +162,11 @@ void Controller::deleteObject(ScicosID uid)
     }
 
     auto initial = getObject(uid);
+    if (initial == nullptr)
+    {
+        // defensive programming
+        return;
+    }
     const kind_t k = initial->kind();
 
     // if this object has been referenced somewhere else do not delete it but decrement the reference counter
index 6e8f493..e5bc73c 100644 (file)
@@ -49,7 +49,7 @@ public class BrowserView extends View {
 
         // first create all the diagrams
         VectorOfScicosID o = controller.getAll(Kind.DIAGRAM);
-        int length = (int) o.size();
+        int length = o.size();
         for (int i = 0; i < length; i++) {
             long uid = o.get(i);
 
index 2cfd3e1..805ae46 100644 (file)
@@ -18,7 +18,7 @@ import org.scilab.modules.graph.utils.StyleMap;
  * Update the source block when the interface function change.
  */
 public final class UpdateStyleFromInterfunctionAdapter extends XcosViewListener {
-    private UpdateStyleFromInterfunctionAdapter() { }
+    public UpdateStyleFromInterfunctionAdapter() { }
 
     /**
      * Put the interfunction at the start of the style map to preserve
@@ -30,6 +30,9 @@ public final class UpdateStyleFromInterfunctionAdapter extends XcosViewListener
      */
     @Override
     public void propertyUpdated(long uid, Kind kind, ObjectProperties property, UpdateStatus status) {
+        if (status != UpdateStatus.SUCCESS) {
+            return;
+        }
 
         // prevent any unrelated property change, safety code
         if (property != ObjectProperties.INTERFACE_FUNCTION && property != ObjectProperties.STYLE) {
@@ -38,10 +41,10 @@ public final class UpdateStyleFromInterfunctionAdapter extends XcosViewListener
 
         JavaController controller = new JavaController();
 
-        String[] interfaceFunction = new String[0];
+        String[] interfaceFunction = new String[1];
         controller.getObjectProperty(uid, kind, ObjectProperties.INTERFACE_FUNCTION, interfaceFunction);
 
-        String[] style = new String[0];
+        String[] style = new String[1];
         controller.getObjectProperty(uid, kind, ObjectProperties.STYLE, style);
 
 
index b886467..e4983c1 100644 (file)
@@ -118,7 +118,8 @@ public final class Xcos {
     /*
      * Instance data
      */
-    private final Map<Long, Collection<XcosDiagram>> diagrams;
+    private final Map<Long, List<XcosDiagram>> diagrams;
+    private XcosView view;
     private BrowserView browser;
     private boolean onDiagramIteration = false;
     private String lastError = null;
@@ -157,9 +158,11 @@ public final class Xcos {
         /*
          * Allocate data
          */
-        diagrams = new HashMap<Long, Collection<XcosDiagram>>();
+        diagrams = new HashMap<>();
 
-        // allocate and install the view on demand to avoid any cost
+        view = new XcosView();
+        JavaController.register_view(Xcos.class.getSimpleName(), view);
+        // allocate and install the browser view on demand to avoid any cost
         browser = null;
 
         /*
@@ -185,13 +188,17 @@ public final class Xcos {
             this.factory = factory;
         }
         ScilabTabFactory.getInstance().addTabFactory(this.factory);
+
+
     }
 
     protected void finalize() throws Throwable {
         if (browser != null) {
             JavaController.unregister_view(browser);
         }
-    };
+
+        JavaController.unregister_view(view);
+    }
 
     /**
      * Check the dependencies and the version dependencies.
@@ -324,6 +331,25 @@ public final class Xcos {
         return opened;
     }
 
+
+    public Long openedDiagramUID(File f) {
+        Long opened = Long.valueOf(0);
+        if (f == null) {
+            return opened;
+        }
+
+        for (Long diagUID : diagrams.keySet()) {
+            List<XcosDiagram> diags = diagrams.getOrDefault(diagUID, Collections.emptyList());
+
+            if (!diags.isEmpty() && f.equals(diags.get(0).getSavedFile())) {
+                opened = diagUID;
+                break;
+            }
+        }
+
+        return opened;
+    }
+
     /**
      * Check if the in memory file representation is modified
      *
@@ -391,7 +417,7 @@ public final class Xcos {
         /*
          * If it is the first window opened, then open the palette first.
          */
-        if (file == null && diagramId == 0 && openedDiagrams().isEmpty()) {
+        if (openedDiagrams().isEmpty()) {
             PaletteManager.setVisible(true);
         }
 
@@ -411,9 +437,9 @@ public final class Xcos {
         /*
          * looking for an already opened diagram
          */
-        final Collection<XcosDiagram> diags = diagrams.get(f);
-        if (diags != null && !diags.isEmpty()) {
-            diag = diags.iterator().next();
+        final Long rootUID = openedDiagramUID(f);
+        if (rootUID != 0l) {
+            diag = diagrams.get(rootUID).iterator().next();
         }
         // if unsaved and empty, reuse it. Allocate otherwise.
         if (f == null && diag != null && diag.getModel().getChildCount(diag.getDefaultParent()) > 0) {
@@ -500,6 +526,13 @@ public final class Xcos {
     }
 
     /**
+     * @return the Xcos view
+     */
+    public XcosView getXcosView() {
+        return view;
+    }
+
+    /**
      * @return the Browser view
      */
     public BrowserView getBrowser() {
@@ -548,15 +581,21 @@ public final class Xcos {
         if (onDiagramIteration) {
             throw new RuntimeException();
         }
+        if (l == 0l) {
+            throw new IllegalArgumentException();
+        }
 
         /*
          * Create the collection if it does not exist
          */
-        Collection<XcosDiagram> diags = diagrams.get(l);
+        List<XcosDiagram> diags = diagrams.get(l);
         if (diags == null) {
             diags = createDiagramCollection();
             diagrams.put(l, diags);
         }
+
+        // insert the diagram
+        diags.add(diag);
     }
 
     /**
@@ -565,7 +604,7 @@ public final class Xcos {
      * @return the diagram collection
      */
     @SuppressWarnings("serial")
-    public Collection<XcosDiagram> createDiagramCollection() {
+    public List<XcosDiagram> createDiagramCollection() {
         return new ArrayList<XcosDiagram>() {
             @Override
             public boolean add(XcosDiagram element) {
@@ -1084,15 +1123,18 @@ public final class Xcos {
         }
 
         private XcosDiagram getDiagram(boolean isTab, boolean isViewport) {
+            final Xcos instance = getInstance();
             XcosDiagram graph = null;
+
             if (isTab) {
                 // load a new diagram
                 graph = getInstance().configuration.loadDiagram(cachedDocumentType);
             } else if (isViewport) {
                 // get the cached diagram
-                final File f = getInstance().configuration.getFile(cachedDocumentType);
-                final Collection<XcosDiagram> diags = getInstance().diagrams.get(f);
+                final File f = instance.configuration.getFile(cachedDocumentType);
+                final Long rootUID = getInstance().openedDiagramUID(f);
 
+                Collection<XcosDiagram> diags = instance.diagrams.getOrDefault(rootUID, Collections.emptyList());
                 for (XcosDiagram d : diags) {
                     final String id = d.getGraphTab();
                     if (id != null && id.equals(cachedDocumentType.getUuid())) {
index 02d30e6..d545089 100644 (file)
@@ -314,9 +314,7 @@ public class XcosTab extends SwingScilabDockablePanel implements SimpleTab {
         final XcosTab tab = new XcosTab(graph, uuid);
         ScilabTabFactory.getInstance().addToCache(tab);
 
-        Xcos.getInstance().addDiagram(graph.getUID(), graph);
         graph.setOpened(true);
-
         if (visible) {
             tab.createDefaultWindow().setVisible(true);
 
index c563eeb..59f3b07 100644 (file)
@@ -45,6 +45,9 @@ public class XcosView extends View {
     public XcosView() {
         registeredListeners = new EnumMap<>(Kind.class);
         visibleObjects = new HashMap<Long, Object>();
+
+
+        addXcosViewListener(new UpdateStyleFromInterfunctionAdapter());
     }
 
     /**
index b1f40b3..9ec494a 100644 (file)
@@ -56,6 +56,7 @@ import org.w3c.dom.Document;
 import com.mxgraph.swing.mxGraphComponent;
 import com.mxgraph.util.mxCellRenderer;
 import com.mxgraph.util.mxUtils;
+import com.mxgraph.util.mxXmlUtils;
 
 /**
  * Diagram export management
@@ -268,12 +269,12 @@ public final class ExportAction extends DefaultAction {
         } else if (fileFormat.equalsIgnoreCase(VML)) {
             Document doc = mxCellRenderer.createVmlDocument(graph, null, 1, null, null);
             if (doc != null) {
-                mxUtils.writeFile(mxUtils.getXml(doc.getDocumentElement()), filename.getCanonicalPath());
+                mxUtils.writeFile(mxXmlUtils.getXml(doc.getDocumentElement()), filename.getCanonicalPath());
             }
         } else if (fileFormat.equalsIgnoreCase(HTML)) {
             Document doc = mxCellRenderer.createHtmlDocument(graph, null, 1, null, null);
             if (doc != null) {
-                mxUtils.writeFile(mxUtils.getXml(doc.getDocumentElement()), filename.getCanonicalPath());
+                mxUtils.writeFile(mxXmlUtils.getXml(doc.getDocumentElement()), filename.getCanonicalPath());
             }
         } else {
             exportBufferedImage(graph, filename, fileFormat);
index 4b9aead..74b1573 100644 (file)
@@ -52,6 +52,7 @@ import org.w3c.dom.Document;
 import com.mxgraph.swing.mxGraphComponent;
 import com.mxgraph.util.mxCellRenderer;
 import com.mxgraph.util.mxUtils;
+import com.mxgraph.util.mxXmlUtils;
 
 /**
  * Diagram export management
@@ -182,7 +183,7 @@ public final class ExportAllAction extends DefaultAction {
         final VectorOfScicosID children = new VectorOfScicosID();
         controller.getObjectProperty(uid, kind, ObjectProperties.CHILDREN, children);
 
-        final int len = (int) children.size();
+        final int len = children.size();
         for (int i = 0; i < len ; i++) {
             String[] interfaceFunction = new String[1];
             long currentUID = children.get(i);
@@ -228,14 +229,14 @@ public final class ExportAllAction extends DefaultAction {
             Document doc = mxCellRenderer.createVmlDocument(graph, null, 1,
                            null, null);
             if (doc != null) {
-                mxUtils.writeFile(mxUtils.getXml(doc.getDocumentElement()),
+                mxUtils.writeFile(mxXmlUtils.getXml(doc.getDocumentElement()),
                                   filename.getCanonicalPath());
             }
         } else if (fileFormat.equalsIgnoreCase(HTML)) {
             Document doc = mxCellRenderer.createHtmlDocument(graph, null, 1,
                            null, null);
             if (doc != null) {
-                mxUtils.writeFile(mxUtils.getXml(doc.getDocumentElement()),
+                mxUtils.writeFile(mxXmlUtils.getXml(doc.getDocumentElement()),
                                   filename.getCanonicalPath());
             }
         } else {
index 0b676b4..8474549 100644 (file)
@@ -108,7 +108,7 @@ public class SetupDialog extends JDialog {
             return number;
         }
 
-        public String getTooltip() {
+        public String getToolTip() {
             return tooltip;
         }
 
@@ -317,7 +317,7 @@ public class SetupDialog extends JDialog {
                 JComponent comp = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
 
                 if (-1 < index && null != value) {
-                    list.setToolTipText(AVAILABLE_SOLVERS[index].getTooltip());
+                    list.setToolTipText(AVAILABLE_SOLVERS[index].getToolTip());
                 }
                 return comp;
             }
index 1074523..7e36bd6 100644 (file)
@@ -29,10 +29,6 @@ import javax.swing.Timer;
 import org.scilab.modules.graph.utils.ScilabExported;
 import org.scilab.modules.graph.utils.StyleMap;
 import org.scilab.modules.types.ScilabString;
-import org.scilab.modules.xcos.graph.XcosDiagram;
-
-import com.mxgraph.model.mxGeometry;
-import com.mxgraph.util.mxRectangle;
 
 /**
  * Implement the AFFICH_m block
@@ -180,12 +176,13 @@ public final class AfficheBlock extends BasicBlock {
             /*
              * Refresh
              */
-            if (src.getParentDiagram() != null) {
-                final XcosDiagram parent = src.getParentDiagram();
-                final mxRectangle rect = parent.getPreferredSizeForCell(src);
-
-                parent.getModel().setGeometry(src, new mxGeometry(src.getGeometry().getX(), src.getGeometry().getY(), rect.getWidth(), rect.getHeight()));
-            }
+            // FIXME
+            //            if (src.getParentDiagram() != null) {
+            //                final XcosDiagram parent = src.getParentDiagram();
+            //                final mxRectangle rect = parent.getPreferredSizeForCell(src);
+            //
+            //                parent.getModel().setGeometry(src, new mxGeometry(src.getGeometry().getX(), src.getGeometry().getY(), rect.getWidth(), rect.getHeight()));
+            //            }
         }
 
         /**
index 27f27e3..d5f69b2 100644 (file)
@@ -15,21 +15,14 @@ package org.scilab.modules.xcos.block;
 import java.awt.MouseInfo;
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
-import java.util.Deque;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 
-import org.apache.batik.css.engine.StyleMap;
 import org.scilab.modules.action_binding.InterpreterManagement;
 import org.scilab.modules.graph.ScilabGraph;
-import org.scilab.modules.graph.ScilabGraphUniqueObject;
 import org.scilab.modules.graph.actions.CopyAction;
 import org.scilab.modules.graph.actions.CutAction;
 import org.scilab.modules.graph.actions.DeleteAction;
@@ -69,7 +62,6 @@ import org.scilab.modules.xcos.block.actions.alignement.AlignBlockActionTop;
 import org.scilab.modules.xcos.graph.XcosDiagram;
 import org.scilab.modules.xcos.graph.model.XcosCell;
 import org.scilab.modules.xcos.io.scicos.BasicBlockInfo;
-import org.scilab.modules.xcos.port.BasicPort;
 import org.scilab.modules.xcos.port.command.CommandPort;
 import org.scilab.modules.xcos.port.control.ControlPort;
 import org.scilab.modules.xcos.port.input.InputPort;
@@ -114,44 +106,6 @@ public class BasicBlock extends XcosCell implements Serializable {
     private static final double DEFAULT_HEIGHT = 40.0;
 
     /**
-     * Sort the children list in place.
-     *
-     * The sort put inputs then outputs the control then command ports. The
-     * local port order is preserved.The sort is performed in place and do not
-     * emit any event.
-     *
-     *
-     * @param children
-     *            the children to sort
-     */
-    public static final void sort(List<?> children) {
-        final List<Object> reference = new ArrayList<Object>(children);
-
-        Collections.sort(children, new Comparator<Object>() {
-            @Override
-            public int compare(Object o1, Object o2) {
-                // diff is the major sorting by kind
-                int diff = compareByChildClass(o1, o2);
-                if (o1 instanceof BasicPort && o2 instanceof BasicPort) {
-                    // first sort with the port list index
-                    final int diffIndexOf = Integer.signum(reference.indexOf(o1) - reference.indexOf(o2));
-                    // then sort with the ordering value
-                    final int diffOrdering = Integer.signum(((BasicPort) o1).getOrdering() - ((BasicPort) o2).getOrdering());
-                    // then sort with the port position value
-                    final mxGeometry o1Geom = ((BasicPort) o1).getGeometry();
-                    final mxGeometry o2Geom = ((BasicPort) o2).getGeometry();
-                    final int diffPosition = Integer.signum((int) (o2Geom.getX() - o1Geom.getX() - o2Geom.getY() + o1Geom.getY()));
-
-                    // voting is performed with these equivalent 3 selector
-                    diff = diff + diffIndexOf + diffOrdering + diffPosition;
-                }
-
-                return diff;
-            }
-        });
-    }
-
-    /**
      * Internal method to get a base index to compare with depending on the cell
      * type.
      *
@@ -284,45 +238,6 @@ public class BasicBlock extends XcosCell implements Serializable {
     }
 
     /**
-     * @return the parent diagram of this graphical object
-     */
-    public XcosDiagram getParentDiagram() {
-        /*
-         * Retrieve the parent
-         */
-        long[] parentBlock = new long[0];
-        long[] parentDiagram = new long[0];
-        JavaController controller = new JavaController();
-        controller.getObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.PARENT_BLOCK, parentBlock);
-        controller.getObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.PARENT_DIAGRAM, parentDiagram);
-
-        final long parent;
-        final Kind kind;
-        if (parentBlock[0] == 0l) {
-            parent = parentDiagram[0];
-            kind = Kind.DIAGRAM;
-        } else {
-            parent = parentBlock[0];
-            kind = Kind.BLOCK;
-        }
-
-        /*
-         * Retrieve and create on demand the corresponding Diagram
-         */
-        XcosDiagram diagram;
-        Collection<XcosDiagram> diagrams = Xcos.getInstance().getDiagrams(parentDiagram[0]);
-        Optional<XcosDiagram> optDiagram = diagrams.stream().filter(d -> d.getUID() == parent).findFirst();
-        if (optDiagram.isPresent()) {
-            diagram = optDiagram.get();
-        } else {
-            diagram = new XcosDiagram(parent, kind);
-            Xcos.getInstance().addDiagram(parentDiagram[0], diagram);
-        }
-
-        return diagram;
-    }
-
-    /**
      * @return locked status
      */
     public synchronized boolean isLocked() {
@@ -410,30 +325,27 @@ public class BasicBlock extends XcosCell implements Serializable {
     }
 
     /**
-     * Format the children as a typed map for the given class set.
+     * Format the children as a typed map index for the given class set.
      *
      * @param types
      *            the classes to search for.
-     * @return a map which linked foreach type the corresponding cell list.
+     * @return a map which linked foreach type the corresponding cell index in the children.
      */
-    private Map < Class <? extends mxICell > , Deque<mxICell >> getTypedChildren(Set < Class <? extends mxICell >> types) {
-        Map < Class <? extends mxICell > , Deque<mxICell >> oldPorts = new HashMap < Class <? extends mxICell > , Deque<mxICell >> ();
+    public Map < Class<? extends mxICell> , ArrayList<Integer> > getTypedChildrenIndexes(Set< Class<? extends mxICell> > types) {
+        Map < Class<? extends mxICell> , ArrayList<Integer> > oldPorts = new HashMap < Class<? extends mxICell> , ArrayList<Integer> > ();
 
         // Allocate all types set
         for (Class <? extends mxICell > type : types) {
-            oldPorts.put(type, new LinkedList<mxICell>());
+            oldPorts.put(type, new ArrayList<>());
         }
 
         if (getChildCount() <= 0) {
             return oldPorts;
         }
 
-        // sort children according to the ordering parameter (useful on
-        // scilab-5.2.x diagrams)
-        sort(children);
-
         // children lookup
-        for (Object cell : children) {
+        for (int i = 0; i < children.size(); i++) {
+            final Object cell = children.get(i);
 
             Class <? extends Object > klass = cell.getClass();
             while (klass != null) {
@@ -443,28 +355,56 @@ public class BasicBlock extends XcosCell implements Serializable {
                 klass = klass.getSuperclass();
             }
 
-            final Deque<mxICell> current = oldPorts.get(klass);
+            final ArrayList<Integer> current = oldPorts.get(klass);
             if (current != null) {
-                current.add((mxICell) cell);
+                current.add(i);
             }
         }
 
         return oldPorts;
     }
 
-    /**
-     * Sort the children list in place.
-     *
-     * The sort put inputs then outputs the control then command ports. The
-     * local port order is preserved.The sort is performed in place and do not
-     * emit any event.
-     */
-    public void sortChildren() {
+    public ArrayList<Integer> getTypedChildrenIndexes(Class<? extends mxICell> type) {
+        return getTypedChildrenIndexes(Collections.singleton(type)).get(type);
+    }
+
+    public Map < Class<? extends mxICell> , ArrayList<Long> > getTypedChildrenUIDs(Set< Class<? extends mxICell> > types) {
+        Map < Class<? extends mxICell> , ArrayList<Long> > ports = new HashMap<> ();
+
+        // Allocate all types set
+        types.stream().forEach(t -> ports.put(t, new ArrayList<>()));
+
         if (getChildCount() <= 0) {
-            return;
+            return ports;
+        }
+
+        // children lookup
+        for (int i = 0; i < children.size(); i++) {
+            final Object cell = children.get(i);
+
+            Class <? extends Object > klass = cell.getClass();
+            while (klass != null) {
+                if (types.contains(klass)) {
+                    break;
+                }
+                klass = klass.getSuperclass();
+            }
+
+            final ArrayList<Long> current = ports.get(klass);
+            if (current != null) {
+                if (cell instanceof XcosCell) {
+                    current.add(((XcosCell) cell).getUID());
+                } else {
+                    current.add(0l);
+                }
+            }
         }
 
-        sort(children);
+        return ports;
+    }
+
+    public ArrayList<Long> getTypedChildrenUIDs(Class<? extends mxICell> type) {
+        return getTypedChildrenUIDs(Collections.singleton(type)).get(type);
     }
 
     /**
@@ -555,60 +495,6 @@ public class BasicBlock extends XcosCell implements Serializable {
     }
 
     /**
-     * @return tooltip text
-     */
-    public String getToolTipText() {
-        StringBuilder result = new StringBuilder();
-        result.append(ScilabGraphConstants.HTML_BEGIN);
-
-        JavaController controller = new JavaController();
-
-        String[] interfaceFunctionName = new String[1];
-        controller.getObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.INTERFACE_FUNCTION, interfaceFunctionName);
-        String[] simulationFunctionName = new String[1];
-        controller.getObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.SIM_FUNCTION_NAME, simulationFunctionName);
-
-        result.append("Block Name : " + interfaceFunctionName[0] + ScilabGraphConstants.HTML_NEWLINE);
-        result.append("Simulation : " + simulationFunctionName[1] + ScilabGraphConstants.HTML_NEWLINE);
-
-        //        if (getParentDiagram() instanceof PaletteDiagram) {
-        //            if (getIntegerParameters() != null) {
-        //                result.append("Integer parameters : " + getIntegerParameters() + ScilabGraphConstants.HTML_NEWLINE);
-        //            }
-        //
-        //            if (getRealParameters() != null && getRealParameters().getHeight() != 0 && getRealParameters().getWidth() != 0) {
-        //                result.append("Real parameters : " + getRealParameters() + ScilabGraphConstants.HTML_NEWLINE);
-        //            }
-        //
-        //            if (getObjectsParameters() != null) {
-        //                result.append("Object parameters : " + getObjectsParameters() + ScilabGraphConstants.HTML_NEWLINE);
-        //            }
-        //        } else {
-        result.append("UID : " + getId() + ScilabGraphConstants.HTML_NEWLINE);
-        final int length = getStyle().length();
-        result.append("Style : ");
-        if (length > XcosConstants.MAX_CHAR_IN_STYLE) {
-            result.append(getStyle().substring(0, XcosConstants.MAX_CHAR_IN_STYLE));
-            result.append(XcosMessages.DOTS);
-        } else {
-            result.append(getStyle());
-        }
-        result.append(ScilabGraphConstants.HTML_NEWLINE);
-        result.append("Input ports : " + BasicBlockInfo.getAllTypedPorts(this, false, InputPort.class).size() + ScilabGraphConstants.HTML_NEWLINE);
-        result.append("Output ports : " + BasicBlockInfo.getAllTypedPorts(this, false, OutputPort.class).size() + ScilabGraphConstants.HTML_NEWLINE);
-        result.append("Control ports : " + BasicBlockInfo.getAllTypedPorts(this, false, ControlPort.class).size() + ScilabGraphConstants.HTML_NEWLINE);
-        result.append("Command ports : " + BasicBlockInfo.getAllTypedPorts(this, false, CommandPort.class).size() + ScilabGraphConstants.HTML_NEWLINE);
-        //        }
-
-        result.append("x : " + getGeometry().getX() + ScilabGraphConstants.HTML_NEWLINE);
-        result.append("y : " + getGeometry().getY() + ScilabGraphConstants.HTML_NEWLINE);
-        result.append("w : " + getGeometry().getWidth() + ScilabGraphConstants.HTML_NEWLINE);
-        result.append("h : " + getGeometry().getHeight() + ScilabGraphConstants.HTML_NEWLINE);
-        result.append(ScilabGraphConstants.HTML_END);
-        return result.toString();
-    }
-
-    /**
      * @param graph
      *            parent graph
      */
@@ -644,14 +530,19 @@ public class BasicBlock extends XcosCell implements Serializable {
                 public void callBack() {
                     JavaController controller = new JavaController();
                     XcosDiagram theDiagram = new XcosDiagram(controller.createObject(Kind.DIAGRAM), Kind.DIAGRAM);
-                    BasicBlock block = (BasicBlock) BlockFactory.createClone(BasicBlock.this);
+                    BasicBlock block = null;
+                    try {
+                        block = (BasicBlock) BasicBlock.this.clone();
+                    } catch (CloneNotSupportedException e) {
+                        e.printStackTrace();
+                    }
                     theDiagram.getModel().add(theDiagram.getDefaultParent(), block, 0);
                     mxGeometry geom = BasicBlock.this.getGeometry();
                     setDefaultPosition(geom);
                     theDiagram.getModel().setGeometry(block, geom);
 
                     XcosTab.get(theDiagram).setVisible(true);
-                    BlockPositioning.updateBlockView(block);
+                    BlockPositioning.updateBlockView(theDiagram, block);
                 }
             });
 
@@ -668,12 +559,17 @@ public class BasicBlock extends XcosCell implements Serializable {
 
                 @Override
                 public void callBack() {
-                    BasicBlock block = (BasicBlock) BlockFactory.createClone(BasicBlock.this);
+                    BasicBlock block = null;
+                    try {
+                        block = (BasicBlock) BasicBlock.this.clone();
+                    } catch (CloneNotSupportedException e) {
+                        e.printStackTrace();
+                    }
                     theDiagram.getModel().add(theDiagram.getDefaultParent(), block, 0);
                     mxGeometry geom = BasicBlock.this.getGeometry();
                     setDefaultPosition(geom);
                     theDiagram.getModel().setGeometry(block, geom);
-                    BlockPositioning.updateBlockView(block);
+                    BlockPositioning.updateBlockView(theDiagram, block);
                 }
             });
 
@@ -694,12 +590,17 @@ public class BasicBlock extends XcosCell implements Serializable {
 
                     @Override
                     public void callBack() {
-                        BasicBlock block = (BasicBlock) BlockFactory.createClone(BasicBlock.this);
+                        BasicBlock block = null;
+                        try {
+                            block = (BasicBlock) BasicBlock.this.clone();
+                        } catch (CloneNotSupportedException e) {
+                            e.printStackTrace();
+                        }
                         theDiagram.getModel().add(theDiagram.getDefaultParent(), block, 0);
                         mxGeometry geom = BasicBlock.this.getGeometry();
                         setDefaultPosition(geom);
                         theDiagram.getModel().setGeometry(block, geom);
-                        BlockPositioning.updateBlockView(block);
+                        BlockPositioning.updateBlockView(theDiagram, block);
                     }
                 });
                 addTo.add(diagram);
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/BlockFactory.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/BlockFactory.java
deleted file mode 100644 (file)
index f1359c4..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2009 - DIGITEO - Clement DAVID
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
- *
- */
-
-package org.scilab.modules.xcos.block;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.scilab.modules.xcos.JavaController;
-import org.scilab.modules.xcos.Kind;
-import org.scilab.modules.xcos.ObjectProperties;
-import org.scilab.modules.xcos.block.io.EventInBlock;
-import org.scilab.modules.xcos.block.io.EventOutBlock;
-import org.scilab.modules.xcos.block.io.ExplicitInBlock;
-import org.scilab.modules.xcos.block.io.ExplicitOutBlock;
-import org.scilab.modules.xcos.block.io.ImplicitInBlock;
-import org.scilab.modules.xcos.block.io.ImplicitOutBlock;
-import org.scilab.modules.xcos.block.positionning.BigSom;
-import org.scilab.modules.xcos.block.positionning.GroundBlock;
-import org.scilab.modules.xcos.block.positionning.Product;
-import org.scilab.modules.xcos.block.positionning.RoundBlock;
-import org.scilab.modules.xcos.block.positionning.Summation;
-import org.scilab.modules.xcos.block.positionning.VoltageSensorBlock;
-
-import com.mxgraph.model.mxICell;
-
-/**
- * Ease the creation of blocks
- */
-public final class BlockFactory {
-
-    // DAC: As this is the constructor for all the block classes, this class is
-    // very coupled with *Block classes
-    // CSOFF: ClassDataAbstractionCoupling
-    /**
-     * List the specific block interface function name. <BR>
-     * <BR>
-     * <EM>Specific instance must be registered before generic ones in order
-     * to serialized all the non-default values.</EM>
-     */
-    public static enum BlockInterFunction {
-        /** @see TextBlock */
-        TEXT_f(TextBlock.class),
-        /** @see SuperBlock */
-        DSUPER(SuperBlock.class),
-        /** @see SuperBlock */
-        SUPER_f(SuperBlock.class),
-        /** @see AfficheBlock */
-        AFFICH_m(AfficheBlock.class),
-        /** @see AfficheBlock */
-        AFFICH_f(AfficheBlock.class),
-        /** @see ExplicitInBlock */
-        IN_f(ExplicitInBlock.class),
-        /** @see ExplicitOutBlock */
-        OUT_f(ExplicitOutBlock.class),
-        /** @see ImplicitInBlock */
-        INIMPL_f(ImplicitInBlock.class),
-        /** @see ImplicitOutBlock */
-        OUTIMPL_f(ImplicitOutBlock.class),
-        /** @see EventInBlock */
-        CLKINV_f(EventInBlock.class),
-        /** @see EventOutBlock */
-        CLKOUTV_f(EventOutBlock.class),
-        /** @see EventOutBlock */
-        CLKOUT_f(EventOutBlock.class),
-        /** @see SplitBlock */
-        SPLIT_f(SplitBlock.class),
-        /** @see SplitBlock */
-        IMPSPLIT_f(SplitBlock.class),
-        /** @see SplitBlock */
-        CLKSPLIT_f(SplitBlock.class),
-        /** @see GroundBlock */
-        Ground(GroundBlock.class),
-        /** @see VoltageSensorBlock */
-        VoltageSensor(VoltageSensorBlock.class),
-        /** @see RoundBlock */
-        SUM_f(RoundBlock.class),
-        /** @see RoundBlock */
-        PROD_f(RoundBlock.class),
-        /** @see RoundBlock */
-        CLKSOM_f(RoundBlock.class),
-        /** @see RoundBlock */
-        CLKSOMV_f(RoundBlock.class),
-        /** @see BigSom */
-        BIGSOM_f(BigSom.class),
-        /** @see Summation */
-        SUMMATION(Summation.class),
-        /** @see Product */
-        PRODUCT(Product.class);
-
-        private final Class<? extends BasicBlock> klass;
-
-        /**
-         * Default constructor
-         *
-         * @param block
-         *            The reference instance
-         */
-        private BlockInterFunction(Class<? extends BasicBlock> klass) {
-            this.klass = klass;
-        }
-
-        /**
-         * @return the class to instantiate
-         */
-        public Class<? extends BasicBlock> getKlass() {
-            return klass;
-        }
-    }
-
-    // CSON: ClassDataAbstractionCoupling
-
-    /** Default singleton constructor */
-    private BlockFactory() {
-        // This class is a static singleton
-    }
-
-    /**
-     * Instantiate a new block with the specified UID value.
-     *
-     * @param uid
-     *            The associated UID value
-     * @return A new instance of a block.
-     */
-    public static BasicBlock createBlock(long uid) {
-        BasicBlock block = null;
-
-        JavaController controller = new JavaController();
-        String[] interfaceFunction = new String[1];
-        controller.getObjectProperty(uid, Kind.BLOCK, ObjectProperties.INTERFACE_FUNCTION, interfaceFunction);
-
-        for (BlockInterFunction func : BlockInterFunction.values()) {
-            if (func.name().equals(interfaceFunction)) {
-                block = createBlock(func, uid);
-                break;
-            }
-        }
-
-        // Not specific block
-        if (block == null) {
-            block = new BasicBlock(uid);
-        }
-
-        return block;
-    }
-
-    /**
-     * Instantiate a new block with the specified interface function.
-     *
-     * @param func
-     *            the interface function
-     * @return A new instance of a block.
-     */
-    public static BasicBlock createBlock(BlockInterFunction func) {
-        JavaController controller = new JavaController();
-
-        long uid = controller.createObject(Kind.BLOCK);
-        return createBlock(func, uid);
-    }
-
-    /**
-     * Instantiate a new block with the specified interface function and uid.
-     *
-     * @param func the interface function
-     * @param uid the allocated uid
-     * @return A new instance of a block.
-     */
-    public static BasicBlock createBlock(BlockInterFunction func, long uid) {
-        BasicBlock block = null;
-        try {
-            block = func.getKlass().getConstructor(Long.TYPE).newInstance(uid);
-        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException        | NoSuchMethodException | SecurityException e) {
-            // Something goes wrong, print it.
-            e.printStackTrace();
-        }
-
-        return block;
-    }
-
-    /**
-     * Create a clone for a block
-     *
-     * @param block
-     *            The block to be cloned
-     * @return the clone
-     */
-    public static Object createClone(BasicBlock block) {
-        JavaController controller = new JavaController();
-
-        try {
-            // FIXME implement the MVC part
-            //         long uid = controller.cloneObject(block.getUID(), true);
-
-            BasicBlock clone = (BasicBlock) block.clone();
-
-            /* Clone children */
-            for (int i = 0; i < block.getChildCount(); i++) {
-                mxICell port = block.getChildAt(i);
-                clone.insert((mxICell) port.clone());
-            }
-
-            return clone;
-        } catch (CloneNotSupportedException e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-}
index a80ba12..887400a 100644 (file)
@@ -53,7 +53,6 @@ public final class SplitBlock extends BasicBlock {
      * @return input port
      */
     public BasicPort getIn() {
-        sortChildren();
         return (BasicPort) getChildAt(0);
     }
 
@@ -61,7 +60,6 @@ public final class SplitBlock extends BasicBlock {
      * @return first output port
      */
     public BasicPort getOut1() {
-        sortChildren();
         return (BasicPort) getChildAt(1);
     }
 
@@ -69,7 +67,6 @@ public final class SplitBlock extends BasicBlock {
      * @return second output port
      */
     public BasicPort getOut2() {
-        sortChildren();
         return (BasicPort) getChildAt(2);
     }
 
@@ -88,13 +85,14 @@ public final class SplitBlock extends BasicBlock {
             /*
              * Align the geometry on the grid
              */
-            if (getParentDiagram() != null && getParentDiagram().isGridEnabled()) {
-                final double cx = getParentDiagram().snap(geometry.getCenterX());
-                final double cy = getParentDiagram().snap(geometry.getCenterY());
-
-                geometry.setX(cx - (DEFAULT_SIZE / 2));
-                geometry.setY(cy - (DEFAULT_SIZE / 2));
-            }
+            // FIXME
+            //            if (getParentDiagram() != null && getParentDiagram().isGridEnabled()) {
+            //                final double cx = getParentDiagram().snap(geometry.getCenterX());
+            //                final double cy = getParentDiagram().snap(geometry.getCenterY());
+            //
+            //                geometry.setX(cx - (DEFAULT_SIZE / 2));
+            //                geometry.setY(cy - (DEFAULT_SIZE / 2));
+            //            }
         }
 
         super.setGeometry(geometry);
index 29aebec..a8f2a2b 100644 (file)
@@ -17,9 +17,7 @@ import java.util.Map;
 
 import org.scilab.modules.graph.actions.base.DefaultAction;
 import org.scilab.modules.gui.menu.Menu;
-import org.scilab.modules.xcos.JavaController;
 import org.scilab.modules.xcos.Kind;
-import org.scilab.modules.xcos.ObjectProperties;
 import org.scilab.modules.xcos.block.actions.BlockParametersAction;
 import org.scilab.modules.xcos.block.actions.RegionToSuperblockAction;
 import org.scilab.modules.xcos.utils.XcosMessages;
@@ -50,9 +48,4 @@ public final class TextBlock extends BasicBlock {
         menuList.get(BlockParametersAction.class).setEnabled(false);
         menuList.get(RegionToSuperblockAction.class).setEnabled(false);
     }
-
-    @Override
-    public String getToolTipText() {
-        return String.valueOf(getValue());
-    }
 }
index f887241..06b3400 100644 (file)
@@ -274,7 +274,7 @@ public class RegionToSuperblockAction extends VertexSelectionDependantAction {
             //            getChildBlock().setExprs(new ScilabString(Integer.toString(ordering)));
 
             // update the port value
-            getParentPort().setOrdering(ordering);
+            //            getParentPort().setOrdering(ordering);
         }
 
         /**
@@ -511,7 +511,7 @@ public class RegionToSuperblockAction extends VertexSelectionDependantAction {
                 /*
                  * Update the view
                  */
-                BlockPositioning.updateBlockView(broken.getChildBlock());
+                BlockPositioning.updateBlockView(parentGraph, broken.getChildBlock());
             }
         } finally {
             parentModel.endUpdate();
index d033bfe..529b09b 100644 (file)
@@ -104,8 +104,7 @@ public final class SuperblockMaskCustomizeAction extends DefaultAction {
 
         SuperBlock block = (SuperBlock) graph.getSelectionCell();
 
-        XcosDiagram parentGraph = block.getParentDiagram();
-        CustomizeFrame frame = new CustomizeFrame(parentGraph);
+        CustomizeFrame frame = new CustomizeFrame(graph);
         CustomizeFrame.CustomizeFrameModel model = frame.getController().getModel();
         model.setBlock(block);
         model.importFromBlock();
index 11462a9..f4204f0 100644 (file)
@@ -80,18 +80,19 @@ public class ProdPortLabelingListener implements PropertyChangeListener,
         /**
          * Set the ports labels
          */
-        for (InputPort port : ports) {
-            final double gain;
-
-            if (data.isEmpty()
-                    || data.getRealPart().length < port.getOrdering()) {
-                gain = 1;
-            } else {
-                gain = data.getRealPart()[port.getOrdering() - 1][0];
-            }
-
-            port.setValue(getLabel(gain));
-        }
+        // FIXME
+        //        for (InputPort port : ports) {
+        //            final double gain;
+        //
+        //            if (data.isEmpty()
+        //                    || data.getRealPart().length < port.getOrdering()) {
+        //                gain = 1;
+        //            } else {
+        //                gain = data.getRealPart()[port.getOrdering() - 1][0];
+        //            }
+        //
+        //            port.setValue(getLabel(gain));
+        //        }
 
         /**
          * Check if all the values are equal to the default one.
index 84458b7..c4e8351 100644 (file)
@@ -80,18 +80,19 @@ public class SumPortLabelingListener implements PropertyChangeListener,
         /**
          * Set the ports labels
          */
-        for (InputPort port : ports) {
-            final double gain;
-
-            if (data.isEmpty()
-                    || data.getRealPart().length < port.getOrdering()) {
-                gain = 1;
-            } else {
-                gain = data.getRealPart()[port.getOrdering() - 1][0];
-            }
-
-            port.setValue(getLabel(gain));
-        }
+        // FIXME
+        //        for (InputPort port : ports) {
+        //            final double gain;
+        //
+        //            if (data.isEmpty()
+        //                    || data.getRealPart().length < port.getOrdering()) {
+        //                gain = 1;
+        //            } else {
+        //                gain = data.getRealPart()[port.getOrdering() - 1][0];
+        //            }
+        //
+        //            port.setValue(getLabel(gain));
+        //        }
 
         /**
          * Check if all the values are equal to the default one.
index 3744553..cfc5c0b 100644 (file)
@@ -46,7 +46,7 @@ public class RoundBlock extends BasicBlock {
          */
         if (child instanceof InputPort) {
             final InputPort port = (InputPort) child;
-            port.setOrientation(getPortOrientation(port.getOrdering()));
+            port.setOrientation(getPortOrientation(index));
 
         }
 
index 7f26933..75b6b7c 100644 (file)
@@ -44,7 +44,7 @@ public class VoltageSensorBlock extends BasicBlock {
             final OutputPort port = (OutputPort) child;
 
             // Only orientate the first output port
-            if (port.getOrdering() == 1) {
+            if (index == 0) {
                 port.setOrientation(Orientation.SOUTH);
             }
         }
index 21d522e..06a271a 100644 (file)
@@ -456,7 +456,7 @@ public final class ConfigurationManager {
         JavaController controller = new JavaController();
         // TODO is this algorithm fast enough ?
         VectorOfScicosID blocks = controller.getAll(Kind.BLOCK);
-        final int len = (int) blocks.size();
+        final int len = blocks.size();
         for (int i = 0 ; i < len ; i++) {
             controller.getObjectProperty(blocks.get(i), Kind.BLOCK, ObjectProperties.UID, blockUID);
             if (uid.equals(blockUID[0])) {
index 864f1c5..a9d8a16 100644 (file)
@@ -125,7 +125,7 @@ public class PaletteDiagram extends XcosDiagram {
             if (obj instanceof BasicBlock) {
                 BasicBlock block = (BasicBlock) obj;
                 block.setGeometry(getNewBlockPosition(block.getGeometry(), blockCount));
-                BlockPositioning.updateBlockView(block);
+                BlockPositioning.updateBlockView(this, block);
                 blockCount++;
             }
         }
index 6675f1a..32f62ab 100644 (file)
@@ -54,14 +54,11 @@ import org.scilab.modules.xcos.Kind;
 import org.scilab.modules.xcos.ObjectProperties;
 import org.scilab.modules.xcos.VectorOfDouble;
 import org.scilab.modules.xcos.VectorOfInt;
-import org.scilab.modules.xcos.VectorOfScicosID;
 import org.scilab.modules.xcos.Xcos;
 import org.scilab.modules.xcos.XcosTab;
 import org.scilab.modules.xcos.actions.SaveAsAction;
 import org.scilab.modules.xcos.block.AfficheBlock;
 import org.scilab.modules.xcos.block.BasicBlock;
-import org.scilab.modules.xcos.block.BlockFactory;
-import org.scilab.modules.xcos.block.BlockFactory.BlockInterFunction;
 import org.scilab.modules.xcos.block.SplitBlock;
 import org.scilab.modules.xcos.block.TextBlock;
 import org.scilab.modules.xcos.block.io.EventInBlock;
@@ -72,6 +69,8 @@ import org.scilab.modules.xcos.block.io.ImplicitInBlock;
 import org.scilab.modules.xcos.block.io.ImplicitOutBlock;
 import org.scilab.modules.xcos.configuration.ConfigurationManager;
 import org.scilab.modules.xcos.graph.model.XcosCell;
+import org.scilab.modules.xcos.graph.model.XcosCellFactory;
+import org.scilab.modules.xcos.graph.model.XcosCellFactory.BlockInterFunction;
 import org.scilab.modules.xcos.graph.swing.GraphComponent;
 import org.scilab.modules.xcos.io.XcosFileType;
 import org.scilab.modules.xcos.link.BasicLink;
@@ -162,9 +161,11 @@ public class XcosDiagram extends ScilabGraph {
             scicosParameters = null;
         }
 
+        // add the default parent (the JGraphX layer)
         XcosCell parent = new XcosCell(this.uid, this.kind);
-        getModel().add(getModel().getRoot(), parent, 0);
+        ((mxICell) getModel().getRoot()).insert(parent);
         setDefaultParent(parent);
+
         setComponent(new GraphComponent(this));
         initComponent();
 
@@ -249,14 +250,14 @@ public class XcosDiagram extends ScilabGraph {
 
                 final int value1;
                 if (data1.size() >= 1) {
-                    value1 = (int) data1.get(0);
+                    value1 = data1.get(0);
                 } else {
                     value1 = 0;
                 }
 
                 final int value2;
                 if (data2.size() >= 1) {
-                    value2 = (int) data2.get(0);
+                    value2 = data2.get(0);
                 } else {
                     value2 = 0;
                 }
@@ -459,7 +460,7 @@ public class XcosDiagram extends ScilabGraph {
             try {
                 for (int i = 0; i < cells.length; ++i) {
                     if (cells[i] instanceof BasicBlock) {
-                        BlockPositioning.updateBlockView((BasicBlock) cells[i]);
+                        BlockPositioning.updateBlockView(diagram, (BasicBlock) cells[i]);
                     }
                 }
             } finally {
@@ -597,7 +598,7 @@ public class XcosDiagram extends ScilabGraph {
             diagram.getModel().beginUpdate();
             try {
                 final BasicBlock updatedBlock = (BasicBlock) evt.getProperty(XcosConstants.EVENT_BLOCK_UPDATED);
-                BlockPositioning.updateBlockView(updatedBlock);
+                BlockPositioning.updateBlockView(diagram, updatedBlock);
 
                 diagram.getView().clear(updatedBlock, true, true);
 
@@ -851,7 +852,7 @@ public class XcosDiagram extends ScilabGraph {
         final BasicPort linkSource = (BasicPort) link.getSource();
         final BasicPort linkTarget = (BasicPort) link.getTarget();
 
-        final SplitBlock splitBlock = (SplitBlock) BlockFactory.createBlock(BlockInterFunction.SPLIT_f);
+        final SplitBlock splitBlock = (SplitBlock) XcosCellFactory.createBlock(BlockInterFunction.SPLIT_f);
 
         getModel().beginUpdate();
         try {
@@ -1958,10 +1959,8 @@ public class XcosDiagram extends ScilabGraph {
      */
     @Override
     public String getToolTipForCell(final Object cell) {
-        if (cell instanceof BasicBlock) {
-            return ((BasicBlock) cell).getToolTipText();
-        } else if (cell instanceof BasicPort) {
-            return ((BasicPort) cell).getToolTipText();
+        if (cell instanceof XcosCell) {
+            return String.valueOf(((XcosCell) cell).getUID());
         }
         return "";
     }
@@ -2122,4 +2121,10 @@ public class XcosDiagram extends ScilabGraph {
             }
         };
     }
+
+    @Override
+    protected void finalize() throws Throwable {
+        JavaController controller = new JavaController();
+        controller.deleteObject(uid);
+    }
 }
index de4d55f..be612b0 100644 (file)
@@ -142,7 +142,7 @@ public class XcosCell extends ScilabGraphUniqueObject {
             case ANNOTATION:
             case BLOCK:
             case PORT:
-                controller.setObjectProperty(getUID(), getKind(), ObjectProperties.STYLE, String.valueOf(value));
+                controller.setObjectProperty(getUID(), getKind(), ObjectProperties.STYLE, String.valueOf(style));
                 break;
             default:
                 break;
@@ -368,6 +368,10 @@ public class XcosCell extends ScilabGraphUniqueObject {
 
     }
 
+    /*
+     * Override methods from Object
+     */
+
     @Override
     public Object clone() throws CloneNotSupportedException {
         JavaController controller = new JavaController();
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCellFactory.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCellFactory.java
new file mode 100644 (file)
index 0000000..c521c92
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2009 - DIGITEO - Clement DAVID
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ */
+
+package org.scilab.modules.xcos.graph.model;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.EnumSet;
+
+import org.scilab.modules.xcos.JavaController;
+import org.scilab.modules.xcos.Kind;
+import org.scilab.modules.xcos.ObjectProperties;
+import org.scilab.modules.xcos.VectorOfScicosID;
+import org.scilab.modules.xcos.block.AfficheBlock;
+import org.scilab.modules.xcos.block.BasicBlock;
+import org.scilab.modules.xcos.block.SplitBlock;
+import org.scilab.modules.xcos.block.SuperBlock;
+import org.scilab.modules.xcos.block.TextBlock;
+import org.scilab.modules.xcos.block.io.EventInBlock;
+import org.scilab.modules.xcos.block.io.EventOutBlock;
+import org.scilab.modules.xcos.block.io.ExplicitInBlock;
+import org.scilab.modules.xcos.block.io.ExplicitOutBlock;
+import org.scilab.modules.xcos.block.io.ImplicitInBlock;
+import org.scilab.modules.xcos.block.io.ImplicitOutBlock;
+import org.scilab.modules.xcos.block.positionning.BigSom;
+import org.scilab.modules.xcos.block.positionning.GroundBlock;
+import org.scilab.modules.xcos.block.positionning.Product;
+import org.scilab.modules.xcos.block.positionning.RoundBlock;
+import org.scilab.modules.xcos.block.positionning.Summation;
+import org.scilab.modules.xcos.block.positionning.VoltageSensorBlock;
+import org.scilab.modules.xcos.graph.XcosDiagram;
+import org.scilab.modules.xcos.port.BasicPort;
+import org.scilab.modules.xcos.port.command.CommandPort;
+import org.scilab.modules.xcos.port.control.ControlPort;
+import org.scilab.modules.xcos.port.input.ExplicitInputPort;
+import org.scilab.modules.xcos.port.input.ImplicitInputPort;
+import org.scilab.modules.xcos.port.output.ExplicitOutputPort;
+import org.scilab.modules.xcos.port.output.ImplicitOutputPort;
+import com.mxgraph.model.mxCell;
+import com.mxgraph.model.mxICell;
+
+/**
+ * Ease the creation of any {@link Kind} of graphical object
+ */
+public final class XcosCellFactory {
+
+    // DAC: As this is the constructor for all the block classes, this class is
+    // very coupled with *Block classes
+    // CSOFF: ClassDataAbstractionCoupling
+    /**
+     * List the specific block interface function name. <BR>
+     * <BR>
+     * <EM>Specific instance must be registered before generic ones in order
+     * to serialized all the non-default values.</EM>
+     */
+    public static enum BlockInterFunction {
+        /** @see TextBlock */
+        TEXT_f(TextBlock.class),
+        /** @see SuperBlock */
+        DSUPER(SuperBlock.class),
+        /** @see SuperBlock */
+        SUPER_f(SuperBlock.class),
+        /** @see AfficheBlock */
+        AFFICH_m(AfficheBlock.class),
+        /** @see AfficheBlock */
+        AFFICH_f(AfficheBlock.class),
+        /** @see ExplicitInBlock */
+        IN_f(ExplicitInBlock.class),
+        /** @see ExplicitOutBlock */
+        OUT_f(ExplicitOutBlock.class),
+        /** @see ImplicitInBlock */
+        INIMPL_f(ImplicitInBlock.class),
+        /** @see ImplicitOutBlock */
+        OUTIMPL_f(ImplicitOutBlock.class),
+        /** @see EventInBlock */
+        CLKINV_f(EventInBlock.class),
+        /** @see EventOutBlock */
+        CLKOUTV_f(EventOutBlock.class),
+        /** @see EventOutBlock */
+        CLKOUT_f(EventOutBlock.class),
+        /** @see SplitBlock */
+        SPLIT_f(SplitBlock.class),
+        /** @see SplitBlock */
+        IMPSPLIT_f(SplitBlock.class),
+        /** @see SplitBlock */
+        CLKSPLIT_f(SplitBlock.class),
+        /** @see GroundBlock */
+        Ground(GroundBlock.class),
+        /** @see VoltageSensorBlock */
+        VoltageSensor(VoltageSensorBlock.class),
+        /** @see RoundBlock */
+        SUM_f(RoundBlock.class),
+        /** @see RoundBlock */
+        PROD_f(RoundBlock.class),
+        /** @see RoundBlock */
+        CLKSOM_f(RoundBlock.class),
+        /** @see RoundBlock */
+        CLKSOMV_f(RoundBlock.class),
+        /** @see BigSom */
+        BIGSOM_f(BigSom.class),
+        /** @see Summation */
+        SUMMATION(Summation.class),
+        /** @see Product */
+        PRODUCT(Product.class),
+        /** @see BasicBlock */
+        BASIC_BLOCK(BasicBlock.class);
+
+        private final Class<? extends BasicBlock> klass;
+
+        /**
+         * Default constructor
+         *
+         * @param block
+         *            The reference instance
+         */
+        private BlockInterFunction(Class<? extends BasicBlock> klass) {
+            this.klass = klass;
+        }
+
+        /**
+         * @return the class to instantiate
+         */
+        public Class<? extends BasicBlock> getKlass() {
+            return klass;
+        }
+    }
+
+    // CSON: ClassDataAbstractionCoupling
+
+    /** Default singleton constructor */
+    private XcosCellFactory() {
+        // This class is a static singleton
+    }
+
+    /*
+     * Block and Annotation management
+     */
+
+    /**
+     * Instantiate a new block with the specified UID value.
+     *
+     * @param uid
+     *            The associated UID value
+     * @return A new instance of a block.
+     */
+    public static BasicBlock createBlock(long uid) {
+        BasicBlock block = null;
+
+        JavaController controller = new JavaController();
+        String[] interfaceFunction = new String[1];
+        controller.getObjectProperty(uid, Kind.BLOCK, ObjectProperties.INTERFACE_FUNCTION, interfaceFunction);
+
+        for (BlockInterFunction func : BlockInterFunction.values()) {
+            if (func.name().equals(interfaceFunction)) {
+                block = createBlock(controller, func, uid);
+                break;
+            }
+        }
+
+        if (block == null) {
+            block = createBlock(controller, BlockInterFunction.BASIC_BLOCK, uid);
+            block.setStyle(interfaceFunction[0]);
+        }
+
+        return block;
+    }
+
+    /**
+     * Instantiate a new block with the specified interface function.
+     *
+     * @param func
+     *            the interface function
+     * @return A new instance of a block.
+     */
+    public static BasicBlock createBlock(BlockInterFunction func) {
+        JavaController controller = new JavaController();
+
+        long uid = controller.createObject(Kind.BLOCK);
+        return createBlock(controller, func, uid);
+    }
+
+    /**
+     * Instantiate a new block with the specified interface function and uid.
+     *
+     * @param controller the Java controller to use
+     * @param func the interface function
+     * @param uid the allocated uid
+     * @return A new instance of a block.
+     */
+    public static BasicBlock createBlock(final JavaController controller, BlockInterFunction func, long uid) {
+        BasicBlock block = null;
+        try {
+            block = func.getKlass().getConstructor(Long.TYPE).newInstance(uid);
+        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException        | NoSuchMethodException | SecurityException e) {
+            // Something goes wrong, print it.
+            e.printStackTrace();
+            return block;
+        }
+
+        insertPortChildren(controller, block);
+        return block;
+    }
+
+    /*
+     * Port management
+     */
+
+
+    /**
+     * Helper used to create port children on a parent block.
+     *
+     * This method does not manage the model transaction and should be used to preset the children of a block out of an {@link XcosDiagram}.
+     *
+     * @param controller is the shared controller instance
+     * @param parent is the parent {@link mxCell} to modify
+     */
+    public static void insertPortChildren(final JavaController controller, final XcosCell parent) {
+        final EnumSet<ObjectProperties> properties = EnumSet.of(ObjectProperties.INPUTS, ObjectProperties.OUTPUTS, ObjectProperties.EVENT_INPUTS, ObjectProperties.EVENT_OUTPUTS);
+        insertPortChildren(controller, properties, parent);
+    }
+
+
+    /**
+     * Helper used to create port children on a parent block.
+     *
+     * This method does not manage the model transaction and should be used to preset the children of a block out of an {@link XcosDiagram}.
+     *
+     * @param controller is the shared controller instance
+     * @param properties specify the kind of port to insert and should be some of : <UL>
+     *        <LI>{@link ObjectProperties#INPUTS}
+     *        <LI>{@link ObjectProperties#OUTPUTS}
+     *        <LI>{@link ObjectProperties#EVENT_INPUTS}
+     *        <LI>{@link ObjectProperties#EVENT_OUTPUTS}
+     * @param parent is the parent {@link mxCell} to modify
+     */
+    public static void insertPortChildren(final JavaController controller, final EnumSet<ObjectProperties> properties, final XcosCell parent) {
+        for (ObjectProperties property : properties) {
+            insertPortChildren(controller, property, parent);
+        }
+    }
+
+    /**
+     * Helper used to create port children on a parent block.
+     *
+     * This method does not manage the model transaction and should be used to preset the children of a block out of an {@link XcosDiagram}.
+     *
+     * @param controller is the shared controller instance
+     * @param property specify the kind of port to insert and should be one of : <UL>
+     *        <LI>{@link ObjectProperties#INPUTS}
+     *        <LI>{@link ObjectProperties#OUTPUTS}
+     *        <LI>{@link ObjectProperties#EVENT_INPUTS}
+     *        <LI>{@link ObjectProperties#EVENT_OUTPUTS}
+     * @param parent is the parent {@link mxCell} to modify
+     */
+    public static void insertPortChildren(final JavaController controller, final ObjectProperties property, final XcosCell parent) {
+        if (parent.getKind() != Kind.BLOCK) {
+            return;
+        }
+
+        VectorOfScicosID modelChildren = new VectorOfScicosID();
+        controller.getObjectProperty(parent.getUID(), parent.getKind(), property, modelChildren);
+
+        mxICell[] children = new mxICell[modelChildren.size()];
+        for (int i = 0; i < children.length; i++) {
+            children[i] = createPort(controller, modelChildren.get(i), property);
+        }
+        Arrays.stream(children).forEach(c -> parent.insert(c));
+    }
+
+    /**
+     * Create a port for a specific uid
+     *
+     * @param controller is the shared controller instance
+     * @param uid represent the allocated UID on the MVC
+     * @param property specify the kind of port to create and should be one of : <UL>
+     *        <LI>{@link ObjectProperties#INPUTS}
+     *        <LI>{@link ObjectProperties#OUTPUTS}
+     *        <LI>{@link ObjectProperties#EVENT_INPUTS}
+     *        <LI>{@link ObjectProperties#EVENT_OUTPUTS}
+     * @return a newly allocated port
+     */
+    private static final BasicPort createPort(final JavaController controller, long uid, final ObjectProperties property) {
+        boolean[] isImplicit = {false};
+
+        switch (property) {
+            case INPUTS:
+                controller.getObjectProperty(uid, Kind.PORT, ObjectProperties.IMPLICIT, isImplicit);
+                if (isImplicit[0]) {
+                    return new ImplicitInputPort(uid);
+                } else {
+                    return new ExplicitInputPort(uid);
+                }
+            case OUTPUTS:
+                controller.getObjectProperty(uid, Kind.PORT, ObjectProperties.IMPLICIT, isImplicit);
+                if (isImplicit[0]) {
+                    return new ImplicitOutputPort(uid);
+                } else {
+                    return new ExplicitOutputPort(uid);
+                }
+            case EVENT_INPUTS:
+                return new ControlPort(uid);
+            case EVENT_OUTPUTS:
+                return new CommandPort(uid);
+            default:
+                return null;
+        }
+    }
+}
index 7e05c20..b0b2c61 100644 (file)
@@ -24,9 +24,9 @@ import org.scilab.modules.graph.ScilabGraph;
 import org.scilab.modules.xcos.JavaController;
 import org.scilab.modules.xcos.Kind;
 import org.scilab.modules.xcos.block.BasicBlock;
-import org.scilab.modules.xcos.block.BlockFactory;
-import org.scilab.modules.xcos.block.BlockFactory.BlockInterFunction;
 import org.scilab.modules.xcos.block.TextBlock;
+import org.scilab.modules.xcos.graph.model.XcosCellFactory;
+import org.scilab.modules.xcos.graph.model.XcosCellFactory.BlockInterFunction;
 import org.scilab.modules.xcos.graph.swing.GraphComponent;
 import org.scilab.modules.xcos.link.BasicLink;
 import org.scilab.modules.xcos.port.BasicPort;
@@ -139,7 +139,7 @@ public class GraphHandler extends mxGraphHandler {
     private void createTextBlock(MouseEvent e) {
         // allocate
         JavaController controller = new JavaController();
-        final TextBlock textBlock = (TextBlock) BlockFactory.createBlock(BlockInterFunction.TEXT_f, controller.createObject(Kind.ANNOTATION));
+        final TextBlock textBlock = (TextBlock) XcosCellFactory.createBlock(controller, BlockInterFunction.TEXT_f, controller.createObject(Kind.ANNOTATION));
 
         // set the position of the block
         final mxPoint pt = graphComponent.getPointForEvent(e);
index b0bdb58..af5b2f9 100644 (file)
@@ -21,9 +21,9 @@ import org.scilab.modules.xcos.JavaController;
 import org.scilab.modules.xcos.Kind;
 import org.scilab.modules.xcos.ObjectProperties;
 import org.scilab.modules.xcos.block.BasicBlock;
-import org.scilab.modules.xcos.block.BlockFactory;
-import org.scilab.modules.xcos.block.BlockFactory.BlockInterFunction;
 import org.scilab.modules.xcos.block.TextBlock;
+import org.scilab.modules.xcos.graph.model.XcosCellFactory;
+import org.scilab.modules.xcos.graph.model.XcosCellFactory.BlockInterFunction;
 import org.scilab.modules.xcos.port.BasicPort;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -70,8 +70,8 @@ public class BasicBlockCodec extends XcosObjectCodec {
         mxCodecRegistry.addPackage("org.scilab.modules.xcos.block.io");
         mxCodecRegistry.addPackage("org.scilab.modules.xcos.block.positionning");
 
-        for (BlockInterFunction function : BlockFactory.BlockInterFunction.values()) {
-            XcosObjectCodec codec = new BasicBlockCodec(BlockFactory.createBlock(function), IGNORED_FIELDS, REFS, null);
+        for (BlockInterFunction function : XcosCellFactory.BlockInterFunction.values()) {
+            XcosObjectCodec codec = new BasicBlockCodec(XcosCellFactory.createBlock(function), IGNORED_FIELDS, REFS, null);
             mxCodecRegistry.register(codec);
         }
 
index 9908dc5..d4be8a1 100644 (file)
@@ -13,6 +13,7 @@
 package org.scilab.modules.xcos.io.scicos;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.EnumMap;
 import java.util.List;
 import java.util.Map;
@@ -97,44 +98,12 @@ public final class BasicBlockInfo {
                 // There we are sure that the cell is an instance of the type
                 // class. Thus we can safely cast it and add it to the result
                 // vector.
-                if (revert) {
-                    data.add(0, (T) cell);
-                } else {
-                    data.add((T) cell);
-                }
+                data.add((T) cell);
             }
         }
 
-        return data;
-    }
-
-    /**
-     * Get the n-th port for a n position.
-     *
-     * This method assume that the port are sorted and that the
-     * {@link BasicPort#getOrdering()} is filled with the right value.
-     *
-     * @param block
-     *            the block
-     * @param position
-     *            the position to look for
-     * @return a list of applicable ports
-     */
-    public static List<BasicPort> getAllPortsAtPosition(final BasicBlock block, final int position) {
-        final List<BasicPort> data = new ArrayList<BasicPort>();
-        if (block == null) {
-            return data;
-        }
-
-        final int childrenCount = block.getChildCount();
-        for (int i = 0; i < childrenCount; ++i) {
-            final mxICell cell = block.getChildAt(i);
-            if (cell instanceof BasicPort) {
-                final BasicPort p = ((BasicPort) cell);
-                if (p.getOrdering() == position) {
-                    data.add(p);
-                }
-            }
+        if (revert) {
+            Collections.reverse(data);
         }
 
         return data;
index fd67321..44f8d47 100644 (file)
@@ -530,7 +530,7 @@ public final class Palette {
         graph.addCell(block);
         graph.selectAll();
 
-        BlockPositioning.updateBlockView(block);
+        BlockPositioning.updateBlockView(graph, block);
 
         /*
          * Render
index dacf6eb..8721196 100644 (file)
@@ -12,6 +12,9 @@
 
 package org.scilab.modules.xcos.palette;
 
+import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.buildCall;
+import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.synchronousScilabExec;
+
 import java.awt.Point;
 import java.awt.datatransfer.Transferable;
 import java.awt.dnd.DnDConstants;
@@ -19,23 +22,28 @@ import java.awt.dnd.DragGestureEvent;
 import java.awt.dnd.DragGestureListener;
 import java.awt.dnd.DragSource;
 import java.awt.dnd.InvalidDnDOperationException;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.event.MouseListener;
 import java.lang.ref.WeakReference;
+import java.util.EnumSet;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.InterpreterException;
 import org.scilab.modules.gui.messagebox.ScilabModalDialog;
 import org.scilab.modules.gui.messagebox.ScilabModalDialog.IconType;
 import org.scilab.modules.localization.Messages;
 import org.scilab.modules.xcos.JavaController;
 import org.scilab.modules.xcos.Kind;
+import org.scilab.modules.xcos.ObjectProperties;
+import org.scilab.modules.xcos.UpdateStatus;
+import org.scilab.modules.xcos.Xcos;
+import org.scilab.modules.xcos.XcosView;
+import org.scilab.modules.xcos.XcosViewListener;
 import org.scilab.modules.xcos.block.BasicBlock;
-import org.scilab.modules.xcos.block.BlockFactory;
-import org.scilab.modules.xcos.block.BlockFactory.BlockInterFunction;
 import org.scilab.modules.xcos.graph.XcosDiagram;
+import org.scilab.modules.xcos.graph.model.XcosCellFactory;
 import org.scilab.modules.xcos.io.scicos.ScicosFormatException;
+import org.scilab.modules.xcos.io.scicos.ScilabDirectHandler;
 import org.scilab.modules.xcos.palette.listener.PaletteBlockMouseListener;
 import org.scilab.modules.xcos.palette.model.PaletteBlock;
 import org.scilab.modules.xcos.palette.view.PaletteBlockView;
@@ -120,7 +128,6 @@ public final class PaletteBlockCtrl {
     public synchronized Transferable getTransferable() throws ScicosFormatException {
         Transferable transfer = transferable.get();
         if (transfer == null) {
-            /* Load the block from the H5 file */
             BasicBlock block;
             try {
                 block = loadBlock();
@@ -144,10 +151,11 @@ public final class PaletteBlockCtrl {
             INTERNAL_GRAPH.addCell(block);
             INTERNAL_GRAPH.selectAll();
 
-            BlockPositioning.updateBlockView(block);
+            BlockPositioning.updateBlockView(INTERNAL_GRAPH, block);
 
             mxGraphTransferHandler handler = ((mxGraphTransferHandler) INTERNAL_GRAPH.getAsComponent().getTransferHandler());
-            transfer = handler.createTransferable(INTERNAL_GRAPH.getAsComponent());
+            Object[] cells = new Object[] {block};
+            transfer = new mxGraphTransferable(cells, INTERNAL_GRAPH.getPaintBounds(cells), handler.createTransferableImage(INTERNAL_GRAPH.getAsComponent(), cells));
             transferable = new WeakReference<Transferable>(transfer);
 
             INTERNAL_GRAPH.removeCells();
@@ -155,90 +163,69 @@ public final class PaletteBlockCtrl {
         return transfer;
     }
 
+    private static class BlockLoadedListener extends XcosViewListener {
+        private long uid;
+
+        public BlockLoadedListener() {
+            uid = 0;
+        }
+
+        public long getUID() {
+            return uid;
+        }
+
+        /**
+         * When a unique block is created then store it for later use.
+         */
+        @Override
+        public void objectCreated(long uid, Kind kind) {
+            if (!EnumSet.of(Kind.BLOCK, Kind.ANNOTATION).contains(kind)) {
+                return;
+            }
+
+            this.uid = uid;
+        }
+
+        /**
+         * When a composite block is created we track the PARENT_BLOCK / CHILDREN association to store the parent.
+         */
+        @Override
+        public void propertyUpdated(long uid, Kind kind, ObjectProperties property, UpdateStatus status) {
+            if (status != UpdateStatus.SUCCESS || property != ObjectProperties.CHILDREN) {
+                return;
+            }
+            if (!EnumSet.of(Kind.BLOCK, Kind.ANNOTATION).contains(kind)) {
+                return;
+            }
+
+            this.uid = uid;
+        }
+    }
+
+
     /**
      * @return the loaded block.
      * @throws ScicosFormatException
      *             on error
      */
     private BasicBlock loadBlock() throws ScicosFormatException {
+        XcosView view = (XcosView) JavaController.lookup_view(Xcos.class.getSimpleName());
+
+        BlockLoadedListener blockLoaded = new BlockLoadedListener();
+        view.addXcosViewListener(blockLoaded, EnumSet.allOf(Kind.class), true, EnumSet.of(ObjectProperties.CHILDREN));
+
         BasicBlock block;
-        if (model.getName().compareTo("TEXT_f") != 0) {
-            // FIXME : play with the view to allocate that
+        try {
+            synchronousScilabExec(ScilabDirectHandler.BLK + " = " + buildCall(model.getName(), "define"));
+            block = XcosCellFactory.createBlock(blockLoaded.getUID());
+        } catch (InterpreterException e1) {
+            LOG.severe(e1.toString());
             block = null;
-            //            try {
-            //                synchronousScilabExec(ScilabDirectHandler.BLK + " = " + buildCall(model.getName(), "define"));
-            //                block = handler.readBlock();
-            //            } catch (InterpreterException e1) {
-            //                LOG.severe(e1.toString());
-            //                block = null;
-            //            } finally {
-            //                handler.release();
-            //            }
-            //
-            //            // invalid block case
-            //            if (block == null) {
-            //                return null;
-            //            }
-            //
-            //            if (block.getStyle().compareTo("") == 0) {
-            //                block.setStyle(block.getInterfaceFunctionName());
-            //            }
-        } else {
-            block = BlockFactory.createBlock(BlockInterFunction.TEXT_f);
+        } finally {
+            view.removeXcosViewListener(blockLoaded);
         }
-        return block;
-    }
 
-    /**
-     * @param callback
-     *            called after the block loading
-     */
-    protected void loadBlock(final ActionListener callback) {
-        if (model.getName().compareTo("TEXT_f") != 0) {
-
-            // FIXME : play with the view
-            //            // Load the block with a reference instance
-            //            final ScilabDirectHandler handler = ScilabDirectHandler.acquire();
-            //            if (handler == null) {
-            //                return;
-            //            }
-            //
-            //            final ActionListener internalCallback = new ActionListener() {
-            //                @Override
-            //                public void actionPerformed(ActionEvent e) {
-            //                    try {
-            //                        final BasicBlock block = handler.readBlock();
-            //
-            //                        // invalid block case
-            //                        if (block == null) {
-            //                            return;
-            //                        }
-            //
-            //                        // update style
-            //                        if (block.getStyle().compareTo("") == 0) {
-            //                            block.setStyle(block.getInterfaceFunctionName());
-            //                        }
-            //
-            //                        callback.actionPerformed(new ActionEvent(block, 0, "loaded"));
-            //                    } catch (ScicosFormatException e1) {
-            //                        e1.printStackTrace();
-            //                    } finally {
-            //                        handler.release();
-            //                    }
-            //                }
-            //            };
-            //
-            //            try {
-            //                asynchronousScilabExec(internalCallback, ScilabDirectHandler.BLK + " = " + buildCall(model.getName(), "define"));
-            //            } catch (InterpreterException e1) {
-            //                LOG.severe(e1.toString());
-            //            } finally {
-            //                handler.release();
-            //            }
-        } else {
-            final BasicBlock block = BlockFactory.createBlock(BlockInterFunction.TEXT_f);
-            callback.actionPerformed(new ActionEvent(block, 0, "loaded"));
-        }
+        return block;
     }
 
     /**
index 6e3f839..ee116b5 100644 (file)
@@ -73,6 +73,8 @@ public final class PaletteBlockMouseListener implements MouseListener {
                               + XcosTab.get(allDiagrams.get(0)).getName());
                 final XcosDiagram theDiagram = allDiagrams.get(0);
                 addTo.setCallback(new CommonCallBack(e.toString()) {
+                    private static final long serialVersionUID = 0L;
+
                     @Override
                     public void callBack() {
                         BasicBlock current = control.getBlock();
@@ -93,6 +95,8 @@ public final class PaletteBlockMouseListener implements MouseListener {
                     final XcosDiagram theDiagram = allDiagrams.get(i);
                     diagram.setText(XcosTab.get(allDiagrams.get(i)).getName());
                     diagram.setCallback(new CommonCallBack(e.toString()) {
+                        private static final long serialVersionUID = 0L;
+
                         @Override
                         public void callBack() {
                             BasicBlock current = control.getBlock();
@@ -110,6 +114,8 @@ public final class PaletteBlockMouseListener implements MouseListener {
             MenuItem help = ScilabMenuItem.createMenuItem();
             help.setText("Block help");
             help.setCallback(new CommonCallBack(e.toString()) {
+                private static final long serialVersionUID = 0L;
+
                 @Override
                 public void callBack() {
                     try {
index 5f024d2..dcf0af8 100644 (file)
@@ -111,6 +111,8 @@ public class PaletteManagerMouseListener implements MouseListener {
         }
 
         create.setCallback(new CommonCallBack(XcosMessages.CREATE) {
+            private static final long serialVersionUID = 0L;
+
             @Override
             public void callBack() {
                 String name = JOptionPane.showInputDialog(XcosMessages.ASK_FOR_A_NAME, XcosMessages.DEFAULT_CATEGORY_NAME);
@@ -158,6 +160,8 @@ public class PaletteManagerMouseListener implements MouseListener {
     private void setupRename(final JTree paletteTree, final TreePath path, final MenuItem rename) {
         rename.setText(XcosMessages.RENAME);
         rename.setCallback(new CommonCallBack(XcosMessages.RENAME) {
+            private static final long serialVersionUID = 0L;
+
             @Override
             public void callBack() {
                 if (path == null) {
@@ -194,6 +198,8 @@ public class PaletteManagerMouseListener implements MouseListener {
     private void setupRemove(final JTree paletteTree, final TreePath path, final MenuItem remove) {
         remove.setText(XcosMessages.REMOVE);
         remove.setCallback(new CommonCallBack(XcosMessages.REMOVE) {
+            private static final long serialVersionUID = 0L;
+
             @Override
             public void callBack() {
                 if (path == null) {
index 22eb1d1..023d185 100644 (file)
@@ -44,7 +44,6 @@ public class PaletteConfiguratorListView extends JTable {
     /**
      * The default model
      */
-    @SuppressWarnings(value = { "serial" })
     public static class PaletteListModel extends AbstractTableModel {
         private final Category category;
 
index c9ce84f..a654844 100644 (file)
@@ -12,7 +12,6 @@
 
 package org.scilab.modules.xcos.port;
 
-import org.scilab.modules.graph.utils.ScilabGraphConstants;
 import org.scilab.modules.graph.utils.StyleMap;
 import org.scilab.modules.types.ScilabType;
 import org.scilab.modules.xcos.JavaController;
@@ -20,8 +19,6 @@ import org.scilab.modules.xcos.Kind;
 import org.scilab.modules.xcos.ObjectProperties;
 import org.scilab.modules.xcos.block.BasicBlock;
 import org.scilab.modules.xcos.graph.model.XcosCell;
-import org.scilab.modules.xcos.utils.XcosConstants;
-import org.scilab.modules.xcos.utils.XcosMessages;
 
 import com.mxgraph.model.mxGeometry;
 import com.mxgraph.model.mxICell;
@@ -31,13 +28,13 @@ import com.mxgraph.util.mxConstants;
  * Common implementation of any Port.
  */
 public abstract class BasicPort extends XcosCell {
+    private static final long serialVersionUID = 0L;
 
     /**
      * The side-size of any port. All ports must have the same size.
      */
     public static final double DEFAULT_PORTSIZE = 8;
 
-    private int ordering;
     private Orientation orientation;
 
     /** Type of any dataport */
@@ -127,21 +124,6 @@ public abstract class BasicPort extends XcosCell {
     }
 
     /**
-     * @param ordering
-     *            a unique order number per instance
-     */
-    public void setOrdering(int ordering) {
-        this.ordering = ordering;
-    }
-
-    /**
-     * @return the unique order number per instance
-     */
-    public int getOrdering() {
-        return ordering;
-    }
-
-    /**
      * @return the type of the port (Explicit or Implicit)
      */
     public abstract Type getType();
@@ -163,28 +145,6 @@ public abstract class BasicPort extends XcosCell {
     }
 
     /**
-     * @return An html formatted documentation string
-     */
-    public String getToolTipText() {
-        StringBuilder result = new StringBuilder();
-        result.append(ScilabGraphConstants.HTML_BEGIN);
-        result.append("Port number : " + getOrdering() + ScilabGraphConstants.HTML_NEWLINE);
-
-        final int length = getStyle().length();
-        result.append("Style : ");
-        if (length > XcosConstants.MAX_CHAR_IN_STYLE) {
-            result.append(getStyle().substring(0, XcosConstants.MAX_CHAR_IN_STYLE));
-            result.append(XcosMessages.DOTS);
-        } else {
-            result.append(getStyle());
-        }
-        result.append(ScilabGraphConstants.HTML_NEWLINE);
-
-        result.append(ScilabGraphConstants.HTML_END);
-        return result.toString();
-    }
-
-    /**
      * Set the default values for newly created port.
      */
     public void setDefaultValues() {
index 6097796..4dcf42f 100644 (file)
@@ -25,10 +25,13 @@ import org.scilab.modules.xcos.port.Orientation;
  * port default orientation is the SOUTH.
  */
 public class CommandPort extends BasicPort {
+    private static final long serialVersionUID = 0L;
 
     /** Default constructor */
     public CommandPort(long uid) {
         super(uid);
+
+        setStyle("CommandPort");
         setOrientation(Orientation.SOUTH);
     }
 
index 0cdbd96..7908c37 100644 (file)
@@ -30,6 +30,8 @@ public class ControlPort extends BasicPort {
     /** Default constructor */
     public ControlPort(long uid) {
         super(uid);
+
+        setStyle("ControlPort");
         setOrientation(Orientation.NORTH);
     }
 
index 394cf8b..2164675 100644 (file)
@@ -23,6 +23,8 @@ public class ExplicitInputPort extends InputPort {
     /** Default constructor */
     public ExplicitInputPort(long uid) {
         super(uid);
+
+        setStyle("ExplicitInputPort");
     }
 
     /** @return always Type.EXPLICIT */
index 937fbdd..1bd226f 100644 (file)
@@ -28,6 +28,8 @@ public class ImplicitInputPort extends InputPort {
     /** Default constructor */
     public ImplicitInputPort(long uid) {
         super(uid);
+
+        setStyle("ImplicitInputPort");
     }
 
     /** @return always Type.IMPLICIT */
index c78b72b..2b22366 100644 (file)
@@ -23,6 +23,8 @@ import org.scilab.modules.xcos.port.Orientation;
  * connected to an {@link org.scilab.modules.xcos.port.output.OutputPort} .
  */
 public abstract class InputPort extends BasicPort {
+    private static final long serialVersionUID = 0L;
+
     /**
      * Default constructor
      *
index 743ec55..482a5ef 100644 (file)
@@ -23,6 +23,8 @@ public class ExplicitOutputPort extends OutputPort {
     /** Default constructor */
     public ExplicitOutputPort(long uid) {
         super(uid);
+
+        setStyle("ExplicitOutputPort");
     }
 
     /**
index c244e3e..582ba43 100644 (file)
@@ -28,6 +28,8 @@ public class ImplicitOutputPort extends OutputPort {
     /** Default constructor */
     public ImplicitOutputPort(long uid) {
         super(uid);
+
+        setStyle("ExplicitOutputPort");
     }
 
     /** @return always Type.IMPLICIT */
index ac11e6c..dbdfb4b 100644 (file)
@@ -23,6 +23,7 @@ import org.scilab.modules.xcos.port.Orientation;
  * connected to an {@link org.scilab.modules.xcos.port.input.InputPort} .
  */
 public abstract class OutputPort extends BasicPort {
+    private static final long serialVersionUID = 0L;
 
     /**
      * Default constructor
index f7f766c..22b41c8 100644 (file)
@@ -14,23 +14,22 @@ package org.scilab.modules.xcos.utils;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 
-import org.scilab.modules.graph.utils.StyleMap;
 import org.scilab.modules.xcos.JavaController;
 import org.scilab.modules.xcos.Kind;
 import org.scilab.modules.xcos.ObjectProperties;
 import org.scilab.modules.xcos.VectorOfDouble;
 import org.scilab.modules.xcos.block.BasicBlock;
+import org.scilab.modules.xcos.graph.XcosDiagram;
 import org.scilab.modules.xcos.io.scicos.BasicBlockInfo;
 import org.scilab.modules.xcos.port.BasicPort;
 import org.scilab.modules.xcos.port.Orientation;
 
 import com.mxgraph.model.mxGeometry;
 import com.mxgraph.model.mxIGraphModel;
-import com.mxgraph.util.mxUtils;
+import com.mxgraph.util.mxStyleUtils;
 
 /**
  * Helpers to place port on a block.
@@ -52,25 +51,6 @@ public final class BlockPositioning {
     }
 
     /**
-     *
-     */
-    public static class PortComparator implements Comparator<BasicPort> {
-        @Override
-        public int compare(BasicPort arg0, BasicPort arg1) {
-            int order_0 = arg0.getOrdering();
-            int order_1 = arg1.getOrdering();
-
-            if (order_0 < order_1) {
-                return -1;
-            } else if (order_0 > order_1) {
-                return 1;
-            } else {
-                return 0;
-            }
-        }
-    }
-
-    /**
      * Dispatch ports on Block's _WEST_ side.
      *
      * @param block
@@ -78,19 +58,9 @@ public final class BlockPositioning {
      * @param ports
      *            The ports we have to move on the side.
      */
-    public static void updateWestPortsPosition(BasicBlock block, List <? extends BasicPort > ports) {
-
-        double gridSize;
-        if (block.getParentDiagram() == null) {
-            gridSize = DEFAULT_GRIDSIZE;
-        } else {
-            gridSize = block.getParentDiagram().getGridSize();
-        }
+    public static void updateWestPortsPosition(final XcosDiagram diag, BasicBlock block, List <? extends BasicPort > ports) {
 
-        // BasicBlock.sortsort(List<?> children) takes into account different
-        // parameters to order the ports list. We only need to order the ports
-        // given their ordering.
-        Collections.sort(ports, new PortComparator());
+        double gridSize = diag.getGridSize();
 
         final mxGeometry blockGeom = block.getGeometry();
         assert blockGeom != null;
@@ -98,7 +68,7 @@ public final class BlockPositioning {
         final double blockLength = blockGeom.getHeight();
         final double segLength = blockLength / (portsSize + 1);
 
-        beginUpdate(block);
+        diag.getModel().beginUpdate();
         for (int i = 0; i < portsSize; ++i) {
             final BasicPort port = (ports.get(i));
             final mxGeometry portGeom = port.getGeometry();
@@ -112,7 +82,7 @@ public final class BlockPositioning {
 
             port.setLabelPosition(Orientation.WEST);
         }
-        endUpdate(block);
+        diag.getModel().endUpdate();
     }
 
     /**
@@ -155,18 +125,8 @@ public final class BlockPositioning {
      * @param ports
      *            The ports we have to move on the side.
      */
-    public static void updateNorthPortsPosition(BasicBlock block, List <? extends BasicPort > ports) {
-        double gridSize;
-        if (block.getParentDiagram() == null) {
-            gridSize = DEFAULT_GRIDSIZE;
-        } else {
-            gridSize = block.getParentDiagram().getGridSize();
-        }
-
-        // BasicBlock.sortsort(List<?> children) takes into account different
-        // parameters to order the ports list. We only need to order the ports
-        // given their ordering.
-        Collections.sort(ports, new PortComparator());
+    public static void updateNorthPortsPosition(final XcosDiagram diag, BasicBlock block, List <? extends BasicPort > ports) {
+        double gridSize = diag.getGridSize();
 
         final mxGeometry blockGeom = block.getGeometry();
         assert blockGeom != null;
@@ -174,7 +134,7 @@ public final class BlockPositioning {
         final double blockLength = blockGeom.getWidth();
         final double segLength = blockLength / (portsSize + 1);
 
-        beginUpdate(block);
+        diag.getModel().beginUpdate();
         for (int i = 0; i < portsSize; ++i) {
             final BasicPort port = (ports.get(i));
             final mxGeometry portGeom = port.getGeometry();
@@ -188,7 +148,7 @@ public final class BlockPositioning {
 
             port.setLabelPosition(Orientation.NORTH);
         }
-        endUpdate(block);
+        diag.getModel().endUpdate();
     }
 
     /**
@@ -199,18 +159,8 @@ public final class BlockPositioning {
      * @param ports
      *            The ports we have to move on the side.
      */
-    public static void updateEastPortsPosition(BasicBlock block, List <? extends BasicPort > ports) {
-        double gridSize;
-        if (block.getParentDiagram() == null) {
-            gridSize = DEFAULT_GRIDSIZE;
-        } else {
-            gridSize = block.getParentDiagram().getGridSize();
-        }
-
-        // BasicBlock.sortsort(List<?> children) takes into account different
-        // parameters to order the ports list. We only need to order the ports
-        // given their ordering.
-        Collections.sort(ports, new PortComparator());
+    public static void updateEastPortsPosition(final XcosDiagram diag, BasicBlock block, List <? extends BasicPort > ports) {
+        double gridSize = diag.getGridSize();
 
         final mxGeometry blockGeom = block.getGeometry();
         assert blockGeom != null;
@@ -218,7 +168,7 @@ public final class BlockPositioning {
         final double blockLength = blockGeom.getHeight();
         final double segLength = blockLength / (portsSize + 1);
 
-        beginUpdate(block);
+        diag.getModel().beginUpdate();
         for (int i = 0; i < portsSize; ++i) {
             final BasicPort port = (ports.get(i));
             final mxGeometry portGeom = port.getGeometry();
@@ -232,7 +182,7 @@ public final class BlockPositioning {
 
             port.setLabelPosition(Orientation.EAST);
         }
-        endUpdate(block);
+        diag.getModel().endUpdate();
     }
 
     /**
@@ -243,18 +193,8 @@ public final class BlockPositioning {
      * @param ports
      *            The ports we have to move on the side.
      */
-    public static void updateSouthPortsPosition(BasicBlock block, List <? extends BasicPort > ports) {
-        double gridSize;
-        if (block.getParentDiagram() == null) {
-            gridSize = DEFAULT_GRIDSIZE;
-        } else {
-            gridSize = block.getParentDiagram().getGridSize();
-        }
-
-        // BasicBlock.sortsort(List<?> children) takes into account different
-        // parameters to order the ports list. We only need to order the ports
-        // given their ordering.
-        Collections.sort(ports, new PortComparator());
+    public static void updateSouthPortsPosition(final XcosDiagram diag, BasicBlock block, List <? extends BasicPort > ports) {
+        double gridSize = diag.getGridSize();
 
         final mxGeometry blockGeom = block.getGeometry();
         assert blockGeom != null;
@@ -262,7 +202,7 @@ public final class BlockPositioning {
         final double blockLength = blockGeom.getWidth();
         final double segLength = blockLength / (portsSize + 1);
 
-        beginUpdate(block);
+        diag.getModel().beginUpdate();
         for (int i = 0; i < portsSize; ++i) {
             final BasicPort port = (ports.get(i));
             final mxGeometry portGeom = port.getGeometry();
@@ -276,7 +216,7 @@ public final class BlockPositioning {
 
             port.setLabelPosition(Orientation.SOUTH);
         }
-        endUpdate(block);
+        diag.getModel().endUpdate();
     }
 
     /**
@@ -285,17 +225,17 @@ public final class BlockPositioning {
      * @param block
      *            The block we have to work on.
      */
-    public static void updatePortsPosition(BasicBlock block) {
+    public static void updatePortsPosition(final XcosDiagram diag, BasicBlock block) {
         final Map<Orientation, List<BasicPort>> ports = BasicBlockInfo.getAllOrientedPorts(block);
 
-        beginUpdate(block);
+        diag.getModel().beginUpdate();
         for (Orientation iter : Orientation.values()) {
             List<BasicPort> orientedPorts = ports.get(iter);
             if (orientedPorts != null && !orientedPorts.isEmpty()) {
-                updatePortsPositions(block, orientedPorts, iter);
+                updatePortsPositions(diag, block, orientedPorts, iter);
             }
         }
-        endUpdate(block);
+        diag.getModel().endUpdate();
     }
 
     /**
@@ -309,7 +249,7 @@ public final class BlockPositioning {
      * @param iter
      *            The orientation.
      */
-    private static void updatePortsPositions(BasicBlock block, List<BasicPort> ports, Orientation iter) {
+    private static void updatePortsPositions(final XcosDiagram diag, BasicBlock block, List<BasicPort> ports, Orientation iter) {
         @SuppressWarnings("serial")
         final List<BasicPort> invertedPorts = new ArrayList<BasicPort>(ports) {
             {
@@ -346,7 +286,7 @@ public final class BlockPositioning {
          */
         Orientation rotated = rotateOrientation(iter, mirrored, flipped);
 
-        updatePortsPosition(block, rotated, angle, working);
+        updatePortsPosition(diag, block, rotated, angle, working);
     }
 
     /**
@@ -392,7 +332,7 @@ public final class BlockPositioning {
      * @param working
      *            The ordered ports we are working on.
      */
-    private static void updatePortsPosition(BasicBlock block, Orientation iter, final double angle, List<BasicPort> working) {
+    private static void updatePortsPosition(final XcosDiagram diag, BasicBlock block, Orientation iter, final double angle, List<BasicPort> working) {
         /*
          * Ugly modification of the iter to update at the right position Works
          * only for 0 - 90 - 180 - 270 angles.
@@ -407,16 +347,16 @@ public final class BlockPositioning {
         /* Call the associated function */
         switch (rotated) {
             case NORTH:
-                updateNorthPortsPosition(block, working);
+                updateNorthPortsPosition(diag, block, working);
                 break;
             case SOUTH:
-                updateSouthPortsPosition(block, working);
+                updateSouthPortsPosition(diag, block, working);
                 break;
             case EAST:
-                updateEastPortsPosition(block, working);
+                updateEastPortsPosition(diag, block, working);
                 break;
             case WEST:
-                updateWestPortsPosition(block, working);
+                updateWestPortsPosition(diag, block, working);
                 break;
 
             default:
@@ -430,7 +370,7 @@ public final class BlockPositioning {
      * @param block
      *            The block to work on.
      */
-    public static void rotateAllPorts(BasicBlock block) {
+    public static void rotateAllPorts(final XcosDiagram diag, BasicBlock block) {
         JavaController controller = new JavaController();
         VectorOfDouble mvcAngle = new VectorOfDouble();
         controller.getObjectProperty(block.getUID(), Kind.BLOCK, ObjectProperties.ANGLE, mvcAngle);
@@ -445,21 +385,15 @@ public final class BlockPositioning {
                 final BasicPort port = (BasicPort) block.getChildAt(i);
                 final Orientation orientation = port.getOrientation();
 
-                beginUpdate(block);
+                diag.getModel().beginUpdate();
 
                 /* Apply angle */
-                if (block.getParentDiagram() != null) {
-                    final mxIGraphModel model = block.getParentDiagram().getModel();
-                    final String rot = Double.toString(orientation.getRelativeAngle(angle, port.getClass(), flipped, mirrored));
-                    mxUtils.setCellStyles(model, new Object[] { port }, XcosConstants.STYLE_ROTATION, rot);
-                } else {
-                    final StyleMap m = new StyleMap(port.getStyle());
-                    final double rot = orientation.getRelativeAngle(angle, port.getClass(), flipped, mirrored);
-                    m.put(XcosConstants.STYLE_ROTATION, Double.toString(rot));
-                    port.setStyle(m.toString());
-                }
-
-                endUpdate(block);
+                final mxIGraphModel model = diag.getModel();
+                final String rot = Double.toString(orientation.getRelativeAngle(angle, port.getClass(), flipped, mirrored));
+                mxStyleUtils.setCellStyles(model, new Object[] { port }, XcosConstants.STYLE_ROTATION, rot);
+
+
+                diag.getModel().endUpdate();
             }
         }
     }
@@ -470,15 +404,15 @@ public final class BlockPositioning {
      * @param block
      *            The block to work on
      */
-    public static void updateBlockView(BasicBlock block) {
+    public static void updateBlockView(final XcosDiagram diag, BasicBlock block) {
         if (block.getKind() != Kind.BLOCK) {
             return;
         }
 
-        beginUpdate(block);
-        updatePortsPosition(block);
-        rotateAllPorts(block);
-        endUpdate(block);
+        diag.getModel().beginUpdate();
+        updatePortsPosition(diag, block);
+        rotateAllPorts(diag, block);
+        diag.getModel().endUpdate();
 
         /*
          * FIXME: #6705; This placement trick doesn't work on the first block
@@ -495,13 +429,13 @@ public final class BlockPositioning {
      * @param block
      *            The block to work on
      */
-    public static void toggleFlip(BasicBlock block) {
+    public static void toggleFlip(final XcosDiagram diag, BasicBlock block) {
         JavaController controller = new JavaController();
         VectorOfDouble mvcAngle = new VectorOfDouble();
         controller.getObjectProperty(block.getUID(), Kind.BLOCK, ObjectProperties.ANGLE, mvcAngle);
 
         mvcAngle.set(0, mvcAngle.get(0) + 8d);
-        updateBlockView(block);
+        updateBlockView(diag, block);
     }
 
     /**
@@ -510,13 +444,13 @@ public final class BlockPositioning {
      * @param block
      *            The block to work on
      */
-    public static void toggleMirror(BasicBlock block) {
+    public static void toggleMirror(final XcosDiagram diag, BasicBlock block) {
         JavaController controller = new JavaController();
         VectorOfDouble mvcAngle = new VectorOfDouble();
         controller.getObjectProperty(block.getUID(), Kind.BLOCK, ObjectProperties.ANGLE, mvcAngle);
 
         mvcAngle.set(0, mvcAngle.get(0) + 16d);
-        updateBlockView(block);
+        updateBlockView(diag, block);
     }
 
     /**
@@ -525,7 +459,7 @@ public final class BlockPositioning {
      * @param block
      *            The block to work on
      */
-    public static void toggleAntiClockwiseRotation(BasicBlock block) {
+    public static void toggleAntiClockwiseRotation(final XcosDiagram diag, BasicBlock block) {
         JavaController controller = new JavaController();
 
         VectorOfDouble mvcAngle = new VectorOfDouble();
@@ -533,7 +467,7 @@ public final class BlockPositioning {
 
         mvcAngle.set(1, getNextAntiClockwiseAngle(block));
         controller.setObjectProperty(block.getUID(), Kind.BLOCK, ObjectProperties.ANGLE, mvcAngle);
-        updateBlockView(block);
+        updateBlockView(diag, block);
     }
 
     /**
@@ -594,28 +528,4 @@ public final class BlockPositioning {
         }
         return ret;
     }
-
-    /**
-     * Helper function that protect the block model.
-     *
-     * @param block
-     *            The block to protect
-     */
-    private static void beginUpdate(BasicBlock block) {
-        if (block != null && block.getParentDiagram() != null) {
-            block.getParentDiagram().getModel().beginUpdate();
-        }
-    }
-
-    /**
-     * Helper function that end the protection of the block model.
-     *
-     * @param block
-     *            The block previously protected
-     */
-    private static void endUpdate(BasicBlock block) {
-        if (block != null && block.getParentDiagram() != null) {
-            block.getParentDiagram().getModel().endUpdate();
-        }
-    }
 }
index d6a76a6..383c163 100644 (file)
@@ -25,6 +25,7 @@ import org.w3c.dom.Document;
 
 import com.mxgraph.io.mxCodec;
 import com.mxgraph.util.mxUtils;
+import com.mxgraph.util.mxXmlUtils;
 import com.mxgraph.view.mxStylesheet;
 
 /**
@@ -53,20 +54,22 @@ public final class FileUtils {
      *             when an errors has occurred
      */
     public static void copy(File in, File out) throws IOException {
-        FileChannel inChannel = new FileInputStream(in).getChannel();
-        FileChannel outChannel = new FileOutputStream(out).getChannel();
+        FileInputStream fis = new FileInputStream(in);
+        FileOutputStream fos = new FileOutputStream(out);
+        FileChannel inChannel = fis.getChannel();
+        FileChannel outChannel = fos.getChannel();
+
         try {
             inChannel.transferTo(0, inChannel.size(), outChannel);
         } catch (IOException e) {
             Logger.getLogger(FileUtils.class.getName()).warning(e.toString());
             throw e;
         } finally {
-            if (inChannel != null) {
-                inChannel.close();
-            }
-            if (outChannel != null) {
-                outChannel.close();
-            }
+            inChannel.close();
+            fis.close();
+
+            outChannel.close();
+            fos.close();
         }
     }
 
@@ -90,10 +93,15 @@ public final class FileUtils {
             }
         }
 
+
         try {
-            inChannel = new FileInputStream(in).getChannel();
-            outChannel = new FileOutputStream(out).getChannel();
+            FileInputStream fis = new FileInputStream(in);
+            FileOutputStream fos = new FileOutputStream(out);
+            inChannel = fis.getChannel();
+            outChannel = fos.getChannel();
             inChannel.transferTo(0, inChannel.size(), outChannel);
+            fis.close();
+            fos.close();
         } catch (IOException e) {
             Logger.getLogger(FileUtils.class.getName()).warning(e.toString());
         } finally {
@@ -179,7 +187,7 @@ public final class FileUtils {
         xml = mxUtils.readFile(baseStyleSheet.getAbsolutePath());
         xml = xml.replaceAll("\\$SCILAB", sciURL);
         xml = xml.replaceAll("\\$SCIHOME", homeURL);
-        document = mxUtils.parseXml(xml);
+        document = mxXmlUtils.parseXml(xml);
         new mxCodec().decode(document.getDocumentElement(), styleSheet);
 
         /*
@@ -189,7 +197,7 @@ public final class FileUtils {
             xml = mxUtils.readFile(userStyleSheet.getAbsolutePath());
             xml = xml.replaceAll("\\$SCILAB", sciURL);
             xml = xml.replaceAll("\\$SCIHOME", homeURL);
-            document = mxUtils.parseXml(xml);
+            document = mxXmlUtils.parseXml(xml);
             new mxCodec().decode(document.getDocumentElement(), styleSheet);
         }
     }
index 6220bb9..0399d28 100644 (file)
@@ -23,9 +23,6 @@ import org.scilab.modules.xcos.Kind;
 import org.scilab.modules.xcos.graph.XcosDiagram;
 import org.scilab.modules.xcos.io.XcosFileType;
 
-import com.mxgraph.swing.mxGraphComponent;
-import com.mxgraph.util.mxCellRenderer;
-
 /**
  * Class which contains all Xcos dependant function used by other modules.
  */