Restructured the Preferences system
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Fri, 27 Mar 2020 19:06:54 +0000 (20:06 +0100)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Fri, 27 Mar 2020 19:21:14 +0000 (20:21 +0100)
52 files changed:
plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java [deleted file]
plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java
plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java
plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java
plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java
plugins/net.mograsim.logic.model/META-INF/MANIFEST.MF
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/BitVectorFormatter.java [new file with mode: 0644]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/preferences/DefaultRenderPreferences.java [new file with mode: 0755]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/preferences/RenderPreferences.java [new file with mode: 0755]
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java
plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java
plugins/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java
plugins/net.mograsim.plugin.core/META-INF/MANIFEST.MF
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/EclipsePreferences.java [deleted file]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/launch/MachineRegister.java
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/launch/MainMemoryBlockExtension.java
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/DefaultPluginPreferences.java [new file with mode: 0755]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePluginPreferences.java [new file with mode: 0755]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePreferences.java [new file with mode: 0755]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipseRenderPreferences.java [new file with mode: 0755]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/PluginPreferences.java [new file with mode: 0755]
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTable.java
plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/SimulationView.java
plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java
plugins/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java
tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/TestGCD.java
tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java
tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java

diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java
deleted file mode 100644 (file)
index a369b05..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-package net.mograsim.logic.core.types;
-
-import java.math.BigInteger;
-
-import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
-import net.mograsim.preferences.ColorDefinition;
-import net.mograsim.preferences.ColorDefinition.BuiltInColor;
-import net.mograsim.preferences.Preferences;
-
-public class BitVectorFormatter
-{
-       public static String formatValueAsString(ReadEnd end, boolean useDashInsteadOfZ)
-       {
-               return formatAsString(end == null ? null : end.getValues(), useDashInsteadOfZ);
-       }
-
-       public static String toBitstring(BitVector bitVector)
-       {
-               return bitVector.toBitstring();
-       }
-
-       public static String formatAsString(BitVector bitVector, boolean useDashInsteadOfZ)
-       {
-               if (bitVector == null)
-                       return "null";
-               if (useDashInsteadOfZ && bitVector.isHighImpedance())
-                       return "-";
-               if (bitVector.length() == 1)
-                       return bitVector.toBitstring();
-               if (bitVector.isBinary())
-               {
-                       String hexdigits = bitVector.getUnsignedValue().toString(16);
-                       StringBuilder sb = new StringBuilder();
-                       sb.append("0x");
-                       sb.append("0".repeat((bitVector.length() + 3) / 4 - hexdigits.length()));
-                       sb.append(hexdigits);
-                       return sb.toString();
-               }
-               return bitVector.toBitstring();
-       }
-
-       // TODO this method overlaps in functionality with AsmNumberUtil (in plugin.core)
-       public static BitVector parseUserBitVector(String userInput, int width)
-       {
-               BitVector bitvector = null;
-               if (width > 0 && userInput.matches("0x[0-9a-fA-F]+"))
-                       // TODO should we check for overflows?
-                       bitvector = BitVector.from(new BigInteger(userInput.substring(2), 16), width);
-               else if (width <= 0 || userInput.length() == width)
-                       // TODO do this without exceptions
-                       try
-                       {
-                               bitvector = BitVector.parseBitstring(userInput);
-                       }
-                       catch (@SuppressWarnings("unused") NullPointerException x)
-                       {
-                               // ignore
-                       }
-               if (bitvector == null && width > 0)
-                       try
-                       {
-                               // TODO should we check for overflows?
-                               bitvector = BitVector.from(new BigInteger(userInput), width);
-                       }
-                       catch (@SuppressWarnings("unused") NumberFormatException x)
-                       {
-                               // ignore
-                       }
-               return bitvector;
-       }
-
-       // TODO doesn't this belong to logic.model?
-       public static ColorDefinition formatAsColor(ReadEnd end)
-       {
-               return formatAsColor(end == null ? null : end.getValues());
-       }
-
-       public static ColorDefinition formatAsColor(BitVector bitVector)
-       {
-               // TODO maybe find a color assignment for multiple-bit bit vectors?
-               if (bitVector == null || bitVector.length() != 1)
-                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);
-               switch (bitVector.getLSBit(0))
-               {
-               case ONE:
-                       return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.one");
-               case U:
-                       return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.u");
-               case X:
-                       return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.x");
-               case Z:
-                       return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.z");
-               case ZERO:
-                       return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.zero");
-               default:
-                       throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getLSBit(0));
-               }
-       }
-
-       private BitVectorFormatter()
-       {
-               throw new UnsupportedOperationException("No BitVectorFormatter instances");
-       }
-}
\ No newline at end of file
index 8c60257..b58c947 100644 (file)
@@ -22,6 +22,8 @@ import net.mograsim.logic.model.editor.ui.EditorGUI;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.ModelWire;
+import net.mograsim.logic.model.preferences.DefaultRenderPreferences;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler;
@@ -35,6 +37,7 @@ public final class Editor
        public final DeserializedSubmodelComponent toBeEdited;
        public final HandleManager handleManager;
        public final EditorGUI gui;
+       public final RenderPreferences renderPrefs;
        public final StateManager stateManager;
        private final SaveLoadManager saveManager;
        private Snapping snapping = Snapping.ABSOLUTE;
@@ -46,6 +49,7 @@ public final class Editor
        {
                this.toBeEdited = toBeEdited;
                handleManager = new HandleManager(this);
+               renderPrefs = new DefaultRenderPreferences();
                gui = new EditorGUI(this);
                userInput = new EditorUserInput(this);
                stateManager = new StateManager(this);
index 154a81f..4de8683 100644 (file)
@@ -1,10 +1,11 @@
 package net.mograsim.logic.model.editor;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.ACTION_BUTTON;
+
 import org.eclipse.swt.SWT;
 
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.mograsim.logic.model.editor.ui.EditorGUI;
-import net.mograsim.preferences.Preferences;
 
 public class EditorUserInput
 {
@@ -16,7 +17,7 @@ public class EditorUserInput
                gui.logicCanvas.addListener(SWT.MouseDown, e ->
                {
                        Point clicked = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y);
-                       if (e.button == Preferences.current().getInt("net.mograsim.logic.model.button.action"))
+                       if (e.button == editor.renderPrefs.getInt(ACTION_BUTTON))
                                editor.handleManager.click(clicked, e.stateMask);
                });
 
index 3030103..5db38c0 100644 (file)
@@ -17,7 +17,7 @@ public class EditorCanvas extends LogicUICanvas
 
        public EditorCanvas(Composite parent, int style, Editor editor)
        {
-               super(parent, style, editor.toBeEdited.submodel);
+               super(parent, style, editor.toBeEdited.submodel, editor.renderPrefs);
 
                handles = editor.handleManager.getHandles();
                editor.handleManager.addHandleAddedListener(h ->
@@ -37,7 +37,8 @@ public class EditorCanvas extends LogicUICanvas
                        Rectangle visibleRegion = new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom);
 
                        TranslatedGC tgc = new TranslatedGC(gc, 0.0d, 0.0d, 1 / editor.toBeEdited.getSubmodelScale(), false);
-                       editor.toBeEdited.getOutlineRenderer().render(tgc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom));
+                       editor.toBeEdited.getOutlineRenderer().render(tgc, renderPrefs,
+                                       new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom));
 
                        handles.forEach(h -> h.render(gc, visibleRegion));
                });
index 3dfd62e..6e61b1b 100644 (file)
@@ -1,5 +1,8 @@
 package net.mograsim.logic.model.editor.ui;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.DRAG_BUTTON;
+import static net.mograsim.logic.model.preferences.RenderPreferences.ZOOM_BUTTON;
+
 import java.io.IOException;
 
 import org.eclipse.swt.SWT;
@@ -21,7 +24,6 @@ import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInpu
 import net.mograsim.logic.model.editor.Editor;
 import net.mograsim.logic.model.editor.SaveLoadManager;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
-import net.mograsim.preferences.Preferences;
 
 public class EditorGUI
 {
@@ -74,8 +76,8 @@ public class EditorGUI
                setupBottomToolBar(innerComp);
 
                ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas);
-               userInput.buttonDrag = Preferences.current().getInt("net.mograsim.logic.model.button.drag");
-               userInput.buttonZoom = Preferences.current().getInt("net.mograsim.logic.model.button.zoom");
+               userInput.buttonDrag = editor.renderPrefs.getInt(DRAG_BUTTON);
+               userInput.buttonZoom = editor.renderPrefs.getInt(ZOOM_BUTTON);
                userInput.enableUserInput();
                new ZoomableCanvasOverlay(logicCanvas, null).enableScale();
        }
index e6b077a..6a57b8f 100644 (file)
@@ -12,6 +12,7 @@ Export-Package: net.mograsim.logic.model,
  net.mograsim.logic.model.model.wires,
  net.mograsim.logic.model.modeladapter,
  net.mograsim.logic.model.modeladapter.componentadapters,
