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