basic refactoring of ModelEvent's

This commit is contained in:
hneemann 2020-07-21 19:34:09 +02:00
parent a08496b5b1
commit b3ba581911
20 changed files with 212 additions and 118 deletions

View File

@ -221,7 +221,7 @@ public class Model implements Iterable<Node>, SyncAccess {
for (ModelStateObserver ob : observersMicroStep)
LOGGER.debug("Observer Micro: " + ob.getClass().getSimpleName());
fireEvent(ModelEvent.STOPPED);
fireEvent(ModelEvent.CLOSED);
}
}
@ -429,9 +429,9 @@ public class Model implements Iterable<Node>, SyncAccess {
* @param event the mandatory event
* @param events more optional events
*/
public void addObserver(ModelStateObserver observer, ModelEvent event, ModelEvent... events) {
public void addObserver(ModelStateObserver observer, ModelEventType event, ModelEventType... events) {
addObserverForEvent(observer, event);
for (ModelEvent ev : events)
for (ModelEventType ev : events)
addObserverForEvent(observer, ev);
}
@ -441,18 +441,18 @@ public class Model implements Iterable<Node>, SyncAccess {
* @param observer the observer to add
*/
public void addObserver(ModelStateObserverTyped observer) {
for (ModelEvent ev : observer.getEvents())
for (ModelEventType ev : observer.getEvents())
addObserverForEvent(observer, ev);
}
private void addObserverForEvent(ModelStateObserver observer, ModelEvent event) {
private void addObserverForEvent(ModelStateObserver observer, ModelEventType event) {
ArrayList<ModelStateObserver> obs = observers;
if (event == ModelEvent.STEP) {
if (event == ModelEventType.STEP) {
if (observersStep == null)
observersStep = new ArrayList<>();
obs = observersStep;
} else if (event == ModelEvent.MICROSTEP) {
} else if (event == ModelEventType.MICROSTEP) {
if (observersMicroStep == null)
observersMicroStep = new ArrayList<>();
obs = observersMicroStep;
@ -498,7 +498,7 @@ public class Model implements Iterable<Node>, SyncAccess {
}
private void fireEvent(ModelEvent event) {
switch (event) {
switch (event.getType()) {
case MICROSTEP:
if (observersMicroStep != null)
for (ModelStateObserver observer : observersMicroStep)

View File

@ -1,51 +1,90 @@
/*
* Copyright (c) 2016 Helmut Neemann
* Copyright (c) 2020 Helmut Neemann.
* Use of this source code is governed by the GPL v3 license
* that can be found in the LICENSE file.
*/
package de.neemann.digital.core;
/**
* A event fired by the model
*/
public enum ModelEvent {
import java.util.Objects;
/**
* Is fired after the model had became stable after first stabilization.
* a model event
*/
STARTED,
public class ModelEvent {
/**
* The model has stopped.
* Shorthand for a ModelEventType.STARTED event
*/
STOPPED,
public static final ModelEvent STARTED = new ModelEvent(ModelEventType.STARTED);
/**
* Is fired if the model had performed a full step.
* This means a change is propagated through all nodes, and the model has
* become stable again.
* Shorthand for a ModelEventType.STOPPED event
*/
STEP,
public static final ModelEvent CLOSED = new ModelEvent(ModelEventType.CLOSED);
/**
* Fast run is started.
* Shorthand for a ModelEventType.STEP event
*/
FASTRUN,
public static final ModelEvent STEP = new ModelEvent(ModelEventType.STEP);
/**
* A break is detected.
* Shorthand for a ModelEventType.MICROSTEP event
*/
BREAK,
public static final ModelEvent MICROSTEP = new ModelEvent(ModelEventType.MICROSTEP);
/**
* Here was a manual change to the model by the user.
* Shorthand for a ModelEventType.FASTRUN event
*/
EXTERNALCHANGE,
public static final ModelEvent FASTRUN = new ModelEvent(ModelEventType.FASTRUN);
/**
* If fired if a micro step is calculated.
* This means the aktual nodes are calculated, but not the effected nodes.
* Shorthand for a ModelEventType.BREAK event
*/
MICROSTEP
public static final ModelEvent BREAK = new ModelEvent(ModelEventType.BREAK);
/**
* Shorthand for a ModelEventType.EXTERNALCHANGE event
*/
public static final ModelEvent EXTERNALCHANGE = new ModelEvent(ModelEventType.EXTERNALCHANGE);
private final ModelEventType type;
private String message;
private Exception cause;
private ModelEvent(ModelEventType type) {
this.type = type;
}
ModelEvent(String message, Exception cause) {
this(ModelEventType.ERROR_OCCURRED);
this.message = message;
this.cause = cause;
}
/**
* @return the event type
*/
public ModelEventType getType() {
return type;
}
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @return the cause in case of an error
*/
public Exception getCause() {
return cause;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ModelEvent that = (ModelEvent) o;
return type == that.type;
}
@Override
public int hashCode() {
return Objects.hash(type);
}
}

View File

@ -0,0 +1,56 @@
/*
* Copyright (c) 2016 Helmut Neemann
* Use of this source code is governed by the GPL v3 license
* that can be found in the LICENSE file.
*/
package de.neemann.digital.core;
/**
* A event fired by the model
*/
public enum ModelEventType {
/**
* Is fired after the model had became stable after first stabilization.
*/
STARTED,
/**
* The model has stopped.
*/
CLOSED,
/**
* Is fired if the model had performed a full step.
* This means a change is propagated through all nodes, and the model has
* become stable again.
*/
STEP,
/**
* Fast run is started.
*/
FASTRUN,
/**
* A break is detected.
*/
BREAK,
/**
* Here was a manual change to the model by the user.
*/
EXTERNALCHANGE,
/**
* If fired if a micro step is calculated.
* This means the aktual nodes are calculated, but not the effected nodes.
*/
MICROSTEP,
/**
* Used to notify an error
*/
ERROR_OCCURRED
}

View File

@ -13,6 +13,6 @@ public interface ModelStateObserverTyped extends ModelStateObserver {
/**
* @return the events on which this handler needs to be called
*/
ModelEvent[] getEvents();
ModelEventType[] getEvents();
}

View File

@ -112,13 +112,13 @@ public class External extends Node implements Element {
}
model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED)) {
if (event.equals(ModelEventType.CLOSED)) {
try {
processInterface.close();
} catch (IOException e) {
SwingUtilities.invokeLater(new ErrorMessage(Lang.get("msg_errorClosingExternalProcess")).addCause(e));
}
}
}, ModelEvent.STOPPED);
}, ModelEventType.CLOSED);
}
}

View File

@ -6,7 +6,7 @@
package de.neemann.digital.core.io;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelEventType;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.lang.Lang;
import org.slf4j.Logger;
@ -73,9 +73,9 @@ public final class MIDIHelper {
isOpen = true;
model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED))
if (event.equals(ModelEventType.CLOSED))
close();
}, ModelEvent.STOPPED);
}, ModelEventType.CLOSED);
}
}