+ net.mograsim.logic.model.preferences,
  net.mograsim.logic.model.serializing,
  net.mograsim.logic.model.snippets,
  net.mograsim.logic.model.snippets.highlevelstatehandlers,
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/BitVectorFormatter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/BitVectorFormatter.java
new file mode 100644 (file)
index 0000000..4836ed1
--- /dev/null
@@ -0,0 +1,111 @@
+package net.mograsim.logic.model;
+
+import static net.mograsim.logic.model.preferences.RenderPreferences.BIT_ONE_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.BIT_U_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.BIT_X_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.BIT_ZERO_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.BIT_Z_COLOR;
+
+import java.math.BigInteger;
+
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.model.preferences.RenderPreferences;
+import net.mograsim.preferences.ColorDefinition;
+import net.mograsim.preferences.ColorDefinition.BuiltInColor;
+
+public class BitVectorFormatter
+{
+       public static String formatValueAsString(ReadEnd end, boolean useDashInsteadOfZ)
+       {
+               return formatAsString(end == null ? null : end.getValues(), useDashInsteadOfZ);
+       }
+
+       public static String toBitstring(BitVector bitVector)
+       {
+               return bitVector.toBitstring();
+       }
+
+       public static String formatAsString(BitVector bitVector, boolean useDashInsteadOfZ)
+       {
+               if (bitVector == null)
+                       return "null";
+               if (useDashInsteadOfZ && bitVector.isHighImpedance())
+                       return "-";
+               if (bitVector.length() == 1)
+                       return bitVector.toBitstring();
+               if (bitVector.isBinary())
+               {
+                       String hexdigits = bitVector.getUnsignedValue().toString(16);
+                       StringBuilder sb = new StringBuilder();
+                       sb.append("0x");
+                       sb.append("0".repeat((bitVector.length() + 3) / 4 - hexdigits.length()));
+                       sb.append(hexdigits);
+                       return sb.toString();
+               }
+               return bitVector.toBitstring();
+       }
+
+       // TODO this method overlaps in functionality with AsmNumberUtil (in plugin.core)
+       public static BitVector parseUserBitVector(String userInput, int width)
+       {
+               BitVector bitvector = null;
+               if (width > 0 && userInput.matches("0x[0-9a-fA-F]+"))
+                       // TODO should we check for overflows?
+                       bitvector = BitVector.from(new BigInteger(userInput.substring(2), 16), width);
+               else if (width <= 0 || userInput.length() == width)
+                       // TODO do this without exceptions
+                       try
+                       {
+                               bitvector = BitVector.parseBitstring(userInput);
+                       }
+                       catch (@SuppressWarnings("unused") NullPointerException x)
+                       {
+                               // ignore
+                       }
+               if (bitvector == null && width > 0)
+                       try
+                       {
+                               // TODO should we check for overflows?
+                               bitvector = BitVector.from(new BigInteger(userInput), width);
+                       }
+                       catch (@SuppressWarnings("unused") NumberFormatException x)
+                       {
+                               // ignore
+                       }
+               return bitvector;
+       }
+
+       // TODO doesn't this belong to logic.model?
+       public static ColorDefinition formatAsColor(RenderPreferences renderPrefs, ReadEnd end)
+       {
+               return formatAsColor(renderPrefs, end == null ? null : end.getValues());
+       }
+
+       public static ColorDefinition formatAsColor(RenderPreferences renderPrefs, BitVector bitVector)
+       {
+               // TODO maybe find a color assignment for multiple-bit bit vectors?
+               if (bitVector == null || bitVector.length() != 1)
+                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);
+               switch (bitVector.getLSBit(0))
+               {
+               case ONE:
+                       return renderPrefs.getColorDefinition(BIT_ONE_COLOR);
+               case U:
+                       return renderPrefs.getColorDefinition(BIT_U_COLOR);
+               case X:
+                       return renderPrefs.getColorDefinition(BIT_X_COLOR);
+               case Z:
+                       return renderPrefs.getColorDefinition(BIT_Z_COLOR);
+               case ZERO:
+                       return renderPrefs.getColorDefinition(BIT_ZERO_COLOR);
+               default:
+                       throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getLSBit(0));
+               }
+       }
+
+       private BitVectorFormatter()
+       {
+               throw new UnsupportedOperationException("No BitVectorFormatter instances");
+       }
+}
\ No newline at end of file
index 3a70dcd..aabe019 100644 (file)
@@ -1,5 +1,11 @@
 package net.mograsim.logic.model;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.ACTION_BUTTON;
+import static net.mograsim.logic.model.preferences.RenderPreferences.BACKGROUND_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.DEBUG_HLSSHELL_DEPTH;
+import static net.mograsim.logic.model.preferences.RenderPreferences.DEBUG_OPEN_HLSSHELL;
+import static net.mograsim.logic.model.preferences.RenderPreferences.IMPROVE_TEXT;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -25,12 +31,11 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas;
 import net.mograsim.logic.core.types.Bit;
 import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.types.BitVectorFormatter;
 import net.mograsim.logic.model.model.LogicModel;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler;
-import net.mograsim.preferences.Preferences;
 
 /**
  * Simulation visualizer canvas.
@@ -39,20 +44,25 @@ import net.mograsim.preferences.Preferences;
  */
 public class LogicUICanvas extends ZoomableCanvas
 {
-       private final LogicModel model;
+       protected final LogicModel model;
+       protected final RenderPreferences renderPrefs;
 
-       public LogicUICanvas(Composite parent, int style, LogicModel model)
+       public LogicUICanvas(Composite parent, int style, LogicModel model, RenderPreferences renderPrefs)
        {
-               super(parent, style, Preferences.current().getBoolean("net.mograsim.logic.model.improvetext"));
+               // TODO add a listener
+               super(parent, style, renderPrefs.getBoolean(IMPROVE_TEXT));
 
+               this.renderPrefs = renderPrefs;
                this.model = model;
 
-               Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background");
+               // TODO add listeners for the render prefs
+
+               Color background = renderPrefs.getColor(BACKGROUND_COLOR);
                if (background != null)
                        setBackground(background);
 
                LogicUIRenderer renderer = new LogicUIRenderer(model);
-               addZoomedRenderer(gc -> renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)));
+               addZoomedRenderer(gc -> renderer.render(gc, renderPrefs, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)));
                model.setRedrawHandler(() ->
                {
                        if (!isDisposed())
@@ -61,13 +71,13 @@ public class LogicUICanvas extends ZoomableCanvas
 
                addListener(SWT.MouseDown, this::mouseDown);
 
-               if (Preferences.current().getBoolean("net.mograsim.logic.model.debug.openhlsshell"))
-                       openDebugSetHighLevelStateShell(model);
+               if (renderPrefs.getBoolean(DEBUG_OPEN_HLSSHELL))
+                       openDebugSetHighLevelStateShell(model, renderPrefs.getInt(DEBUG_HLSSHELL_DEPTH) - 1);
        }
 
        private void mouseDown(Event e)
        {
-               if (e.button == Preferences.current().getInt("net.mograsim.logic.model.button.action"))
+               if (e.button == renderPrefs.getInt(ACTION_BUTTON))
                {
                        Point click = canvasToWorldCoords(e.x, e.y);
                        for (ModelComponent component : model.getComponentsByName().values())
@@ -79,7 +89,7 @@ public class LogicUICanvas extends ZoomableCanvas
                }
        }
 
-       private void openDebugSetHighLevelStateShell(LogicModel model)
+       private void openDebugSetHighLevelStateShell(LogicModel model, int depth)
        {
                Shell debugShell = new Shell();
                debugShell.setLayout(new GridLayout(2, false));
@@ -94,16 +104,16 @@ public class LogicUICanvas extends ZoomableCanvas
                @SuppressWarnings("unchecked")
                Consumer<? super ModelComponent>[] compRemoved = new Consumer[1];
                compAdded[0] = c -> compsChanged(compAdded[0], compRemoved[0], c, models, componentsByItemIndex, componentSelector, model,
-                               recalculateQueued, true);
+                               recalculateQueued, depth, true);
                compRemoved[0] = c -> compsChanged(compAdded[0], compRemoved[0], c, models, componentsByItemIndex, componentSelector, model,
-                               recalculateQueued, false);
+                               recalculateQueued, depth, false);
                iterateModelTree(compAdded[0], compRemoved[0], model, models, true);
                debugShell.addListener(SWT.Dispose, e -> models.forEach(m ->
                {
                        m.removeComponentAddedListener(compAdded[0]);
                        m.removeComponentRemovedListener(compRemoved[0]);
                }));
-               queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model);
+               queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model, depth);
                new Label(debugShell, SWT.NONE).setText("Target state ID: ");
                Text stateIDText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
                stateIDText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
@@ -237,10 +247,10 @@ public class LogicUICanvas extends ZoomableCanvas
 
        private void compsChanged(Consumer<? super ModelComponent> compAdded, Consumer<? super ModelComponent> compRemoved, ModelComponent c,
                        List<LogicModel> models, List<ModelComponent> componentsByItemIndex, Combo componentSelector, LogicModel model,
-                       AtomicBoolean recalculateQueued, boolean add)
+                       AtomicBoolean recalculateQueued, int depth, boolean add)
        {
                iterateSubmodelTree(compAdded, compRemoved, c, models, add);
-               queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model);
+               queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model, depth);
        }
 
        private void iterateSubmodelTree(Consumer<? super ModelComponent> compAdded, Consumer<? super ModelComponent> compRemoved,
@@ -272,20 +282,20 @@ public class LogicUICanvas extends ZoomableCanvas
        }
 
        private void queueRecalculateComponentSelector(AtomicBoolean recalculateQueued, List<ModelComponent> componentsByItemIndex,
-                       Combo componentSelector, LogicModel model)
+                       Combo componentSelector, LogicModel model, int depth)
        {
                if (recalculateQueued.compareAndSet(false, true))
-                       getDisplay().asyncExec(() -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model));
+                       getDisplay().asyncExec(
+                                       () -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model, depth));
        }
 
        private void recalculateComponentSelector(AtomicBoolean recalculateQueued, List<ModelComponent> componentsByItemIndex,
-                       Combo componentSelector, LogicModel model)
+                       Combo componentSelector, LogicModel model, int depth)
        {
                recalculateQueued.set(false);
                componentsByItemIndex.clear();
                componentSelector.setItems();
-               addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model,
-                               Preferences.current().getInt("net.mograsim.logic.model.debug.hlsshelldepth") - 1);
+               addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model, depth);
        }
 
        private void addComponentSelectorItems(List<ModelComponent> componentsByItemIndex, String base, Combo componentSelector,
index 1df2f7b..6f4e0e8 100644 (file)
@@ -1,5 +1,7 @@
 package net.mograsim.logic.model;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.DEFAULT_LINE_WIDTH;
+
 import org.eclipse.swt.SWT;
 
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -8,7 +10,7 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.LogicModel;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
-import net.mograsim.preferences.Preferences;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 
 public class LogicUIRenderer
 {
@@ -21,28 +23,28 @@ public class LogicUIRenderer
                this.model = model;
        }
 
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                gc.setAntialias(SWT.ON);
                gc.setClipping(visibleRegion);
-               gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default"));
+               gc.setLineWidth(renderPrefs.getDouble(DEFAULT_LINE_WIDTH));
                model.getWiresByName().values().forEach(w ->
                {
                        Rectangle bounds = w.getBounds();
                        double lw = gc.getLineWidth();
                        if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw))
-                               w.render(gc);
+                               w.render(gc, renderPrefs);
                });
