diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java index e264a89..494b3ee 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java @@ -7,6 +7,7 @@ import models.dataConstraintModel.JsonTerm; import models.dataConstraintModel.MapTerm; import simulator.Event; +import simulator.SystemState; import simulator.interfaces.INativeReceiver; public class HtmlElementVisibilityReceiver implements INativeReceiver{ @@ -24,7 +25,7 @@ } @Override - public void onReceiveFromModel(Event event) { + public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); if (message instanceof Term) { Expression visible = ((Term) message).getChild(0); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java index 8997834..e622697 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java @@ -15,27 +15,28 @@ import simulator.Event; import simulator.Resource; import simulator.Simulator; +import simulator.SystemState; import simulator.interfaces.INativeReceiver; public class HtmlPresenter implements INativeReceiver{ - + public final String screenUpdateChannelName = "ScreenUpdate"; public final String setVisibleChannelName = "SetVisible"; public final String mouseEventChannelName = "MouseEvent"; public final String textEventChannelName = "TextEvent"; - + protected Simulator simulator; protected DataTransferChannel screenUpdateChannel; protected DataTransferChannel setVisibleChannel; protected DataTransferChannel mouseEventChannel; protected DataTransferChannel textEventChannel; - - protected Map> channelAndResourcesForReceiving = new HashMap<>();// ??? - + + protected Map> channelAndResourcesForReceiving = new HashMap<>(); + protected Map elements; - + protected IWebSocketMessageSender ws; - + public HtmlPresenter(Simulator simulator, IWebSocketMessageSender ws) { this.simulator = simulator; this.ws = ws; @@ -44,91 +45,108 @@ mouseEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(mouseEventChannelName); textEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(textEventChannelName); simulator.addNativeReceiver(this, screenUpdateChannel); - + elements = new HashMap<>(); } - + + @Override - public void onReceiveFromModel(Event event) { + public void onReceiveFromModel(Event event, SystemState nextSystemState) { //画面遷移するときに呼ばれそう - - + Expression message = event.getMessage(); - - if (message instanceof Term && ((Term) message).getChildren().size() == 1) { - message = ((Term)message).getChild(0); - - // Remove old native receivers. - if (message instanceof JsonTerm) { - - for (DataTransferChannel channel : channelAndResourcesForReceiving.keySet()) { - for (Resource resource : channelAndResourcesForReceiving.get(channel)) { - simulator.removeNativeReceiver(channel, resource); + + if (message instanceof Term && ((Term) message).getChildren().size() >= 2) { + Expression curScExp = ((Term) message).getChild(0); + Expression nextScExp = ((Term) message).getChild(1); + + if (curScExp instanceof JsonTerm && nextScExp instanceof JsonTerm) { + + JsonTerm sendData = new JsonTerm(); + sendData.addMember("\"method\"", new Constant("\"updateHtml\"")); + JsonTerm sendElements = new JsonTerm(); + ListTerm addElements = new ListTerm(); + ListTerm delElements = new ListTerm(); + + JsonTerm curSc = (JsonTerm) curScExp; + JsonTerm nextSc = (JsonTerm) nextScExp; + Expression oldWidgets = curSc.get("widgets"); + Expression newWidgets = nextSc.get("widgets"); + + if (oldWidgets instanceof MapTerm && newWidgets instanceof MapTerm) { + + Set oldWidSet = new HashSet<>(((MapTerm) oldWidgets).keySet()); + Set newWidSet = new HashSet<>(((MapTerm) newWidgets).keySet()); + oldWidSet.removeAll(((MapTerm) newWidgets).keySet()); + newWidSet.removeAll(((MapTerm)oldWidgets).keySet()); + + if(!oldWidSet.isEmpty()) { + deleteOldWidgets(oldWidSet, delElements); + } + + if (!newWidSet.isEmpty()) { + addNewWidgets(newWidSet, nextSystemState, event, newWidgets, addElements); } } - - channelAndResourcesForReceiving.clear(); - - JsonTerm screenContent = (JsonTerm) message; //受け取ったmessageをjsonとして扱う - Resource screenResource = simulator.getCurState().getResource(event.getInputResource().getResourceIdentifier()); //出力チャンネルに接続されたresourceを取得? - Expression widgets = screenContent.get("widgets"); //json化したmessageから"widgets"を取得 - Resource widgetsResource = screenResource.getChildrenMap().get("widgets");//??? - - elements.clear(); - - if(widgets instanceof MapTerm) { - for(String key : ((MapTerm) widgets).keySet()) { // keyはなに? どうやって決められる? - Expression value = ((MapTerm) widgets).get(key); //widgetの構成要素(text, typeなど)を持つjson, 一つのwidgetを表す? - if(value instanceof JsonTerm) { - JsonTerm widget = (JsonTerm) value; //jsonとして扱えるように - Resource widgetResouce = widgetsResource.getChildrenMap().get(key); //??? - Expression type = widget.get("\"type\""); //widgetのtypeを取得 - if(type.toString().equals("\"button\"")) { - - //こんな感じになりそう - Expression text = widget.get("\"text\""); - HtmlElement button = new HtmlElement(type.toString(), key, text.toString().replace("\"", "")); - elements.put(key, button); - - //ボタンが押された時の処理 - //ボタンが押されたかどうかをどうやって確認するか - //そもそもボタンが押されたらREST API が叩かれるのでは? - - //可視化、不可視化のやつ - HtmlElementVisibilityReceiver nativeReceiver = new HtmlElementVisibilityReceiver(button, ws); - simulator.addNativeReceiver(nativeReceiver, setVisibleChannel, widgetResouce); - Set resources = channelAndResourcesForReceiving.get(setVisibleChannel);//この辺謎 - if (resources == null) { - resources = new HashSet<>(); - channelAndResourcesForReceiving.put(setVisibleChannel, resources); - } - resources.add(widgetsResource); - - } else if(type.toString().equals("label")) { - - Expression text = widget.get("\"text\""); - HtmlElement elem = new HtmlElement(type.toString(), key, text.toString().replace("\"", "")); - elements.put(key, elem); - - } else if(type.toString().equals("inputText")) { - - HtmlElement elem = new HtmlElement(type.toString(), key, ""); - elements.put(key, elem); - - } - } - } - - JsonTerm json = new JsonTerm(); - json.addMember("\"method\"", new Constant("\"updateHtml\"")); - ListTerm elements = new ListTerm(); - for(String id : this.elements.keySet()) { - elements.append(this.elements.get(id).toMap()); - } - json.addMember("\"elements\"",elements); - ws.send(json.toString()); + + + + sendElements.addMember("\"add\"", addElements); + sendElements.addMember("\"delete\"", delElements); + sendData.addMember("\"data\"", sendElements); + + ws.send(sendData.toString()); + } + + } + } + + + private void addNewWidgets(Set newWidSet, SystemState nextSystemState, Event event, Expression newWidgets, ListTerm addElements) { + + Resource screenResource = nextSystemState.getResource(event.getInputResource().getResourceIdentifier()); + Resource widgetsResource = screenResource.getChildrenMap().get("widgets"); + for(String newWid: newWidSet) { + Expression value = ((MapTerm) newWidgets).get(newWid); + if(value instanceof JsonTerm) { + JsonTerm widget = (JsonTerm) value; + Resource widgetResource = widgetsResource.getChildrenMap().get(newWid); + Expression type = widget.get("\"type\""); + + switch(type.toString()) { + case "button": + addButton(widget, newWid, addElements); + break; + } - + + } + } + + } + + private void addButton(JsonTerm widget, String wid, ListTerm addElements) { + String text = widget.get("\"text\"").toString(); + HtmlElement button = new HtmlElement("button", wid, text); + elements.put(wid, button); + addElements.append(new Constant(wid)); + } + + private void deleteOldWidgets(Set oldWidSet, ListTerm delElements) { + for (String oldWid : oldWidSet) { + elements.remove(oldWid); + //TODO + // del widgets + delElements.append(new Constant(oldWid)); + } + + for (DataTransferChannel channel : channelAndResourcesForReceiving.keySet()) { + Map widToResource = channelAndResourcesForReceiving.get(channel); + for (String oldWid: oldWidSet) { + Resource resource = widToResource.remove(oldWid); + if (resource != null) { + simulator.removeNativeReceiver(channel, resource); + } } } }