diff --git a/pom.xml b/pom.xml index efe821a..360d8a7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.2.1 + 1.2.2 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index ec451ff..1566dae 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -55,7 +55,8 @@ Create action : Aktion erzeugen Current location\: : Aktueller Ort: Current location : Aufenthaltsort Current location\: {} : Aufenthaltsort: {} -Current velocity\: {} {} : Aktuelle Geschwindigkeit: {} {} +Current velocity\: {} {} : Aktuelle Geschwindigkeit: {} {} +Decoder address : Decoder-Adresse Delay : Verzögerung DelayedAction : verzögerte Aktion delete : entfernen @@ -174,6 +175,7 @@ SOUTH : Süden Speed unit : Geschwindigkeits-Einheit Start actions : Start-Aktionen Stock ID : Inventarnummer +Stop settings : Halte-Einstellungen Started {} : {} gestartet State : Status StopAllTrains : Alle Züge stoppen @@ -222,6 +224,7 @@ Unknown action\: {} : Unbekannte Aktion: {} unset : ungesetzt Wait {} ms, then\: : {} ms warten, dann: {} waiting {} secs... : {} wartet {} Sekunden... +Wait times : Wartezeiten Was not able to assign {} to {}! : Konnte {} nicht an {} zuweisen! Was not able to lock {} : Konnte {} nicht reservieren Was not able to set all signals! : Konnte nicht alle Signale stellen! diff --git a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java index b8244b1..df7fe8e 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java @@ -1,11 +1,12 @@ package de.srsoftware.web4rail.conditions; import java.util.HashMap; +import java.util.List; import org.json.JSONObject; -import de.srsoftware.tools.Tag; -import de.srsoftware.web4rail.tags.Label; +import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tiles.Block; public class BlockFree extends Condition { @@ -28,12 +29,11 @@ public class BlockFree extends Condition { block(Block.get(new Id(json.getString(BLOCK)))); return this; } - + @Override - public Tag propForm(HashMap params) { - Tag form = super.propForm(params); - Block.selector(block, null).addTo(new Label(t("Select block:")+NBSP)).addTo(form); - return form; + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Select block"), Block.selector(block, null)); + return super.properties(preForm, formInputs, postForm); } @Override diff --git a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java index 93e2ae1..237dede 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java @@ -18,10 +18,8 @@ import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.actions.ConditionalAction; -import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Checkbox; -import de.srsoftware.web4rail.tags.Form; -import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Select; @@ -54,7 +52,7 @@ public abstract class Condition extends BaseClass { switch (action) { case ACTION_PROPS: - return condition.properties(params); + return condition.properties(); case ACTION_UPDATE: condition.update(params); return plan.showContext(params); @@ -157,23 +155,11 @@ public abstract class Condition extends BaseClass { inverted = json.has(INVERTED) && json.getBoolean(INVERTED); return this; } - - public Tag propForm(HashMap params) { - Form form = new Form("condition-props-"+id); - new Input(REALM,REALM_CONDITION).hideIn(form); - new Input(ACTION,ACTION_UPDATE).hideIn(form); - new Input(ID,id).hideIn(form); - String context = params.get(CONTEXT); - if (isSet(context)) new Input(CONTEXT,context).hideIn(form); - return form; - } - - protected Window properties(HashMap params) { - Window win = new Window("condition-props", t("Properties of {}",getClass().getSimpleName())); - Tag form = propForm(params); - new Checkbox(INVERTED, t("inverted"), inverted).addTo(form); - new Button(t("Apply"),"return submitForm('condition-props-"+id+"');").addTo(form).addTo(win); - return win; + + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("inverted"),new Checkbox(INVERTED, t("inverted"), inverted)); + return super.properties(preForm, formInputs, postForm); } public static Tag selector() { diff --git a/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java b/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java index 08028d4..9f060c4 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/OrCondition.java @@ -1,11 +1,12 @@ package de.srsoftware.web4rail.conditions; -import java.util.HashMap; +import java.util.List; import java.util.stream.Collectors; import org.json.JSONObject; import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Fieldset; public class OrCondition extends Condition{ @@ -33,13 +34,11 @@ public class OrCondition extends Condition{ } @Override - protected Window properties(HashMap params) { - Window win = super.properties(params); - - win.children().insertElementAt(conditions.tag(REALM_CONDITION+":"+id()),2); - return win; + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + // add conditions + return super.properties(preForm, formInputs, postForm); } - + @Override public String toString() { return conditions.isEmpty() ? t("Click here to select conditions") : String.join(" "+t("OR")+" ", conditions.stream().map(Object::toString).collect(Collectors.toList())); diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java index 34a4f21..3c1a422 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainHasTag.java @@ -1,12 +1,13 @@ package de.srsoftware.web4rail.conditions; import java.util.HashMap; +import java.util.List; import org.json.JSONObject; -import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; -import de.srsoftware.web4rail.tags.Label; public class TrainHasTag extends Condition { @@ -31,10 +32,11 @@ public class TrainHasTag extends Condition { } @Override - public Tag propForm(HashMap params) { - return new Input(TAG, tag == null ? "" : tag).addTo(new Label(t("Tag:")+NBSP)).addTo(super.propForm(params)); + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Tag"),new Input(TAG, tag == null ? "" : tag)); + return super.properties(preForm, formInputs, postForm); } - + @Override public String toString() { if (tag == null) return t("[Click to setup tag]"); diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java index 0b0b79d..d2c5e37 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainLength.java @@ -1,13 +1,14 @@ package de.srsoftware.web4rail.conditions; import java.util.HashMap; +import java.util.List; import org.json.JSONObject; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; -import de.srsoftware.web4rail.tags.Label; public class TrainLength extends Condition { @@ -30,10 +31,11 @@ public class TrainLength extends Condition { if (json.has(MAX_LENGTH)) maxLength = json.getInt(MAX_LENGTH); return this; } - + @Override - public Tag propForm(HashMap params) { - return new Input(MAX_LENGTH, maxLength).numeric().addTo(new Label(t("Maximum train length:")+NBSP)).addTo(super.propForm(params)); + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Maximum train length"),new Input(MAX_LENGTH, maxLength).numeric()); + return super.properties(preForm, formInputs, postForm); } @Override @@ -48,7 +50,7 @@ public class TrainLength extends Condition { if (ml < 1) throw new NumberFormatException(t("length must be larger than zero!")); maxLength = ml; } catch (NumberFormatException nfe) { - Window win = properties(params); + Window win = properties(); win.children().insertElementAt(new Tag("div").content(nfe.getMessage()),1); return win; } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java index ca45b97..558061a 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainSelect.java @@ -1,12 +1,13 @@ package de.srsoftware.web4rail.conditions; import java.util.HashMap; +import java.util.List; import org.json.JSONObject; -import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.moving.Train; -import de.srsoftware.web4rail.tags.Label; +import de.srsoftware.web4rail.tags.Fieldset; public class TrainSelect extends Condition { @@ -30,12 +31,11 @@ public class TrainSelect extends Condition { } @Override - public Tag propForm(HashMap params) { - Tag form = super.propForm(params); - Train.selector(train, null).addTo(new Label(t("Select train:")+NBSP)).addTo(form); - return form; + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Select train"),Train.selector(train, null)); + return super.properties(preForm, formInputs, postForm); } - + @Override public String toString() { if (train == null) return t("[Click here to select train!]"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index 4edcb5a..f278b2b 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -19,9 +19,9 @@ import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Checkbox; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; -import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Select; /** @@ -212,89 +212,15 @@ public abstract class Block extends StretchableTile implements Comparable return super.load(json); } - public Form propForm(String id) { - Form form = new Form("test"); - new Tag("h4").content(t("Block properties")).addTo(form); - - new Input(NAME, name).addTo(new Label(t("name:")+NBSP)).addTo(new Tag("p")).addTo(form); - - new Checkbox(ALLOW_TURN,t("Turn allowed"),turnAllowed).addTo(new Tag("p")).addTo(form); - - Select select = Train.selector(train, null); - select.addTo(new Label(t("Train:")+NBSP)).addTo(new Tag("p")).addTo(form); - - return form; + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Name"),new Input(NAME, name)); + formInputs.add("",new Checkbox(ALLOW_TURN,t("Turn allowed"),turnAllowed)); + formInputs.add(t("Train"),Train.selector(train, null)); + postForm.add(waitTimeForm()); + return super.properties(preForm, formInputs, postForm); } - - public Window propMenu() { - Window win = new Window("test", "Replace Block.propmenu by Block.properties!"); - Form form = new Form("train-wait-form"); - new Tag("h4").content(t("Stop settings")).addTo(win); - new Input(REALM,REALM_PLAN).hideIn(form); - new Input(ID,id()).hideIn(form); - new Input(ACTION,ACTION_TIMES).hideIn(form); - - new Tag("div").content(t("Minimum and maximum times (in Miliseconds) trains with the respective tag have to wait in this block.")).addTo(form); - - Direction dA = directionA(); - Direction dB = directionB(); - - Tag table = new Tag("table"); - Tag row = new Tag("tr"); - new Tag("td").content(t("Direction")).addTo(row); - new Tag("th").content(t("{}bound",dA)).attr("colspan", 2).addTo(row); - new Tag("th").content(t("{}bound",dB)).attr("colspan", 2).addTo(row); - new Tag("td").content("").addTo(row).addTo(table); - - row = new Tag("tr"); - new Tag("th").content(t("Tag")).addTo(row); - new Tag("th").content(t("min")).addTo(row); - new Tag("th").content(t("max")).addTo(row); - new Tag("th").content(t("min")).addTo(row); - new Tag("th").content(t("max")).addTo(row); - new Tag("th").content(t("Actions")).addTo(row).addTo(table); - - int count = 0; - for (WaitTime wt : waitTimes) { - count++; - row = new Tag("tr"); - new Tag("td").content(wt.tag).addTo(row); - new Input("min."+wt.tag+"."+dA,wt.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); - new Input("max."+wt.tag+"."+dA,wt.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); - new Input("min."+wt.tag+"."+dB,wt.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); - new Input("max."+wt.tag+"."+dB,wt.get(dB).max).numeric().addTo(new Tag("td")).addTo(row); - Tag actions = new Tag("td"); - Map props = Map.of(REALM,REALM_PLAN,ID,id().toString(),ACTION,ACTION_TIMES); - switch (count) { - case 1: - actions.content(""); break; - case 2: - new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions); - break; - default: - new Button("↑",merged(props,Map.of(RAISE,wt.tag))).addTo(actions); - new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions); - } - actions.addTo(row).addTo(table); - } - - WaitTime defaultWT = getWaitTime(NO_TAG); - - row = new Tag("tr"); - new Input(NEW_TAG,"").attr("placeholder", t("new tag")).addTo(new Tag("td")).addTo(row); - new Input("min."+NEW_TAG+"."+dA,defaultWT.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); - new Input("max."+NEW_TAG+"."+dA,defaultWT.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); - new Input("min."+NEW_TAG+"."+dB,defaultWT.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); - new Input("max."+NEW_TAG+"."+dB,defaultWT.get(dB).max).numeric().addTo(new Tag("td")).addTo(row).addTo(table); - - table.addTo(form); - - new Button(t("Apply"),form).addTo(form).addTo(win); - - return win; - } - public Tile raise(String tag) { for (int i=1; i return this; } + + public Fieldset waitTimeForm() { + Fieldset win = new Fieldset("Wait times"); + Form form = new Form("train-wait-form"); + new Tag("h4").content(t("Stop settings")).addTo(win); + new Input(REALM,REALM_PLAN).hideIn(form); + new Input(ID,id()).hideIn(form); + new Input(ACTION,ACTION_TIMES).hideIn(form); + + new Tag("div").content(t("Minimum and maximum times (in Miliseconds) trains with the respective tag have to wait in this block.")).addTo(form); + + Direction dA = directionA(); + Direction dB = directionB(); + + Tag table = new Tag("table"); + Tag row = new Tag("tr"); + new Tag("td").content(t("Direction")).addTo(row); + new Tag("th").content(t("{}bound",dA)).attr("colspan", 2).addTo(row); + new Tag("th").content(t("{}bound",dB)).attr("colspan", 2).addTo(row); + new Tag("td").content("").addTo(row).addTo(table); + + row = new Tag("tr"); + new Tag("th").content(t("Tag")).addTo(row); + new Tag("th").content(t("min")).addTo(row); + new Tag("th").content(t("max")).addTo(row); + new Tag("th").content(t("min")).addTo(row); + new Tag("th").content(t("max")).addTo(row); + new Tag("th").content(t("Actions")).addTo(row).addTo(table); + + int count = 0; + for (WaitTime wt : waitTimes) { + count++; + row = new Tag("tr"); + new Tag("td").content(wt.tag).addTo(row); + new Input("min."+wt.tag+"."+dA,wt.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); + new Input("max."+wt.tag+"."+dA,wt.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); + new Input("min."+wt.tag+"."+dB,wt.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); + new Input("max."+wt.tag+"."+dB,wt.get(dB).max).numeric().addTo(new Tag("td")).addTo(row); + Tag actions = new Tag("td"); + Map props = Map.of(REALM,REALM_PLAN,ID,id().toString(),ACTION,ACTION_TIMES); + switch (count) { + case 1: + actions.content(""); break; + case 2: + new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions); + break; + default: + new Button("↑",merged(props,Map.of(RAISE,wt.tag))).addTo(actions); + new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions); + } + actions.addTo(row).addTo(table); + + } + + WaitTime defaultWT = getWaitTime(NO_TAG); + + row = new Tag("tr"); + new Input(NEW_TAG,"").attr("placeholder", t("new tag")).addTo(new Tag("td")).addTo(row); + new Input("min."+NEW_TAG+"."+dA,defaultWT.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); + new Input("max."+NEW_TAG+"."+dA,defaultWT.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); + new Input("min."+NEW_TAG+"."+dB,defaultWT.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); + new Input("max."+NEW_TAG+"."+dB,defaultWT.get(dB).max).numeric().addTo(new Tag("td")).addTo(row).addTo(table); + + table.addTo(form); + + new Button(t("Apply"),form).addTo(form).addTo(win); + + return win; + } + } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java index feb7256..8dec5d8 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java @@ -3,6 +3,7 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeoutException; @@ -13,10 +14,9 @@ import de.srsoftware.web4rail.Command; import de.srsoftware.web4rail.Command.Reply; import de.srsoftware.web4rail.Device; import de.srsoftware.web4rail.Protocol; +import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; -import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; -import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Radio; public class Relay extends Tile implements Device{ @@ -127,26 +127,22 @@ public class Relay extends Tile implements Device{ return this; } - public Form propForm(String id) { - Form form = new Form(id); - Fieldset fieldset = new Fieldset(t("Decoder settings")); - Label protocol = new Label(t("Protocol:")); + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Name"),new Input(NAME,name)); + Tag div = new Tag("div"); for (Protocol proto : Protocol.values()) { - new Radio(PROTOCOL, proto.toString(), t(proto.toString()), proto == this.protocol).addTo(protocol); + new Radio(PROTOCOL, proto.toString(), t(proto.toString()), proto == this.protocol).addTo(div); } - protocol.addTo(fieldset); - new Input(ADDRESS, address).numeric().addTo(new Label(t("Address"))).addTo(fieldset).addTo(form); - fieldset = new Fieldset(t("Ports and Labels")); - new Input(PORT_A, portA).numeric().addTo(new Label(t("Port for state A"))).addTo(fieldset); - new Input(LABEL_A, stateLabelA).addTo(new Label(t("Label for state A"))).addTo(fieldset); - new Input(PORT_B, portB).numeric().addTo(new Label(t("Port for state B"))).addTo(fieldset); - new Input(LABEL_B, stateLabelB).addTo(new Label(t("Label for state B"))).addTo(fieldset); - fieldset.addTo(form); - fieldset = new Fieldset(t("Name")); - new Input(NAME,name).addTo(new Label(t("Name"))).addTo(fieldset).addTo(form); - return form; - } - + formInputs.add(t("Decoder address"),div); + formInputs.add(t("Address"),new Input(ADDRESS, address).numeric()); + formInputs.add(t("Port for state A"),new Input(PORT_A, portA).numeric()); + formInputs.add(t("Label for state A"),new Input(LABEL_A, stateLabelA)); + formInputs.add(t("Port for state B"),new Input(PORT_B, portB).numeric()); + formInputs.add(t("Label for state B"),new Input(LABEL_B, stateLabelB)); + return super.properties(preForm, formInputs, postForm); + } + private char proto() { switch (protocol) { case DCC14: