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 02b022a..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,7 +83,6 @@ 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++)
@@ -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:"))
                                {
@@ -157,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;
        }
 }