private static final double height = 15;
private static final double fontHeight = 5;
+ private final Pin outputPin;
+
private ManualSwitch logicSwitch;
private ReadEnd end;
{
super(model);
setSize(width, height);
- addPin(new Pin(this, 1, width, height / 2));
+ addPin(this.outputPin = new Pin(this, 1, width, height / 2));
}
@Override
logicSwitch.toggle();
return true;
}
+
+ public Pin getOutputPin()
+ {
+ return outputPin;
+ }
}
\ No newline at end of file
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;
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)
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
--- /dev/null
+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
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();
{
public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins);
}
+
}
\ No newline at end of file