-               model.getComponentsByName().values().forEach(c -> renderComponent(gc, c, visibleRegion));
+               model.getComponentsByName().values().forEach(c -> renderComponent(gc, renderPrefs, c, visibleRegion));
        }
 
-       private static void renderComponent(GeneralGC gc, ModelComponent component, Rectangle visibleRegion)
+       private static void renderComponent(GeneralGC gc, RenderPreferences renderPrefs, ModelComponent component, Rectangle visibleRegion)
        {
                Rectangle bounds = component.getBounds();
                double lw = gc.getLineWidth();
                if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw))
                {
-                       component.render(gc, visibleRegion);
+                       component.render(gc, renderPrefs, visibleRegion);
                        if (DRAW_PINS)
                        {
                                gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_DARK_CYAN));
index 55a96a5..e803c26 100644 (file)
@@ -1,5 +1,8 @@
 package net.mograsim.logic.model;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.DRAG_BUTTON;
+import static net.mograsim.logic.model.preferences.RenderPreferences.ZOOM_BUTTON;
+
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Display;
@@ -8,7 +11,7 @@ import org.eclipse.swt.widgets.Shell;
 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay;
 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
 import net.mograsim.logic.model.model.LogicModel;
-import net.mograsim.preferences.Preferences;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 
 /**
  * Standalone simulation visualizer graphical user interface.
@@ -21,16 +24,18 @@ public class LogicUIStandaloneGUI implements Runnable
        private final Shell shell;
        private final LogicUICanvas ui;
 
-       public LogicUIStandaloneGUI(LogicModel model)
+       public LogicUIStandaloneGUI(LogicModel model, RenderPreferences renderPrefs)
        {
                display = new Display();
                shell = new Shell(display);
                shell.setLayout(new FillLayout());
-               ui = new LogicUICanvas(shell, SWT.NONE, model);
+               ui = new LogicUICanvas(shell, SWT.NONE, model, renderPrefs);
 
                ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
-               userInput.buttonDrag = Preferences.current().getInt("net.mograsim.logic.model.button.drag");
-               userInput.buttonZoom = Preferences.current().getInt("net.mograsim.logic.model.button.zoom");
+               // TODO add a listener
+               userInput.buttonDrag = renderPrefs.getInt(DRAG_BUTTON);
+               // TODO add a listener
+               userInput.buttonZoom = renderPrefs.getInt(ZOOM_BUTTON);
                userInput.enableUserInput();
                new ZoomableCanvasOverlay(ui, null).enableScale();
        }
index b84877e..829abaa 100644 (file)
@@ -6,6 +6,7 @@ import net.mograsim.logic.core.timeline.Timeline;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.modeladapter.CoreModelParameters;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
+import net.mograsim.logic.model.preferences.DefaultRenderPreferences;
 
 public class SimpleLogicUIStandalone
 {
@@ -39,7 +40,7 @@ public class SimpleLogicUIStandalone
                Timeline timeline = LogicCoreAdapter.convert(logicModel, params);
 
                // initialize UI and executer
-               LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(logicModel);
+               LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(logicModel, new DefaultRenderPreferences());
                LogicExecuter exec = new LogicExecuter(timeline);
 
                if (beforeRun != null)
index b4d8928..0a9816a 100644 (file)
@@ -11,6 +11,7 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.JSONSerializable;
 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
@@ -98,13 +99,6 @@ public abstract class ModelComponent implements JSONSerializable
                model.componentCreated(this, this::destroyed);
        }
 
-       // basic getters
-
-       public String getName()
-       {
-               return name;
-       }
-
        /**
         * Destroys this component. This method is called from {@link LogicModelModifiable#componentDestroyed(ModelComponent)
         * destroyComponent()} of the model this component is a part of.<br>
@@ -117,6 +111,13 @@ public abstract class ModelComponent implements JSONSerializable
                pinsByName.values().forEach(this::removePinWithoutRedraw);
        }
 
+       // basic getters
+
+       public String getName()
+       {
+               return name;
+       }
+
        // pins
 
        /**
@@ -344,7 +345,7 @@ public abstract class ModelComponent implements JSONSerializable
         * 
         * @author Daniel Kirschten
         */
-       public abstract void render(GeneralGC gc, Rectangle visibleRegion);
+       public abstract void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion);
 
        // serializing
 
index 68e8d45..37ab427 100644 (file)
@@ -1,5 +1,8 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import org.eclipse.swt.graphics.Color;
 
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -7,17 +10,17 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.core.LogicObserver;
 import net.mograsim.logic.core.components.CoreBitDisplay;
