diff --git a/pom.xml b/pom.xml index 345b366..dc7bc63 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.5.18 + 1.5.19 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 9a7d4b0..b604a89 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -13,14 +13,16 @@ Actions in case conditions are not fulfilled : Aktionen, wenn Bedingung Actions will only fire, if all conditions are fullfilled. : Aktionen werden nur ausgeführt, wenn alle Bedingungen erfüllt sind. Action type : Aktions-Typ ActivateRoute : Route aktivieren -add : hinzufügen -add command for {} : Kommando für {} hinzufügen -Added {} : {} hinzugefügt -Added {} routes. : {} Routen hinzugefügt. add action : Aktion hinzufügen Add action to action list : Aktion zur Liste hinzufügen add car : Waggon hinzufügen +add : hinzufügen +add column ({}) : Spalte ({}) hinzufügen +Add column/row : Spalte/Zeile hinzufügen +add command for {} : Kommando für {} hinzufügen Add condition : Bedingung hinzufügen +Added {} : {} hinzugefügt +Added {} routes. : {} Routen hinzugefügt. Add entry : Eintrag hinzufügen Add function : Funktion hinzufügen add locomotive : Lok hinzufügen @@ -30,6 +32,7 @@ add new car : neuen Waggon anlegen Add new custom field : neues benutzerdefiniertes Feld hinzufügen add new locomotive : neue Lok anlegen add new train : neuen Zug anlegen +add row ({}) : Zeile ({}) hinzufügen AddRemoveDestination : Ziel hinzufügen/löschen AddRemoveTag : Markierung hinzufügen/entfernen Address : Adresse @@ -71,13 +74,14 @@ BrakeStop : Bremsvorgang abschließen Brake time¹, forward : Bremszeit¹, vorwärts Brake time¹, reverse : Bremszeit¹, rückwärts Brake time table : Bremszeit-Tabelle +car : Fahrzeug Car : Fahrzeug CarInTrain : Fahrzeug im Zug Car manager : Waggon-Verwaltung Car of train : Fahrzeug des Zuges Car {} of train : Fahrzeug {} des Zuges CarOrientation : Wagen-Laufrichtung -Cars : Waggons +Cars : Fahrzeuge  cars :  Fahrzeugen teilen Clear destinations : Ziele löschen Clear destinations of train : Ziele des Zugs löschen @@ -127,7 +131,8 @@ Decoder function : Decoder-Funktion decouple : Abkuppeln decoupler : decoupler Decoupler : Entkuppler -Default maintenance intervall : Standard-Wartungsintervall +Default maintenance intervall : Standard-Wartungsintervall +default value : Standard-Wert DelayedAction : verzögerte Aktion Delay must not be less than zero! : Verzögerung darf nicht kleiner als null sein! delete : entfernen @@ -210,6 +215,7 @@ Inverts the direction {} is heading to. : Kehrt die Richtung, in welche {} fähr JSON code of {} : JSON-Code von {} known cars : bekannte Waggons known locomotives : bekannte Lokomotiven +known lookup tables: bekannte Wertetabellen: known trains : bekannte Züge Label for state {} : Beschriftung für Status {} Last blocks : Letzte Blöcke @@ -227,6 +233,7 @@ Locomotive manager : Lok-Verwaltung Locomotives : Lokomotiven Locomotives and cars : Lokomotiven und Waggons lookup tables : Wertetabellen +LookupTable : Wertetabelle Loop : Wiederholung Lower speed limit : Minimale Geschwindigkeit Maintenance : Wartung @@ -416,12 +423,14 @@ Task type : Aufgabe Text to display on clients : Text, welcher auf den Clients angezeigt werden soll Text to show on display : Text, welcher in der Anzeige dargestellt werden soll test : testen +This value is used, when no entry is set for a specific input pair. : Dieser Wert wird benutzt, wenn für ein Eingabe-Paar kein anderer WErt gesetzt ist. Tile(s) : Kachel(n) Tile(s) moved. : Kachel(n) verschoben. Timeout : maximale Wartezeit5 Toggle : umschalten toggle {} : {} umschalten Toggle power : Stom umschalten +train : Zug Train : Zug train contains {} : {} ist im Zug train does not contain {} : {} ist nicht im Zug @@ -473,6 +482,7 @@ Use negative number to count from end. : Nutze negative Nummern, um von Ende zu unset : ungesetzt update : aktualisieren value : Wert +Values : Werte WaitForContact : Auf Kontakt warten Wait for {}, then : auf {} warten, dann Wait {} ms, then : {} ms warten, dann diff --git a/src/main/java/de/srsoftware/web4rail/LookupTable.java b/src/main/java/de/srsoftware/web4rail/LookupTable.java index 71be11e..f223e3c 100644 --- a/src/main/java/de/srsoftware/web4rail/LookupTable.java +++ b/src/main/java/de/srsoftware/web4rail/LookupTable.java @@ -1,8 +1,23 @@ package de.srsoftware.web4rail; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Vector; + +import org.json.JSONArray; +import org.json.JSONObject; + +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.moving.Car; +import de.srsoftware.web4rail.moving.Train; +import de.srsoftware.web4rail.tags.Button; +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; +import de.srsoftware.web4rail.tags.Table; import de.srsoftware.web4rail.tags.Window; public class LookupTable extends BaseClass{ @@ -10,14 +25,35 @@ public class LookupTable extends BaseClass{ private static final String ADD_FORM = "add_lookup"; private static final String COLUMNS = "columns"; private static final String ROWS = "rows"; + private static final String DEFAULT_VALUE = "default"; + private static final String NEW_ROW = "new_row"; + private static final String NEW_COL = "new_col"; + private String colType; + private String rowType; + private String name; + private int defaultValue = 0; + + private HashSet cols = new HashSet<>(); + private HashSet rows = new HashSet<>(); + private HashMap> values = new HashMap<>(); + + public LookupTable(String name, String cols, String rows) { + this.name = name; + this.colType = cols; + this.rowType = rows; + } public static Object action(Params params) { String action = params.getString(ACTION); if (isNull(action)) throw new NullPointerException(ACTION+" should not be null!"); - + LookupTable table = get(Id.from(params)); switch (action) { case ACTION_ADD: return addForm(params); + case ACTION_PROPS: + return isSet(table) ? table.properties() : plan.properties(); + case ACTION_UPDATE: + return isSet(table) ? table.update(params) : plan.properties(); } return plan.properties(t("Unknown action: {}",action)); } @@ -39,18 +75,130 @@ public class LookupTable extends BaseClass{ new Input(ACTION, ACTION_ADD).hideIn(form); return form.addTo(win); } + + private static Object create(String name, String cols, String rows) { + return new LookupTable(name, cols, rows).register().properties(); + } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + json.put(COLUMNS, colType); + json.put(DEFAULT_VALUE, defaultValue); + json.put(NAME, name); + json.put(ROWS, rowType); + return json; + } + + public static JSONArray jsonList() { + JSONArray list = new JSONArray(); + listElements(LookupTable.class).forEach(table -> list.put(table.json())); + return list; + } - private static Object create(String name, String cols, String rows2) { - // TODO Auto-generated method stub - return null; + + public String name() { + return name; + } + + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm, String... errorMessages) { + formInputs.add(t(NAME),new Input(NAME,name)); + formInputs.add(t("default value"),new Input(DEFAULT_VALUE, defaultValue).numeric().title(t("This value is used, when no entry is set for a specific input pair."))); + + postForm.add(table()); + + return super.properties(preForm, formInputs, postForm, errorMessages); + } + + @Override + public String realm() { + return REALM_LOOKUP; } private static Select selector(String name) { Select selector = new Select(name); - selector.addOption(REALM_LOCO, t("Locomotives")); + selector.addOption(REALM_CAR, t("Cars")); selector.addOption(REALM_TRAIN, t("Trains")); selector.addOption(REALM_TRAIN+"_length", t("TrainLength")); return selector; } + + private Fieldset table() { + + Fieldset fieldset = new Fieldset(t("Values")); + + rowAdder().addTo(fieldset); + + Table table = new Table(); + Vector head = new Vector(); + head.add(""); + head.addAll(cols); + table.addHead(head.toArray()); + for (Object row : rows) { + Vector entries = new Vector<>(); + entries.add(row); + + HashMap items = values.get(row); + for (Object col : cols) { + Integer item = isSet(items) ? items.get(col) : defaultValue; + entries.add(item); + } + table.addRow(entries.toArray()); + } + + return table.addTo(fieldset); + } + + private Tag rowAdder() { + Fieldset fieldset = new Fieldset("Add column/row"); + Form form = new Form("add_row_form"); + new Input(REALM,REALM_LOOKUP).hideIn(form); + new Input(ID,id()).hideIn(form); + new Input(ACTION,ACTION_UPDATE).hideIn(form); + Tag select = null; + switch (colType) { + case REALM_CAR: + select = Car.selector(null, null).attr(NAME, NEW_COL); + break; + case REALM_TRAIN: + select = Train.selector(null, null).attr(NAME, NEW_COL); + break; + } + if (isSet(select)) select.addTo(new Label(t("add column ({})",t(colType))+':'+NBSP)).addTo(form); + + select = null; + switch (rowType) { + case REALM_CAR: + select = Car.selector(null, null).attr(NAME, NEW_ROW); + break; + case REALM_TRAIN: + select = Train.selector(null, null).attr(NAME, NEW_ROW); + break; + } + if (isSet(select)) select.addTo(new Label(t("add row ({})",t(rowType))+':'+NBSP)).addTo(form); + return new Button(t("add"), form).addTo(form).addTo(fieldset); + } + + @Override + public String toString() { + return t("{} \"{}\"",getClass().getSimpleName(),name); + } + @Override + protected Object update(Params params) { + if (params.containsKey(NAME)) name = params.getString(NAME); + if (params.containsKey(DEFAULT_VALUE)) defaultValue = params.getInt(DEFAULT_VALUE); + if (params.containsKey(NEW_COL)) { + Object o = BaseClass.get(Id.from(params, NEW_COL)); + if (isSet(o) && !cols.contains(o)) cols.add(o); + } + if (params.containsKey(NEW_ROW)) { + Object o = BaseClass.get(Id.from(params, NEW_ROW)); + if (isSet(o) && !rows.contains(o)) rows.add(o); + } + + super.update(params); + return properties(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index eee3308..ddcf4cb 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -543,7 +543,8 @@ public class Plan extends BaseClass{ .put(LENGTH_UNIT, lengthUnit) .put(SPEED_UNIT, speedUnit) .put(Turnout.DELAY, Turnout.delay) - .put(TILE, jTiles); + .put(TILE, jTiles) + .put(REALM_LOOKUP, LookupTable.jsonList()); } /** @@ -613,6 +614,14 @@ public class Plan extends BaseClass{ Fieldset fieldset = new Fieldset(t("lookup tables")); Button button = button(t("add"),Map.of(REALM,REALM_LOOKUP,ACTION,ACTION_ADD)); button.addTo(fieldset); + List tables = BaseClass.listElements(LookupTable.class); + + if (!tables.isEmpty()) { + new Tag("div").content("known lookup tables:").addTo(fieldset); + Tag list = new Tag("ul"); + for (LookupTable table : tables) table.button(table.name()).addTo(list); + list.addTo(fieldset); + } return fieldset; }