1ced6d4a86410a76db0cfcba5880aee83f2e5eb8
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / model / components / atomic / SimpleRectangularHardcodedGUIComponent.java
1 package net.mograsim.logic.model.model.components.atomic;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import net.haspamelodica.swt.helper.gcs.GeneralGC;
7 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
8 import net.mograsim.logic.core.wires.Wire.ReadEnd;
9 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
10 import net.mograsim.logic.model.model.ViewModelModifiable;
11 import net.mograsim.logic.model.model.components.GUIComponent;
12 import net.mograsim.logic.model.model.wires.Pin;
13 import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter;
14 import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedGUIComponentAdapter;
15 import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
16 import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer;
17 import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams;
18 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer;
19 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams;
20 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position;
21
22 public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponent
23 {
24         private static final double centerTextHeight = 5;
25         private static final double pinNamesHeight = 3.5;
26         private static final double pinNamesMargin = .5;
27
28         // TODO maybe make this more general?
29         private final Map<Pin, Usage> pinUsages;
30
31         private final DefaultOutlineRenderer outlineRenderer;
32         private final CenteredTextSymbolRenderer centerTextRenderer;
33         private final PinNamesSymbolRenderer pinNamesRenderer;
34
35         // creation and destruction
36
37         public SimpleRectangularHardcodedGUIComponent(ViewModelModifiable model, String name, String centerText)
38         {
39                 super(model, name);
40                 pinUsages = new HashMap<>();
41                 this.outlineRenderer = new DefaultOutlineRenderer(this);
42                 CenteredTextParams centeredTextParams = new CenteredTextParams();
43                 centeredTextParams.text = centerText;
44                 centeredTextParams.fontHeight = centerTextHeight;
45                 this.centerTextRenderer = new CenteredTextSymbolRenderer(this, centeredTextParams);
46                 PinNamesParams pinNamesParams = new PinNamesParams();
47                 pinNamesParams.pinLabelHeight = pinNamesHeight;
48                 pinNamesParams.pinLabelMargin = pinNamesMargin;
49                 this.pinNamesRenderer = new PinNamesSymbolRenderer(this, pinNamesParams);
50                 addPinRemovedListener(this::pinRemoved);
51         }
52
53         // pins
54
55         protected void addPin(Pin pin, Usage usage, Position namePosition)
56         {
57                 super.addPin(pin); // do this first to catch errors
58                 pinUsages.put(pin, usage);
59                 pinNamesRenderer.setPinPosition(pin, namePosition);
60         }
61
62         private void pinRemoved(Pin pin)
63         {
64                 pinUsages.remove(pin);
65                 pinNamesRenderer.setPinPosition(pin, null);
66         }
67
68         public Usage getPinUsage(Pin pin)
69         {
70                 return pinUsages.get(pin);
71         }
72
73         // logic
74
75         protected abstract Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds);
76
77         // "graphical" operations
78
79         @Override
80         public void render(GeneralGC gc, Rectangle visibleRegion)
81         {
82                 outlineRenderer.render(gc, visibleRegion);
83                 centerTextRenderer.render(gc, visibleRegion);
84                 pinNamesRenderer.render(gc, visibleRegion);
85         }
86
87         // operations no longer supported
88
89         @Override
90         protected void addPin(Pin pin)
91         {
92                 throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin, Usage [, Position]) instead");
93         }
94
95         public static enum Usage
96         {
97                 INPUT, OUTPUT, TRISTATE;
98         }
99
100         static
101         {
102                 ViewLogicModelAdapter.addComponentAdapter(new SimpleRectangularHardcodedGUIComponentAdapter(c -> c::recalculate));
103         }
104 }