diff --git a/pom.xml b/pom.xml index 4d06bf3..0b48c6a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.6.12 + 0.6.13 Web4Rail jar Java Model Railway Control diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index e831a50..fabede2 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -6,6 +6,7 @@ import java.nio.charset.StandardCharsets; public interface Constants { public static final String ACTION = "action"; public static final String ACTION_ADD = "add"; + public static final String ACTION_ADD_ACTION = "add_action"; public static final String ACTION_ANALYZE = "analyze"; public static final String ACTION_AUTO = "auto"; public static final String ACTION_CLICK = "click"; diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 6a64ad9..4c08f2c 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -407,6 +407,8 @@ public class Plan implements Constants{ Route route = route(Integer.parseInt(params.get(ID))); if (route == null) return t("Unknown route: {}",params.get(ID)); switch (params.get(ACTION)) { + case ACTION_ADD_ACTION: + return route.addActionForm(params); case ACTION_PROPS: return route.properties(); case ACTION_UPDATE: diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 57db683..8d4bf27 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -29,6 +29,7 @@ import de.srsoftware.web4rail.actions.FinishRoute; import de.srsoftware.web4rail.actions.SetSignalsToStop; import de.srsoftware.web4rail.actions.SpeedReduction; import de.srsoftware.web4rail.moving.Train; +import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tiles.Block; @@ -55,12 +56,15 @@ public class Route implements Constants{ public Train train; private Block startBlock = null,endBlock; private static final String START_DIRECTION = "direction_start"; - public Direction startDirection; private static final String END_DIRECTION = "direction_end"; + + public Direction startDirection; + private Direction endDirection; + private Plan plan; + private static final String TRIGGER = "trigger"; private static final String ACTIONS = "actions"; - private static final String ID = "id"; - private Direction endDirection; + private static final String CONTACT = "contact"; /** * Route wurde von Zug betreten @@ -96,6 +100,75 @@ public class Route implements Constants{ actions.add(action); } + public Object addActionForm(HashMap params) { + String contactId = params.get(CONTACT); + Tile tag = plan.get(contactId, false); + if (!(tag instanceof Contact)) return t("No contact id passed to request!"); + Contact contact = (Contact) tag; + Window win = new Window("add-action-form", t("Add action to contact on route")); + new Tag("div").content("Route: "+this).addTo(win); + new Tag("div").content("Contact: "+contact).addTo(win); + return win; + } + + private void addBasicPropertiesTo(Window win) { + new Tag("h4").content(t("Origin and destination")).addTo(win); + Tag list = new Tag("ul"); + Plan.addLink(startBlock, t("Origin: {} to {}",startBlock.name,startDirection), list); + Plan.addLink(endBlock, t("Destination: {} from {}",endBlock.name,endDirection), list); + list.addTo(win); + + if (!signals.isEmpty()) { + new Tag("h4").content(t("Signals")).addTo(win); + list = new Tag("ul"); + for (Signal s : signals) Plan.addLink(s,s.toString(),list); + list.addTo(win); + } + } + + private void addContactsTo(Window win) { + if (!contacts.isEmpty()) { + new Tag("h4").content(t("Contacts and actions")).addTo(win); + Tag list = new Tag("ul"); + for (Contact c : contacts) { + Tag link = Plan.addLink(c,c.toString(),list); + JSONObject json = new JSONObject(Map.of( + REALM,REALM_ROUTE, + ID,id, + ACTION,ACTION_ADD_ACTION, + CONTACT,c.id())); + new Button(t("add action"),json).addTo(link); + Vector actions = triggers.get(c.trigger()); + if (actions != null && !actions.isEmpty()) { + Tag ul = new Tag("ul"); + for (Action action : actions) { + Tag act = new Tag("li").content(action.toString()); + new Button("↑").addTo(act); + new Button("↓").addTo(act); + new Button("-").addTo(act); + act.addTo(ul); + } + ul.addTo(link); + } + } + list.addTo(win); + } + } + + private void addFormTo(Window win) { + Form form = new Form(); + new Input(ACTION, ACTION_UPDATE).hideIn(form); + new Input(REALM,REALM_ROUTE).hideIn(form); + new Input(ID,id()).hideIn(form); + + Tag label = new Tag("label").content(t("name:")); + new Tag("input").attr("type", "text").attr(NAME,"name").attr("value", name()).addTo(label); + label.addTo(form); + + new Tag("button").attr("type", "submit").content(t("save")).addTo(form); + form.addTo(win); + } + void addSignal(Signal signal) { signals.add(signal); } @@ -104,6 +177,18 @@ public class Route implements Constants{ turnouts.put(t, s); } + private void addTurnoutsTo(Window win) { + if (!turnouts.isEmpty()) { + new Tag("h4").content(t("Turnouts")).addTo(win); + Tag list = new Tag("ul"); + for (Entry entry : turnouts.entrySet()) { + Turnout turnout = entry.getKey(); + Plan.addLink(turnout, turnout+": "+entry.getValue(), list); + } + list.addTo(win); + } + } + protected Route clone() { Route clone = new Route(); clone.startBlock = startBlock; @@ -233,6 +318,7 @@ public class Route implements Constants{ } private Route load(JSONObject json,Plan plan) { + this.plan = plan; if (json.has(ID)) id = json.getInt(ID); JSONArray pathIds = json.getJSONArray(PATH); startDirection = Direction.valueOf(json.getString(START_DIRECTION)); @@ -336,66 +422,14 @@ public class Route implements Constants{ public Window properties() { Window win = new Window("route-properties",t("Properties of {}",this)); - - new Tag("h4").content(t("Origin and destination")).addTo(win); - Tag list = new Tag("ul"); - Plan.addLink(startBlock, t("Origin: {} to {}",startBlock.name,startDirection), list); - Plan.addLink(endBlock, t("Destination: {} from {}",endBlock.name,endDirection), list); - list.addTo(win); - - - if (!signals.isEmpty()) { - new Tag("h4").content(t("Signals")).addTo(win); - list = new Tag("ul"); - for (Signal s : signals) Plan.addLink(s,s.toString(),list); - list.addTo(win); - } - - if (!contacts.isEmpty()) { - new Tag("h4").content(t("Contacts and actions")).addTo(win); - list = new Tag("ul"); - for (Contact c : contacts) { - Tag link = Plan.addLink(c,c.toString(),list); - Vector actions = triggers.get(c.trigger()); - if (actions != null && !actions.isEmpty()) { - Tag ul = new Tag("ul"); - for (Action action : actions) new Tag("li").content(action.toString()).addTo(ul); - ul.addTo(link); - } - } - list.addTo(win); - } - - if (!turnouts.isEmpty()) { - new Tag("h4").content(t("Turnouts")).addTo(win); - list = new Tag("ul"); - for (Entry entry : turnouts.entrySet()) { - Turnout turnout = entry.getKey(); - Plan.addLink(turnout, turnout+": "+entry.getValue(), list); - } - list.addTo(win); - } - - Tag form = propForm(); - new Tag("button").attr("type", "submit").content(t("save")).addTo(form); - form.addTo(win); + addFormTo(win); + addBasicPropertiesTo(win); + addTurnoutsTo(win); + addContactsTo(win); return win; } - public Tag propForm() { - Form form = new Form(); - new Input(ACTION, ACTION_UPDATE).hideIn(form); - new Input(REALM,REALM_ROUTE).hideIn(form); - new Input(ID,id()).hideIn(form); - - Tag label = new Tag("label").content(t("name:")); - new Tag("input").attr("type", "text").attr(NAME,"name").attr("value", name()).addTo(label); - label.addTo(form); - - return form; - } - public static void saveAll(Collection routes, String filename) throws IOException { BufferedWriter file = new BufferedWriter(new FileWriter(filename)); for (Route route : routes) file.write(route.json()+"\n"); diff --git a/src/main/java/de/srsoftware/web4rail/tags/Button.java b/src/main/java/de/srsoftware/web4rail/tags/Button.java index 69f2bfd..102f43e 100644 --- a/src/main/java/de/srsoftware/web4rail/tags/Button.java +++ b/src/main/java/de/srsoftware/web4rail/tags/Button.java @@ -1,5 +1,7 @@ package de.srsoftware.web4rail.tags; +import org.json.JSONObject; + import de.srsoftware.tools.Tag; public class Button extends Tag { @@ -16,5 +18,9 @@ public class Button extends Tag { super("button"); attr("onclick",action).content(text); } - + + public Button(String text,JSONObject json) { + super("button"); + attr("onclick","request("+(json.toString().replace("\"", "'"))+")").content(text); + } }