diff --git a/models/SimpleUI.model b/models/SimpleUI.model index 584d8e3..9b54346 100644 --- a/models/SimpleUI.model +++ b/models/SimpleUI.model @@ -1,5 +1,15 @@ +init { + screen := {"widgets": {"001": {"type": "button", "text": "OK", "state": 0}, + "002": {"type": "textInput", "text": "", "state": 0}}, + "layout": true} +} + native channel ScreenUpdate { - in screen(curSc: Json, update(nextSc)) = nextSc + in screen(curSc: Json, update(curSc, nextSc)) = nextSc +} + +native channel SetLayout { + in screen.layout(curLayout: Bool, setLayout(nextLayout)) = nextLayout } native channel SetVisible(wid: Str) { @@ -10,6 +20,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 +44,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}) } @@ -26,6 +64,18 @@ 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 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/models/SimpleUI2.model b/models/SimpleUI2.model index 1247b28..8c63896 100644 --- a/models/SimpleUI2.model +++ b/models/SimpleUI2.model @@ -1,7 +1,21 @@ +init { + screen := { + "widgets": { + "001": {"type": "label", "text": "a", "state": 0}, + "002": {"type": "textInput", "text": "", "state": 0} + }, + "layout": true + } +} + native channel ScreenUpdate { 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 } @@ -18,17 +32,11 @@ out screen.widgets.{wid}.text(curText: Str, textEvent(nextText)) = nextText } -channel AddButton { - out screen.widgets(widgets: Map, addButton(wid: Str, text: Str)) = insert(widgets, wid, {"type": "button", "text": text, "state": 0}) -} - -channel AddLabel { - out screen.widgets(widgets: Map, addLabel(wid: Str, text: Str)) = insert(widgets, wid, {"type": "label", "text": text, "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(widgets, "0", {"type": "textInput", "text": "OK", "state": 0}) + +channel ChangeText { + in screen.widgets.002.text(curText: Str, updateText(newText: Str)) = curText + out screen.widgets.001.text(curText: Str, updateText(newText: Str)) = newText } diff --git a/models/sample.model b/models/sample.model new file mode 100644 index 0000000..f7c93ed --- /dev/null +++ b/models/sample.model @@ -0,0 +1,63 @@ + +init { +screen := { + "widgets": { + "0dbaeeb89bf349748ef4f7fc1388fe19": { + "type": "button", + "text": "ボタン", + "state": 0, + "x": 193.1903429031372, + "y": 73, + "width": 96.875, + "height": 37.79829406738281 + }, + "b92b875fe3e442118e512e854fdf6dad": { + "type": "textInput", + "text": "入力欄", + "state": 0, + "x": 178.1903429031372, + "y": 175.79261016845703, + "width": 96.875, + "height": 37.79829406738281 + }, + "47b39829ea8d4949940695f019439711": { + "type": "label", + "text": "テキストラベル", + "state": 0, + "x": 276.1903429031372, + "y": 338.5852279663086, + "width": 96.875, + "height": 57.79829406738281 + } + }, + "layout": true +} +} + +native channel ScreenUpdate { + 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 +} + +native channel SetText(wid: Str) { + in screen.widgets.{wid}.text(curText: Str, setText(nextText)) = nextText +} + +native channel MouseEvent(wid: Str) { + out screen.widgets.{wid}.state(curState: Int, mouseEvent(nextState)) = nextState +} + +native channel TextEvent(wid: Str) { + out screen.widgets.{wid}.text(curText: Str, textEvent(nextText)) = nextText +} + +channel AddTextInput { + out screen.widgets(widgets: Map, addTextInput(wid: Str)) = insert(widgets, wid, {"type": "textInput", "text": "", "state": 0}) +} diff --git a/src/main/java/com/example/test/controller/SimulatPageController.java b/src/main/java/com/example/test/controller/SimulatPageController.java deleted file mode 100644 index 0742c50..0000000 --- a/src/main/java/com/example/test/controller/SimulatPageController.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.example.test.controller; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -@RequestMapping("/simulator") -public class SimulatPageController { - - @GetMapping("") - public String simulatePage(Model model) { - List modelFiles = new ArrayList<>(); - File directory = new File("models"); - if(directory.exists() && directory.isDirectory()) { - String[] files = directory.list(); - for(String f : files) { - modelFiles.add(f); - } - } - model.addAttribute("files", modelFiles); - return "simulator"; - } - -} diff --git a/src/main/java/com/example/test/controller/SimulatePageController.java b/src/main/java/com/example/test/controller/SimulatePageController.java new file mode 100644 index 0000000..8e52a9d --- /dev/null +++ b/src/main/java/com/example/test/controller/SimulatePageController.java @@ -0,0 +1,15 @@ +package com.example.test.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/simulator") +public class SimulatePageController { + + @GetMapping("") + public String simulatePage() { + return "simulator"; + } +} diff --git a/src/main/java/com/example/test/dtram/Dtram.java b/src/main/java/com/example/test/dtram/Dtram.java index b958ae3..270fffd 100644 --- a/src/main/java/com/example/test/dtram/Dtram.java +++ b/src/main/java/com/example/test/dtram/Dtram.java @@ -3,26 +3,17 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Component; -import com.example.test.pojo.Layout; - -import algorithms.TypeInference; -import models.algebra.Expression; -import models.algebra.Variable; -import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.JsonTerm; -import models.dataConstraintModel.ResourcePath; -import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; import parser.Parser; -import parser.Parser.TokenStream; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.WrongJsonExpression; import simulator.Simulator; import simulator.interfaces.html.HtmlElement; import simulator.interfaces.html.HtmlPresenter; @@ -52,112 +43,25 @@ try { Parser parser = new Parser(new BufferedReader(new FileReader(file))); model = parser.doParse(); - model.getInputChannel("Init"); }catch(Exception e) { - - } - } - - public void constructModel(Layout l) { - try { - - TokenStream stream = new Parser.TokenStream(); - Parser parser = new Parser(stream); - - model = new DataTransferModel(); - ResourcePath screen = new ResourcePath("screen"); - ResourcePath widgets = new ResourcePath(screen, "widgets"); - ResourcePath widget = new ResourcePath(widgets, new Variable("wid")); - ResourcePath type = new ResourcePath(widget, "type"); - ResourcePath text = new ResourcePath(widget, "text"); - ResourcePath id = new ResourcePath(widget, "id"); - ResourcePath state = new ResourcePath(widget, "state"); - ResourcePath visible = new ResourcePath(widget, "visible"); - ResourcePath x = new ResourcePath(widget, "x"); - ResourcePath y = new ResourcePath(widget, "y"); - ResourcePath w = new ResourcePath(widget, "w"); - ResourcePath h = new ResourcePath(widget, "h"); - - model.addResourcePath(screen); - model.addResourcePath(widgets); - model.addResourcePath(widget); - model.addResourcePath(type); - model.addResourcePath(id); - model.addResourcePath(text); - model.addResourcePath(state); - model.addResourcePath(visible); - model.addResourcePath(x); - model.addResourcePath(y); - model.addResourcePath(w); - model.addResourcePath(h); -// JsonTerm elements = new JsonTerm(); -// for(Element element : l.getElements()) { -// JsonTerm elem = new JsonTerm(); -// elem.addMember("type", new Constant(element.getType())); -// elem.addMember("id", new Constant(element.getId())); -// elem.addMember("text", new Constant(element.getText())); -// elements.addMember(element.getId(), elem); -// } -// widgets.getResourceHierarchy().setInitialValue(elements); - - addNativeOutputChannel(stream, parser, screen, "ScreenUpdate", "curSc: Json", "update(curSc, nextSc)", "nextSc"); - addNativeOutputChannel(stream, parser, visible, "SetVisible", "curVisible: Bool", "setVisible(nextVisible)", "nextVisible"); - addNativeOutputChannel(stream, parser, text, "SetText", "curText: Str", "setText(nextText)", "nextText"); - addNativeInputChannel(stream, parser, state, "MouseEvent", "curState: Int", "mouseEvent(nextState)", "nextState"); - addNativeInputChannel(stream, parser, text, "MouseEvent", "curText: Str", "textEvent(nextText)", "nextText"); - - TypeInference.infer(model); - - - - } catch (Exception e) { - // TODO 自動生成された catch ブロック e.printStackTrace(); } - } - private void addNativeOutputChannel(TokenStream stream, Parser parser, ResourcePath path, - String channelName, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon { - DataTransferChannel outputChannel = new DataTransferChannel(channelName); - outputChannel.setNative(true); - ChannelMember out = new ChannelMember(path); - stream.addLine(curStateName); - Expression curState = parser.parseTerm(stream, model); - stream.addLine(messageName); - Expression message = parser.parseTerm(stream, model); - stream.addLine(nextStateName); - Expression nextState = parser.parseTerm(stream, model); - out.getStateTransition().setCurStateExpression(curState); - out.getStateTransition().setMessageExpression(message); - out.getStateTransition().setNextStateExpression(nextState); - outputChannel.addChannelMemberAsInput(out); - model.addChannel(outputChannel); - } - - private void addNativeInputChannel(TokenStream stream, Parser parser, ResourcePath path, - String channelName, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon { - DataTransferChannel inputChannel = new DataTransferChannel(channelName); - inputChannel.setNative(true); - ChannelMember in = new ChannelMember(path); - stream.addLine(curStateName); - Expression curState = parser.parseTerm(stream, model); - stream.addLine(messageName); - Expression message = parser.parseTerm(stream, model); - stream.addLine(nextStateName); - Expression nextState = parser.parseTerm(stream, model); - in.getStateTransition().setCurStateExpression(curState); - in.getStateTransition().setMessageExpression(message); - in.getStateTransition().setNextStateExpression(nextState); - inputChannel.addChannelMemberAsOutput(in); - model.addInputChannel(inputChannel); + public void initModel(InputStream stream) { + try { + Parser parser = new Parser(new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))); + model = parser.doParse(); + } + catch(Exception e) { + e.printStackTrace(); + } } public void startSimulator() { simulator = new Simulator(model); simulator.init(); presenter = new HtmlPresenter(simulator, ws, elements); - System.out.println(simulator.getCurState().getResource("screen.widgets")); } public void onRestEvent(String id, String method, JsonTerm message) { 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 5c83f16..ad4f985 100644 --- a/src/main/java/com/example/test/rest_controllers/OpenModelController.java +++ b/src/main/java/com/example/test/rest_controllers/OpenModelController.java @@ -1,12 +1,13 @@ package com.example.test.rest_controllers; +import java.io.IOException; + import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; -import com.example.test.pojo.Layout; import com.example.test.services.ModelHandleService; @RestController @@ -20,14 +21,16 @@ } @PostMapping("/open_model") - public void openModel(@RequestParam("path") String path) { - modelService.openModel(path); + public void openModel(@RequestParam("file") MultipartFile file) { + try { + modelService.openModel(file.getInputStream()); + } catch (IOException e) { + // TODO 自動生成された catch ブロック + e.printStackTrace(); + } } - @PostMapping("/layout_json") - public void layoutJson(@RequestBody Layout l) { - modelService.loadLayout(l); - } + } diff --git a/src/main/java/com/example/test/services/ModelHandleService.java b/src/main/java/com/example/test/services/ModelHandleService.java index b073757..ae976d5 100644 --- a/src/main/java/com/example/test/services/ModelHandleService.java +++ b/src/main/java/com/example/test/services/ModelHandleService.java @@ -1,9 +1,10 @@ package com.example.test.services; +import java.io.InputStream; + import org.springframework.stereotype.Service; import com.example.test.dtram.Dtram; -import com.example.test.pojo.Layout; @Service public class ModelHandleService { @@ -19,8 +20,8 @@ dtram.startSimulator(); } - public void loadLayout(Layout l) { - dtram.constructModel(l); + public void openModel(InputStream stream) { + dtram.initModel(stream); dtram.startSimulator(); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ec8b7f3..203146a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,4 @@ spring.application.name=DTRAMServer +spring.servlet.multipart.enabled=true +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB diff --git a/src/main/resources/static/open_model.js b/src/main/resources/static/open_model.js index f8814d6..bc1f0bf 100644 --- a/src/main/resources/static/open_model.js +++ b/src/main/resources/static/open_model.js @@ -1,12 +1,13 @@ function open_model() { - let file_name = document.getElementById("select_file"); - const data = {path: `models/${file_name.value}`}; - const formBody = new URLSearchParams(data); - fetch(`${apiUrl}/open_model`, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: formBody.toString() + const file = document.getElementById("file").files[0]; + if(!file) { + alert("ファイルを選択して"); + return; + } + const formData = new FormData(); + formData.append("file", file); + fetch("http://localhost:8080/api/open_model", { + method: "POST", + body: formData, }); } \ No newline at end of file diff --git a/src/main/resources/static/simulator_ws.js b/src/main/resources/static/simulator_ws.js index 019fc72..9ebddd9 100644 --- a/src/main/resources/static/simulator_ws.js +++ b/src/main/resources/static/simulator_ws.js @@ -54,7 +54,8 @@ let value = styles[prop]; style += `${prop}: ${value};` } - let style_attribute = Object.keys(styles).lenget > 0 ? `style="${style}"` : ""; + let style_attribute = Object.keys(styles).length > 0 ? `style="${style}"` : ""; + console.log(styles, style) switch(type){ case "button": container.insertAdjacentHTML("beforeend", ``) diff --git a/src/main/resources/templates/simulator.html b/src/main/resources/templates/simulator.html index dd2eb1f..adf6e3e 100644 --- a/src/main/resources/templates/simulator.html +++ b/src/main/resources/templates/simulator.html @@ -6,15 +6,12 @@
- - - +
+ + +
-
+