diff --git a/AlgebraicDataflowArchitectureModel/models/SimpleUI.model b/AlgebraicDataflowArchitectureModel/models/SimpleUI.model index 3b0d023..ac3c51d 100644 --- a/AlgebraicDataflowArchitectureModel/models/SimpleUI.model +++ b/AlgebraicDataflowArchitectureModel/models/SimpleUI.model @@ -2,6 +2,10 @@ in screen(curSc: Json, update(curSc, nextSc)) = nextSc } +native channel SetLayout { + in screen.layout(curLayout: Bool, setLayout(nextLayout)) = nextLayout +} + native channel SetVisible(wid: Str) { in screen.widgets.{wid}.visible(curVisible: Bool, setVisible(nextVisible)) = nextVisible } @@ -10,6 +14,22 @@ in screen.widgets.{wid}.text(curText: Str, setText(nextText)) = nextText } +native channel SetX(wid: Str) { + in screen.widgets.{wid}.x(curX: Int, setX(nextX)) = nextX +} + +native channel SetY(wid: Str) { + in screen.widgets.{wid}.y(curY: Int, setY(nextY)) = nextY +} + +native channel SetWidth(wid: Str) { + in screen.widgets.{wid}.width(curWidth: Int, setWidth(nextWidth)) = nextWidth +} + +native channel SetHeight(wid: Str) { + in screen.widgets.{wid}.height(curHeight: Int, setHeight(nextHeight)) = nextHeight +} + native channel MouseEvent(wid: Str) { out screen.widgets.{wid}.state(curState: Int, mouseEvent(nextState)) = nextState } @@ -18,6 +38,18 @@ out screen.widgets.{wid}.text(curText: Str, textEvent(nextText)) = nextText } +channel ChangeLayout { + out screen.layout(curLayout: Bool, changeLayout(layout)) = layout +} + +channel ChangeX(wid: Str) { + out screen.widgets.{wid}.x(curX: Int, changeX(x)) = x +} + +channel ChangeY(wid: Str) { + out screen.widgets.{wid}.y(curY: Int, changeY(y)) = y +} + channel AddButton { out screen.widgets(widgets: Map, addButton(wid: Str, text: Str)) = insert(widgets, wid, {"type": "button", "text": text, "state": 0}) } @@ -28,4 +60,16 @@ channel AddTextInput { out screen.widgets(widgets: Map, addTextInput(wid: Str)) = insert(widgets, wid, {"type": "textInput", "text": "", "state": 0}) -} \ No newline at end of file +} + +channel AddMovableButton { + out screen.widgets(widgets: Map, addMovableButton(wid: Str, text: Str, x: Int, y: Int, width: Int, height: Int)) = insert(widgets, wid, {"type": "button", "text": text, "x": x, "y": y, "width": width, "height": height, "state": 0}) +} + +channel AddMovableLabel { + out screen.widgets(widgets: Map, addMovableLabel(wid: Str, text: Str, x: Int, y: Int, width: Int, height: Int)) = insert(widgets, wid, {"type": "label", "text": text, "x": x, "y": y, "width": width, "height": height, "state": 0}) +} + +channel AddMovableTextInput { + out screen.widgets(widgets: Map, addMovableTextInput(wid: Str, x: Int, y: Int, width: Int, height: Int)) = insert(widgets, wid, {"type": "textInput", "text": "", "x": x, "y": y, "width": width, "height": height, "state": 0}) +} diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java index a5c1973..dd213a8 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java @@ -31,10 +31,12 @@ } public Expression get(String key) { + if (keyToIndex.get(key) == null) return null; return getChild(keyToIndex.get(key)); } public Expression get(Constant key) { + if (keyToIndex.get(key.toString()) == null) return null; return getChild(keyToIndex.get(key.toString())); } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java index b819fe9..368b3a6 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java @@ -32,7 +32,7 @@ private DataTransferModel model; private SystemState curState; private List systemReceivers = new ArrayList<>(); - private Map> nativeReceivers = new HashMap<>(); + private Map> nativeReceivers = new HashMap<>(); private Map nativeChannelReceivers = new HashMap<>(); public Simulator(DataTransferModel model) { @@ -96,12 +96,12 @@ } public void addNativeReceiver(INativeReceiver receiver, DataTransferChannel channel, Resource resource) { - Map receivers = nativeReceivers.get(channel); + Map receivers = nativeReceivers.get(channel); if (receivers == null) { receivers = new HashMap<>(); nativeReceivers.put(channel, receivers); } - receivers.put(resource, receiver); + receivers.put(resource.getResourceIdentifier(), receiver); } public void removeSystemReceiver(INativeReceiver receiver) { @@ -113,9 +113,9 @@ } public void removeNativeReceiver(DataTransferChannel channel, Resource resource) { - Map receivers = nativeReceivers.get(channel); + Map receivers = nativeReceivers.get(channel); if (receivers != null) { - receivers.remove(resource); + receivers.remove(resource.getResourceIdentifier()); if (receivers.size() == 0) { nativeReceivers.remove(channel); } @@ -189,7 +189,7 @@ INativeReceiver receiver = nativeChannelReceivers.get(channel); // receiver for the channel if (receiver != null) receiver.onReceiveFromModel(event, nextSystemState); if (nativeReceivers.get(channel) != null) { - receiver = nativeReceivers.get(channel).get(event.getInputResource()); // receiver for the channel and resource + receiver = nativeReceivers.get(channel).get(event.getInputResource().getResourceIdentifier()); // receiver for the channel and resource if (receiver != null) receiver.onReceiveFromModel(event, nextSystemState); } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentHeightReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentHeightReceiver.java new file mode 100644 index 0000000..9d6aad1 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentHeightReceiver.java @@ -0,0 +1,35 @@ +package simulator.interfaces.swing; + +import java.awt.Component; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.text.JTextComponent; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Term; +import simulator.Event; +import simulator.SystemState; +import simulator.interfaces.INativeReceiver; + +public class ComponentHeightReceiver implements INativeReceiver { + protected Component component; + + public ComponentHeightReceiver(Component component) { + this.component = component; + } + + @Override + public void onReceiveFromModel(Event event, SystemState nextSystemState) { + Expression message = event.getMessage(); + if (message instanceof Term) { + Expression height = ((Term) message).getChild(0); + if (height instanceof Constant) { + int curWidth = component.getSize().width; + component.setSize(curWidth, Integer.parseInt(height.toString())); + } + } + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentWidthReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentWidthReceiver.java new file mode 100644 index 0000000..76c0dda --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentWidthReceiver.java @@ -0,0 +1,35 @@ +package simulator.interfaces.swing; + +import java.awt.Component; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.text.JTextComponent; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Term; +import simulator.Event; +import simulator.SystemState; +import simulator.interfaces.INativeReceiver; + +public class ComponentWidthReceiver implements INativeReceiver { + protected Component component; + + public ComponentWidthReceiver(Component component) { + this.component = component; + } + + @Override + public void onReceiveFromModel(Event event, SystemState nextSystemState) { + Expression message = event.getMessage(); + if (message instanceof Term) { + Expression width = ((Term) message).getChild(0); + if (width instanceof Constant) { + int curHeight = component.getSize().height; + component.setSize(Integer.parseInt(width.toString()), curHeight); + } + } + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentXReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentXReceiver.java new file mode 100644 index 0000000..2867e97 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentXReceiver.java @@ -0,0 +1,35 @@ +package simulator.interfaces.swing; + +import java.awt.Component; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.text.JTextComponent; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Term; +import simulator.Event; +import simulator.SystemState; +import simulator.interfaces.INativeReceiver; + +public class ComponentXReceiver implements INativeReceiver { + protected Component component; + + public ComponentXReceiver(Component component) { + this.component = component; + } + + @Override + public void onReceiveFromModel(Event event, SystemState nextSystemState) { + Expression message = event.getMessage(); + if (message instanceof Term) { + Expression x = ((Term) message).getChild(0); + if (x instanceof Constant) { + int curY = component.getLocation().y; + component.setLocation(Integer.parseInt(x.toString()), curY); + } + } + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentYReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentYReceiver.java new file mode 100644 index 0000000..a964f6b --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentYReceiver.java @@ -0,0 +1,35 @@ +package simulator.interfaces.swing; + +import java.awt.Component; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.text.JTextComponent; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Term; +import simulator.Event; +import simulator.SystemState; +import simulator.interfaces.INativeReceiver; + +public class ComponentYReceiver implements INativeReceiver { + protected Component component; + + public ComponentYReceiver(Component component) { + this.component = component; + } + + @Override + public void onReceiveFromModel(Event event, SystemState nextSystemState) { + Expression message = event.getMessage(); + if (message instanceof Term) { + Expression y = ((Term) message).getChild(0); + if (y instanceof Constant) { + int curX = component.getLocation().x; + component.setLocation(curX, Integer.parseInt(y.toString())); + } + } + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java index e82372e..e935244 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java @@ -1,7 +1,7 @@ package simulator.interfaces.swing; import java.awt.Component; -import java.awt.Toolkit; +import java.awt.FlowLayout; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -11,8 +11,8 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; -import javax.swing.SwingUtilities; +import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; import models.dataConstraintModel.JsonTerm; @@ -26,20 +26,34 @@ import simulator.interfaces.INativeReceiver; public class SwingPresenter implements INativeReceiver { + // Native channel names. public final String screenUpdateChannelName = "ScreenUpdate"; + public final String setLayoutChannelName = "SetLayout"; public final String setVisibleChannelName = "SetVisible"; public final String setTextChannelName = "SetText"; + public final String setXChannelName = "SetX"; + public final String setYChannelName = "SetY"; + public final String setWidthChannelName = "SetWidth"; + public final String setHeightChannelName = "SetHeight"; public final String mouseEventChannelName = "MouseEvent"; public final String textEventChannelName = "TextEvent"; protected JPanel mainPanel; protected Simulator simulator; protected Map components; + + // Native channels. protected DataTransferChannel screenUpdateChannel; + protected DataTransferChannel setLayoutChannel; protected DataTransferChannel setVisibleChannel; protected DataTransferChannel setTextChannel; + protected DataTransferChannel setXChannel; + protected DataTransferChannel setYChannel; + protected DataTransferChannel setWidthChannel; + protected DataTransferChannel setHeightChannel; protected DataTransferChannel mouseEventChannel; protected DataTransferChannel textEventChannel; + protected Map> channelAndResourcesForReceiving = new HashMap<>(); public SwingPresenter(JPanel mainPanel, Simulator simulator) { @@ -47,11 +61,17 @@ this.simulator = simulator; components = new HashMap<>(); screenUpdateChannel = (DataTransferChannel) simulator.getModel().getChannel(screenUpdateChannelName); + setLayoutChannel = (DataTransferChannel) simulator.getModel().getChannel(setLayoutChannelName); setVisibleChannel = (DataTransferChannel) simulator.getModel().getChannel(setVisibleChannelName); setTextChannel = (DataTransferChannel) simulator.getModel().getChannel(setTextChannelName); + setXChannel = (DataTransferChannel) simulator.getModel().getChannel(setXChannelName); + setYChannel = (DataTransferChannel) simulator.getModel().getChannel(setYChannelName); + setWidthChannel = (DataTransferChannel) simulator.getModel().getChannel(setWidthChannelName); + setHeightChannel = (DataTransferChannel) simulator.getModel().getChannel(setHeightChannelName); mouseEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(mouseEventChannelName); textEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(textEventChannelName); simulator.addNativeReceiver(this, screenUpdateChannel); + simulator.addNativeReceiver(new SwingLayout(), setLayoutChannel); } @Override @@ -63,6 +83,14 @@ if (curScExp instanceof JsonTerm && nextScExp instanceof JsonTerm) { JsonTerm curSc = (JsonTerm) curScExp; JsonTerm nextSc = (JsonTerm) nextScExp; + Expression newLayout = nextSc.get("layout"); + if (newLayout != null) { + if (newLayout.toString().equals("true")) { + mainPanel.setLayout(new FlowLayout()); + } else if (newLayout.toString().equals("false")) { + mainPanel.setLayout(null); + } + } Expression oldWidgets = curSc.get("widgets"); Expression newWidgets = nextSc.get("widgets"); if (oldWidgets instanceof MapTerm && newWidgets instanceof MapTerm) { @@ -100,7 +128,17 @@ if (type.toString().equals("\"button\"")) { // Add a button component. Expression text = widget.get("\"text\""); + Expression x = widget.get("\"x\""); + Expression y = widget.get("\"y\""); + Expression width = widget.get("\"width\""); + Expression height = widget.get("\"height\""); JButton button = new JButton(text.toString().replace("\"", "")); + if (x != null && y != null) { + button.setLocation(Integer.parseInt(x.toString()), Integer.parseInt(y.toString())); + } + if (width != null && height != null) { + button.setSize(Integer.parseInt(width.toString()), Integer.parseInt(height.toString())); + } mainPanel.add(button); components.put(newWid, button); // Connect swing component and model. @@ -114,7 +152,7 @@ resources = new HashMap<>(); channelAndResourcesForReceiving.put(setVisibleChannel, resources); } - resources.put(newWid, widgetsResource); + resources.put(newWid, widgetResource); ComponentTextReceiver nativeTextReceiver = new ComponentTextReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource); @@ -123,11 +161,69 @@ resources = new HashMap<>(); channelAndResourcesForReceiving.put(setTextChannel, resources); } - resources.put(newWid, widgetsResource); + resources.put(newWid, widgetResource); + + Resource widgetXResource = widgetResource.getChildrenMap().get("\"x\""); + if (widgetXResource != null) { + ComponentXReceiver nativeXReceiver = new ComponentXReceiver(button); // widgetResource => button + simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); + resources = channelAndResourcesForReceiving.get(setXChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setXChannel, resources); + } + resources.put(newWid, widgetXResource); + } + + Resource widgetYResource = widgetResource.getChildrenMap().get("\"y\""); + if (widgetYResource != null) { + ComponentYReceiver nativeYReceiver = new ComponentYReceiver(button); // widgetResource => button + simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); + resources = channelAndResourcesForReceiving.get(setYChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setYChannel, resources); + } + resources.put(newWid, widgetYResource); + } + + Resource widgetWidthResource = widgetResource.getChildrenMap().get("\"width\""); + if (widgetWidthResource != null) { + ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(button); // widgetResource => button + simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); + resources = channelAndResourcesForReceiving.get(setWidthChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setWidthChannel, resources); + } + resources.put(newWid, widgetWidthResource); + } + + Resource widgetHeightResource = widgetResource.getChildrenMap().get("\"height\""); + if (widgetHeightResource != null) { + ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(button); // widgetResource => button + simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); + resources = channelAndResourcesForReceiving.get(setHeightChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setHeightChannel, resources); + } + resources.put(newWid, widgetHeightResource); + } } else if (type.toString().equals("\"label\"")) { // Add a label component. Expression text = widget.get("\"text\""); + Expression x = widget.get("\"x\""); + Expression y = widget.get("\"y\""); + Expression width = widget.get("\"width\""); + Expression height = widget.get("\"height\""); JLabel label = new JLabel(text.toString().replace("\"", "")); + if (x != null && y != null) { + label.setLocation(Integer.parseInt(x.toString()), Integer.parseInt(y.toString())); + } + if (width != null && height != null) { + label.setSize(Integer.parseInt(width.toString()), Integer.parseInt(height.toString())); + } mainPanel.add(label); components.put(newWid, label); @@ -139,7 +235,7 @@ resources = new HashMap<>(); channelAndResourcesForReceiving.put(setVisibleChannel, resources); } - resources.put(newWid, widgetsResource); + resources.put(newWid, widgetResource); ComponentTextReceiver nativeTextReceiver = new ComponentTextReceiver(label); // widgetResource => label simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource); @@ -148,10 +244,68 @@ resources = new HashMap<>(); channelAndResourcesForReceiving.put(setTextChannel, resources); } - resources.put(newWid, widgetsResource); + resources.put(newWid, widgetResource); + + Resource widgetXResource = widgetResource.getChildrenMap().get("x"); + if (widgetXResource != null) { + ComponentXReceiver nativeXReceiver = new ComponentXReceiver(label); // widgetResource => label + simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); + resources = channelAndResourcesForReceiving.get(setXChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setXChannel, resources); + } + resources.put(newWid, widgetXResource); + } + + Resource widgetYResource = widgetResource.getChildrenMap().get("y"); + if (widgetYResource != null) { + ComponentYReceiver nativeYReceiver = new ComponentYReceiver(label); // widgetResource => label + simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); + resources = channelAndResourcesForReceiving.get(setYChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setYChannel, resources); + } + resources.put(newWid, widgetYResource); + } + + Resource widgetWidthResource = widgetResource.getChildrenMap().get("width"); + if (widgetWidthResource != null) { + ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(label); // widgetResource => label + simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); + resources = channelAndResourcesForReceiving.get(setWidthChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setWidthChannel, resources); + } + resources.put(newWid, widgetWidthResource); + } + + Resource widgetHeightResource = widgetResource.getChildrenMap().get("height"); + if (widgetHeightResource != null) { + ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(label); // widgetResource => label + simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); + resources = channelAndResourcesForReceiving.get(setHeightChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setHeightChannel, resources); + } + resources.put(newWid, widgetHeightResource); + } } else if (type.toString().equals("\"textInput\"")) { // Add a text input component. + Expression x = widget.get("\"x\""); + Expression y = widget.get("\"y\""); + Expression width = widget.get("\"width\""); + Expression height = widget.get("\"height\""); JTextField textField = new JTextField(10); + if (x != null && y != null) { + textField.setLocation(Integer.parseInt(x.toString()), Integer.parseInt(y.toString())); + } + if (width != null && height != null) { + textField.setSize(Integer.parseInt(width.toString()), Integer.parseInt(height.toString())); + } mainPanel.add(textField); components.put(newWid, textField); // Connect swing component and model. @@ -165,7 +319,55 @@ resources = new HashMap<>(); channelAndResourcesForReceiving.put(setVisibleChannel, resources); } - resources.put(newWid, widgetsResource); + resources.put(newWid, widgetResource); + + Resource widgetXResource = widgetResource.getChildrenMap().get("x"); + if (widgetXResource != null) { + ComponentXReceiver nativeXReceiver = new ComponentXReceiver(textField); // widgetResource => textField + simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); + resources = channelAndResourcesForReceiving.get(setXChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setXChannel, resources); + } + resources.put(newWid, widgetXResource); + } + + Resource widgetYResource = widgetResource.getChildrenMap().get("y"); + if (widgetYResource != null) { + ComponentYReceiver nativeYReceiver = new ComponentYReceiver(textField); // widgetResource => textField + simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); + resources = channelAndResourcesForReceiving.get(setYChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setYChannel, resources); + } + resources.put(newWid, widgetYResource); + } + + Resource widgetWidthResource = widgetResource.getChildrenMap().get("width"); + if (widgetWidthResource != null) { + ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(textField); // widgetResource => textField + simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); + resources = channelAndResourcesForReceiving.get(setWidthChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setWidthChannel, resources); + } + resources.put(newWid, widgetWidthResource); + } + + Resource widgetHeightResource = widgetResource.getChildrenMap().get("height"); + if (widgetHeightResource != null) { + ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(textField); // widgetResource => textField + simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); + resources = channelAndResourcesForReceiving.get(setHeightChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setHeightChannel, resources); + } + resources.put(newWid, widgetHeightResource); + } } } } @@ -177,5 +379,24 @@ } } } + + public class SwingLayout implements INativeReceiver { + + @Override + public void onReceiveFromModel(Event event, SystemState nextSystemState) { + Expression message = event.getMessage(); + if (message instanceof Term && ((Term) message).getChildren().size() >= 1) { + Expression newLayout = ((Term) message).getChild(0); + if (newLayout instanceof Constant) { + if (newLayout.toString().equals("true")) { + mainPanel.setLayout(new FlowLayout()); + } else if (newLayout.toString().equals("false")) { + mainPanel.setLayout(null); + } + } + } + } + + } }