1 package net.mograsim.logic.ui.serializing.snippets.symbolrenderers;
3 import java.util.Map.Entry;
5 import org.eclipse.swt.graphics.Color;
7 import com.google.gson.JsonElement;
8 import com.google.gson.JsonObject;
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;
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>
28 * "centerText": [String]
29 * "centerTextHeight": [double]
30 * "horizontalComponentCenter": [double]
31 * "pinLabelHeight": [double]
32 * "pinLabelMargin": [double]
36 * @author Daniel Kirschten
38 public class SimpleRectangularLikeSymbolRendererProvider implements RendererProvider
41 public Renderer create(DeserializedSubmodelComponent component, JsonElement params)
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) ->
51 double posX = component.getPosX();
52 double posY = component.getPosY();
53 double width = component.getWidth();
54 double height = component.getHeight();
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())
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);
80 CodeSnippetSupplier.symbolRendererProviderSupplier.setSnippetProvider(
81 SimpleRectangularLikeSymbolRendererProvider.class.getCanonicalName(), new SimpleRectangularLikeSymbolRendererProvider());