Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / handles / WireHandle.java
index dcb9451..839c2b5 100644 (file)
@@ -9,28 +9,31 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.editor.states.EditorState;
-import net.mograsim.logic.model.model.wires.GUIWire;
-import net.mograsim.logic.model.model.wires.GUIWire.PathChangedListener;
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.model.wires.ModelWire;
 
-public class WireHandle extends Handle implements PathChangedListener
+public class WireHandle extends Handle
 {
        private boolean selected = false;
        private final static double WIDTH = 2.0;
        private final static double WIDTH_SQUARED = WIDTH * WIDTH;
-       public final GUIWire parent;
+       private final LogicModelModifiable model;
+       public final ModelWire parent;
 
-       public WireHandle(GUIWire parent)
+       public WireHandle(LogicModelModifiable model, ModelWire parent)
        {
+               super(5);
+               this.model = model;
                this.parent = parent;
-               parent.addPathChangedListener(this);
+               parent.addPathChangedListener(c -> updateBounds());
                updateBounds();
        }
-       
+
        @Override
        void destroy()
        {
                super.destroy();
-               parent.removePathChangedListener(this);
+               parent.removePathChangedListener(c -> updateBounds());
        }
 
        public void updateBounds()
@@ -39,18 +42,18 @@ public class WireHandle extends Handle implements PathChangedListener
                moveTo(r.x, r.y);
                setSize(r.width, r.height);
        }
-       
+
        @Override
        public void render(GeneralGC gc)
        {
-               if(selected)
+               if (selected)
                {
                        gc.setLineWidth(WIDTH);
                        gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW));
                        gc.drawPolyline(parent.getEffectivePath());
                }
        }
-               
+
        @Override
        public void onSelect()
        {
@@ -64,43 +67,46 @@ public class WireHandle extends Handle implements PathChangedListener
                selected = false;
                callRedrawListeners();
        }
-       
+
        @Override
        public void reqDelete()
        {
-               parent.destroy();
+               // this wire could already be removed implicitly when removing a selection containing both wires and components
+               if (model.getWireByName(parent.name) != null)
+                       model.destroyWire(parent);
        }
-       
+
        @Override
        public boolean contains(double x, double y)
        {
                return click(parent, x, y).isPresent();
        }
-       
+
        @Override
        public boolean click(double x, double y, int stateMask, EditorState state)
        {
                Optional<WireClickData> op = click(parent, x, y);
-               if(op.isEmpty())
+               if (op.isEmpty())
                        return false;
                WireClickData data = op.get();
                return state.clickedHandle(new WireHandleClickInfo(this, data.segment, data.pos, stateMask));
        }
-       
+
        public static class WireHandleClickInfo extends HandleClickInfo
        {
                public final int segment;
                public final Point posOnWire;
+
                WireHandleClickInfo(WireHandle clicked, int segment, Point posOnWire, int stateMask)
                {
                        super(clicked, stateMask);
                        this.segment = segment;
                        this.posOnWire = posOnWire;
                }
-               
+
        }
-       
-       private static Optional<WireClickData> click(GUIWire w, double x, double y)
+
+       private static Optional<WireClickData> click(ModelWire w, double x, double y)
        {
                Rectangle modifiedBounds = w.getBounds();
                modifiedBounds.x -= WIDTH;
@@ -112,8 +118,8 @@ public class WireHandle extends Handle implements PathChangedListener
                        double[] effectivePath = w.getEffectivePath();
                        for (int i = 3; i < effectivePath.length; i += 2)
                        {
-                               double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1],
-                                               b2 = effectivePath[i], r1 = b2 - a2, r2 = a1 - b1;
+                               double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1], b2 = effectivePath[i], r1 = b2 - a2,
+                                               r2 = a1 - b1;
 
                                double f = ((x - a1) * r2 + (a2 - y) * r1) / (-r2 * r2 - r1 * r1);
                                if (f >= 0 && f <= 1)
@@ -146,16 +152,10 @@ public class WireHandle extends Handle implements PathChangedListener
                 */
                public final int segment;
        }
-       
+
        @Override
        public HandleType getType()
        {
                return HandleType.WIRE;
        }
-
-       @Override
-       public void pathChanged(GUIWire wire, int diff)
-       {
-               updateBounds();
-       }
 }