diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java index d1f4d24..ab2d513 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java @@ -25,13 +25,13 @@ Expression eventMessage = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); Term termMessage = (Term)eventMessage.clone(); termMessage.setChild(0, one); - sendToModel(message); + sendToModel(termMessage); } else if(method.equals("onMouseReleased")) { Constant zero = new Constant("0", DataConstraintModel.typeInt); Expression eventMessage = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); Term termMessage = (Term) eventMessage.clone(); termMessage.setChild(0, zero); - sendToModel(message); + sendToModel(termMessage); } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementTextReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementTextReceiver.java new file mode 100644 index 0000000..5998a45 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementTextReceiver.java @@ -0,0 +1,42 @@ +package simulator.interfaces.html; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Term; +import models.dataConstraintModel.JsonTerm; +import models.dataConstraintModel.MapTerm; +import simulator.Event; +import simulator.SystemState; +import simulator.interfaces.INativeReceiver; + +public class HtmlElementTextReceiver implements INativeReceiver{ + + protected HtmlElement element; + private final IWebSocketMessageSender ws; + + public HtmlElementTextReceiver(HtmlElement elem, IWebSocketMessageSender ws) { + this.ws = ws; + element = elem; + } + + @Override + public void onReceiveFromModel(Event event, SystemState nextSystemState) { + Expression message = event.getMessage(); + if (message instanceof Term) { + Expression text = ((Term) message).getChild(0); + if(text instanceof Constant) { + element.setText(text.toString()); + + JsonTerm json = new JsonTerm(); + json.addMember("\"method\"", new Constant("\"changeText\"")); + json.addMember("\"id\"", new Constant(element.getId())); + MapTerm datas = new MapTerm(); + datas.insert("\"newText\"", new Constant(text.toString())); + json.addMember("\"datas\"", datas); + + ws.send(json.toString()); + } + } + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java index 494b3ee..3d981e4 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java @@ -12,9 +12,6 @@ public class HtmlElementVisibilityReceiver implements INativeReceiver{ - //HtmlElementにwebsocketのインスタンスを渡さない場合こちらに必要 - //見えるかどうかの変更があった場合、html(クライアント側)へwebsocket messageを送る必要がある - // protected HtmlElement element; private final IWebSocketMessageSender ws; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java index faee114..fc0aa6c 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java @@ -23,6 +23,7 @@ public final String screenUpdateChannelName = "ScreenUpdate"; public final String setVisibleChannelName = "SetVisible"; + public final String setTextChannelName = "SetText"; public final String mouseEventChannelName = "MouseEvent"; public final String textEventChannelName = "TextEvent"; @@ -31,6 +32,7 @@ protected DataTransferChannel setVisibleChannel; protected DataTransferChannel mouseEventChannel; protected DataTransferChannel textEventChannel; + protected DataTransferChannel setTextChannel; protected Map> channelAndResourcesForReceiving = new HashMap<>(); @@ -45,6 +47,7 @@ screenUpdateChannel = (DataTransferChannel) simulator.getModel().getChannel(screenUpdateChannelName); setVisibleChannel = (DataTransferChannel) simulator.getModel().getChannel(setVisibleChannelName); mouseEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(mouseEventChannelName); + setTextChannel = (DataTransferChannel) simulator.getModel().getChannel(setTextChannelName); textEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(textEventChannelName); simulator.addNativeReceiver(this, screenUpdateChannel); @@ -124,8 +127,33 @@ private void addButton(JsonTerm widget, String wid, ListTerm addElements, Resource widgetResource) { String text = widget.get("\"text\"").toString(); HtmlElement button = new HtmlElement("button", wid, text); + + //ボタンが押されたり離されたりした時を検知 ResourcePath resPath = mouseEventChannel.getOutputResources().iterator().next(); button.setRestEventListener(new HtmlElementMouseSender(simulator, mouseEventChannel, resPath, widgetResource)); + + //ボタンが透明になったことを通知 + HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(button, ws); +// simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel, widgetResource); + simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel); + Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setVisibleChannel, resources); + } + resources.put(wid, widgetResource); + + //ボタンの文字が変わったことを通知 + HtmlElementTextReceiver nativeTextReceiver = new HtmlElementTextReceiver(button, ws); +// simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource); こっちだと動かない? + simulator.addNativeReceiver(nativeTextReceiver, setTextChannel); + resources = channelAndResourcesForReceiving.get(setTextChannel); + if (resources == null) { + resources = new HashMap<>(); + channelAndResourcesForReceiving.put(setTextChannel, resources); + } + resources.put(wid, widgetResource); + elements.put(wid, button); addElements.append(button.toMap()); }