a47c47fc79c7c28eae899ef89d0faac22bf3c7b4
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / serializing / snippets / symbolrenderers / SimpleRectangularLikeSymbolRendererProvider.java
1 package net.mograsim.logic.ui.serializing.snippets.symbolrenderers;
2
3 import java.util.Map.Entry;
4
5 import org.eclipse.swt.graphics.Color;
6
7 import com.google.gson.JsonElement;
8 import com.google.gson.JsonObject;
9
10 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
11 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
12 import net.mograsim.logic.ui.model.wires.Pin;
13 import net.mograsim.logic.ui.serializing.CodeSnippetSupplier;
14 import net.mograsim.logic.ui.serializing.DeserializedSubmodelComponent;
15 import net.mograsim.logic.ui.serializing.snippets.Renderer;
16 import net.mograsim.logic.ui.serializing.snippets.RendererProvider;
17 import net.mograsim.preferences.Preferences;
18
19 /**
20  * Renders a text (<code>"centerText"</code>) with a given font height (<code>"centerTextHeight"</code>) in the center of the component and
21  * draws a label for each pin with a given font height (<code>"pinLabelHeight"</code>). The labels of pins to the left of a given x
22  * coordinate (<code>"horizontalComponentCenter"</code>) are drawn to the right of the respective pin; labels of pins to the right are drawn
23  * left. A margin (<code>"pinLabelMargin"</code>) is applied for pin label drawing.<br>
24  * Parameter format:
25  * 
26  * <pre>
27  * {
28  *   "centerText": [String]
29  *   "centerTextHeight": [double]
30  *   "horizontalComponentCenter": [double]
31  *   "pinLabelHeight": [double]
32  *   "pinLabelMargin": [double]
33  * }
34  * </pre>
35  * 
36  * @author Daniel Kirschten
37  */
38 public class SimpleRectangularLikeSymbolRendererProvider implements RendererProvider
39 {
40         @Override
41         public Renderer create(DeserializedSubmodelComponent component, JsonElement params)
42         {
43                 JsonObject asJsonObject = params.getAsJsonObject();
44                 String centerText = asJsonObject.getAsJsonPrimitive("centerText").getAsString();
45                 double centerTextHeight = asJsonObject.getAsJsonPrimitive("centerTextHeight").getAsDouble();
46                 double horizontalComponentCenter = asJsonObject.getAsJsonPrimitive("horizontalComponentCenter").getAsDouble();
47                 double pinLabelHeight = asJsonObject.getAsJsonPrimitive("pinLabelHeight").getAsDouble();
48                 double pinLabelMargin = asJsonObject.getAsJsonPrimitive("pinLabelMargin").getAsDouble();
49                 return (gc, visReg) ->
50                 {
51                         double posX = component.getPosX();
52                         double posY = component.getPosY();
53                         double width = component.getWidth();
54                         double height = component.getHeight();
55
56                         Font oldFont = gc.getFont();
57                         gc.setFont(new Font(oldFont.getName(), centerTextHeight, oldFont.getStyle()));
58                         Point textExtent = gc.textExtent(centerText);
59                         Color textColor = Preferences.current().getColor("net.mograsim.logic.ui.color.text");
60                         if (textColor != null)
61                                 gc.setForeground(textColor);
62                         gc.drawText(centerText, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
63                         gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle()));
64                         for (Entry<String, Pin> pinEntry : component.getPins().entrySet())
65                         {
66                                 String pinName = pinEntry.getKey();
67                                 Pin pin = pinEntry.getValue();
68                                 double pinX = pin.getRelX();
69                                 double pinY = posY + pin.getRelY();
70                                 textExtent = gc.textExtent(pinName);
71                                 gc.drawText(pinName, posX + pinX + (pinX > horizontalComponentCenter ? -textExtent.x - pinLabelMargin : pinLabelMargin),
72                                                 pinY - textExtent.y / 2, true);
73                         }
74                         gc.setFont(oldFont);
75                 };
76         }
77
78         static
79         {
80                 CodeSnippetSupplier.setSymbolRendererProvider(SimpleRectangularLikeSymbolRendererProvider.class.getCanonicalName(),
81                                 new SimpleRectangularLikeSymbolRendererProvider());
82         }
83 }