diff --git a/models/SimpleUI2.model b/models/SimpleUI2.model index da3b0c3..0aec4b3 100644 --- a/models/SimpleUI2.model +++ b/models/SimpleUI2.model @@ -26,10 +26,9 @@ out screen.widgets(widgets: Map, addLabel(wid: Str, text: Str)) = insert(widgets, wid, {"type": "label", "text": text, "state": 0}) } -channel AddInputText { - out screen.widgets(widgets: Map, addInputText(wid: Str)) = insert(widgets, wid, {"type": "inputText", "state": 0}) +channel AddTextInput { + out screen.widgets(widgets: Map, addTextInput(wid: Str)) = insert(widgets, wid, {"type": "textInput", "text": "", "state": 0}) } - channel Init { - out screen.widgets(widgets: Map, init(_tmp)) = insert(insert(widgets, "0", {"type": "button", "text": "OK", "state": 0}), "1", {"type": "button", "text": "hi", "state": 0}) + out screen.widgets(widgets: Map, init(_tmp)) = insert(widgets, "0", {"type": "button", "text": "OK", "state": 0}) } diff --git a/src/main/java/com/example/test/dtram/Dtram.java b/src/main/java/com/example/test/dtram/Dtram.java index c5c0bdf..c591777 100644 --- a/src/main/java/com/example/test/dtram/Dtram.java +++ b/src/main/java/com/example/test/dtram/Dtram.java @@ -3,6 +3,8 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; +import java.util.HashMap; +import java.util.Map; import org.springframework.stereotype.Component; @@ -12,6 +14,7 @@ import models.algebra.UnificationFailed; import models.algebra.ValueUndefined; import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.JsonTerm; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; @@ -22,6 +25,7 @@ import parser.exceptions.WrongJsonExpression; import simulator.Event; import simulator.Simulator; +import simulator.interfaces.html.HtmlElement; import simulator.interfaces.html.HtmlPresenter; import simulator.interfaces.html.IWebSocketMessageSender; @@ -34,10 +38,13 @@ private final IWebSocketMessageSender ws; + private Map elements; + HtmlPresenter presenter; Dtram(IWebSocketMessageSender ws){ this.ws = ws; + elements = new HashMap<>(); } public void initModel(String path) { @@ -54,7 +61,7 @@ public void startSimulator() { simulator = new Simulator(model); simulator.init(); - presenter = new HtmlPresenter(simulator, ws); + presenter = new HtmlPresenter(simulator, ws, elements); System.out.println(simulator.getCurState().getResource("screen.widgets")); try { Parser.TokenStream stream = new Parser.TokenStream(); @@ -77,7 +84,28 @@ } } + public void testEvent() { + try { + Parser.TokenStream stream = new Parser.TokenStream(); + Parser p = new Parser(stream); + stream.addLine("textEvent(\"aiueo\")"); + Expression eventMessage = p.parseTerm(stream, model); + ResourcePath eventResPath = null; + DataTransferChannel textEventChannel = (DataTransferChannel) model.getInputChannel("TextEvent"); + for(ChannelMember out : textEventChannel.getOutputChannelMembers()) { + eventResPath = out.getResource(); + } + Event newEvent = new Event(textEventChannel, eventMessage, eventResPath, simulator.getCurState().getResource("screen.widgets.0.text")); + simulator.transition(newEvent); + } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | UnificationFailed | ValueUndefined e) { + // TODO 自動生成された catch ブロック + e.printStackTrace(); + } + } + public void onRestEvent(String id, String method, JsonTerm message) { + elements.get("\"" + id + "\"").onRestEvent(method, message); + } diff --git a/src/main/java/com/example/test/rest_controllers/ElementsController.java b/src/main/java/com/example/test/rest_controllers/ElementsController.java index 354b46a..58ee20c 100644 --- a/src/main/java/com/example/test/rest_controllers/ElementsController.java +++ b/src/main/java/com/example/test/rest_controllers/ElementsController.java @@ -5,18 +5,26 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.example.test.services.ButtonService; + @RestController @RequestMapping("/api/elements") public class ElementsController { + private final ButtonService buttonService; + + ElementsController(ButtonService bs){ + buttonService = bs; + } + @PostMapping("/buttonPressed") public void buttonPressed(@RequestParam("id") String id) { - System.out.println("button " + id + " pressed!"); + buttonService.onButtonPressed(id); } @PostMapping("/buttonReleased") public void buttonReleased(@RequestParam("id") String id) { - System.out.println("button " + id + " released!"); + buttonService.onButtonReleased(id); } } diff --git a/src/main/java/com/example/test/rest_controllers/OpenModelController.java b/src/main/java/com/example/test/rest_controllers/OpenModelController.java index 148169f..220f365 100644 --- a/src/main/java/com/example/test/rest_controllers/OpenModelController.java +++ b/src/main/java/com/example/test/rest_controllers/OpenModelController.java @@ -22,5 +22,10 @@ modelService.openModel(path); } + @PostMapping("/test_event") + public void testEvent() { + modelService.testEvent(); + } + } diff --git a/src/main/java/com/example/test/services/ButtonService.java b/src/main/java/com/example/test/services/ButtonService.java index 0b39ce0..da6117c 100644 --- a/src/main/java/com/example/test/services/ButtonService.java +++ b/src/main/java/com/example/test/services/ButtonService.java @@ -2,18 +2,23 @@ import org.springframework.stereotype.Service; -import models.dataConstraintModel.ResourcePath; -import models.dataFlowModel.DataTransferChannel; -import simulator.Resource; -import simulator.Simulator; -import simulator.interfaces.NativeSender; +import com.example.test.dtram.Dtram; @Service -public class ButtonService extends NativeSender{ - - public ButtonService(Simulator simulator, DataTransferChannel channel, ResourcePath resourcePath, - Resource resource) { - super(simulator, channel, resourcePath, resource); +public class ButtonService { + + private final Dtram dtram; + + ButtonService(Dtram dtram) { + this.dtram = dtram; + } + + public void onButtonPressed(String id) { + dtram.onRestEvent(id, "onMousePressed", null); + } + + public void onButtonReleased(String id) { + dtram.onRestEvent(id, "onMouseReleased", null); } } diff --git a/src/main/java/com/example/test/services/ModelHandleService.java b/src/main/java/com/example/test/services/ModelHandleService.java index 4ef8ee8..c8c854b 100644 --- a/src/main/java/com/example/test/services/ModelHandleService.java +++ b/src/main/java/com/example/test/services/ModelHandleService.java @@ -18,4 +18,8 @@ dtram.startSimulator(); } + public void testEvent() { + dtram.testEvent(); + } + } diff --git a/src/main/resources/static/simulator_ws.js b/src/main/resources/static/simulator_ws.js index 4e932f2..34dd0e4 100644 --- a/src/main/resources/static/simulator_ws.js +++ b/src/main/resources/static/simulator_ws.js @@ -1,6 +1,8 @@ const apiUrl = "http://localhost:8080/api" let socket = new WebSocket("ws://localhost:8080/ws"); +let idSet = new Set(); + socket.onmessage = function(event) { console.log(event.data); @@ -11,28 +13,43 @@ case "updateHtml": put_htmls(json_data.data); break; + case "changeText": + change_text(json_data) + break; } } +function change_text(json){ + let id = json.id; + let datas = json.datas; + let new_text = datas.newText; + document.getElementById(id).textContent = new_text; +} function put_htmls(elements){ let container = document.getElementById("container"); let addElems = elements.add; let delElems = elements.delete; for(const id of delElems) { + idSet.delete(id); let elem = document.getElementById(id); if(elem) { elem.parentNode.removeChild(elem); } } for(const elem of addElems){ + let id = elem.id; let type = elem.type; let styles = elem.styles; let text = elem.text; let style = ""; + if(idSet.has(id)){ + continue; + } + idSet.add(id); for(const prop in styles){ let value = styles[prop]; style += `${prop}: ${value};`