-import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.model.BitVectorFormatter;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.BitDisplayAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.util.TextRenderingHelper;
-import net.mograsim.preferences.Preferences;
 
 public class ModelBitDisplay extends ModelComponent
 {
@@ -50,9 +53,9 @@ public class ModelBitDisplay extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground");
+               Color foreground = renderPrefs.getColor(FOREGROUND_COLOR);
                if (foreground != null)
                        gc.setForeground(foreground);
                gc.drawRectangle(getBounds());
@@ -60,7 +63,7 @@ public class ModelBitDisplay extends ModelComponent
                Font oldFont = gc.getFont();
                Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
                gc.setFont(labelFont);
-               Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text");
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
                if (textColor != null)
                        gc.setForeground(textColor);
                TextRenderingHelper.drawTextFitting(gc, label, getBounds(), textMargin, true);
index 3c4eec6..e22ca82 100644 (file)
@@ -1,5 +1,8 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
@@ -23,11 +26,11 @@ import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.ClockAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
 import net.mograsim.logic.model.util.JsonHandler;
-import net.mograsim.preferences.Preferences;
 
 public class ModelClock extends ModelComponent
 {
@@ -140,9 +143,9 @@ public class ModelClock extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground");
+               Color foreground = renderPrefs.getColor(FOREGROUND_COLOR);
                if (foreground != null)
                        gc.setForeground(foreground);
                gc.drawRectangle(getBounds());
@@ -151,7 +154,7 @@ public class ModelClock extends ModelComponent
                Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
                gc.setFont(labelFont);
                Point textExtent = gc.textExtent(label);
-               Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text");
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
                if (textColor != null)
                        gc.setForeground(textColor);
                gc.drawText(label, getPosX() + (oc.width() - textExtent.x) / 2, getPosY() + (oc.height() - textExtent.y) / 2, true);
index 1d70458..86b21bc 100644 (file)
@@ -1,5 +1,8 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import java.util.Objects;
 
 import org.eclipse.swt.graphics.Color;
@@ -8,18 +11,18 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.model.BitVectorFormatter;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.FixedOutputAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.util.JsonHandler;
 import net.mograsim.logic.model.util.TextRenderingHelper;
-import net.mograsim.preferences.Preferences;
 
 public class ModelFixedOutput extends ModelComponent
 {
@@ -53,9 +56,9 @@ public class ModelFixedOutput extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground");
+               Color foreground = renderPrefs.getColor(FOREGROUND_COLOR);
                if (foreground != null)
                        gc.setForeground(foreground);
                gc.drawRectangle(getBounds());
@@ -63,7 +66,7 @@ public class ModelFixedOutput extends ModelComponent
                Font oldFont = gc.getFont();
                Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
                gc.setFont(labelFont);
-               Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text");
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
                if (textColor != null)
                        gc.setForeground(textColor);
                TextRenderingHelper.drawTextFitting(gc, label, getBounds(), textMargin, true);
index 7897982..ef3c817 100644 (file)
@@ -1,5 +1,8 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
@@ -13,18 +16,18 @@ import net.mograsim.logic.core.LogicObserver;
 import net.mograsim.logic.core.components.CoreManualSwitch;
 import net.mograsim.logic.core.types.Bit;
 import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.model.BitVectorFormatter;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.ManualSwitchAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
 import net.mograsim.logic.model.util.TextRenderingHelper;
-import net.mograsim.preferences.Preferences;
 
 public class ModelManualSwitch extends ModelComponent
 {
@@ -137,9 +140,9 @@ public class ModelManualSwitch extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground");
+               Color foreground = renderPrefs.getColor(FOREGROUND_COLOR);
                if (foreground != null)
                        gc.setForeground(foreground);
                gc.drawRectangle(getBounds());
@@ -147,7 +150,7 @@ public class ModelManualSwitch extends ModelComponent
                Font oldFont = gc.getFont();
                Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
                gc.setFont(labelFont);
-               Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text");
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
                if (textColor != null)
                        gc.setForeground(textColor);
                TextRenderingHelper.drawTextFitting(gc, label, getBounds(), textMargin, true);
index b47f50b..b2c3ba1 100644 (file)
@@ -1,11 +1,16 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.DEFAULT_LINE_WIDTH;
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.WIRE_WIDTH_MULTIBIT;
+import static net.mograsim.logic.model.preferences.RenderPreferences.WIRE_WIDTH_SINGLEBIT;
+
 import org.eclipse.swt.SWT;
 
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-import net.mograsim.logic.core.types.BitVectorFormatter;
 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.model.BitVectorFormatter;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.components.Orientation;
@@ -14,12 +19,12 @@ import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.SplitterAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.util.JsonHandler;
 import net.mograsim.preferences.ColorDefinition;
 import net.mograsim.preferences.ColorManager;
-import net.mograsim.preferences.Preferences;
 
 public class ModelSplitter extends ModelComponent
 {
@@ -57,30 +62,29 @@ public class ModelSplitter extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                double posX = getPosX();
                double posY = getPosY();
 
-               ColorDefinition c = BitVectorFormatter.formatAsColor(inputEnd);
+               ColorDefinition c = BitVectorFormatter.formatAsColor(renderPrefs, inputEnd);
                if (c != null)
                        gc.setForeground(ColorManager.current().toColor(c));
-               gc.setLineWidth(
-                               Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit")));
+               gc.setLineWidth(renderPrefs.getDouble(logicWidth == 1 ? WIRE_WIDTH_SINGLEBIT : WIRE_WIDTH_MULTIBIT));
                double inLineY = heightWithoutOC / 2;
                gc.drawLine(posX + oc.newX(0, inLineY), posY + oc.newY(0, inLineY), posX + oc.newX(width / 2, inLineY),
                                posY + oc.newY(width / 2, inLineY));
-               gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit"));
+               gc.setLineWidth(renderPrefs.getDouble(WIRE_WIDTH_SINGLEBIT));
                double outputHeight = 0;
                for (int i = 0; i < logicWidth; i++, outputHeight += 10)
                {
-                       c = BitVectorFormatter.formatAsColor(outputEnds[i]);
+                       c = BitVectorFormatter.formatAsColor(renderPrefs, outputEnds[i]);
                        if (c != null)
                                gc.setForeground(ColorManager.current().toColor(c));
                        gc.drawLine(posX + oc.newX(width / 2, outputHeight), posY + oc.newY(width / 2, outputHeight),
                                        posX + oc.newX(width, outputHeight), posY + oc.newY(width, outputHeight));
                }
-               gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground"));
+               gc.setForeground(renderPrefs.getColor(FOREGROUND_COLOR));
                int oldLineCap = gc.getLineCap();
                int lineJoin = gc.getLineJoin();
                // TODO find better "replacement" for JOIN_BEVEL
@@ -88,7 +92,7 @@ public class ModelSplitter extends ModelComponent
                gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE);
                gc.drawLine(posX + oc.newX(width / 2, 0), posY + oc.newY(width / 2, 0), posX + oc.newX(width / 2, heightWithoutOC),
                                posY + oc.newY(width / 2, heightWithoutOC));
-               gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default"));
+               gc.setLineWidth(renderPrefs.getDouble(DEFAULT_LINE_WIDTH));
                gc.setLineCap(oldLineCap);
        }
 
index ac0f64d..c3a43a1 100644 (file)
@@ -1,5 +1,7 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import org.eclipse.swt.graphics.Color;
 
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
@@ -9,9 +11,9 @@ import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.NoLogicAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
-import net.mograsim.preferences.Preferences;
 
 //TODO clean size calculation mess
 public class ModelTextComponent extends ModelComponent
@@ -36,7 +38,7 @@ public class ModelTextComponent extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                if (!calculatedSize)
                {
@@ -45,7 +47,7 @@ public class ModelTextComponent extends ModelComponent
                        setSize(textExtent.x, textExtent.y);
                }
 
-               Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text");
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
                if (textColor != null)
                        gc.setForeground(textColor);
                gc.drawText(text, getPosX(), getPosY(), true);
index 93bff32..9bd1dde 100644 (file)
@@ -1,5 +1,7 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+
 import org.eclipse.swt.graphics.Color;
 
 import com.google.gson.JsonSyntaxException;
@@ -14,10 +16,10 @@ import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.TriStateBufferAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.util.JsonHandler;
-import net.mograsim.preferences.Preferences;
 
 public class ModelTriStateBuffer extends ModelComponent
 {
@@ -78,9 +80,9 @@ public class ModelTriStateBuffer extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground");
+               Color foreground = renderPrefs.getColor(FOREGROUND_COLOR);
                if (foreground != null)
                        gc.setForeground(foreground);
                double x = getPosX();
index 427a179..6f78a47 100644 (file)
@@ -15,6 +15,7 @@ import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
 import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedModelComponentAdapter;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
 import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
@@ -176,11 +177,11 @@ public abstract class SimpleRectangularHardcodedModelComponent extends ModelComp
        // "graphical" operations
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               outlineRenderer.render(gc, visibleRegion);
-               centerTextRenderer.render(gc, visibleRegion);
-               pinNamesRenderer.render(gc, visibleRegion);
+               outlineRenderer.render(gc, renderPrefs, visibleRegion);
+               centerTextRenderer.render(gc, renderPrefs, visibleRegion);
+               pinNamesRenderer.render(gc, renderPrefs, visibleRegion);
        }
 
        // serializing
index 8936601..1a39dc1 100644 (file)
@@ -1,5 +1,8 @@
 package net.mograsim.logic.model.model.components.atomic;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -16,8 +19,8 @@ import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.MovablePin;
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
-import net.mograsim.preferences.Preferences;
 
 public class SimpleRectangularModelGate extends ModelComponent
 {
@@ -80,9 +83,9 @@ public class SimpleRectangularModelGate extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground");
+               Color foreground = renderPrefs.getColor(FOREGROUND_COLOR);
                if (foreground != null)
                        gc.setForeground(foreground);
                double height = (getPins().size() - 1) * pinDistance;
@@ -93,7 +96,7 @@ public class SimpleRectangularModelGate extends ModelComponent
                Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
                gc.setFont(labelFont);
                Point textExtent = gc.textExtent(label);
-               Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text");
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
                if (textColor != null)
                        gc.setForeground(textColor);
                gc.drawText(label, getPosX() + (rectWidth - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true);
index f647cb7..8b087aa 100644 (file)
@@ -1,5 +1,9 @@
 package net.mograsim.logic.model.model.components.submodels;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.DEFAULT_LINE_WIDTH;
+import static net.mograsim.logic.model.preferences.RenderPreferences.SUBMODEL_ZOOM_ALPHA_0;
+import static net.mograsim.logic.model.preferences.RenderPreferences.SUBMODEL_ZOOM_ALPHA_1;
+
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -17,13 +21,13 @@ import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.MovablePin;
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.serializing.SubmodelComponentParams;
 import net.mograsim.logic.model.serializing.SubmodelComponentSerializer;
 import net.mograsim.logic.model.snippets.Renderer;
 import net.mograsim.logic.model.util.JsonHandler;
-import net.mograsim.preferences.Preferences;
 
 /**
  * A {@link ModelComponent} consisting of another model. A <code>SubmodelComponent</code> can have so-called "interface pins" connecting the
@@ -357,7 +361,7 @@ public abstract class SubmodelComponent extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                GCConfig conf = new GCConfig(gc);
                GeneralGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true);
@@ -367,12 +371,14 @@ public abstract class SubmodelComponent extends ModelComponent
                 * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel
                 * starts to be visible.
                 */
-               double maxVisibleRegionFillRatioForAlpha0 = Preferences.current().getDouble("net.mograsim.logic.model.submodel.zoomalpha0");
+               // TODO add a listener
+               double maxVisibleRegionFillRatioForAlpha0 = renderPrefs.getDouble(SUBMODEL_ZOOM_ALPHA_0);
                /**
                 * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is
                 * fully visible.
                 */
-               double minVisibleRegionFillRatioForAlpha1 = Preferences.current().getDouble("net.mograsim.logic.model.submodel.zoomalpha1");
+               // TODO add a listener
+               double minVisibleRegionFillRatioForAlpha1 = renderPrefs.getDouble(SUBMODEL_ZOOM_ALPHA_1);
                double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1);
                alphaFactor = Math.max(0, Math.min(1, alphaFactor));
                // we need to take the old alpha into account to support nested submodules better.
@@ -382,18 +388,19 @@ public abstract class SubmodelComponent extends ModelComponent
                if (submodelAlpha != 0)
                {
                        gc.setAlpha(submodelAlpha);
-                       renderer.render(tgc, visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale));
+                       renderer.render(tgc, renderPrefs,
+                                       visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale));
                }
                if (labelAlpha != 0)
                {
                        gc.setAlpha(labelAlpha);
-                       renderSymbol(gc, visibleRegion);
+                       renderSymbol(gc, renderPrefs, visibleRegion);
                }
                conf.reset(gc);
                // reset line width explicitly to avoid rounding errors causing weird glitches
-               gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default"));
+               gc.setLineWidth(renderPrefs.getDouble(DEFAULT_LINE_WIDTH));
                // draw the outline after all other operations to make interface pins look better
-               renderOutline(gc, visibleRegion);
+               renderOutline(gc, renderPrefs, visibleRegion);
        }
 
        /**
@@ -401,10 +408,10 @@ public abstract class SubmodelComponent extends ModelComponent
         * 
         * @author Daniel Kirschten
         */
-       private void renderSymbol(GeneralGC gc, Rectangle visibleRegion)
+       private void renderSymbol(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                if (symbolRenderer != null)
-                       symbolRenderer.render(gc, visibleRegion);
+                       symbolRenderer.render(gc, renderPrefs, visibleRegion);
        }
 
        /**
@@ -412,10 +419,10 @@ public abstract class SubmodelComponent extends ModelComponent
         * 
         * @author Daniel Kirschten
         */
-       private void renderOutline(GeneralGC gc, Rectangle visibleRegion)
+       private void renderOutline(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                if (outlineRenderer != null)
-                       outlineRenderer.render(gc, visibleRegion);
+                       outlineRenderer.render(gc, renderPrefs, visibleRegion);
        }
 
        private static double map(double val, double valMin, double valMax, double mapMin, double mapMax)
index 331db12..233c371 100644 (file)
@@ -5,6 +5,7 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 
 public class SubmodelInterface extends ModelComponent
@@ -15,7 +16,7 @@ public class SubmodelInterface extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {// nothing to do here
        }
 
index 8d3cbde..813f06d 100644 (file)
@@ -1,5 +1,9 @@
 package net.mograsim.logic.model.model.wires;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.DEFAULT_LINE_WIDTH;
+import static net.mograsim.logic.model.preferences.RenderPreferences.WIRE_WIDTH_MULTIBIT;
+import static net.mograsim.logic.model.preferences.RenderPreferences.WIRE_WIDTH_SINGLEBIT;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -12,13 +16,13 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.core.LogicObserver;
 import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.types.BitVectorFormatter;
 import net.mograsim.logic.core.wires.CoreWire;
 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.model.BitVectorFormatter;
 import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.preferences.ColorDefinition;
 import net.mograsim.preferences.ColorManager;
-import net.mograsim.preferences.Preferences;
 
 /**
  * A wire connecting exactly two {@link Pin}s.
@@ -363,15 +367,14 @@ public class ModelWire
         * 
         * @author Daniel Kirschten
         */
-       public void render(GeneralGC gc)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs)
        {
-               ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end);
+               ColorDefinition wireColor = BitVectorFormatter.formatAsColor(renderPrefs, end);
                if (wireColor != null)
                        gc.setForeground(ColorManager.current().toColor(wireColor));
-               gc.setLineWidth(
-                               Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit")));
+               gc.setLineWidth(renderPrefs.getDouble(logicWidth == 1 ? WIRE_WIDTH_SINGLEBIT : WIRE_WIDTH_MULTIBIT));
                gc.drawPolyline(effectivePath);
-               gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default"));
+               gc.setLineWidth(renderPrefs.getDouble(DEFAULT_LINE_WIDTH));
        }
 
        // operations concerning the path
index b9a5ccc..5594bdb 100644 (file)
@@ -3,10 +3,11 @@ package net.mograsim.logic.model.model.wires;
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.core.LogicObserver;
-import net.mograsim.logic.core.types.BitVectorFormatter;
 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
+import net.mograsim.logic.model.BitVectorFormatter;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.preferences.ColorDefinition;
@@ -83,9 +84,9 @@ public class ModelWireCrossPoint extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end);
+               ColorDefinition wireColor = BitVectorFormatter.formatAsColor(renderPrefs, end);
                if (wireColor != null)
                        gc.setBackground(ColorManager.current().toColor(wireColor));
                gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM);
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/preferences/DefaultRenderPreferences.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/preferences/DefaultRenderPreferences.java
new file mode 100755 (executable)
index 0000000..9a97ae1
--- /dev/null
@@ -0,0 +1,86 @@
+package net.mograsim.logic.model.preferences;
+
+import net.mograsim.preferences.ColorDefinition;
+import net.mograsim.preferences.ColorDefinition.BuiltInColor;
+import net.mograsim.preferences.DefaultPreferences;
+
+public class DefaultRenderPreferences extends DefaultPreferences implements RenderPreferences
+{
+       @Override
+       public boolean getBoolean(String name)
+       {
+               switch (name)
+               {
+               case IMPROVE_TEXT:
+                       return true;
+               case DEBUG_OPEN_HLSSHELL:
+                       return false;
+               default:
+                       throw new IllegalArgumentException("Unknown boolean preference name: " + name);
+               }
+       }
+
+       @Override
+       public int getInt(String name)
+       {
+               switch (name)
+               {
+               case DEBUG_HLSSHELL_DEPTH:
+                       return 0;
+               case ACTION_BUTTON:
+                       return 1;
+               case DRAG_BUTTON:
+                       return 3;
+               case ZOOM_BUTTON:
+                       return 2;
+               default:
+                       throw new IllegalArgumentException("Unknown int preference name: " + name);
+               }
+       }
+
+       @Override
+       public double getDouble(String name)
+       {
+               switch (name)
+               {
+               case DEFAULT_LINE_WIDTH:
+                       return 0.5;
+               case WIRE_WIDTH_SINGLEBIT:
+                       return 0.5;
+               case WIRE_WIDTH_MULTIBIT:
+                       return 0.85;
+               case SUBMODEL_ZOOM_ALPHA_0:
+                       return 0.1;
+               case SUBMODEL_ZOOM_ALPHA_1:
+                       return 0.2;
+               default:
+                       throw new IllegalArgumentException("Unknown double preference name: " + name);
+               }
+       }
+
+       @Override
+       public ColorDefinition getColorDefinition(String name)
+       {
+               switch (name)
+               {
+               case BIT_ONE_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_GREEN);
+               case BIT_U_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_CYAN);
+               case BIT_X_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_RED);
+               case BIT_Z_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_YELLOW);
+               case BIT_ZERO_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_GRAY);
+               case BACKGROUND_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_WHITE);
+               case FOREGROUND_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);
+               case TEXT_COLOR:
+                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);
+               default:
+                       throw new IllegalArgumentException("Unknown color preference name: " + name);
+               }
+       }
+}
\ No newline at end of file
diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/preferences/RenderPreferences.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/preferences/RenderPreferences.java
new file mode 100755 (executable)
index 0000000..fd325c3
--- /dev/null
@@ -0,0 +1,28 @@
+package net.mograsim.logic.model.preferences;
+
+import net.mograsim.preferences.Preferences;
+
+public interface RenderPreferences extends Preferences
+{
+       public static final String PREFIX = "net.mograsim.logic.model.";
+
+       public static final String IMPROVE_TEXT = PREFIX + "improvetext";
+       public static final String TEXT_COLOR = PREFIX + "color.text";
+       public static final String FOREGROUND_COLOR = PREFIX + "color.foreground";
+       public static final String BACKGROUND_COLOR = PREFIX + "color.background";
+       public static final String BIT_ZERO_COLOR = PREFIX + "color.bit.zero";
+       public static final String BIT_Z_COLOR = PREFIX + "color.bit.z";
+       public static final String BIT_X_COLOR = PREFIX + "color.bit.x";
+       public static final String BIT_U_COLOR = PREFIX + "color.bit.u";
+       public static final String BIT_ONE_COLOR = PREFIX + "color.bit.one";
+       public static final String SUBMODEL_ZOOM_ALPHA_1 = PREFIX + "submodel.zoomalpha1";
+       public static final String SUBMODEL_ZOOM_ALPHA_0 = PREFIX + "submodel.zoomalpha0";
+       public static final String WIRE_WIDTH_MULTIBIT = PREFIX + "linewidth.wire.multibit";
+       public static final String WIRE_WIDTH_SINGLEBIT = PREFIX + "linewidth.wire.singlebit";
+       public static final String DEFAULT_LINE_WIDTH = PREFIX + "linewidth.default";
+       public static final String ZOOM_BUTTON = PREFIX + "button.zoom";
+       public static final String DRAG_BUTTON = PREFIX + "button.drag";
+       public static final String ACTION_BUTTON = PREFIX + "button.action";
+       public static final String DEBUG_OPEN_HLSSHELL = PREFIX + "debug.openhlsshell";
+       public static final String DEBUG_HLSSHELL_DEPTH = PREFIX + "debug.hlsshelldepth";
+}
index 5ed33bd..9dff925 100644 (file)
@@ -2,9 +2,10 @@ package net.mograsim.logic.model.snippets;
 
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.JSONSerializable;
 
 public interface Renderer extends JSONSerializable
 {
-       public void render(GeneralGC gc, Rectangle visibleRegion);
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion);
 }
