+++ /dev/null
-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
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;
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;
{
this.toBeEdited = toBeEdited;
handleManager = new HandleManager(this);
+ renderPrefs = new DefaultRenderPreferences();
gui = new EditorGUI(this);
userInput = new EditorUserInput(this);
stateManager = new StateManager(this);
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
{
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);
});
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 ->
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));
});
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;
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
{
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();
}
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,
--- /dev/null
+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
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;
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.
*/
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())
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())
}
}
- private void openDebugSetHighLevelStateShell(LogicModel model)
+ private void openDebugSetHighLevelStateShell(LogicModel model, int depth)
{
Shell debugShell = new Shell();
debugShell.setLayout(new GridLayout(2, false));
@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));
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,
}
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,
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;
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
{
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));
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;
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.
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();
}
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
{
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)
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;
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>
pinsByName.values().forEach(this::removePinWithoutRedraw);
}
+ // basic getters
+
+ public String getName()
+ {
+ return name;
+ }
+
// pins
/**
*
* @author Daniel Kirschten
*/
- public abstract void render(GeneralGC gc, Rectangle visibleRegion);
+ public abstract void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion);
// serializing
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;
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
{
}
@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());
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);
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;
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
{
}
@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());
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);
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;
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
{
}
@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());
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);
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;
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
{
}
@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());
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);
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;
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
{
}
@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
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);
}
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;
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
}
@Override
- public void render(GeneralGC gc, Rectangle visibleRegion)
+ public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
{
if (!calculatedSize)
{
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);
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;
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
{
}
@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();
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;
// "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
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 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
{
}
@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;
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);
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;
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
}
@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);
* 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.
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);
}
/**
*
* @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);
}
/**
*
* @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)
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
}
@Override
- public void render(GeneralGC gc, Rectangle visibleRegion)
+ public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
{// nothing to do here
}
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;
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.
*
* @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
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;
}
@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);
--- /dev/null
+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
--- /dev/null
+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";
+}
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
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
{
}
@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());
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.
}
@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);
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
{
}
@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);
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;
}
@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())
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;
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
}
@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();
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);
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;
}
@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
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,
+++ /dev/null
-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
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
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
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();
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();
public void dispose()
{
exec.stopLiveExecution();
- if (Preferences.current() == currentThemePreferences)
- Preferences.setPreferences(oldPreferences);
}
}
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;
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;
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
{
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;
}
--- /dev/null
+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
--- /dev/null
+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());
+ }
+}
--- /dev/null
+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
--- /dev/null
+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());
+ }
+}
--- /dev/null
+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";
+
+}
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;
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
{
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);
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;
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
{
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)
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)
{
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
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));
}
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;
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
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;
}
@Override
- public void render(GeneralGC gc, Rectangle visibleRegion)
+ public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion)
{
// do nothing
}
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;
{
try
{
- new LogicUIStandaloneGUI(logicModel).run();
+ new LogicUIStandaloneGUI(logicModel, new DefaultRenderPreferences()).run();
logicModel.setRedrawHandler(null);
}
catch (Exception e)