X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2FLogicModel.java;h=17d0a44e306e4729cd12330728d1cf788e4c2c23;hb=8bed58cd47f4e53a0a83e066d38864aa6875502f;hp=227d9b1a39ae19a3b376509d7942a2e5fbf18f9a;hpb=b32414f8406634aca730d724a011023c0da8bf22;p=Mograsim.git diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java index 227d9b1a..17d0a44e 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java @@ -5,9 +5,11 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Consumer; import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.wires.ModelWire; public class LogicModel @@ -51,10 +53,10 @@ public class LogicModel */ protected void componentCreated(ModelComponent component, Runnable destroyed) { - if (components.containsKey(component.name)) + if (components.containsKey(component.getName())) throw new IllegalStateException("Don't add the same component twice!"); - components.put(component.name, component); - componentDestroyFunctions.put(component.name, destroyed); + components.put(component.getName(), component); + componentDestroyFunctions.put(component.getName(), destroyed); callComponentAddedListeners(component); requestRedraw(); } @@ -66,10 +68,10 @@ public class LogicModel */ protected void destroyComponent(ModelComponent component) { - componentDestroyFunctions.get(component.name).run(); - if (!components.containsKey(component.name)) + componentDestroyFunctions.get(component.getName()).run(); + if (!components.containsKey(component.getName())) throw new IllegalStateException("Don't remove the same component twice!"); - components.remove(component.name); + components.remove(component.getName()); callComponentRemovedListeners(component); requestRedraw(); } @@ -115,24 +117,64 @@ public class LogicModel return wiresUnmodifiable; } + public ModelComponent getComponentByName(String name) + { + return components.get(name); + } + + @SuppressWarnings("unchecked") + public T getComponentByName(String name, Class expectedComponentClass) + { + ModelComponent comp = components.get(name); + Objects.requireNonNull(comp, "Invaild path, component " + name + " not found"); + if (expectedComponentClass.isInstance(comp)) + return (T) comp; + throw new IllegalArgumentException("The component " + name + " is not an instance of " + expectedComponentClass); + } + + public ModelWire getWireByName(String name) + { + return wires.get(name); + } + + public T getComponentBySubmodelPath(String path, Class modelClass) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getComponentByName(path, modelClass); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getComponentBySubmodelPath(rest, modelClass); + } + + public ModelWire getWireBySubmodelPath(String path) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getWireByName(path); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getWireBySubmodelPath(rest); + } + // @formatter:off public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners .add (listener);} public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} - public void addRedrawHandlerChangedListener (Consumer listener) {redrawHandlerChangedListeners.add (listener);} + public void addRedrawHandlerChangedListener (Consumer listener) {redrawHandlerChangedListeners.add (listener);} public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} public void removeComponentRemovedListener (Consumer listener) {componentRemovedListeners .remove(listener);} public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} - public void removeRedrawHandlerChangedListener(Consumer listener) {redrawHandlerChangedListeners.remove(listener);} + public void removeRedrawHandlerChangedListener(Consumer listener) {redrawHandlerChangedListeners.remove(listener);} private void callComponentAddedListeners (ModelComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} private void callComponentRemovedListeners (ModelComponent c) {componentRemovedListeners .forEach(l -> l.accept(c));} private void callWireAddedListeners (ModelWire w) {wireAddedListeners .forEach(l -> l.accept(w));} private void callWireRemovedListeners (ModelWire w) {wireRemovedListeners .forEach(l -> l.accept(w));} - private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));} + private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));} // @formatter:on public void setRedrawHandler(Runnable handler)