Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / handles / ComponentHandle.java
1 package net.mograsim.logic.model.editor.handles;
2
3 import java.util.Optional;
4
5 import org.eclipse.swt.SWT;
6 import org.eclipse.swt.widgets.Display;
7
8 import net.haspamelodica.swt.helper.gcs.GeneralGC;
9 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
10 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
11 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
12 import net.mograsim.logic.model.editor.Editor.ComponentInfo;
13 import net.mograsim.logic.model.model.LogicModelModifiable;
14 import net.mograsim.logic.model.model.components.ModelComponent;
15 import net.mograsim.logic.model.serializing.IdentifyParams;
16
17 public class ComponentHandle extends Handle
18 {
19         private final LogicModelModifiable model;
20         public final ModelComponent parent;
21         private final static double POS_OFFSET = 2.0d;
22         private final static double LENGTH_OFFSET = POS_OFFSET * 2;
23         boolean selected = false;
24
25         public ComponentHandle(LogicModelModifiable model, ModelComponent parent)
26         {
27                 super(4);
28                 this.model = model;
29                 this.parent = parent;
30                 Rectangle bounds = parent.getBounds();
31                 setSize(bounds.width, bounds.height);
32                 parent.addComponentResizedListener((c) ->
33                 {
34                         Rectangle pBounds = c.getBounds();
35                         setSize(pBounds.width, pBounds.height);
36                 });
37                 moveTo(parent.getPosX(), parent.getPosY());
38         }
39
40         @Override
41         protected void moveTo(double x, double y)
42         {
43                 super.moveTo(x, y);
44                 parent.moveTo(x, y);
45         }
46
47         @Override
48         protected void render(GeneralGC gc)
49         {
50                 if (selected)
51                 {
52                         gc.setLineWidth(2);
53                         gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
54                         Rectangle bounds = getBounds();
55                         bounds.x -= POS_OFFSET;
56                         bounds.y -= POS_OFFSET;
57                         bounds.width += LENGTH_OFFSET;
58                         bounds.height += LENGTH_OFFSET;
59                         gc.drawRectangle(bounds);
60                         Font oldFont = gc.getFont();
61                         gc.setFont(new Font(oldFont.getName(), 5, oldFont.getStyle()));
62                         gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
63                         gc.drawText(parent.getName(), bounds.x, bounds.y, true);
64                         gc.setFont(oldFont);
65                 }
66         }
67
68         @Override
69         public void reqMove(double x, double y)
70         {
71                 moveTo(x, y);
72         }
73
74         @Override
75         public void onSelect()
76         {
77                 selected = true;
78                 callRedrawListeners();
79         }
80
81         @Override
82         public void onDeselect()
83         {
84                 selected = false;
85                 callRedrawListeners();
86         }
87
88         @Override
89         public void reqDelete()
90         {
91                 model.destroyComponent(parent);
92         }
93
94         @Override
95         public Optional<ComponentInfo> reqCopy(Point refPoint)
96         {
97                 IdentifyParams idParams = new IdentifyParams();
98                 return Optional.of(new ComponentInfo(parent.getPosX() - refPoint.x, parent.getPosY() - refPoint.y,
99                                 parent.getIDForSerializing(idParams), parent.getParamsForSerializingJSON(idParams)));
100         }
101
102         @Override
103         public HandleType getType()
104         {
105                 return HandleType.COMPONENT;
106         }
107 }