\ No newline at end of file
index 90f25a4..31366a7 100644 (file)
@@ -1,15 +1,17 @@
 package net.mograsim.logic.model.snippets.outlinerenderers;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR;
+
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.snippets.Renderer;
 import net.mograsim.logic.model.snippets.SnippetDefinintion;
 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
 import net.mograsim.preferences.ColorDefinition;
 import net.mograsim.preferences.ColorManager;
-import net.mograsim.preferences.Preferences;
 
 public class DefaultOutlineRenderer implements Renderer
 {
@@ -26,9 +28,9 @@ public class DefaultOutlineRenderer implements Renderer
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.foreground");
+               ColorDefinition fg = renderPrefs.getColorDefinition(FOREGROUND_COLOR);
                if (fg != null)
                        gc.setForeground(ColorManager.current().toColor(fg));
                gc.drawRectangle(component.getBounds());
index 9a6599a..e122cdf 100644 (file)
@@ -1,17 +1,19 @@
 package net.mograsim.logic.model.snippets.symbolrenderers;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.snippets.Renderer;
 import net.mograsim.logic.model.snippets.SnippetDefinintion;
 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
 import net.mograsim.preferences.ColorDefinition;
 import net.mograsim.preferences.ColorManager;
-import net.mograsim.preferences.Preferences;
 
 /**
  * Renders a text (<code>"text"</code>) with a given font height (<code>"height"</code>) in the center of the component.
@@ -33,11 +35,11 @@ public class CenteredTextSymbolRenderer implements Renderer
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                Font oldFont = gc.getFont();
                gc.setFont(new Font(oldFont.getName(), fontHeight, oldFont.getStyle()));
-               ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text");
+               ColorDefinition fg = renderPrefs.getColorDefinition(TEXT_COLOR);
                if (fg != null)
                        gc.setForeground(ColorManager.current().toColor(fg));
                Point idSize = gc.textExtent(text);
index 28ad8a8..eb883e2 100644 (file)
@@ -1,16 +1,18 @@
 package net.mograsim.logic.model.snippets.symbolrenderers;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.snippets.Renderer;
 import net.mograsim.logic.model.snippets.SnippetDefinintion;
 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
 import net.mograsim.preferences.ColorDefinition;
 import net.mograsim.preferences.ColorManager;
-import net.mograsim.preferences.Preferences;
 
 public class DefaultSymbolRenderer implements Renderer
 {
@@ -29,9 +31,9 @@ public class DefaultSymbolRenderer implements Renderer
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text");
+               ColorDefinition fg = renderPrefs.getColorDefinition(TEXT_COLOR);
                if (fg != null)
                        gc.setForeground(ColorManager.current().toColor(fg));
                Point idSize = gc.textExtent(id);
index ede8710..06d97e6 100644 (file)
@@ -1,14 +1,19 @@
 package net.mograsim.logic.model.snippets.symbolrenderers;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.swt.graphics.Color;
+
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.snippets.Renderer;
 import net.mograsim.logic.model.snippets.SnippetDefinintion;
@@ -47,8 +52,11 @@ public class PinNamesSymbolRenderer implements Renderer
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
+               if (textColor != null)
+                       gc.setForeground(textColor);
                Font oldFont = gc.getFont();
                gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle()));
                for (Pin pin : component.getPins().values())
index d57203a..b61bca9 100644 (file)
@@ -1,5 +1,7 @@
 package net.mograsim.logic.model.snippets.symbolrenderers;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR;
+
 import java.util.Map.Entry;
 
 import org.eclipse.swt.graphics.Color;
@@ -10,11 +12,11 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.components.ModelComponent;
 import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.snippets.Renderer;
 import net.mograsim.logic.model.snippets.SnippetDefinintion;
 import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers;
-import net.mograsim.preferences.Preferences;
 
 /**
  * Renders a text (<code>"centerText"</code>) with a given font height (<code>"centerTextHeight"</code>) in the center of the component and
@@ -44,7 +46,7 @@ public class SimpleRectangularLikeSymbolRenderer implements Renderer
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
                double posX = component.getPosX();
                double posY = component.getPosY();
@@ -54,7 +56,7 @@ public class SimpleRectangularLikeSymbolRenderer implements Renderer
                Font oldFont = gc.getFont();
                gc.setFont(new Font(oldFont.getName(), centerTextHeight, oldFont.getStyle()));
                Point textExtent = gc.textExtent(centerText);
-               Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text");
+               Color textColor = renderPrefs.getColor(TEXT_COLOR);
                if (textColor != null)
                        gc.setForeground(textColor);
                gc.drawText(centerText, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
index 72fe437..9b820eb 100644 (file)
@@ -4,6 +4,7 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.snippets.Renderer;
 import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
 import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer;
@@ -34,9 +35,9 @@ public abstract class ModelMemory extends ModelComponent
        }
 
        @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
+       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
        {
-               symbolRenderer.render(gc, visibleRegion);
-               outlineRenderer.render(gc, visibleRegion);
+               symbolRenderer.render(gc, renderPrefs, visibleRegion);
+               outlineRenderer.render(gc, renderPrefs, visibleRegion);
        }
 }
\ No newline at end of file
index a5add49..c735a0a 100644 (file)
@@ -11,6 +11,8 @@ Export-Package: net.mograsim.plugin;uses:="org.eclipse.ui.themes,org.eclipse.swt
  net.mograsim.plugin.launch,
  net.mograsim.plugin.nature,
  net.mograsim.plugin.nature.properties,
+ net.mograsim.plugin.perspectives,
+ net.mograsim.plugin.preferences,
  net.mograsim.plugin.tables,
  net.mograsim.plugin.tables.memory,
  net.mograsim.plugin.tables.mi,
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/EclipsePreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/EclipsePreferences.java
deleted file mode 100644 (file)
index 445cf20..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-package net.mograsim.plugin;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.themes.ITheme;
-
-import net.mograsim.preferences.ColorDefinition;
-import net.mograsim.preferences.DefaultPreferences;
-import net.mograsim.preferences.Preferences;
-
-public class EclipsePreferences extends Preferences
-{
-       private final ITheme theme;
-       private final IPreferenceStore prefs;
-       private final Preferences defaultPrefs;
-
-       public EclipsePreferences(ITheme theme, IPreferenceStore prefs)
-       {
-               this.theme = theme;
-               this.prefs = prefs;
-               this.defaultPrefs = new DefaultPreferences();
-       }
-
-       @Override
-       public boolean getBoolean(String name)
-       {
-               prefs.setDefault(name, defaultPrefs.getBoolean(name));
-               return prefs.getBoolean(name);
-       }
-
-       @Override
-       public int getInt(String name)
-       {
-               prefs.setDefault(name, defaultPrefs.getInt(name));
-               return prefs.getInt(name);
-       }
-
-       @Override
-       public double getDouble(String name)
-       {
-               prefs.setDefault(name, defaultPrefs.getDouble(name));
-               return prefs.getDouble(name);
-       }
-
-       @Override
-       public ColorDefinition getColorDefinition(String name)
-       {
-               RGB rgb = getColorRegistry().getRGB(name);
-               if (rgb == null)
-               {
-                       StatusManager.getManager().handle(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "No color for name " + name));
-                       return null;
-               }
-               return new ColorDefinition(rgb.red, rgb.green, rgb.blue);
-       }
-
-       @Override
-       public Color getColor(String name)
-       {
-               return getColorRegistry().get(name);
-       }
-
-       private ColorRegistry getColorRegistry()
-       {
-               return theme.getColorRegistry();
-       }
-}
\ No newline at end of file
index 765a63a..64586b0 100644 (file)
@@ -1,9 +1,15 @@
 package net.mograsim.plugin;
 
+import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.themes.ITheme;
 
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.machine.MachineRegistry;
+import net.mograsim.plugin.preferences.EclipsePluginPreferences;
+import net.mograsim.plugin.preferences.EclipseRenderPreferences;
+import net.mograsim.plugin.preferences.PluginPreferences;
 import net.mograsim.preferences.Preferences;
 
 public final class MograsimActivator extends AbstractUIPlugin
@@ -12,20 +18,36 @@ public final class MograsimActivator extends AbstractUIPlugin
 
        private static MograsimActivator instance;
 
+       public static MograsimActivator instance()
+       {
+               if (instance == null)
+                       throw new IllegalStateException("MograsimActivator not yet created!");
+               return instance;
+       }
+
+       private final RenderPreferences renderPrefs;
+       private final PluginPreferences pluginPrefs;
+
        public MograsimActivator()
        {
                if (instance != null)
                        throw new IllegalStateException("MograsimActivator already created!");
                instance = this;
+
                MachineRegistry.initialize();
-               Preferences.setPreferences(new EclipsePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(),
-                               MograsimActivator.instance().getPreferenceStore()));
+               ITheme currentTheme = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme();
+               IPreferenceStore preferenceStore = getPreferenceStore();
+               renderPrefs = new EclipseRenderPreferences(currentTheme, preferenceStore);
+               pluginPrefs = new EclipsePluginPreferences(currentTheme, preferenceStore);
        }
 
-       public static MograsimActivator instance()
+       public RenderPreferences getRenderPrefs()
        {
-               if (instance == null)
-                       throw new IllegalStateException("MograsimActivator not yet created!");
-               return instance;
+               return renderPrefs;
+       }
+
+       public Preferences getPluginPrefs()
+       {
+               return pluginPrefs;
        }
 }
\ No newline at end of file
index 746433b..03a0e34 100644 (file)
@@ -17,24 +17,20 @@ import net.mograsim.logic.model.model.wires.ModelWire;
 import net.mograsim.logic.model.model.wires.ModelWireCrossPoint;
 import net.mograsim.logic.model.modeladapter.CoreModelParameters;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
-import net.mograsim.preferences.Preferences;
+import net.mograsim.logic.model.preferences.RenderPreferences;
+import net.mograsim.plugin.preferences.EclipseRenderPreferences;
 
 public class SimulationPreview implements IThemePreview
 {
        private LogicUICanvas ui;
        private LogicExecuter exec;
-       private Preferences oldPreferences;
-       private Preferences currentThemePreferences;
 
        @Override
        @SuppressWarnings("unused")
        public void createControl(Composite parent, ITheme currentTheme)
        {
-               oldPreferences = Preferences.current();
-
-               currentThemePreferences = new EclipsePreferences(currentTheme, MograsimActivator.instance().getPreferenceStore());
-               // TODO this will change the global preferences; so if another LogicUICanvas redraws, it will use the "new" colors too.
-               Preferences.setPreferences(currentThemePreferences);
+               RenderPreferences currentThemeRenderPrefs = new EclipseRenderPreferences(currentTheme,
+                               MograsimActivator.instance().getPreferenceStore());
 
                LogicModelModifiable model = new LogicModelModifiable();
                CoreModelParameters params = new CoreModelParameters();
@@ -86,7 +82,7 @@ public class SimulationPreview implements IThemePreview
 
                rIn.clicked(0, 0);
 
-               ui = new LogicUICanvas(parent, SWT.NONE, model);
+               ui = new LogicUICanvas(parent, SWT.NONE, model, currentThemeRenderPrefs);
 
                ui.zoom(3.5, 10, 10);
                exec.startLiveExecution();
@@ -98,7 +94,5 @@ public class SimulationPreview implements IThemePreview
        public void dispose()
        {
                exec.stopLiveExecution();
-               if (Preferences.current() == currentThemePreferences)
-                       Preferences.setPreferences(oldPreferences);
        }
 }
index 88c6ba7..f8d2265 100644 (file)
@@ -18,7 +18,7 @@ import org.eclipse.debug.core.model.IValue;
 import org.eclipse.swt.SWT;
 
 import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.model.BitVectorFormatter;
 import net.mograsim.machine.Machine;
 import net.mograsim.machine.registers.Register;
 import net.mograsim.plugin.MograsimActivator;
index 5d4cf5d..16c6db0 100644 (file)
@@ -1,5 +1,7 @@
 package net.mograsim.plugin.launch;
 
+import static net.mograsim.plugin.preferences.PluginPreferences.MAX_MEMORY_CHANGE_INTERVAL;
+
 import java.math.BigInteger;
 import java.util.HashSet;
 import java.util.Set;
@@ -21,7 +23,6 @@ import net.mograsim.machine.MainMemory;
 import net.mograsim.machine.MainMemoryDefinition;
 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
 import net.mograsim.plugin.MograsimActivator;
-import net.mograsim.preferences.Preferences;
 
 public class MainMemoryBlockExtension extends PlatformObject implements IMemoryBlockExtension
 {
@@ -80,7 +81,8 @@ public class MainMemoryBlockExtension extends PlatformObject implements IMemoryB
                this.memListener = a -> queueFireContentChangeEvent();
                this.memListenerRegistered = new AtomicBoolean();
 
-               this.maxContentChangeInterval = Preferences.current().getInt("net.mograsim.plugin.core.maxmemchangeinterval");
+               // TODO add a listener
+               this.maxContentChangeInterval = MograsimActivator.instance().getPluginPrefs().getInt(MAX_MEMORY_CHANGE_INTERVAL);
                this.contentChangeLock = new Object();
                this.nextContentChangeAllowedMillis = System.currentTimeMillis() - maxContentChangeInterval - 1;
        }
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/DefaultPluginPreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/DefaultPluginPreferences.java
new file mode 100755 (executable)
index 0000000..e3dcc72
--- /dev/null
@@ -0,0 +1,53 @@
+package net.mograsim.plugin.preferences;
+
+import net.mograsim.preferences.ColorDefinition;
+import net.mograsim.preferences.DefaultPreferences;
+
+public class DefaultPluginPreferences extends DefaultPreferences implements PluginPreferences
+{
+       @Override
+       public boolean getBoolean(String name)
+       {
+               switch (name)
+               {
+               case MPM_EDITOR_BITS_AS_COLUMN_NAME:
+                       return false;
+               default:
+                       throw new IllegalArgumentException("Unknown boolean preference name: " + name);
+               }
+       }
+
+       @Override
+       public int getInt(String name)
+       {
+               switch (name)
+               {
+               case SIMULATION_SPEED_PRECISION:
+                       return 6;
+               case MAX_MEMORY_CHANGE_INTERVAL:
+                       return 1000;
+               default:
+                       throw new IllegalArgumentException("Unknown int preference name: " + name);
+               }
+       }
+
+       @Override
+       public double getDouble(String name)
+       {
+               switch (name)
+               {
+               default:
+                       throw new IllegalArgumentException("Unknown double preference name: " + name);
+               }
+       }
+
+       @Override
+       public ColorDefinition getColorDefinition(String name)
+       {
+               switch (name)
+               {
+               default:
+                       throw new IllegalArgumentException("Unknown color preference name: " + name);
+               }
+       }
+}
\ No newline at end of file
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePluginPreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePluginPreferences.java
new file mode 100755 (executable)
index 0000000..193471d
--- /dev/null
@@ -0,0 +1,12 @@
+package net.mograsim.plugin.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.themes.ITheme;
+
+public class EclipsePluginPreferences extends EclipsePreferences implements PluginPreferences
+{
+       public EclipsePluginPreferences(ITheme theme, IPreferenceStore prefs)
+       {
+               super(theme, prefs, new DefaultPluginPreferences());
+       }
+}
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePreferences.java
new file mode 100755 (executable)
index 0000000..c57c443
--- /dev/null
@@ -0,0 +1,189 @@
+package net.mograsim.plugin.preferences;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.eclipse.ui.themes.ITheme;
+
+import net.mograsim.plugin.MograsimActivator;
+import net.mograsim.preferences.ColorDefinition;
+import net.mograsim.preferences.Preferences;
+
+public class EclipsePreferences implements Preferences
+{
+       private final ITheme theme;
+       private final IPreferenceStore prefs;
+       private final Preferences defaultPrefs;
+
+       private final ListenerManager<Boolean> booleanListeners;
+       private final ListenerManager<Integer> intListeners;
+       private final ListenerManager<Double> doubleListeners;
+       private final ListenerManager<ColorDefinition> colorDefinitionListeners;
+
+       protected EclipsePreferences(ITheme theme, IPreferenceStore prefs, Preferences defaultPrefs)
+       {
+               this.theme = theme;
+               this.prefs = prefs;
+               this.defaultPrefs = defaultPrefs;
+
+               this.booleanListeners = new ListenerManager<>(this::getBoolean);
+               this.intListeners = new ListenerManager<>(this::getInt);
+               this.doubleListeners = new ListenerManager<>(this::getDouble);
+               this.colorDefinitionListeners = new ListenerManager<>(this::getColorDefinition);
+       }
+
+       @Override
+       public boolean getBoolean(String name)
+       {
+               prefs.setDefault(name, defaultPrefs.getBoolean(name));
+               return prefs.getBoolean(name);
+       }
+
+       @Override
+       public int getInt(String name)
+       {
+               prefs.setDefault(name, defaultPrefs.getInt(name));
+               return prefs.getInt(name);
+       }
+
+       @Override
+       public double getDouble(String name)
+       {
+               prefs.setDefault(name, defaultPrefs.getDouble(name));
+               return prefs.getDouble(name);
+       }
+
+       @Override
+       public ColorDefinition getColorDefinition(String name)
+       {
+               RGB rgb = getColorRegistry().getRGB(name);
+               if (rgb == null)
+               {
+                       StatusManager.getManager().handle(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "No color for name " + name));
+                       return null;
+               }
+               return new ColorDefinition(rgb.red, rgb.green, rgb.blue);
+       }
+
+       @Override
+       public Color getColor(String name)
+       {
+               return getColorRegistry().get(name);
+       }
+
+       private ColorRegistry getColorRegistry()
+       {
+               return theme.getColorRegistry();
+       }
+
+       @Override
+       public void addBooleanListener(String name, Consumer<Boolean> listener)
+       {
+               booleanListeners.addListener(name, listener);
+       }
+
+       @Override
+       public void removeBooleanListener(String name, Consumer<Boolean> listener)
+       {
+               booleanListeners.removeListener(name, listener);
+       }
+
+       @Override
+       public void addIntListener(String name, Consumer<Integer> listener)
+       {
+               intListeners.addListener(name, listener);
+       }
+
+       @Override
+       public void removeIntListener(String name, Consumer<Integer> listener)
+       {
+               intListeners.removeListener(name, listener);
+       }
+
+       @Override
+       public void addDoubleListener(String name, Consumer<Double> listener)
+       {
+               doubleListeners.addListener(name, listener);
+       }
+
+       @Override
+       public void removeDoubleListener(String name, Consumer<Double> listener)
+       {
+               doubleListeners.removeListener(name, listener);
+       }
+
+       @Override
+       public void addColorDefinitionListener(String name, Consumer<ColorDefinition> listener)
+       {
+               colorDefinitionListeners.addListener(name, listener);
+       }
+
+       @Override
+       public void removeColorDefinitionListener(String name, Consumer<ColorDefinition> listener)
+       {
+               colorDefinitionListeners.removeListener(name, listener);
+       }
+
+       private class ListenerManager<P>
+       {
+               private final Map<String, Set<Consumer<P>>> listenersPerName;
+               private final IPropertyChangeListener eclipseListener;
+
+               public ListenerManager(Function<String, P> preferenceGetter)
+               {
+                       this.listenersPerName = new HashMap<>();
+                       this.eclipseListener = e ->
+                       {
+                               String name = e.getProperty();
+                               synchronized (listenersPerName)
+                               {
+                                       Set<Consumer<P>> listenersThisName = listenersPerName.get(name);
+                                       if (listenersThisName != null)
+                                       {
+                                               P p = preferenceGetter.apply(name);
+                                               listenersThisName.forEach(l -> l.accept(p));
+                                       }
+                               }
+                       };
+               }
+
+               public void addListener(String name, Consumer<P> listener)
+               {
+                       synchronized (listenersPerName)
+                       {
+                               boolean wasEmpty = listenersPerName.isEmpty();
+                               listenersPerName.computeIfAbsent(name, n -> new HashSet<>()).add(listener);
+                               if (wasEmpty)
+                                       prefs.addPropertyChangeListener(eclipseListener);
+                       }
+               }
+
+               public void removeListener(String name, Consumer<P> listener)
+               {
+                       synchronized (listenersPerName)
+                       {
+                               Set<Consumer<P>> listenersThisName = listenersPerName.get(name);
+                               if (listenersThisName != null)
+                               {
+                                       listenersThisName.remove(listener);
+                                       if (listenersThisName.isEmpty())
+                                               listenersPerName.remove(name);
+                               }
+                               if (listenersPerName.isEmpty())
+                                       prefs.addPropertyChangeListener(eclipseListener);
+                       }
+               }
+       }
+}
\ No newline at end of file
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipseRenderPreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipseRenderPreferences.java
new file mode 100755 (executable)
index 0000000..f976ccc
--- /dev/null
@@ -0,0 +1,15 @@
+package net.mograsim.plugin.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.themes.ITheme;
+
+import net.mograsim.logic.model.preferences.DefaultRenderPreferences;
+import net.mograsim.logic.model.preferences.RenderPreferences;
+
+public class EclipseRenderPreferences extends EclipsePreferences implements RenderPreferences
+{
+       public EclipseRenderPreferences(ITheme theme, IPreferenceStore prefs)
+       {
+               super(theme, prefs, new DefaultRenderPreferences());
+       }
+}
diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/PluginPreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/PluginPreferences.java
new file mode 100755 (executable)
index 0000000..3378e66
--- /dev/null
@@ -0,0 +1,13 @@
+package net.mograsim.plugin.preferences;
+
+import net.mograsim.preferences.Preferences;
+
+public interface PluginPreferences extends Preferences
+{
+       public static final String PREFIX = "net.mograsim.plugin.core.";
+
+       public static final String MAX_MEMORY_CHANGE_INTERVAL = "net.mograsim.plugin.core.maxmemchangeinterval";
+       public static final String SIMULATION_SPEED_PRECISION = "net.mograsim.plugin.core.simspeedprecision";
+       public static final String MPM_EDITOR_BITS_AS_COLUMN_NAME = "net.mograsim.plugin.core.editors.mpm.bitsascolumnname";
+
+}
index 81e0f16..25c0f71 100644 (file)
@@ -1,5 +1,7 @@
 package net.mograsim.plugin.tables.mi;
 
+import static net.mograsim.plugin.preferences.PluginPreferences.MPM_EDITOR_BITS_AS_COLUMN_NAME;
+
 import java.util.Arrays;
 
 import org.eclipse.jface.viewers.ColumnLabelProvider;
@@ -25,10 +27,10 @@ import net.mograsim.machine.mi.MicroInstructionDefinition;
 import net.mograsim.machine.mi.MicroInstructionMemory;
 import net.mograsim.machine.mi.parameters.MnemonicFamily;
 import net.mograsim.machine.mi.parameters.ParameterClassification;
+import net.mograsim.plugin.MograsimActivator;
 import net.mograsim.plugin.tables.AddressLabelProvider;
 import net.mograsim.plugin.tables.DisplaySettings;
 import net.mograsim.plugin.tables.LazyTableViewer;
-import net.mograsim.preferences.Preferences;
 
 public class InstructionTable
 {
@@ -134,7 +136,8 @@ public class InstructionTable
 
                        String columnTitle;
                        String bitString = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit;
-                       if (Preferences.current().getBoolean("net.mograsim.plugin.core.editors.mpm.bitsascolumnname"))
+                       // TODO add a listener
+                       if (MograsimActivator.instance().getPluginPrefs().getBoolean(MPM_EDITOR_BITS_AS_COLUMN_NAME))
                                columnTitle = bitString;
                        else
                                columnTitle = miDef.getParameterTitle(i).orElse(bitString);
index f81fb4b..210e9de 100644 (file)
@@ -1,5 +1,9 @@
 package net.mograsim.plugin.views;
 
+import static net.mograsim.logic.model.preferences.RenderPreferences.DRAG_BUTTON;
+import static net.mograsim.logic.model.preferences.RenderPreferences.ZOOM_BUTTON;
+import static net.mograsim.plugin.preferences.PluginPreferences.SIMULATION_SPEED_PRECISION;
+
 import java.util.HashSet;
 import java.util.Optional;
 import java.util.Set;
@@ -26,16 +30,17 @@ import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInpu
 import net.mograsim.logic.core.LogicObserver;
 import net.mograsim.logic.core.components.CoreClock;
 import net.mograsim.logic.model.LogicUICanvas;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.machine.Machine;
 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
 import net.mograsim.machine.mi.AssignableMicroInstructionMemory;
+import net.mograsim.plugin.MograsimActivator;
 import net.mograsim.plugin.launch.MachineDebugContextListener;
 import net.mograsim.plugin.launch.MachineDebugTarget;
 import net.mograsim.plugin.tables.DisplaySettings;
 import net.mograsim.plugin.tables.mi.ActiveInstructionPreviewContentProvider;
 import net.mograsim.plugin.tables.mi.InstructionTable;
 import net.mograsim.plugin.util.OverlappingFillLayout;
-import net.mograsim.preferences.Preferences;
 
 public class SimulationView extends ViewPart
 {
@@ -153,7 +158,8 @@ public class SimulationView extends ViewPart
 
                simSpeedInput = new DoubleInput(c, SWT.NONE);
                controlsToDisableWhenNoMachinePresent.add(simSpeedInput);
-               simSpeedInput.setPrecision(Preferences.current().getInt("net.mograsim.plugin.core.simspeedprecision"));
+               // TODO add a listener
+               simSpeedInput.setPrecision(MograsimActivator.instance().getPluginPrefs().getInt(SIMULATION_SPEED_PRECISION));
                simSpeedInput.addChangeListener(speed ->
                {
                        if (speed != 0)
@@ -220,11 +226,14 @@ public class SimulationView extends ViewPart
 
                        Machine machine = debugTarget.getMachine();
 
-                       canvas = new LogicUICanvas(canvasParent, SWT.NONE, machine.getModel());
+                       RenderPreferences renderPrefs = MograsimActivator.instance().getRenderPrefs();
+                       canvas = new LogicUICanvas(canvasParent, SWT.NONE, machine.getModel(), renderPrefs);
                        canvas.addListener(SWT.MouseDown, e -> canvas.setFocus());
                        ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(canvas);
-                       userInput.buttonDrag = Preferences.current().getInt("net.mograsim.logic.model.button.drag");
-                       userInput.buttonZoom = Preferences.current().getInt("net.mograsim.logic.model.button.zoom");
+                       // TODO add a listener
+                       userInput.buttonDrag = renderPrefs.getInt(DRAG_BUTTON);
+                       // TODO add a listener
+                       userInput.buttonZoom = renderPrefs.getInt(ZOOM_BUTTON);
                        userInput.enableUserInput();
                        if (zoom > 0)
                        {
index 67bb46a..d51acab 100644 (file)
@@ -1,90 +1,19 @@
 package net.mograsim.preferences;
 
-import net.mograsim.preferences.ColorDefinition.BuiltInColor;
+import java.util.function.Consumer;
 
-public class DefaultPreferences extends Preferences
+public abstract class DefaultPreferences implements Preferences
 {
-       @Override
-       public boolean getBoolean(String name)
-       {
-               switch (name)
-               {
-               case "net.mograsim.logic.model.improvetext":
-                       return true;
-               case "net.mograsim.logic.model.debug.openhlsshell":
-                       return false;
-               case "net.mograsim.plugin.core.editors.mpm.bitsascolumnname":
-                       return false;
-               default:
-                       throw new IllegalArgumentException("Unknown boolean preference name: " + name);
-               }
-       }
+       // Adding / removing listeners. All are no-ops, since DefaultPreferences are immutable.
 
-       @Override
-       public int getInt(String name)
-       {
-               switch (name)
-               {
-               case "net.mograsim.logic.model.debug.hlsshelldepth":
-                       return 0;
-               case "net.mograsim.logic.model.button.action":
-                       return 3;
-               case "net.mograsim.logic.model.button.drag":
-                       return 1;
-               case "net.mograsim.logic.model.button.zoom":
-                       return 2;
-               case "net.mograsim.plugin.core.simspeedprecision":
-                       return 6;
-               case "net.mograsim.plugin.core.maxmemchangeinterval":
-                       return 1000;
-               default:
-                       throw new IllegalArgumentException("Unknown int preference name: " + name);
-               }
-       }
-
-       @Override
-       public double getDouble(String name)
-       {
-               switch (name)
-               {
-               case "net.mograsim.logic.model.linewidth.default":
-                       return 0.5;
-               case "net.mograsim.logic.model.linewidth.wire.singlebit":
-                       return 0.5;
-               case "net.mograsim.logic.model.linewidth.wire.multibit":
-                       return 0.85;
-               case "net.mograsim.logic.model.submodel.zoomalpha0":
-                       return 0.1;
-               case "net.mograsim.logic.model.submodel.zoomalpha1":
-                       return 0.2;
-               default:
-                       throw new IllegalArgumentException("Unknown double preference name: " + name);
-               }
-       }
-
-       @Override
-       public ColorDefinition getColorDefinition(String name)
-       {
-               switch (name)
-               {
-               case "net.mograsim.logic.model.color.bit.one":
-                       return new ColorDefinition(BuiltInColor.COLOR_GREEN);
-               case "net.mograsim.logic.model.color.bit.u":
-                       return new ColorDefinition(BuiltInColor.COLOR_CYAN);
-               case "net.mograsim.logic.model.color.bit.x":
-                       return new ColorDefinition(BuiltInColor.COLOR_RED);
-               case "net.mograsim.logic.model.color.bit.z":
-                       return new ColorDefinition(BuiltInColor.COLOR_YELLOW);
-               case "net.mograsim.logic.model.color.bit.zero":
-                       return new ColorDefinition(BuiltInColor.COLOR_GRAY);
-               case "net.mograsim.logic.model.color.background":
-                       return new ColorDefinition(BuiltInColor.COLOR_WHITE);
-               case "net.mograsim.logic.model.color.foreground":
-                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);
-               case "net.mograsim.logic.model.color.text":
-                       return new ColorDefinition(BuiltInColor.COLOR_BLACK);
-               default:
-                       throw new IllegalArgumentException("Unknown color preference name: " + name);
-               }
-       }
+       //@formatter:off
+       @Override public void addBooleanListener(String name, Consumer<Boolean> listener) {/**/}
+       @Override public void removeBooleanListener(String name, Consumer<Boolean> listener) {/**/}
+       @Override public void addIntListener(String name, Consumer<Integer> listener) {/**/}
+       @Override public void removeIntListener(String name, Consumer<Integer> listener) {/**/}
+       @Override public void addDoubleListener(String name, Consumer<Double> listener) {/**/}
+       @Override public void removeDoubleListener(String name, Consumer<Double> listener) {/**/}
+       @Override public void addColorDefinitionListener(String name, Consumer<ColorDefinition> listener) {/**/}
+       @Override public void removeColorDefinitionListener(String name, Consumer<ColorDefinition> listener) {/**/}
+       //@formatter:on
 }