View File

@ -84,7 +84,7 @@ public class EEPROM extends Node implements Element, RAMInterface, ROMInterface
super.registerNodes(model);
if (memory.isEmpty())
model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEvent.STOPPED);
model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEventType.CLOSED);
}
@Override

View File

@ -6,7 +6,7 @@
package de.neemann.digital.core.memory;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelEventType;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
import de.neemann.digital.core.element.Keys;
@ -60,7 +60,7 @@ public class EEPROMDualPort extends RAMDualPort implements ROMInterface {
super.registerNodes(model);
if (memory.isEmpty())
model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEvent.STOPPED);
model.addObserver(event -> attr.set(Keys.DATA, memory), ModelEventType.CLOSED);
}
}

View File

@ -72,11 +72,11 @@ public class TransGate extends Node implements Element {
public void init(Model model) throws NodeException {
aSwitch.init(model);
model.addObserver(event -> {
if (event.equals(ModelEvent.STEP)) {
if (event.equals(ModelEventType.STEP)) {
if (!s.isHighZ() && !ns.isHighZ() && (s.getBool() == ns.getBool()))
throw new BurnException(Lang.get("err_invalidTransmissionGateState"), new ObservableValues(s, ns));
}
}, ModelEvent.STEP);
}, ModelEventType.STEP);
}
/**

View File

@ -6,6 +6,7 @@
package de.neemann.digital.core.wiring.bus;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelEventType;
import de.neemann.digital.core.ModelStateObserverTyped;
import de.neemann.digital.core.switching.PlainSwitch;
@ -40,8 +41,8 @@ public final class BusModelStateObserver implements ModelStateObserverTyped {
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.STEP};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.STEP};
}
/**

View File

@ -111,13 +111,13 @@ public class GifExporter extends JDialog implements ModelStateObserverTyped, Mod
@Override
public void handleEvent(ModelEvent event) {
if (event.equals(ModelEvent.STEP))
if (event == ModelEvent.STEP)
writeImage();
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.STEP};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.STEP};
}
private void writeImage() {

View File

@ -5,10 +5,7 @@
*/
package de.neemann.digital.draw.model;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelStateObserverTyped;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.*;
import de.neemann.digital.core.wiring.AsyncSeq;
import de.neemann.digital.gui.ErrorStopper;
import de.neemann.digital.lang.Lang;
@ -46,14 +43,14 @@ public class AsyncSequentialClock implements ModelStateObserverTyped {
@Override
public void handleEvent(ModelEvent event) {
switch (event) {
switch (event.getType()) {
case STARTED:
int delayMuS = 1000000 / frequency;
if (delayMuS < 100)
delayMuS = 100;
runner = new RealTimeRunner(delayMuS);
break;
case STOPPED:
case CLOSED:
if (runner != null)
runner.stop();
break;
@ -61,8 +58,8 @@ public class AsyncSequentialClock implements ModelStateObserverTyped {
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.STARTED, ModelEvent.STOPPED};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.STARTED, ModelEventType.CLOSED};
}
/**

View File

@ -55,7 +55,7 @@ public class RealTimeClock implements ModelStateObserverTyped {
@Override
public void handleEvent(ModelEvent event) {
switch (event) {
switch (event.getType()) {
case STARTED:
int delayMuS = 500000 / frequency;
if (delayMuS < 1)
@ -63,7 +63,7 @@ public class RealTimeClock implements ModelStateObserverTyped {
else
runner = new RealTimeRunner(delayMuS);
break;
case STOPPED:
case CLOSED:
if (runner != null)
runner.stop();
break;
@ -71,8 +71,8 @@ public class RealTimeClock implements ModelStateObserverTyped {
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.STARTED, ModelEvent.STOPPED};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.STARTED, ModelEventType.CLOSED};
}
/**

View File

@ -459,9 +459,9 @@ public class FSMFrame extends JFrame implements ClosingWindowListener.ConfirmSav
value.addObserverToValue(() -> setActiveState(value.getValue()));
setActiveState(value.getValue());
model.addObserver(event -> {
if (event == ModelEvent.STOPPED)
if (event == ModelEvent.CLOSED)
setActiveState(-1);
}, ModelEvent.STOPPED
}, ModelEventType.CLOSED
);
}
}

View File

@ -1060,9 +1060,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override
public void actionPerformed(ActionEvent actionEvent) {
if (model != null) {
ModelEvent event = ModelEvent.STEP;
ModelEventType event = ModelEventType.STEP;
if (stateManager.isActive(runModelMicroState))
event = ModelEvent.MICROSTEP;
event = ModelEventType.MICROSTEP;
showMeasurementDialog(event);
}
}
@ -1072,9 +1072,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override
public void actionPerformed(ActionEvent actionEvent) {
if (model != null) {
ModelEvent event = ModelEvent.STEP;
ModelEventType event = ModelEventType.STEP;
if (stateManager.isActive(runModelMicroState))
event = ModelEvent.MICROSTEP;
event = ModelEventType.MICROSTEP;
showMeasurementGraph(event);
}
}
@ -1286,7 +1286,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
showMeasurementGraph.setEnabled(true);
stoppedState.getAction().setEnabled(true);
runTests.setEnabled(false);
createAndStartModel(false, ModelEvent.MICROSTEP, null);
createAndStartModel(false, ModelEventType.MICROSTEP, null);
}
});
stateManager.setActualState(stoppedState);
@ -1323,7 +1323,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
showMeasurementDialog.setEnabled(true);
showMeasurementGraph.setEnabled(true);
runTests.setEnabled(false);
createAndStartModel(runRealTime, ModelEvent.STEP, modelModifier);
createAndStartModel(runRealTime, ModelEventType.STEP, modelModifier);
}
}
@ -1335,7 +1335,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
model = null;
}
private void createAndStartModel(boolean globalRunClock, ModelEvent updateEvent, ModelModifier modelModifier) {
private void createAndStartModel(boolean globalRunClock, ModelEventType updateEvent, ModelModifier modelModifier) {
try {
circuitComponent.removeHighLighted();
@ -1376,7 +1376,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
if (threadRunnerCount > 1)
throw new RuntimeException(Lang.get("err_moreThanOneFastClock"));
}
if (!realTimeClockRunning && updateEvent == ModelEvent.MICROSTEP) {
if (!realTimeClockRunning && updateEvent == ModelEventType.MICROSTEP) {
// no real clock
AsyncSeq ai = model.getAsyncInfos();
if (ai != null) {
@ -1399,7 +1399,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
doMicroStep.setEnabled(false);
if (!realTimeClockRunning && model.isRunToBreakAllowed()) {
if (updateEvent == ModelEvent.MICROSTEP)
if (updateEvent == ModelEventType.MICROSTEP)
runToBreakMicroAction.setEnabled(true);
else
runToBreakAction.setEnabled(true);
@ -1412,7 +1412,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
if (settings.get(Keys.SHOW_DATA_GRAPH) || windowPosManager.isVisible("dataSet"))
showMeasurementGraph(updateEvent);
if (settings.get(Keys.SHOW_DATA_GRAPH_MICRO))
showMeasurementGraph(ModelEvent.MICROSTEP);
showMeasurementGraph(ModelEventType.MICROSTEP);
if (modelModifier != null)
modelModifier.preInit(model);
@ -1421,10 +1421,10 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
new ProgramMemoryLoader(settings.get(Keys.PROGRAM_TO_PRELOAD)).preInit(model);
}
if (updateEvent == ModelEvent.MICROSTEP) {
if (updateEvent == ModelEventType.MICROSTEP) {
checkMicroStepActions(model);
model.addObserver(new MicroStepObserver(model));
} else if (updateEvent == ModelEvent.STEP) {
} else if (updateEvent == ModelEventType.STEP) {
if (maxFrequency <= 50)
model.addObserver(new FullStepObserver(model));
else
@ -1432,9 +1432,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
}
model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED))
if (event.equals(ModelEventType.CLOSED))
SwingUtilities.invokeLater(this::ensureModelIsStopped);
}, ModelEvent.STOPPED);
}, ModelEventType.CLOSED);
model.init();
@ -1458,12 +1458,12 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
windowPosManager.register("keyboard_" + k.getLabel(), new KeyboardDialog(this, k, model));
}
private void showMeasurementGraph(ModelEvent updateEvent) {
private void showMeasurementGraph(ModelEventType updateEvent) {
List<String> ordering = circuitComponent.getCircuit().getMeasurementOrdering();
windowPosManager.register("dataSet", GraphDialog.createLiveDialog(this, model, updateEvent == ModelEvent.MICROSTEP, ordering)).setVisible(true);
windowPosManager.register("dataSet", GraphDialog.createLiveDialog(this, model, updateEvent == ModelEventType.MICROSTEP, ordering)).setVisible(true);
}
private void showMeasurementDialog(ModelEvent updateEvent) {
private void showMeasurementDialog(ModelEventType updateEvent) {
List<String> ordering = circuitComponent.getCircuit().getMeasurementOrdering();
windowPosManager.register("probe", new ProbeDialog(this, model, updateEvent, ordering)).setVisible(true);
}
@ -1649,7 +1649,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override
public void handleEvent(ModelEvent event) {
try {
switch (event) {
switch (event.getType()) {
case EXTERNALCHANGE:
model.doStep();
circuitComponent.graphicHasChanged();
@ -1664,8 +1664,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.EXTERNALCHANGE, ModelEvent.BREAK};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.EXTERNALCHANGE, ModelEventType.BREAK};
}
}
@ -1681,11 +1681,11 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override
public void handleEvent(ModelEvent event) {
switch (event) {
switch (event.getType()) {
case STARTED:
timer.start();
break;
case STOPPED:
case CLOSED:
case BREAK:
timer.stop();
circuitComponent.graphicHasChanged();
@ -1694,8 +1694,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.STOPPED, ModelEvent.BREAK};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.CLOSED, ModelEventType.BREAK};
}
}
@ -1711,7 +1711,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
@Override
public void handleEvent(ModelEvent event) {
switch (event) {
switch (event.getType()) {
case EXTERNALCHANGE:
case MICROSTEP:
case BREAK:
@ -1727,8 +1727,8 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.EXTERNALCHANGE, ModelEvent.MICROSTEP, ModelEvent.BREAK};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.EXTERNALCHANGE, ModelEventType.MICROSTEP, ModelEventType.BREAK};
}
}
@ -1839,7 +1839,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
runModelState.enter(false, new ProgramMemoryLoader(romHex));
circuitComponent.graphicHasChanged();
if (model != null)
showMeasurementDialog(ModelEvent.STEP);
showMeasurementDialog(ModelEventType.STEP);
});
}

View File

@ -231,9 +231,9 @@ public class DataEditor extends JDialog {
if (model != null) {
model.getWindowPosManager().register("RAM_DATA_" + label, this);
model.addObserver(event -> {
if (event.equals(ModelEvent.STOPPED))
if (event.equals(ModelEventType.CLOSED))
detachFromRunningModel();
}, ModelEvent.STOPPED);
}, ModelEventType.CLOSED);
}
}

View File

@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
*/
public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
private final ModelEvent type;
private final ModelEventType type;
private final SignalTableModel tableModel;
private boolean tableUpdateEnable = true;
@ -39,7 +39,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
* @param type the event type which fires a dialog repaint
* @param ordering the names list used to order the measurement values
*/
public ProbeDialog(Frame owner, Model model, ModelEvent type, List<String> ordering) {
public ProbeDialog(Frame owner, Model model, ModelEventType type, List<String> ordering) {
super(owner, Lang.get("win_measures"), false);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.type = type;
@ -109,7 +109,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
@Override
public void handleEvent(ModelEvent event) {
if (event == type || event == ModelEvent.EXTERNALCHANGE) {
if (event.getType() == type || event == ModelEvent.EXTERNALCHANGE) {
if (tableUpdateEnable) {
if (paintPending.compareAndSet(false, true)) {
SwingUtilities.invokeLater(() -> {
@ -119,12 +119,12 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
}
}
}
switch (event) {
switch (event.getType()) {
case FASTRUN:
tableUpdateEnable = false;
break;
case BREAK:
case STOPPED:
case CLOSED:
tableUpdateEnable = true;
SwingUtilities.invokeLater(tableModel::fireChanged);
break;
@ -132,8 +132,8 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{type, ModelEvent.EXTERNALCHANGE, ModelEvent.FASTRUN, ModelEvent.BREAK, ModelEvent.STOPPED};
public ModelEventType[] getEvents() {
return new ModelEventType[]{type, ModelEventType.EXTERNALCHANGE, ModelEventType.FASTRUN, ModelEventType.BREAK, ModelEventType.CLOSED};
}
private static class SignalTableModel implements TableModel {

View File

@ -180,13 +180,13 @@ public final class SingleValueDialog extends JDialog implements ModelStateObserv
@Override
public void handleEvent(ModelEvent event) {
if (event.equals(ModelEvent.STOPPED))
if (event.equals(ModelEvent.CLOSED))
dispose();
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.STOPPED};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.CLOSED};
}
private JPanel createCheckBoxPanel(int bits, long value) {

View File

@ -6,6 +6,7 @@
package de.neemann.digital.gui.components.data;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelEventType;
import de.neemann.digital.core.ModelStateObserverTyped;
import de.neemann.digital.core.Signal;
import de.neemann.digital.data.Value;
@ -20,7 +21,7 @@ import java.util.ArrayList;
public class ValueTableObserver implements ModelStateObserverTyped {
private final ValueTable logData;
private final ModelEvent type;
private final ModelEventType type;
private final ArrayList<Signal> signals;
private Value[] manualSample;
@ -35,9 +36,9 @@ public class ValueTableObserver implements ModelStateObserverTyped {
public ValueTableObserver(boolean microStep, ArrayList<Signal> signals, int maxSize) {
this.signals = signals;
if (microStep)
this.type = ModelEvent.MICROSTEP;
this.type = ModelEventType.MICROSTEP;
else
this.type = ModelEvent.STEP;
this.type = ModelEventType.STEP;
String[] names = new String[signals.size()];
for (int i = 0; i < signals.size(); i++)
@ -50,14 +51,14 @@ public class ValueTableObserver implements ModelStateObserverTyped {
if (event == ModelEvent.STARTED)
logData.clear();
if (event == ModelEvent.EXTERNALCHANGE && type == ModelEvent.MICROSTEP) {
if (event == ModelEvent.EXTERNALCHANGE && type == ModelEventType.MICROSTEP) {
if (manualSample == null)
manualSample = new Value[logData.getColumns()];
for (int i = 0; i < logData.getColumns(); i++)
manualSample[i] = new Value(signals.get(i).getValue());
}
if (event == type) {
if (event.getType() == type) {
if (manualSample != null) {
logData.add(new TestRow(manualSample));
manualSample = null;
@ -70,8 +71,8 @@ public class ValueTableObserver implements ModelStateObserverTyped {
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{type, ModelEvent.STARTED, ModelEvent.EXTERNALCHANGE};
public ModelEventType[] getEvents() {
return new ModelEventType[]{type, ModelEventType.STARTED, ModelEventType.EXTERNALCHANGE};
}
/**

View File

@ -227,8 +227,8 @@ public class InitialTutorial extends JDialog implements CircuitComponent.Tutoria
}
@Override
public ModelEvent[] getEvents() {
return new ModelEvent[]{ModelEvent.EXTERNALCHANGE};
public ModelEventType[] getEvents() {
return new ModelEventType[]{ModelEventType.EXTERNALCHANGE};
}
@Override