1 package net.mograsim.logic.model.model;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
8 import java.util.function.Consumer;
10 import net.mograsim.logic.model.model.components.ModelComponent;
11 import net.mograsim.logic.model.model.wires.ModelWire;
13 public class LogicModel
15 private final Map<String, ModelComponent> components;
16 private final Map<String, Runnable> componentDestroyFunctions;
17 private final Map<String, ModelComponent> componentsUnmodifiable;
18 private final Map<String, ModelWire> wires;
19 private final Map<String, Runnable> wireDestroyFunctions;
20 private final Map<String, ModelWire> wiresUnmodifiable;
22 private final List<Consumer<? super ModelComponent>> componentAddedListeners;
23 private final List<Consumer<? super ModelComponent>> componentRemovedListeners;
24 private final List<Consumer<? super ModelWire>> wireAddedListeners;
25 private final List<Consumer<? super ModelWire>> wireRemovedListeners;
26 private final List<Consumer<? super Runnable>> redrawHandlerChangedListeners;
28 private Runnable redrawHandler;
30 protected LogicModel()
32 components = new HashMap<>();
33 componentDestroyFunctions = new HashMap<>();
34 componentsUnmodifiable = Collections.unmodifiableMap(components);
35 wires = new HashMap<>();
36 wireDestroyFunctions = new HashMap<>();
37 wiresUnmodifiable = Collections.unmodifiableMap(wires);
39 componentAddedListeners = new ArrayList<>();
40 componentRemovedListeners = new ArrayList<>();
41 wireAddedListeners = new ArrayList<>();
42 wireRemovedListeners = new ArrayList<>();
43 redrawHandlerChangedListeners = new ArrayList<>();
47 * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application
48 * code as it is automatically called in {@link ModelComponent}'s constructor.
50 * @author Daniel Kirschten
52 protected void componentCreated(ModelComponent component, Runnable destroyed)
54 if (components.containsKey(component.getName()))
55 throw new IllegalStateException("Don't add the same component twice!");
56 components.put(component.getName(), component);
57 componentDestroyFunctions.put(component.getName(), destroyed);
58 callComponentAddedListeners(component);
63 * Destroyes the given component, removes it from the list of components and calls all componentRemovedListeners.
65 * @author Daniel Kirschten
67 protected void destroyComponent(ModelComponent component)
69 componentDestroyFunctions.get(component.getName()).run();
70 if (!components.containsKey(component.getName()))
71 throw new IllegalStateException("Don't remove the same component twice!");
72 components.remove(component.getName());
73 callComponentRemovedListeners(component);
78 * Adds the given wire to the list of wires and calls all wireAddedListeners. Don't call this method from application code as it is
79 * automatically called in {@link ModelWire}'s constructor.
81 * @author Daniel Kirschten
83 protected void wireCreated(ModelWire wire, Runnable destroyed)
85 if (wires.containsKey(wire.name))
86 throw new IllegalStateException("Don't add the same wire twice!");
87 wires.put(wire.name, wire);
88 wireDestroyFunctions.put(wire.name, destroyed);
89 callWireAddedListeners(wire);
94 * Destroys the given wire, removes it from the list of wires and calls all wireRemovedListeners.
96 * @author Daniel Kirschten
98 protected void destroyWire(ModelWire wire)
100 wireDestroyFunctions.get(wire.name).run();
101 if (!wires.containsKey(wire.name))
102 throw new IllegalStateException("Don't remove the same wire twice!");
103 wires.remove(wire.name);
104 callWireRemovedListeners(wire);
108 public Map<String, ModelComponent> getComponentsByName()
110 return componentsUnmodifiable;
113 public Map<String, ModelWire> getWiresByName()
115 return wiresUnmodifiable;
119 public void addComponentAddedListener (Consumer<? super ModelComponent> listener) {componentAddedListeners .add (listener);}
120 public void addComponentRemovedListener (Consumer<? super ModelComponent> listener) {componentRemovedListeners .add (listener);}
121 public void addWireAddedListener (Consumer<? super ModelWire > listener) {wireAddedListeners .add (listener);}
122 public void addWireRemovedListener (Consumer<? super ModelWire > listener) {wireRemovedListeners .add (listener);}
123 public void addRedrawHandlerChangedListener (Consumer<? super Runnable > listener) {redrawHandlerChangedListeners.add (listener);}
125 public void removeComponentAddedListener (Consumer<? super ModelComponent> listener) {componentAddedListeners .remove(listener);}
126 public void removeComponentRemovedListener (Consumer<? super ModelComponent> listener) {componentRemovedListeners .remove(listener);}
127 public void removeWireAddedListener (Consumer<? super ModelWire > listener) {wireAddedListeners .remove(listener);}
128 public void removeWireRemovedListener (Consumer<? super ModelWire > listener) {wireRemovedListeners .remove(listener);}
129 public void removeRedrawHandlerChangedListener(Consumer<? super Runnable > listener) {redrawHandlerChangedListeners.remove(listener);}
131 private void callComponentAddedListeners (ModelComponent c) {componentAddedListeners .forEach(l -> l.accept(c));}
132 private void callComponentRemovedListeners (ModelComponent c) {componentRemovedListeners .forEach(l -> l.accept(c));}
133 private void callWireAddedListeners (ModelWire w) {wireAddedListeners .forEach(l -> l.accept(w));}
134 private void callWireRemovedListeners (ModelWire w) {wireRemovedListeners .forEach(l -> l.accept(w));}
135 private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));}
138 public void setRedrawHandler(Runnable handler)
140 this.redrawHandler = handler;
141 callRedrawHandlerChangedListener(handler);
144 public Runnable getRedrawHandler()
146 return redrawHandler;
149 public void requestRedraw()
151 if (redrawHandler != null)