1 package net.mograsim.logic.ui.serializing;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.HashMap;
8 import com.google.gson.JsonElement;
10 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
11 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
12 import net.mograsim.logic.ui.serializing.snippets.Renderer;
13 import net.mograsim.logic.ui.serializing.snippets.RendererProvider;
14 import net.mograsim.logic.ui.util.JsonHandler;
15 import net.mograsim.preferences.ColorDefinition;
16 import net.mograsim.preferences.ColorManager;
17 import net.mograsim.preferences.Preferences;
19 public class CodeSnippetSupplier
21 private static final Map<String, String> standardSnippetIDClassNames = new HashMap<>();
23 private static final Map<String, RendererProvider> outlineRendererProvidersForComponentClassNames = new HashMap<>();
24 private static final Map<String, RendererProvider> symbolRendererProvidersForComponentClassNames = new HashMap<>();
26 private static final RendererProvider defaultOutlineRendererProvider;
27 private static final RendererProvider defaultSymbolRendererProvider;
30 // TODO this code does not belong here
31 defaultOutlineRendererProvider = (comp, params) -> (gc, visReg) ->
33 ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.ui.color.foreground");
35 gc.setForeground(ColorManager.current().toColor(fg));
36 gc.drawRectangle(comp.getBounds());
38 defaultSymbolRendererProvider = (comp, params) -> (gc, visReg) ->
40 ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.ui.color.text");
42 gc.setForeground(ColorManager.current().toColor(fg));
43 String id = "TODO";// TODO add an ID of sorts to DeserializedSubmodelComponent
44 Point idSize = gc.textExtent(id);
45 Rectangle bounds = comp.getBounds();
46 gc.drawText(id, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true);
52 try (InputStream s = IndirectGUIComponentCreator.class.getResourceAsStream("./mapping.json"))
55 throw new IOException("Resource not found");
56 Map<String, String> tmp = JsonHandler.readJson(s, Map.class);
57 standardSnippetIDClassNames.putAll(tmp);
61 System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage());
65 public static void addStandardSnippetID(String standardSnippetID, String associatedSnippetClassName)
67 standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetClassName);
70 public static void setOutlineRendererProvider(String id, RendererProvider outlineRendererProvider)
72 outlineRendererProvidersForComponentClassNames.put(id, outlineRendererProvider);
75 public static void setSymbolRendererProvider(String id, RendererProvider symbolRendererProvider)
77 symbolRendererProvidersForComponentClassNames.put(id, symbolRendererProvider);
80 public static Renderer createOutlineRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
82 return getSnippet(id, outlineRendererProvidersForComponentClassNames, defaultOutlineRendererProvider).create(component, params);
85 public static Renderer createSymbolRenderer(String id, DeserializedSubmodelComponent component, JsonElement params)
87 return getSnippet(id, symbolRendererProvidersForComponentClassNames, defaultSymbolRendererProvider).create(component, params);
91 private static <C> C getSnippet(String id, Map<String, C> specializedCodeMap, C defaultSnippet)
95 String snippetClassName;
96 if (id.startsWith("class:"))
97 snippetClassName = id.substring(6);
99 snippetClassName = standardSnippetIDClassNames.get(id);
100 if (snippetClassName != null)
102 tryLoadSnippetClass(snippetClassName);
103 C specializedCode = specializedCodeMap.get(snippetClassName);
104 if (specializedCode != null)
105 return specializedCode;
108 return defaultSnippet;
111 private static void tryLoadSnippetClass(String snippetClassName)
113 tryLoadClass(snippetClassName, "Error getting snippet code for component class: %s\n");
116 public static void tryLoadClass(String className, String errorMessageFormat)
120 CodeSnippetSupplier.class.getClassLoader().loadClass(className);
122 catch (@SuppressWarnings("unused") ClassNotFoundException e)
124 System.err.printf(errorMessageFormat, className);