Restructured ComponentAdapter; added ManualSwitchAdapter
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Wed, 29 May 2019 15:31:22 +0000 (17:31 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Wed, 29 May 2019 15:31:43 +0000 (17:31 +0200)
LogicUI/src/era/mi/gui/model/components/GUIManualSwitch.java
LogicUI/src/era/mi/gui/modeladapter/ViewLogicModelAdapter.java
LogicUI/src/era/mi/gui/modeladapter/componentadapters/ComponentAdapter.java
LogicUI/src/era/mi/gui/modeladapter/componentadapters/ManualSwitchAdapter.java [new file with mode: 0644]
LogicUI/src/era/mi/gui/modeladapter/componentadapters/SimpleGateAdapter.java

index 6008329..b215cff 100644 (file)
@@ -16,6 +16,8 @@ public class GUIManualSwitch extends GUIComponent
        private static final double height = 15;
        private static final double fontHeight = 5;
 
+       private final Pin outputPin;
+
        private ManualSwitch logicSwitch;
        private ReadEnd end;
 
@@ -23,7 +25,7 @@ public class GUIManualSwitch extends GUIComponent
        {
                super(model);
                setSize(width, height);
-               addPin(new Pin(this, 1, width, height / 2));
+               addPin(this.outputPin = new Pin(this, 1, width, height / 2));
        }
 
        @Override
@@ -53,4 +55,9 @@ public class GUIManualSwitch extends GUIComponent
                logicSwitch.toggle();
                return true;
        }
+
+       public Pin getOutputPin()
+       {
+               return outputPin;
+       }
 }
\ No newline at end of file
index c64ae97..3cb593f 100644 (file)
@@ -20,6 +20,7 @@ import era.mi.gui.model.wires.GUIWire;
 import era.mi.gui.model.wires.Pin;
 import era.mi.gui.model.wires.WireCrossPoint;
 import era.mi.gui.modeladapter.componentadapters.ComponentAdapter;
+import era.mi.gui.modeladapter.componentadapters.ManualSwitchAdapter;
 import era.mi.gui.modeladapter.componentadapters.SimpleGateAdapter;
 import era.mi.logic.components.Component;
 import era.mi.logic.components.gates.AndGate;
@@ -34,12 +35,14 @@ public class ViewLogicModelAdapter
        private final static Map<Class<? extends GUIComponent>, ComponentAdapter<? extends GUIComponent>> componentAdapters;
        static
        {
-               Map<Class<? extends GUIComponent>, ComponentAdapter<? extends GUIComponent>> componentAdaptersModifiable = new HashMap<>();
-               componentAdaptersModifiable.put(GUIOrGate.class, new SimpleGateAdapter(OrGate::new));
-               componentAdaptersModifiable.put(GUIAndGate.class, new SimpleGateAdapter(AndGate::new));
-               componentAdaptersModifiable.put(GUINotGate.class, new SimpleGateAdapter((t, p, o, i) -> new NotGate(t, p, i[0], o)));
+               Set<ComponentAdapter<? extends GUIComponent>> componentAdaptersModifiable = new HashSet<>();
+               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIOrGate.class, OrGate::new));
+               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIAndGate.class, AndGate::new));
+               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUINotGate.class, (t, p, o, i) -> new NotGate(t, p, i[0], o)));
+               componentAdaptersModifiable.add(new ManualSwitchAdapter());
                // TODO list all "primitive" adapters here
-               componentAdapters = Collections.unmodifiableMap(componentAdaptersModifiable);
+               componentAdapters = Collections.unmodifiableMap(
+                               componentAdaptersModifiable.stream().collect(Collectors.toMap(ComponentAdapter::getSupportedClass, Function.identity())));
        }
 
        public static Timeline convert(ViewModel viewModel, LogicModelParameters params)
index 8598fa8..c109d73 100644 (file)
@@ -11,6 +11,8 @@ import era.mi.logic.wires.Wire;
 
 public interface ComponentAdapter<G extends GUIComponent>
 {
+       public Class<G> getSupportedClass();
+
        public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent,
                        Map<Pin, Wire> logicWiresPerPin);
 }
\ No newline at end of file
diff --git a/LogicUI/src/era/mi/gui/modeladapter/componentadapters/ManualSwitchAdapter.java b/LogicUI/src/era/mi/gui/modeladapter/componentadapters/ManualSwitchAdapter.java
new file mode 100644 (file)
index 0000000..3a6ea05
--- /dev/null
@@ -0,0 +1,31 @@
+package era.mi.gui.modeladapter.componentadapters;
+
+import java.util.Map;
+
+import era.mi.gui.model.components.GUIManualSwitch;
+import era.mi.gui.model.wires.Pin;
+import era.mi.gui.modeladapter.LogicModelParameters;
+import era.mi.logic.components.Component;
+import era.mi.logic.components.ManualSwitch;
+import era.mi.logic.timeline.Timeline;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+
+public class ManualSwitchAdapter implements ComponentAdapter<GUIManualSwitch>
+{
+       @Override
+       public Class<GUIManualSwitch> getSupportedClass()
+       {
+               return GUIManualSwitch.class;
+       }
+
+       @Override
+       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIManualSwitch guiComponent,
+                       Map<Pin, Wire> logicWiresPerPin)
+       {
+               ReadWriteEnd end = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
+               ManualSwitch manualSwitch = new ManualSwitch(timeline, end);
+               guiComponent.setLogicModelBinding(manualSwitch, end);
+               return manualSwitch;
+       }
+}
\ No newline at end of file
index e256ff0..b244973 100644 (file)
@@ -12,18 +12,25 @@ import era.mi.logic.wires.Wire;
 import era.mi.logic.wires.Wire.ReadEnd;
 import era.mi.logic.wires.Wire.ReadWriteEnd;
 
-public class SimpleGateAdapter implements ComponentAdapter<SimpleRectangularGUIGate>
+public class SimpleGateAdapter<G extends SimpleRectangularGUIGate> implements ComponentAdapter<G>
 {
+       private final Class<G> supportedClass;
        private final ComponentConstructor constructor;
 
-       public SimpleGateAdapter(ComponentConstructor constructor)
+       public SimpleGateAdapter(Class<G> supportedClass, ComponentConstructor constructor)
        {
+               this.supportedClass = supportedClass;
                this.constructor = constructor;
        }
 
        @Override
-       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularGUIGate guiComponent,
-                       Map<Pin, Wire> logicWiresPerPin)
+       public Class<G> getSupportedClass()
+       {
+               return supportedClass;
+       }
+
+       @Override
+       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent, Map<Pin, Wire> logicWiresPerPin)
        {
                ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
                List<Pin> inputPins = guiComponent.getInputPins();
@@ -37,4 +44,5 @@ public class SimpleGateAdapter implements ComponentAdapter<SimpleRectangularGUIG
        {
                public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins);
        }
+
 }
\ No newline at end of file