Completely changed the structure and switched to Eclipse Plugin.
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / components / GUICustomComponentCreator.java
index 9d04092..0e23feb 100644 (file)
@@ -6,11 +6,13 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 
 import net.mograsim.logic.ui.model.ViewModelModifiable;
-import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams.InnerComponentParams;
 import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams;
+import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams.InnerComponentParams;
 import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InnerWireParams;
 import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InterfacePinParams;
 import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.MovablePin;
+import net.mograsim.logic.ui.model.wires.WireCrossPoint;
 
 /**
  * Creates {@link SubmodelComponent}s from {@link SubmodelComponentParams}
@@ -81,17 +83,16 @@ public final class GUICustomComponentCreator
                        rect.setSubmodelScale(params.composition.innerScale);
                        // rect.setSize(params.width, params.height);
 
-                       // TODO save & restore names
                        int inputCount = ((Number) m.get(SimpleRectangularSubmodelComponent.kInCount)).intValue();
                        String[] inputNames = new String[inputCount];
                        for (int i = 0; i < inputCount; i++)
-                               inputNames[i] = "Input pin #" + i;
+                               inputNames[i] = params.interfacePins[i].name;
                        rect.setInputPins(inputNames);
 
                        int outputCount = ((Number) m.get(SimpleRectangularSubmodelComponent.kOutCount)).intValue();
                        String[] outputPins = new String[outputCount];
                        for (int i = 0; i < outputCount; i++)
-                               outputPins[i] = "Output pin #" + i;
+                               outputPins[i] = params.interfacePins[inputCount + i].name;
                        rect.setOutputPins(outputPins);
 
                        return rect;
@@ -112,7 +113,8 @@ public final class GUICustomComponentCreator
                comp.setSize(params.width, params.height);
                for (InterfacePinParams iPinParams : params.interfacePins)
                {
-                       comp.addSubmodelInterface(iPinParams.name, iPinParams.logicWidth, iPinParams.location.x, iPinParams.location.y);
+                       comp.addSubmodelInterface(
+                                       new MovablePin(comp, iPinParams.name, iPinParams.logicWidth, iPinParams.location.x, iPinParams.location.y));
                }
                return comp;
        }
@@ -130,7 +132,7 @@ public final class GUICustomComponentCreator
                                if (path.startsWith("class:"))
                                {
                                        path = path.substring(6);
-                                       components[i] = createInnerComponentFromClass(comp, path, cParams.logicWidth);
+                                       components[i] = createInnerComponentFromClass(comp, path, cParams.params);
                                        components[i].moveTo(cParams.pos.x, cParams.pos.y);
                                } else if (path.startsWith("file:"))
                                {
@@ -145,9 +147,8 @@ public final class GUICustomComponentCreator
                        {
                                InnerWireParams innerWire = params.innerWires[i];
                                new GUIWire(comp.submodelModifiable,
-                                               comp.submodelModifiable.getComponents().get(innerWire.pin1.compId).getPins().get(innerWire.pin1.pinIndex),
-                                               comp.submodelModifiable.getComponents().get(innerWire.pin2.compId).getPins().get(innerWire.pin2.pinIndex),
-                                               innerWire.path);
+                                               comp.submodelModifiable.getComponents().get(innerWire.pin1.compId).getPin(innerWire.pin1.pinName),
+                                               comp.submodelModifiable.getComponents().get(innerWire.pin2.compId).getPin(innerWire.pin2.pinName), innerWire.path);
                        }
                }
                catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException
@@ -158,25 +159,22 @@ public final class GUICustomComponentCreator
                }
        }
 
-       private static GUIComponent createInnerComponentFromClass(SubmodelComponent parent, String classname, int logicWidth)
-                       throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
-                       NoSuchMethodException, SecurityException, ClassNotFoundException
+       private static GUIComponent createInnerComponentFromClass(SubmodelComponent parent, String classname, Map<String, Object> params)
+                       throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, SecurityException,
+                       ClassNotFoundException
        {
                Class<?> c = Class.forName(classname);
                Object comp;
-               try
+               if (SimpleRectangularGUIGate.class.isAssignableFrom(c) || WireCrossPoint.class.equals(c))
+               {
+                       Constructor<?> constructor = c.getConstructor(ViewModelModifiable.class, int.class);
+                       comp = constructor.newInstance(parent.submodelModifiable,
+                                       ((Number) params.get(SimpleRectangularGUIGate.kLogicWidth)).intValue());
+               } else
                {
                        Constructor<?> constructor = c.getConstructor(ViewModelModifiable.class);
                        comp = constructor.newInstance(parent.submodelModifiable);
                }
-               catch (@SuppressWarnings("unused") NoSuchMethodException e)
-               {
-                       Constructor<?> constructor = c.getConstructor(ViewModelModifiable.class, int.class);
-                       comp = constructor.newInstance(parent.submodelModifiable, logicWidth);
-               }
-
-               if (comp instanceof GUIComponent)
-                       return (GUIComponent) comp;
-               throw new IllegalArgumentException("Class given as subcomponent was not a GUIComponent!");
+               return (GUIComponent) comp;
        }
 }