\ No newline at end of file
index f249856..f19ae65 100644 (file)
@@ -1,34 +1,36 @@
 package net.mograsim.preferences;
 
-import java.util.Objects;
+import java.util.function.Consumer;
 
 import org.eclipse.swt.graphics.Color;
 
-public abstract class Preferences
+public interface Preferences
 {
-       private static Preferences currentPreferences;
+       public boolean getBoolean(String name);
 
-       public static void setPreferences(Preferences preferences)
-       {
-               currentPreferences = Objects.requireNonNull(preferences);
-       }
+       public void addBooleanListener(String name, Consumer<Boolean> listener);
 
-       public static Preferences current()
-       {
-               if (currentPreferences == null)
-                       currentPreferences = new DefaultPreferences();
-               return currentPreferences;
-       }
+       public void removeBooleanListener(String name, Consumer<Boolean> listener);
+
+       public int getInt(String name);
+
+       public void addIntListener(String name, Consumer<Integer> listener);
+
+       public void removeIntListener(String name, Consumer<Integer> listener);
+
+       public double getDouble(String name);
+
+       public void addDoubleListener(String name, Consumer<Double> listener);
 
-       public abstract boolean getBoolean(String name);
+       public void removeDoubleListener(String name, Consumer<Double> listener);
 
-       public abstract int getInt(String name);
+       public ColorDefinition getColorDefinition(String name);
 
-       public abstract double getDouble(String name);
+       public void addColorDefinitionListener(String name, Consumer<ColorDefinition> listener);
 
-       public abstract ColorDefinition getColorDefinition(String name);
+       public void removeColorDefinitionListener(String name, Consumer<ColorDefinition> listener);
 
-       public Color getColor(String name)
+       public default Color getColor(String name)
        {
                return ColorManager.current().toColor(getColorDefinition(name));
        }
index 622aa69..080e6f3 100644 (file)
@@ -24,6 +24,7 @@ import net.mograsim.logic.model.am2900.machine.Am2900MicroInstructionDefinition;
 import net.mograsim.logic.model.am2900.machine.Am2900MicroInstructionMemoryDefinition;
 import net.mograsim.logic.model.am2900.machine.StrictAm2900MachineDefinition;
 import net.mograsim.logic.model.am2900.machine.registers.am2901.NumberedRegister;
+import net.mograsim.logic.model.preferences.DefaultRenderPreferences;
 import net.mograsim.machine.MainMemory;
 import net.mograsim.machine.mi.MicroInstruction;
 import net.mograsim.machine.mi.MicroInstructionDefinition;
@@ -99,7 +100,7 @@ public class TestGCD
 
        private void startGUI()
        {
-               new Thread(() -> new LogicUIStandaloneGUI(mach.getModel()).run(), "GUI thread").start();
+               new Thread(() -> new LogicUIStandaloneGUI(mach.getModel(), new DefaultRenderPreferences()).run(), "GUI thread").start();
        }
 
        @Test
index e46561d..1f52750 100644 (file)
@@ -10,6 +10,7 @@ import net.mograsim.logic.model.am2900.Am2900Loader;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch;
 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
@@ -44,7 +45,7 @@ public class Am2904Testbench
                        }
 
                        @Override
-                       public void render(GeneralGC gc, Rectangle visibleRegion)
+                       public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
                        {
                                // do nothing
                        }
index 51833be..54321cb 100644 (file)
@@ -29,6 +29,7 @@ import net.mograsim.logic.model.model.wires.ModelWire;
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.modeladapter.CoreModelParameters;
 import net.mograsim.logic.model.modeladapter.LogicCoreAdapter;
+import net.mograsim.logic.model.preferences.DefaultRenderPreferences;
 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
 import net.mograsim.logic.model.util.ModellingTool;
 
@@ -261,7 +262,7 @@ public class TestEnvironmentHelper
        {
                try
                {
-                       new LogicUIStandaloneGUI(logicModel).run();
+                       new LogicUIStandaloneGUI(logicModel, new DefaultRenderPreferences()).run();
                        logicModel.setRedrawHandler(null);
                }
                catch (Exception e)