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=6af791df52c447197af6dcccf9e8c5ccfdd6d805;hp=839d5f9af0cb9956a833c7df7b0c483b75273cc8;hpb=9bb76ff610ab0fcc07a9049e4a572053339593c9;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 839d5f9a..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 @@ -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)