Fixed issues with WirePointHandle
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / handles / HandleManager.java
index f999c96..ee755f9 100644 (file)
@@ -8,6 +8,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -89,8 +90,8 @@ public class HandleManager
                        comps.remove(interfaceComp);
                        registerInterfaceComponent(interfaceComp);
                        comps.forEach(c -> registerComponent(c));
                        comps.remove(interfaceComp);
                        registerInterfaceComponent(interfaceComp);
                        comps.forEach(c -> registerComponent(c));
-                       
-                       model.getWires().forEach(w -> registerWire(w));
+
+                       model.getWiresByName().values().forEach(w -> registerWire(w));
                        addHandle(cornerHandle = new CornerHandle(editor.toBeEdited));
                }
        }
                        addHandle(cornerHandle = new CornerHandle(editor.toBeEdited));
                }
        }
@@ -114,26 +115,24 @@ public class HandleManager
 
        private void registerWire(GUIWire wire)
        {
 
        private void registerWire(GUIWire wire)
        {
-               wire.addPathChangedListener((w, diff) ->
+               Point[] path = wire.getPath();
+               AtomicInteger oldLength = new AtomicInteger(path == null ? 0 : path.length);
+               wire.addPathChangedListener(w ->
                {
                {
-                       if(diff != 0)
+                       Point[] newPath = w.getPath();
+                       int newLength = newPath == null ? 0 : newPath.length;
+                       int diff = newLength - oldLength.getAndSet(newLength);
+                       if (diff != 0)
                        {
                        {
-                               if(diff > 0)
+                               if (diff > 0)
                                {
                                {
-                                       for(int i = 0; i < diff; i++)
+                                       for (int i = 0; i < diff; i++)
                                                addWirePointHandle(w);
                                }
                                                addWirePointHandle(w);
                                }
-                               else
-                               {
-                                       for(int i = 0; i > diff; i--)
-                                       {
-                                               removeLastWirePointHandle(wire);
-                                       }
-                               }
-                               
+
                                List<WirePointHandle> wpHandles = pointHandlesPerWire.get(w);
                                int size = wpHandles.size();
                                List<WirePointHandle> wpHandles = pointHandlesPerWire.get(w);
                                int size = wpHandles.size();
-                               for(int i = 0; i < size; i++)
+                               for (int i = 0; i < size; i++)
                                {
                                        wpHandles.get(i).setIndex(i);
                                }
                                {
                                        wpHandles.get(i).setIndex(i);
                                }
@@ -141,9 +140,9 @@ public class HandleManager
                        pointHandlesPerWire.get(w).forEach(h -> h.updatePos());
                });
                addWireHandle(wire);
                        pointHandlesPerWire.get(w).forEach(h -> h.updatePos());
                });
                addWireHandle(wire);
-               if (wire.getPath() == null)
+               if (path == null)
                        return;
                        return;
-               for (int i = 0; i < wire.getPath().length; i++)
+               for (int i = 0; i < path.length; i++)
                {
                        addWirePointHandle(wire);
                }
                {
                        addWirePointHandle(wire);
                }
@@ -183,8 +182,8 @@ public class HandleManager
 
        private void addInterfacePinHandle(Pin p)
        {
 
        private void addInterfacePinHandle(Pin p)
        {
-               //The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called
-               //editor.toBeEdited.getSubmodelMovablePins().get(p.name);
+               // The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called
+               // editor.toBeEdited.getSubmodelMovablePins().get(p.name);
                MovablePin pM = (MovablePin) p;
                InterfacePinHandle h = new InterfacePinHandle(pM, editor.toBeEdited);
                handlePerInterfacePin.put(pM, h);
                MovablePin pM = (MovablePin) p;
                InterfacePinHandle h = new InterfacePinHandle(pM, editor.toBeEdited);
                handlePerInterfacePin.put(pM, h);
@@ -203,11 +202,11 @@ public class HandleManager
                List<WirePointHandle> wireHandles = pointHandlesPerWire.get(w);
                WirePointHandle h;
                if (wireHandles != null)
                List<WirePointHandle> wireHandles = pointHandlesPerWire.get(w);
                WirePointHandle h;
                if (wireHandles != null)
-                       wireHandles.add(h = new WirePointHandle(w, wireHandles.size()));
+                       wireHandles.add(h = new WirePointHandle(this, w, wireHandles.size()));
                else
                {
                        wireHandles = new ArrayList<>();
                else
                {
                        wireHandles = new ArrayList<>();
-                       h = new WirePointHandle(w, 0);
+                       h = new WirePointHandle(this, w, 0);
                        wireHandles.add(h);
                        pointHandlesPerWire.put(h.parent, wireHandles);
                }
                        wireHandles.add(h);
                        pointHandlesPerWire.put(h.parent, wireHandles);
                }
@@ -215,16 +214,21 @@ public class HandleManager
                addHandle(h);
        }
 
                addHandle(h);
        }
 
-       private void removeLastWirePointHandle(GUIWire owner)
+       void destroyWirePointHandle(GUIWire owner, WirePointHandle h)
        {
        {
-               Handle h = pointHandlesPerWire.get(owner).remove(0);
-               wirePointHandles.remove(h);
-               removeHandle(h);
+               if (pointHandlesPerWire.containsKey(owner))
+               {
+                       List<WirePointHandle> handles = pointHandlesPerWire.get(owner);
+                       int pointIndex = handles.indexOf(h);
+                       handles.remove(pointIndex);
+                       removeHandle(h);
+                       owner.removePathPoint(pointIndex);
+               }
        }
 
        private void removeWirePointHandles(GUIWire owner)
        {
        }
 
        private void removeWirePointHandles(GUIWire owner)
        {
-               if(!pointHandlesPerWire.containsKey(owner))
+               if (!pointHandlesPerWire.containsKey(owner))
                        return;
                pointHandlesPerWire.get(owner).forEach(h ->
                {
                        return;
                pointHandlesPerWire.get(owner).forEach(h ->
                {
@@ -275,7 +279,7 @@ public class HandleManager
        {
                return handlePerWire.get(parent);
        }
        {
                return handlePerWire.get(parent);
        }
-       
+
        public Handle getInterfacePinHandle(Pin p)
        {
                return handlePerInterfacePin.get(p);
        public Handle getInterfacePinHandle(Pin p)
        {
                return handlePerInterfacePin.get(p);
@@ -304,7 +308,7 @@ public class HandleManager
        {
                return Collections.unmodifiableCollection(handlePerPin.values());
        }
        {
                return Collections.unmodifiableCollection(handlePerPin.values());
        }
-       
+
        /**
         * @return An unmodifiable view of all registered {@link InterfacePinHandle}s
         */
        /**
         * @return An unmodifiable view of all registered {@link InterfacePinHandle}s
         */
@@ -345,13 +349,13 @@ public class HandleManager
                        if (!click(handlePerPin.values(), clicked, entryState, stateMask))
                                if (!click(handlePerInterfacePin.values(), clicked, entryState, stateMask))
                                        if (!click(getWirePointHandles(), clicked, entryState, stateMask))
                        if (!click(handlePerPin.values(), clicked, entryState, stateMask))
                                if (!click(handlePerInterfacePin.values(), clicked, entryState, stateMask))
                                        if (!click(getWirePointHandles(), clicked, entryState, stateMask))
-                                               if (!click(handlePerComp.values(), clicked, entryState, stateMask))
-                                                       if (!click(getWireHandles(), clicked, entryState, stateMask))
+                                               if (!click(getWireHandles(), clicked, entryState, stateMask))
+                                                       if (!click(handlePerComp.values(), clicked, entryState, stateMask))
                                                                entryState.clickedEmpty(clicked, stateMask);
                entryState.clicked(clicked, stateMask);
        }
 
                                                                entryState.clickedEmpty(clicked, stateMask);
                entryState.clicked(clicked, stateMask);
        }
 
-       private boolean click(Collection<? extends Handle> handles, Point clicked, EditorState state, int stateMask)
+       private static boolean click(Collection<? extends Handle> handles, Point clicked, EditorState state, int stateMask)
        {
                for (Handle h : handles)
                        if (h.click(clicked.x, clicked.y, stateMask, state))
        {
                for (Handle h : handles)
                        if (h.click(clicked.x, clicked.y, stateMask, state))