Bug #12502 fixed: Rotate, flip did not work on ports 34/20934/3
Clement DAVID [Fri, 22 Mar 2019 09:29:37 +0000 (10:29 +0100)]
Change-Id: I34e3918685e2a6500accc30746bc01a78d2f64eb

scilab/modules/graph/src/java/org/scilab/modules/graph/shape/SvgShape.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCellFactory.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/BlockPositioning.java

index 344b382..2cc277c 100644 (file)
@@ -43,7 +43,8 @@ public class SvgShape extends mxLabelShape {
     @Override
     public void paintShape(mxGraphics2DCanvas canvas, mxCellState state) {
         // paint previously set background without the rotation applied
-        if (mxUtils.getDouble(state.getStyle(), mxConstants.STYLE_ROTATION, 0) != 0) {
+        double angle = mxUtils.getDouble(state.getStyle(), mxConstants.STYLE_ROTATION, 0);
+        if (angle % 180. != 0.) {
             mxCellState nonRotatedState = (mxCellState) state.clone();
 
             double tmp = nonRotatedState.getCenterY() - nonRotatedState.getWidth() / 2;
index 9455066..6f17742 100644 (file)
@@ -225,6 +225,7 @@ public final class XcosCellFactory {
                     BasicBlock b = createBlock(controller, uid, kind);
                     cells[i] = b;
                     BlockPositioning.updatePortsPosition(diagram, b);
+                    BlockPositioning.rotateAllPorts(diagram, b);
                     b.getTypedChildrenIndexes(BasicPort.class).stream()
                     .map(index -> b.getChildAt(index))
                     .filter(c -> c instanceof BasicPort)
index b9ef583..489f196 100644 (file)
@@ -256,12 +256,6 @@ public final class BlockPositioning {
      */
     private static void updatePortsPositions(final XcosDiagram diag, BasicBlock block, List<BasicPort> ports, Orientation iter) {
         @SuppressWarnings("serial")
-        final List<BasicPort> invertedPorts = new ArrayList<BasicPort>(ports) {
-            {
-                Collections.reverse(this);
-            }
-        };
-
         JavaController controller = new JavaController();
         String[] style = new String[1];
         controller.getObjectProperty(block.getUID(), Kind.BLOCK, ObjectProperties.STYLE, style);
@@ -272,19 +266,24 @@ public final class BlockPositioning {
         final int intRotation = Double.valueOf(styleMap.getOrDefault(XcosConstants.STYLE_ROTATION, "0")).intValue();
         final int angle = (intRotation % 360 + 360) % 360;
 
-        List<BasicPort> working = ports;
+        List<BasicPort> working = new ArrayList<>(ports);
+
+        /* List order modification for opposite angle */
+        if (0 < angle && angle < 270) {
+            Collections.reverse(working);
+        }
 
         /* List order modification with the flip flag */
         if (flipped) {
-            if (iter == Orientation.NORTH || iter == Orientation.SOUTH) {
-                working = invertedPorts;
+            if (iter == Orientation.EAST || iter == Orientation.WEST) {
+                Collections.reverse(working);
             }
         }
 
         /* List order modification with the mirror flag */
         if (mirrored) {
-            if (iter == Orientation.EAST || iter == Orientation.WEST) {
-                working = invertedPorts;
+            if (iter == Orientation.NORTH || iter == Orientation.SOUTH) {
+                Collections.reverse(working);
             }
         }
 
@@ -452,7 +451,8 @@ public final class BlockPositioning {
         final boolean invertedFlip = ! Boolean.TRUE.toString().equals(styleMap.get(XcosConstants.STYLE_FLIP));
 
         styleMap.put(XcosConstants.STYLE_FLIP, Boolean.toString(invertedFlip));
-
+        cleanup(styleMap);
+        
         diag.getModel().setStyle(block, styleMap.toString());
         updateBlockView(diag, block);
     }
@@ -468,7 +468,8 @@ public final class BlockPositioning {
         final boolean invertedFlip = ! Boolean.TRUE.toString().equals(styleMap.get(XcosConstants.STYLE_MIRROR));
 
         styleMap.put(XcosConstants.STYLE_MIRROR, Boolean.toString(invertedFlip));
-
+        cleanup(styleMap);
+        
         diag.getModel().setStyle(block, styleMap.toString());
         updateBlockView(diag, block);
     }
@@ -482,6 +483,7 @@ public final class BlockPositioning {
     public static void toggleAntiClockwiseRotation(final XcosDiagram diag, BasicBlock block) {
         StyleMap styleMap = new StyleMap(block.getStyle());
         computeNextAntiClockwiseAngle(styleMap);
+        cleanup(styleMap);
 
         mxGeometry old = block.getGeometry();
         mxGeometry rotated = new mxGeometry(old.getCenterX() - old.getHeight() / 2,
@@ -498,31 +500,13 @@ public final class BlockPositioning {
      */
     private static void computeNextAntiClockwiseAngle(StyleMap styleMap) {
         final int rotation = Double.valueOf(styleMap.getOrDefault(XcosConstants.STYLE_ROTATION, "0")).intValue();
-        boolean flip = Boolean.TRUE.toString().equals(styleMap.get(XcosConstants.STYLE_FLIP));
-        boolean mirror = Boolean.TRUE.toString().equals(styleMap.get(XcosConstants.STYLE_MIRROR));
-
-        int angle = (rotation - ROTATION_STEP + MAX_ROTATION) % MAX_ROTATION;
-        if (angle > 90) {
-            angle = angle - 180;
-            flip = !flip;
-            mirror = !mirror;
-        }
-
+        
+        int angle = roundAngle(rotation - ROTATION_STEP);
         if (angle == 0) {
             styleMap.remove(XcosConstants.STYLE_ROTATION);
         } else {
             styleMap.put(XcosConstants.STYLE_ROTATION, Integer.toString(angle));
         }
-        if (!flip) {
-            styleMap.remove(XcosConstants.STYLE_FLIP);
-        } else {
-            styleMap.put(XcosConstants.STYLE_FLIP, Boolean.toString(flip));
-        }
-        if (!mirror) {
-            styleMap.remove(XcosConstants.STYLE_MIRROR);
-        } else {
-            styleMap.put(XcosConstants.STYLE_MIRROR, Boolean.toString(mirror));
-        }
     }
 
     /**
@@ -549,4 +533,16 @@ public final class BlockPositioning {
         }
         return ret;
     }
+    
+    private static void cleanup(StyleMap styleMap) {
+        String rotation = styleMap.get(XcosConstants.STYLE_ROTATION);
+        if ("0".equals(rotation))
+            styleMap.remove(XcosConstants.STYLE_ROTATION);
+        String flip = styleMap.get(XcosConstants.STYLE_FLIP);
+        if ("false".equals(flip))
+            styleMap.remove(XcosConstants.STYLE_FLIP);
+        String mirror = styleMap.get(XcosConstants.STYLE_MIRROR);
+        if ("false".equals(mirror))
+            styleMap.remove(XcosConstants.STYLE_MIRROR);
+    }
 }