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 0e6c455..839c2b5 100644 (file)
@@ -9,22 +9,26 @@ 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.LogicModelModifiable;
+import net.mograsim.logic.model.model.wires.ModelWire;
 
 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(c -> updateBounds());
                updateBounds();
        }
-       
+
        @Override
        void destroy()
        {
@@ -38,18 +42,18 @@ public class WireHandle extends Handle
                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()
        {
@@ -63,43 +67,46 @@ public class WireHandle extends Handle
                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;
@@ -111,8 +118,8 @@ public class WireHandle extends Handle
                        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)
@@ -145,7 +152,7 @@ public class WireHandle extends Handle
                 */
                public final int segment;
        }
-       
+
        @Override
        public HandleType getType()
        {