From 7041f02ba209813aef69d16805bfffc7f7cae724 Mon Sep 17 00:00:00 2001 From: hneemann Date: Sat, 19 Mar 2016 10:49:40 +0100 Subject: [PATCH] renamed some classes --- .../java/de/neemann/digital/core/Model.java | 10 +++---- .../java/de/neemann/digital/core/Node.java | 4 +-- .../neemann/digital/core/ObservableValue.java | 16 +++++------ .../core/{Listener.java => Observer.java} | 4 +-- .../neemann/digital/core/arithmetic/Add.java | 6 ++-- .../neemann/digital/core/arithmetic/Mul.java | 4 +-- .../de/neemann/digital/core/basic/FanIn.java | 2 +- .../de/neemann/digital/core/basic/Not.java | 2 +- .../de/neemann/digital/core/basic/XOr.java | 4 +-- .../neemann/digital/core/flipflops/D_FF.java | 4 +-- .../neemann/digital/core/flipflops/JK_FF.java | 6 ++-- .../neemann/digital/core/flipflops/RS_FF.java | 6 ++-- .../neemann/digital/core/flipflops/T_FF.java | 2 +- .../de/neemann/digital/core/wiring/Delay.java | 2 +- .../digital/core/wiring/Multiplexer.java | 2 +- .../java/de/neemann/digital/gui/Main.java | 6 ++-- .../gui/components/CircuitComponent.java | 9 ++++-- .../gui/draw/model/ModelDescription.java | 14 ++++++++-- .../digital/gui/draw/model/ModelEntry.java | 14 ++++++++-- .../digital/gui/draw/parts/Circuit.java | 14 ++++++---- .../digital/gui/draw/parts/IOState.java | 26 +++++++++++++++++ .../digital/gui/draw/parts/VisualPart.java | 28 +++++++++---------- .../neemann/digital/gui/draw/parts/Wire.java | 2 +- .../digital/gui/draw/shapes/ConstShape.java | 12 ++++---- .../digital/gui/draw/shapes/Drawable.java | 8 +++--- .../digital/gui/draw/shapes/GenericShape.java | 8 +++--- .../digital/gui/draw/shapes/InputShape.java | 26 ++++++++--------- .../digital/gui/draw/shapes/Interactor.java | 4 +-- .../digital/gui/draw/shapes/LEDShape.java | 20 ++++++------- .../digital/gui/draw/shapes/OutputShape.java | 20 ++++++------- .../digital/gui/draw/shapes/ProbeShape.java | 8 +++--- .../digital/gui/draw/shapes/Shape.java | 16 ++++++----- 32 files changed, 180 insertions(+), 129 deletions(-) rename src/main/java/de/neemann/digital/core/{Listener.java => Observer.java} (55%) create mode 100644 src/main/java/de/neemann/digital/gui/draw/parts/IOState.java diff --git a/src/main/java/de/neemann/digital/core/Model.java b/src/main/java/de/neemann/digital/core/Model.java index 7de24b2ff..77a31c9da 100644 --- a/src/main/java/de/neemann/digital/core/Model.java +++ b/src/main/java/de/neemann/digital/core/Model.java @@ -13,7 +13,7 @@ public class Model { private ArrayList nodesToUpdateNext; private int version; private int maxCounter = 1000; - private Listener listener; + private Observer observer; public Model() { this.nodes = new ArrayList<>(); @@ -42,8 +42,8 @@ public class Model { public void doStep(boolean noise) throws NodeException { int counter = 0; while (!doMicroStep(noise)) { - if (listener != null) - listener.needsUpdate(); + if (observer != null) + observer.hasChanged(); if (counter++ > maxCounter) { throw new NodeException("seemsToOscillate"); } @@ -85,7 +85,7 @@ public class Model { doStep(noise); } - public void setListener(Listener listener) { - this.listener = listener; + public void setObserver(Observer observer) { + this.observer = observer; } } diff --git a/src/main/java/de/neemann/digital/core/Node.java b/src/main/java/de/neemann/digital/core/Node.java index 4d0c75ea3..cecdce4bb 100644 --- a/src/main/java/de/neemann/digital/core/Node.java +++ b/src/main/java/de/neemann/digital/core/Node.java @@ -3,7 +3,7 @@ package de.neemann.digital.core; /** * @author hneemann */ -public abstract class Node implements Listener { +public abstract class Node implements Observer { private Model model; private int version; @@ -13,7 +13,7 @@ public abstract class Node implements Listener { } @Override - public void needsUpdate() { + public void hasChanged() { if (model == null) throw new RuntimeException("noModelSet"); diff --git a/src/main/java/de/neemann/digital/core/ObservableValue.java b/src/main/java/de/neemann/digital/core/ObservableValue.java index d5291c104..5ed81d2c2 100644 --- a/src/main/java/de/neemann/digital/core/ObservableValue.java +++ b/src/main/java/de/neemann/digital/core/ObservableValue.java @@ -7,7 +7,7 @@ import java.util.ArrayList; */ public class ObservableValue extends Value { - private final ArrayList listeners; + private final ArrayList observers; private final String name; private final long mask; @@ -19,20 +19,20 @@ public class ObservableValue extends Value { super(bits, highZ); mask = (1L << bits) - 1; this.name = name; - listeners = new ArrayList<>(); + observers = new ArrayList<>(); } - public void addListener(Listener listener) { - listeners.add(listener); + public void addObserver(Observer observer) { + observers.add(observer); } - public void removeListener(Listener listener) { - listeners.remove(listener); + public void removeObserver(Observer observer) { + observers.remove(observer); } public void hasChanged() { - for (Listener l : listeners) { - l.needsUpdate(); + for (Observer l : observers) { + l.hasChanged(); } } diff --git a/src/main/java/de/neemann/digital/core/Listener.java b/src/main/java/de/neemann/digital/core/Observer.java similarity index 55% rename from src/main/java/de/neemann/digital/core/Listener.java rename to src/main/java/de/neemann/digital/core/Observer.java index 4f2739c3c..287472ebd 100644 --- a/src/main/java/de/neemann/digital/core/Listener.java +++ b/src/main/java/de/neemann/digital/core/Observer.java @@ -3,6 +3,6 @@ package de.neemann.digital.core; /** * @author hneemann */ -public interface Listener { - void needsUpdate(); +public interface Observer { + void hasChanged(); } diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Add.java b/src/main/java/de/neemann/digital/core/arithmetic/Add.java index 503d1cff7..dcecc5a6f 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Add.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Add.java @@ -54,11 +54,11 @@ public class Add extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws BitsException { a = inputs[0]; - a.addListener(this); + a.addObserver(this); b = inputs[1]; - b.addListener(this); + b.addObserver(this); c_in = inputs[2]; - c_in.addListener(this); + c_in.addObserver(this); if (a.getBits() != bits) throw new BitsException("wrongBitCount", a); diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Mul.java b/src/main/java/de/neemann/digital/core/arithmetic/Mul.java index 7b6dfd8b4..432fa7292 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Mul.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Mul.java @@ -40,9 +40,9 @@ public class Mul extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws NodeException { a = inputs[0]; - a.addListener(this); + a.addObserver(this); b = inputs[1]; - b.addListener(this); + b.addObserver(this); } @Override diff --git a/src/main/java/de/neemann/digital/core/basic/FanIn.java b/src/main/java/de/neemann/digital/core/basic/FanIn.java index 9c7fe6754..ba148d87a 100644 --- a/src/main/java/de/neemann/digital/core/basic/FanIn.java +++ b/src/main/java/de/neemann/digital/core/basic/FanIn.java @@ -27,7 +27,7 @@ public abstract class FanIn extends Node implements Part { private void addInput(ObservableValue value) throws NodeException { output.checkBits(value); inputs.add(value); - value.addListener(this); + value.addObserver(this); } @Override diff --git a/src/main/java/de/neemann/digital/core/basic/Not.java b/src/main/java/de/neemann/digital/core/basic/Not.java index ff16bc60f..02b745863 100644 --- a/src/main/java/de/neemann/digital/core/basic/Not.java +++ b/src/main/java/de/neemann/digital/core/basic/Not.java @@ -39,7 +39,7 @@ public class Not extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws NodeException { input = inputs[0]; - input.addListener(this); + input.addObserver(this); } @Override diff --git a/src/main/java/de/neemann/digital/core/basic/XOr.java b/src/main/java/de/neemann/digital/core/basic/XOr.java index 1082b980f..d19799fcd 100644 --- a/src/main/java/de/neemann/digital/core/basic/XOr.java +++ b/src/main/java/de/neemann/digital/core/basic/XOr.java @@ -39,9 +39,9 @@ public class XOr extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws BitsException { a = inputs[0]; - a.addListener(this); + a.addObserver(this); b = inputs[1]; - b.addListener(this); + b.addObserver(this); if (a.getBits() != bits) throw new BitsException("wrongBitCount", a); diff --git a/src/main/java/de/neemann/digital/core/flipflops/D_FF.java b/src/main/java/de/neemann/digital/core/flipflops/D_FF.java index 6d2ba90c4..bcb0d90f8 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/D_FF.java +++ b/src/main/java/de/neemann/digital/core/flipflops/D_FF.java @@ -46,9 +46,9 @@ public class D_FF extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws BitsException { dVal = inputs[0]; - dVal.addListener(this); + dVal.addObserver(this); clockVal = inputs[1]; - clockVal.addListener(this); + clockVal.addObserver(this); if (dVal.getBits() != bits) throw new BitsException("wrongBitCount", dVal); diff --git a/src/main/java/de/neemann/digital/core/flipflops/JK_FF.java b/src/main/java/de/neemann/digital/core/flipflops/JK_FF.java index 31c4a0179..9b7c082c4 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/JK_FF.java +++ b/src/main/java/de/neemann/digital/core/flipflops/JK_FF.java @@ -50,11 +50,11 @@ public class JK_FF extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws BitsException { jVal = inputs[0]; - jVal.addListener(this); + jVal.addObserver(this); clockVal = inputs[1]; - clockVal.addListener(this); + clockVal.addObserver(this); kVal = inputs[2]; - kVal.addListener(this); + kVal.addObserver(this); if (jVal.getBits() != 1) throw new BitsException("wrongBitCount", jVal); diff --git a/src/main/java/de/neemann/digital/core/flipflops/RS_FF.java b/src/main/java/de/neemann/digital/core/flipflops/RS_FF.java index 43666289f..68ff764a2 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/RS_FF.java +++ b/src/main/java/de/neemann/digital/core/flipflops/RS_FF.java @@ -49,11 +49,11 @@ public class RS_FF extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws BitsException { jVal = inputs[0]; - jVal.addListener(this); + jVal.addObserver(this); clockVal = inputs[1]; - clockVal.addListener(this); + clockVal.addObserver(this); kVal = inputs[2]; - kVal.addListener(this); + kVal.addObserver(this); if (jVal.getBits() != 1) throw new BitsException("wrongBitCount", jVal); diff --git a/src/main/java/de/neemann/digital/core/flipflops/T_FF.java b/src/main/java/de/neemann/digital/core/flipflops/T_FF.java index 1a56dbd38..db8fa8c46 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/T_FF.java +++ b/src/main/java/de/neemann/digital/core/flipflops/T_FF.java @@ -43,7 +43,7 @@ public class T_FF extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws BitsException { clockVal = inputs[0]; - clockVal.addListener(this); + clockVal.addObserver(this); if (clockVal.getBits() != 1) throw new BitsException("carryIsABit", clockVal); diff --git a/src/main/java/de/neemann/digital/core/wiring/Delay.java b/src/main/java/de/neemann/digital/core/wiring/Delay.java index 2a6afbc67..ca653538b 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Delay.java +++ b/src/main/java/de/neemann/digital/core/wiring/Delay.java @@ -43,7 +43,7 @@ public class Delay extends Node implements Part { @Override public void setInputs(ObservableValue... inputs) throws NodeException { input = inputs[0]; - input.addListener(this); + input.addObserver(this); if (input.getBits() != bits) throw new BitsException("wrongBitCountInDelay", input, output); diff --git a/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java b/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java index a6ab96881..e501a544d 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java +++ b/src/main/java/de/neemann/digital/core/wiring/Multiplexer.java @@ -38,7 +38,7 @@ public class Multiplexer extends FanIn { @Override public void setInputs(ObservableValue... inputs) throws NodeException { selector = inputs[0]; - selector.addListener(this); + selector.addObserver(this); super.setInputs(Arrays.copyOfRange(inputs, 1, inputs.length)); if (selector.getBits() != selectorBits) diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 6363ec087..1e8b18007 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -3,8 +3,8 @@ package de.neemann.digital.gui; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import com.thoughtworks.xstream.io.xml.StaxDriver; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; import de.neemann.digital.core.part.AttributeKey; import de.neemann.digital.core.part.PartAttributes; import de.neemann.digital.gui.components.CircuitComponent; @@ -132,9 +132,9 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { ModelDescription m = new ModelDescription(circuitComponent.getCircuit(), library); Model model = m.createModel(circuitComponent); if (microStep.isSelected()) { - model.setListener(new Listener() { + model.setObserver(new Observer() { @Override - public void needsUpdate() { + public void hasChanged() { try { Thread.sleep(2000); } catch (InterruptedException e1) { diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index 9d676034d..4e6f3e05f 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -1,6 +1,6 @@ package de.neemann.digital.gui.components; -import de.neemann.digital.core.Listener; +import de.neemann.digital.core.Observer; import de.neemann.digital.core.part.AttributeKey; import de.neemann.digital.gui.draw.graphics.*; import de.neemann.digital.gui.draw.graphics.Polygon; @@ -21,7 +21,7 @@ import java.util.ArrayList; /** * @author hneemann */ -public class CircuitComponent extends JComponent implements Listener { +public class CircuitComponent extends JComponent implements Observer { private static final String delAction = "myDelAction"; private final PartLibrary library; @@ -132,7 +132,7 @@ public class CircuitComponent extends JComponent implements Listener { } @Override - public void needsUpdate() { + public void hasChanged() { repaint(); } @@ -235,6 +235,7 @@ public class CircuitComponent extends JComponent implements Listener { partToInsert.setPos(raster(partToInsert.getPos())); if (insert) circuit.add(partToInsert); + circuit.modified(); repaint(); partToInsert = null; } @@ -248,6 +249,7 @@ public class CircuitComponent extends JComponent implements Listener { Point p = new Point(e.getX(), e.getY()); SwingUtilities.convertPointToScreen(p, CircuitComponent.this); new AttributeDialog(p, list, vp.getPartAttributes()).showDialog(); + circuit.modified(); repaint(); } } @@ -316,6 +318,7 @@ public class CircuitComponent extends JComponent implements Listener { for (Moveable m : elementsToMove) m.move(delta); + circuit.modified(); corner1.move(delta); corner2.move(delta); diff --git a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java index e8cc91ff4..97fea6d32 100644 --- a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java +++ b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java @@ -1,8 +1,8 @@ package de.neemann.digital.gui.draw.model; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.Observer; import de.neemann.digital.core.part.Part; import de.neemann.digital.core.part.PartTypeDescription; import de.neemann.digital.gui.draw.library.PartLibrary; @@ -35,14 +35,22 @@ public class ModelDescription { } } - public Model createModel(Listener listener) throws PinException, NodeException { + /** + * Creates the model + * + * @param guiObserver can be used to update the GUI by calling hasChanged, maybe null + * @return the model + * @throws PinException + * @throws NodeException + */ + public Model createModel(Observer guiObserver) throws PinException, NodeException { for (Net n : netList) n.interconnect(); Model m = new Model(); for (ModelEntry e : entries) - e.applyInputs(listener, m); + e.applyInputs(guiObserver, m); for (ModelEntry e : entries) e.getPart().registerNodes(m); diff --git a/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java b/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java index bf8fef5cd..61ecdebd4 100644 --- a/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java +++ b/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java @@ -1,9 +1,9 @@ package de.neemann.digital.gui.draw.model; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.Observer; import de.neemann.digital.core.part.Part; import de.neemann.digital.gui.draw.parts.*; @@ -25,7 +25,15 @@ public class ModelEntry { this.inputNames = inputNames; } - public void applyInputs(Listener listener, Model model) throws PinException, NodeException { + /** + * Sets the Inputs of the part contained in thes entry + * + * @param guiObserver can be used to update the GUI by calling hasChanged, maybe null + * @param model the model + * @throws PinException + * @throws NodeException + */ + public void applyInputs(Observer guiObserver, Model model) throws PinException, NodeException { HashMap ins = pins.getInputs(); ObservableValue[] inputs = new ObservableValue[inputNames.length]; @@ -43,7 +51,7 @@ public class ModelEntry { } part.setInputs(inputs); } - visualPart.setState(new State(inputs, part.getOutputs()), listener, model); + visualPart.setState(new IOState(inputs, part.getOutputs()), guiObserver, model); } public Part getPart() { diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java b/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java index fade7631f..8d5ac79e1 100644 --- a/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java +++ b/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java @@ -22,21 +22,21 @@ public class Circuit implements Drawable { } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { if (!dotsPresent) { new DotCreator(wires).applyDots(); dotsPresent = true; } for (Wire w : wires) - w.drawTo(graphic, state); + w.drawTo(graphic, ioState); for (VisualPart p : visualParts) - p.drawTo(graphic, state); + p.drawTo(graphic, ioState); } public void add(VisualPart visualPart) { visualParts.add(visualPart); - modified = true; + modified(); } public void add(Wire newWire) { @@ -60,7 +60,7 @@ public class Circuit implements Drawable { wires = checker.check(); dotsPresent = false; - modified = true; + modified(); } public ArrayList getParts() { @@ -99,6 +99,10 @@ public class Circuit implements Drawable { } } dotsPresent = false; + modified(); + } + + public void modified() { modified = true; } diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/IOState.java b/src/main/java/de/neemann/digital/gui/draw/parts/IOState.java new file mode 100644 index 000000000..82cb4a558 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/draw/parts/IOState.java @@ -0,0 +1,26 @@ +package de.neemann.digital.gui.draw.parts; + +import de.neemann.digital.core.ObservableValue; + +/** + * Represents the state of the state of the inputs and outputs of a part. + * + * @author hneemann + */ +public class IOState { + private final ObservableValue[] inputs; + private final ObservableValue[] outputs; + + public IOState(ObservableValue[] inputs, ObservableValue[] outputs) { + this.inputs = inputs; + this.outputs = outputs; + } + + public ObservableValue getInput(int i) { + return inputs[i]; + } + + public ObservableValue getOutput(int i) { + return outputs[i]; + } +} diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java b/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java index 2126dd1f8..18faad21e 100644 --- a/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java +++ b/src/main/java/de/neemann/digital/gui/draw/parts/VisualPart.java @@ -1,7 +1,7 @@ package de.neemann.digital.gui.draw.parts; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; import de.neemann.digital.core.part.AttributeKey; import de.neemann.digital.core.part.AttributeListener; import de.neemann.digital.core.part.PartAttributes; @@ -25,7 +25,7 @@ public class VisualPart implements Drawable, Moveable, AttributeListener { private final PartAttributes partAttributes; private transient GraphicMinMax minMax; private transient Shape shape; - private transient State state; + private transient IOState ioState; private transient Interactor interactor; private Vector pos; private int rotate; @@ -88,10 +88,10 @@ public class VisualPart implements Drawable, Moveable, AttributeListener { } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { Graphic gr = new GraphicTransform(graphic, createTransform()); Shape shape = getShape(); - shape.drawTo(gr, this.state); + shape.drawTo(gr, this.ioState); for (Pin p : shape.getPins()) gr.drawCircle(p.getPos().add(-PIN, -PIN), p.getPos().add(PIN, PIN), p.getDirection() == Pin.Direction.input ? Style.NORMAL : Style.FILLED); } @@ -103,7 +103,7 @@ public class VisualPart implements Drawable, Moveable, AttributeListener { public GraphicMinMax getMinMax() { if (minMax == null) { minMax = new GraphicMinMax(); - drawTo(minMax, state); + drawTo(minMax, ioState); } return minMax; } @@ -126,7 +126,7 @@ public class VisualPart implements Drawable, Moveable, AttributeListener { gr.fillRect(0, 0, bi.getWidth(), bi.getHeight()); gr.translate(-mm.getMin().x, -mm.getMin().y); GraphicSwing grs = new GraphicSwing(gr); - drawTo(grs, state); + drawTo(grs, ioState); return new ImageIcon(bi); } @@ -143,21 +143,21 @@ public class VisualPart implements Drawable, Moveable, AttributeListener { /** * Sets the state of the parts inputs and outputs * - * @param state actual state - * @param listener - * @param model + * @param ioState actual state + * @param guiObserver can be used to update the GUI by calling hasChanged, maybe null + * @param model the model */ - public void setState(State state, Listener listener, Model model) { - this.state = state; - if (state == null) + public void setState(IOState ioState, Observer guiObserver, Model model) { + this.ioState = ioState; + if (ioState == null) interactor = null; else - interactor = getShape().applyStateMonitor(state, listener, model); + interactor = getShape().applyStateMonitor(ioState, guiObserver, model); } public void clicked(CircuitComponent cc, Vector pos) { if (interactor != null) - interactor.interact(cc, pos, state); + interactor.interact(cc, pos, ioState); } @Override diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java b/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java index 26f4bb496..c2bb5860e 100644 --- a/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java +++ b/src/main/java/de/neemann/digital/gui/draw/parts/Wire.java @@ -23,7 +23,7 @@ public class Wire implements Drawable, Moveable { } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { Style style = Style.FILLED; if (value != null) { if (value.getValue() != 0) diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/ConstShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/ConstShape.java index 7344b9700..604ea1463 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/ConstShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/ConstShape.java @@ -1,14 +1,14 @@ package de.neemann.digital.gui.draw.shapes; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; import de.neemann.digital.gui.draw.graphics.Graphic; import de.neemann.digital.gui.draw.graphics.Orientation; import de.neemann.digital.gui.draw.graphics.Style; import de.neemann.digital.gui.draw.graphics.Vector; +import de.neemann.digital.gui.draw.parts.IOState; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; -import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann @@ -27,15 +27,15 @@ public class ConstShape implements Shape { } @Override - public Interactor applyStateMonitor(State state, Listener listener, Model model) { + public Interactor applyStateMonitor(IOState ioState, Observer guiObserver, Model model) { return null; } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { Vector textPos = new Vector(-3, 0); - if (state != null) - value = state.getOutput(0).getValue(); + if (ioState != null) + value = ioState.getOutput(0).getValue(); graphic.drawText(textPos, textPos.add(1, 0), Long.toString(value), Orientation.RIGHTCENTER, Style.NORMAL); } } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java b/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java index e87241ed8..9c289cd95 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/Drawable.java @@ -1,7 +1,7 @@ package de.neemann.digital.gui.draw.shapes; import de.neemann.digital.gui.draw.graphics.Graphic; -import de.neemann.digital.gui.draw.parts.State; +import de.neemann.digital.gui.draw.parts.IOState; /** * @author hneemann @@ -10,8 +10,8 @@ public interface Drawable { /** * Draws a part depending on its state * - * @param graphic - * @param state maybe null + * @param graphic interface to draw to + * @param ioState maybe null, if not in running mode */ - void drawTo(Graphic graphic, State state); + void drawTo(Graphic graphic, IOState ioState); } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java index 777c5e15d..18fe0228c 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/GenericShape.java @@ -1,11 +1,11 @@ package de.neemann.digital.gui.draw.shapes; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; import de.neemann.digital.gui.draw.graphics.*; +import de.neemann.digital.gui.draw.parts.IOState; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; -import de.neemann.digital.gui.draw.parts.State; /** * Universal Shape. Used for most components. @@ -74,12 +74,12 @@ public class GenericShape implements Shape { } @Override - public Interactor applyStateMonitor(State state, Listener listener, Model model) { + public Interactor applyStateMonitor(IOState ioState, Observer guiObserver, Model model) { return null; } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { int max = Math.max(inputs.length, outputs.length); int height = (max - 1) * SIZE + SIZE2; diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java index b28ef7e75..15595e2f5 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/InputShape.java @@ -1,13 +1,13 @@ package de.neemann.digital.gui.draw.shapes; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.Observer; import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.draw.graphics.*; +import de.neemann.digital.gui.draw.parts.IOState; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; -import de.neemann.digital.gui.draw.parts.State; import static de.neemann.digital.gui.draw.shapes.OutputShape.RAD; import static de.neemann.digital.gui.draw.shapes.OutputShape.SIZE; @@ -31,24 +31,24 @@ public class InputShape implements Shape { } @Override - public Interactor applyStateMonitor(State state, Listener listener, Model model) { - state.getOutput(0).addListener(new Listener() { + public Interactor applyStateMonitor(IOState ioState, Observer guiObserver, Model model) { + ioState.getOutput(0).addObserver(new Observer() { public long lastValue; @Override - public void needsUpdate() { - long value = state.getOutput(0).getValue(); + public void hasChanged() { + long value = ioState.getOutput(0).getValue(); if (lastValue != value) { lastValue = value; - listener.needsUpdate(); + guiObserver.hasChanged(); } } }); return new Interactor() { @Override - public void interact(CircuitComponent cc, Vector pos, State state) { - long v = state.getOutput(0).getValue(); - state.getOutput(0).setValue(1 - v); + public void interact(CircuitComponent cc, Vector pos, IOState ioState) { + long v = ioState.getOutput(0).getValue(); + ioState.getOutput(0).setValue(1 - v); try { model.doStep(); } catch (NodeException e) { @@ -59,10 +59,10 @@ public class InputShape implements Shape { } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { Style style = Style.NORMAL; - if (state != null) { - if (state.getOutput(0).getValue() != 0) + if (ioState != null) { + if (ioState.getOutput(0).getValue() != 0) style = Style.WIRE_HIGH; else style = Style.WIRE_LOW; diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java b/src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java index 2f65593a5..f762874ae 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/Interactor.java @@ -2,7 +2,7 @@ package de.neemann.digital.gui.draw.shapes; import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.draw.graphics.Vector; -import de.neemann.digital.gui.draw.parts.State; +import de.neemann.digital.gui.draw.parts.IOState; /** * The VisualParts Interactor instance is called if the part is clicked @@ -13,5 +13,5 @@ import de.neemann.digital.gui.draw.parts.State; * @author hneemann */ public interface Interactor { - void interact(CircuitComponent cc, Vector pos, State state); + void interact(CircuitComponent cc, Vector pos, IOState ioState); } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/LEDShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/LEDShape.java index 0a124f5e7..700250827 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/LEDShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/LEDShape.java @@ -1,14 +1,14 @@ package de.neemann.digital.gui.draw.shapes; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; import de.neemann.digital.gui.draw.graphics.Graphic; import de.neemann.digital.gui.draw.graphics.Orientation; import de.neemann.digital.gui.draw.graphics.Style; import de.neemann.digital.gui.draw.graphics.Vector; +import de.neemann.digital.gui.draw.parts.IOState; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; -import de.neemann.digital.gui.draw.parts.State; import java.awt.*; @@ -34,16 +34,16 @@ public class LEDShape implements Shape { } @Override - public Interactor applyStateMonitor(State state, Listener listener, Model model) { - state.getInput(0).addListener(new Listener() { + public Interactor applyStateMonitor(IOState ioState, Observer guiObserver, Model model) { + ioState.getInput(0).addObserver(new Observer() { public long lastValue = 0; @Override - public void needsUpdate() { - long value = state.getInput(0).getValue(); + public void hasChanged() { + long value = ioState.getInput(0).getValue(); if (lastValue != value) { lastValue = value; - listener.needsUpdate(); + guiObserver.hasChanged(); } } }); @@ -51,10 +51,10 @@ public class LEDShape implements Shape { } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { boolean fill = false; - if (state != null) - fill = state.getInput(0).getValue() != 0; + if (ioState != null) + fill = ioState.getInput(0).getValue() != 0; Vector center = new Vector(2 + SIZE, 0); graphic.drawCircle(center.sub(RADL), center.add(RADL), Style.NORMAL); diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java index 4100a28c8..949e94bb5 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java @@ -1,14 +1,14 @@ package de.neemann.digital.gui.draw.shapes; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; import de.neemann.digital.gui.draw.graphics.Graphic; import de.neemann.digital.gui.draw.graphics.Orientation; import de.neemann.digital.gui.draw.graphics.Style; import de.neemann.digital.gui.draw.graphics.Vector; +import de.neemann.digital.gui.draw.parts.IOState; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; -import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann @@ -31,16 +31,16 @@ public class OutputShape implements Shape { } @Override - public Interactor applyStateMonitor(State state, Listener listener, Model model) { - state.getInput(0).addListener(new Listener() { + public Interactor applyStateMonitor(IOState ioState, Observer guiObserver, Model model) { + ioState.getInput(0).addObserver(new Observer() { public long lastValue = 0; @Override - public void needsUpdate() { - long value = state.getInput(0).getValue(); + public void hasChanged() { + long value = ioState.getInput(0).getValue(); if (lastValue != value) { lastValue = value; - listener.needsUpdate(); + guiObserver.hasChanged(); } } }); @@ -48,10 +48,10 @@ public class OutputShape implements Shape { } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { Style style = Style.NORMAL; - if (state != null) { - if (state.getInput(0).getValue() != 0) + if (ioState != null) { + if (ioState.getInput(0).getValue() != 0) style = Style.WIRE_HIGH; else style = Style.WIRE_LOW; diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/ProbeShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/ProbeShape.java index 563357c51..9f6253f41 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/ProbeShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/ProbeShape.java @@ -1,14 +1,14 @@ package de.neemann.digital.gui.draw.shapes; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; import de.neemann.digital.gui.draw.graphics.Graphic; import de.neemann.digital.gui.draw.graphics.Orientation; import de.neemann.digital.gui.draw.graphics.Style; import de.neemann.digital.gui.draw.graphics.Vector; +import de.neemann.digital.gui.draw.parts.IOState; import de.neemann.digital.gui.draw.parts.Pin; import de.neemann.digital.gui.draw.parts.Pins; -import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann @@ -27,12 +27,12 @@ public class ProbeShape implements Shape { } @Override - public Interactor applyStateMonitor(State state, Listener listener, Model model) { + public Interactor applyStateMonitor(IOState ioState, Observer guiObserver, Model model) { return null; } @Override - public void drawTo(Graphic graphic, State state) { + public void drawTo(Graphic graphic, IOState ioState) { graphic.drawText(new Vector(2, -1), new Vector(3, -1), label, Orientation.LEFTBOTTOM, Style.NORMAL); } } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java index ee03adb47..d5a337d0f 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/Shape.java @@ -1,9 +1,9 @@ package de.neemann.digital.gui.draw.shapes; -import de.neemann.digital.core.Listener; import de.neemann.digital.core.Model; +import de.neemann.digital.core.Observer; +import de.neemann.digital.gui.draw.parts.IOState; import de.neemann.digital.gui.draw.parts.Pins; -import de.neemann.digital.gui.draw.parts.State; /** * @author hneemann @@ -21,12 +21,14 @@ public interface Shape extends Drawable { /** * If the look of the shape depends on an input or output state, the - * shape can register a state monitor to the state. - * If the monitor decides to update the GUI it can call listener.needsUpdate. - * Caution: Don't store state in the shape itself! + * shape can register a listener to one of the the states ObservableValues. + * If the listener decides to update the GUI it can call listener.needsUpdate. * - * @param state the state + * @param ioState the state of the part + * @param guiObserver can be used to update the GUI by calling hasChanged, maybe null + * @param model the model + * @return the interactor is called if the shape is clicked during running mode */ - Interactor applyStateMonitor(State state, Listener listener, Model model); + Interactor applyStateMonitor(IOState ioState, Observer guiObserver, Model model); }