made the model events a simple enum.

This commit is contained in:
hneemann 2016-04-10 15:50:34 +02:00
parent 831c5068fe
commit 198fecea32
9 changed files with 57 additions and 34 deletions

View File

@ -1,27 +1,43 @@
package de.neemann.digital.core; package de.neemann.digital.core;
/** /**
* A event fired by the model
*
* @author hneemann * @author hneemann
*/ */
public class ModelEvent { public enum ModelEvent {
public static final ModelEvent STEP = new ModelEvent(Event.STEP); /**
public static final ModelEvent MICROSTEP = new ModelEvent(Event.MICROSTEP); * Is fired after the model had became stable after first stabilization.
public static final ModelEvent STARTED = new ModelEvent(Event.STARTED); */
public static final ModelEvent BREAK = new ModelEvent(Event.BREAK); STARTED,
public static final ModelEvent STOPPED = new ModelEvent(Event.STOPPED);
public static final ModelEvent MANUALCHANGE = new ModelEvent(Event.MANUALCHANGE);
public enum Event {STARTED, STOPPED, STEP, BREAK, MANUALCHANGE, MICROSTEP} /**
* The model had stopped.
*/
STOPPED,
private final Event event; /**
* 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,
private ModelEvent(Event event) { /**
this.event = event; * A break is detected.
} */
BREAK,
public Event getType() { /**
return event; * Here was a manual change to the model by the user.
} */
MANUALCHANGE,
/**
* If fired if a micro step is calculated.
* This means the aktual nodes are calculated, but not the effected nodes.
*/
MICROSTEP;
} }

View File

@ -1,10 +1,17 @@
package de.neemann.digital.core; package de.neemann.digital.core;
/** /**
* Interface to implement observers of the model.
*
* @author hneemann * @author hneemann
*/ */
public interface ModelStateObserver { public interface ModelStateObserver {
/**
* called if a event was detected.
*
* @param event the event
*/
void handleEvent(ModelEvent event); void handleEvent(ModelEvent event);
} }

View File

@ -41,7 +41,7 @@ public class RealTimeClock implements ModelStateObserver {
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
switch (event.getType()) { switch (event) {
case STARTED: case STARTED:
if (frequency > 50) // if frequency is high it is not necessary to update the GUI at every clock if (frequency > 50) // if frequency is high it is not necessary to update the GUI at every clock
output.removeObserver(GuiModelObserver.class); output.removeObserver(GuiModelObserver.class);

View File

@ -23,14 +23,14 @@ import java.util.ArrayList;
*/ */
public class DataShape implements Shape { public class DataShape implements Shape {
private final ModelEvent.Event type; private final ModelEvent type;
private DataSet dataSet; private DataSet dataSet;
public DataShape(ElementAttributes attr) { public DataShape(ElementAttributes attr) {
if (attr.get(AttributeKey.MicroStep)) if (attr.get(AttributeKey.MicroStep))
type = ModelEvent.Event.MICROSTEP; type = ModelEvent.MICROSTEP;
else else
type = ModelEvent.Event.STEP; type = ModelEvent.STEP;
} }
@Override @Override

View File

@ -16,7 +16,7 @@ import de.neemann.digital.gui.components.CircuitComponent;
*/ */
public class GuiModelObserver implements Observer, ModelStateObserver { public class GuiModelObserver implements Observer, ModelStateObserver {
private final CircuitComponent component; private final CircuitComponent component;
private final ModelEvent.Event type; private final ModelEvent type;
private boolean changed = false; private boolean changed = false;
/** /**
@ -25,7 +25,7 @@ public class GuiModelObserver implements Observer, ModelStateObserver {
* @param component the component to update * @param component the component to update
* @param type the event type which triggers a repainting * @param type the event type which triggers a repainting
*/ */
public GuiModelObserver(CircuitComponent component, ModelEvent.Event type) { public GuiModelObserver(CircuitComponent component, ModelEvent type) {
this.component = component; this.component = component;
this.type = type; this.type = type;
} }
@ -37,7 +37,7 @@ public class GuiModelObserver implements Observer, ModelStateObserver {
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
if (changed && event.getType() == type) { if (changed && event == type) {
component.paintImmediately(0, 0, component.getWidth(), component.getHeight()); component.paintImmediately(0, 0, component.getWidth(), component.getHeight());
changed = false; changed = false;
} }

View File

@ -374,7 +374,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
@Override @Override
public void enter() { public void enter() {
super.enter(); super.enter();
if (createAndStartModel(settings.get(AttributeKey.StartTimer), ModelEvent.Event.STEP)) if (createAndStartModel(settings.get(AttributeKey.StartTimer), ModelEvent.STEP))
circuitComponent.setManualChangeObserver(new FullStepObserver(model)); circuitComponent.setManualChangeObserver(new FullStepObserver(model));
} }
}); });
@ -382,7 +382,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
@Override @Override
public void enter() { public void enter() {
super.enter(); super.enter();
if (createAndStartModel(false, ModelEvent.Event.MICROSTEP)) if (createAndStartModel(false, ModelEvent.MICROSTEP))
circuitComponent.setManualChangeObserver(new MicroStepObserver(model)); circuitComponent.setManualChangeObserver(new MicroStepObserver(model));
} }
}); });
@ -416,7 +416,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
} }
private boolean createAndStartModel(boolean runClock, ModelEvent.Event updateEvent) { private boolean createAndStartModel(boolean runClock, ModelEvent updateEvent) {
try { try {
circuitComponent.removeHighLighted(); circuitComponent.removeHighLighted();
circuitComponent.setModeAndReset(true); circuitComponent.setModeAndReset(true);

View File

@ -20,10 +20,10 @@ import java.util.List;
*/ */
public class ProbeDialog extends JDialog implements ModelStateObserver { public class ProbeDialog extends JDialog implements ModelStateObserver {
private final ModelEvent.Event type; private final ModelEvent type;
private final SignalTableModel tableModel; private final SignalTableModel tableModel;
public ProbeDialog(Frame owner, Model model, ModelEvent.Event type, List<String> ordering) { public ProbeDialog(Frame owner, Model model, ModelEvent type, List<String> ordering) {
super(owner, Lang.get("win_measures"), false); super(owner, Lang.get("win_measures"), false);
setDefaultCloseOperation(DISPOSE_ON_CLOSE); setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.type = type; this.type = type;
@ -61,7 +61,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserver {
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
if (event.getType() == type || event.getType() == ModelEvent.Event.MANUALCHANGE) { if (event == type || event == ModelEvent.MANUALCHANGE) {
tableModel.fireChanged(); tableModel.fireChanged();
} }
} }

View File

@ -32,7 +32,7 @@ public class DataSetDialog extends JDialog implements ModelStateObserver {
* @param type the event type which triggers a new DataSample * @param type the event type which triggers a new DataSample
* @param ordering * @param ordering
*/ */
public DataSetDialog(Frame owner, Model model, ModelEvent.Event type, List<String> ordering) { public DataSetDialog(Frame owner, Model model, ModelEvent type, List<String> ordering) {
super(owner, Lang.get("win_measures"), false); super(owner, Lang.get("win_measures"), false);
setDefaultCloseOperation(DISPOSE_ON_CLOSE); setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setAlwaysOnTop(true); setAlwaysOnTop(true);

View File

@ -9,29 +9,29 @@ import de.neemann.digital.core.ModelStateObserver;
public class DataSetObserver implements ModelStateObserver { public class DataSetObserver implements ModelStateObserver {
private final DataSet dataSet; private final DataSet dataSet;
private final ModelEvent.Event type; private final ModelEvent type;
private DataSample manualSample; private DataSample manualSample;
private int maintime; private int maintime;
public DataSetObserver(ModelEvent.Event type, DataSet dataSet) { public DataSetObserver(ModelEvent type, DataSet dataSet) {
this.type = type; this.type = type;
this.dataSet = dataSet; this.dataSet = dataSet;
} }
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
if (event.getType() == ModelEvent.Event.STARTED) { if (event == ModelEvent.STARTED) {
dataSet.clear(); dataSet.clear();
maintime = 0; maintime = 0;
} }
if (event.getType() == ModelEvent.Event.MANUALCHANGE) { if (event == ModelEvent.MANUALCHANGE) {
if (manualSample == null) if (manualSample == null)
manualSample = new DataSample(maintime, dataSet.signalSize()); manualSample = new DataSample(maintime, dataSet.signalSize());
manualSample.fillWith(dataSet.getSignals()); manualSample.fillWith(dataSet.getSignals());
} }
if (event.getType() == type) { if (event == type) {
if (manualSample != null) { if (manualSample != null) {
dataSet.add(manualSample); dataSet.add(manualSample);
manualSample = null; manualSample = null;