diff --git a/pom.xml b/pom.xml index 9d190f9..237caa1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.0.8 + 1.0.9 Web4Rail jar Java Model Railway Control diff --git a/resources/svg/TextDisplay.svg b/resources/svg/TextDisplay.svg new file mode 100644 index 0000000..8f89ad8 --- /dev/null +++ b/resources/svg/TextDisplay.svg @@ -0,0 +1,3 @@ + + %text% + \ No newline at end of file diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index fe2589d..fe2bf11 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -49,9 +49,11 @@ delete route : Route löschen Destination : Ziel Destination\: : Ziel: Destination\: {} from {} : Ziel: {} von {} +DetermineTrainInBlock : Zug im Block bestimmen Direction : Richtung Direction\: heading {} : Richtung: nach {} disabled : deaktiviert +Display "{}" on clients. : „{}“ auf den Clients anzeigen. Drop : Verwerfen Dropped destination of {}. : Ziel von {} verworfen. EAST : Osten @@ -120,7 +122,7 @@ Select from plan : Auf Plan auswählen Select relay\: : Relais auswählen: Select train\: : Zug auswählen: SendCommand : Kommando senden -Send command \"{}\" to control unit : Kommando „{}“ an Zentrale senden +Send command "{}" to control unit : Kommando „{}“ an Zentrale senden SetRelay : Relais schalten SetSignal : Signal stellen SetSignalsToStop : Signale auf Halt stellen @@ -131,6 +133,7 @@ Set {} to {} : {} auf {} setzen SetPower : Strom schalten Set speed to : Geschwindigkeit setzen Setup actions : Aktivierungs-Aktionen +ShowText : Text anzeigen Signals : Signale Simulating movement of {}... : Simuliere Fahrt von {}... SOUTH : Süden @@ -147,6 +150,7 @@ Switch power off : Strom ausschalten Switch power on : Strom anschalten Tag : Markierung Tags : Markierungen +Text to display on clients\: : Text, welcher auf den Clients angezeigt werden soll: Toggle : umschalten Toggle power : Stom umschalten Train : Zug diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index db0323b..baad2c5 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -50,6 +50,7 @@ import de.srsoftware.web4rail.tiles.SignalS; import de.srsoftware.web4rail.tiles.SignalW; import de.srsoftware.web4rail.tiles.StraightH; import de.srsoftware.web4rail.tiles.StraightV; +import de.srsoftware.web4rail.tiles.TextDisplay; import de.srsoftware.web4rail.tiles.Tile; import de.srsoftware.web4rail.tiles.Turnout.State; import de.srsoftware.web4rail.tiles.Turnout3E; @@ -804,6 +805,7 @@ public class Plan extends BaseClass{ new Turnout3E().tag(null).addTo(tiles); new Relay().setLabel(true,"RL").tag(null).addTo(tiles); new Contact().tag(null).addTo(tiles); + new TextDisplay().text("tx").tag(null).addTo(tiles); new Eraser().tag(null).addTo(tiles); return tiles.addTo(tileMenu); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index aedb493..3879027 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -125,12 +125,14 @@ public abstract class Action extends BaseClass { return List.of( ConditionalAction.class, DelayedAction.class, + DetermineTrainInBlock.class, FinishRoute.class, SendCommand.class, SetPower.class, SetRelay.class, SetSignal.class, SetSpeed.class, + ShowText.class, StopAllTrains.class, StopAuto.class, TriggerContact.class, diff --git a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java new file mode 100644 index 0000000..685eebd --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java @@ -0,0 +1,70 @@ +package de.srsoftware.web4rail.actions; + +import java.io.IOException; +import java.util.HashMap; + +import org.json.JSONObject; + +import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Button; +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.tiles.Block; + +public class DetermineTrainInBlock extends Action { + + private Block block = null; + + @Override + public boolean fire(Context context) throws IOException { + context.block = block; + context.train = block.train(); + return true; + } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + if (isSet(block)) json.put(BLOCK, block.id()); + return json; + } + + @Override + public Action load(JSONObject json) { + super.load(json); + String blockId = json.getString(BLOCK); + if (isSet(blockId)) block = Block.get(blockId); + return this; + } + + @Override + public Window properties(HashMap params) { + Window win = super.properties(params); + Form form = new Form("action-prop-form-"+id); + new Input(REALM,REALM_ACTIONS).hideIn(form); + new Input(ID,params.get(ID)).hideIn(form); + new Input(ACTION,ACTION_UPDATE).hideIn(form); + new Input(CONTEXT,params.get(CONTEXT)).hideIn(form); + + Select select = Block.selector(block, null); + select.addTo(new Label(t("Select block:")+NBSP)).addTo(form); + + new Button(t("Apply"),form).addTo(form).addTo(win); + return win; + } + + public String toString() { + return isSet(block) ? t("Determine, which train is in {}",block) : "["+t("click here to setup block")+"]"; + }; + + @Override + protected Object update(HashMap params) { + LOG.debug("update: {}",params); + String blockId = params.get(Block.class.getSimpleName()); + if (isSet(blockId)) block = Block.get(blockId); + return properties(params); + } + +} diff --git a/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java b/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java index c3230cc..b32f546 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java @@ -28,7 +28,7 @@ public class SendCommand extends Action{ } }); - return false; + return true; } @Override diff --git a/src/main/java/de/srsoftware/web4rail/actions/ShowText.java b/src/main/java/de/srsoftware/web4rail/actions/ShowText.java new file mode 100644 index 0000000..507b517 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/actions/ShowText.java @@ -0,0 +1,23 @@ +package de.srsoftware.web4rail.actions; + +import de.srsoftware.web4rail.tags.Label; + +public class ShowText extends TextAction{ + + + @Override + public boolean fire(Context context) { + plan.stream(fill(text,context)); + return true; + } + + @Override + protected Label label() { + return new Label(t("Text to display on clients:")+NBSP); + } + + @Override + public String toString() { + return t("Display \"{}\" on clients.",text); + } +} diff --git a/src/main/java/de/srsoftware/web4rail/actions/TextAction.java b/src/main/java/de/srsoftware/web4rail/actions/TextAction.java new file mode 100644 index 0000000..2d783bd --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/actions/TextAction.java @@ -0,0 +1,66 @@ +package de.srsoftware.web4rail.actions; + +import java.util.HashMap; + +import org.json.JSONObject; + +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Button; +import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tags.Label; + +public abstract class TextAction extends Action { + + public static final String TEXT = "text"; + protected String text = "Hello, world!"; + + + public String fill(String tx,Context context) { + if (isSet(context.block)) tx = tx.replace("%block%", context.block.name); + if (isSet(context.contact)) tx = tx.replace("%contact%", context.contact.id()); + if (isSet(context.direction)) tx = tx.replace("%dir%", context.direction.name()); + if (isSet(context.route)) tx = tx.replace("%route%", context.route.name()); + if (isSet(context.train)) tx = tx.replace("%train%", context.train.name()); + return tx; + } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + json.put(TEXT, text); + return json; + } + + protected abstract Label label(); + + @Override + public Action load(JSONObject json) { + super.load(json); + text = json.getString(TEXT); + return this; + } + + @Override + public Window properties(HashMap params) { + Window win = super.properties(params); + Form form = new Form("action-prop-form-"+id); + new Input(REALM,REALM_ACTIONS).hideIn(form); + new Input(ID,params.get(ID)).hideIn(form); + new Input(ACTION,ACTION_UPDATE).hideIn(form); + new Input(CONTEXT,params.get(CONTEXT)).hideIn(form); + new Input(TEXT, text).addTo(label()).addTo(form); + new Button(t("Apply"),form).addTo(form).addTo(win); + return win; + } + + @Override + protected Object update(HashMap params) { + LOG.debug("update: {}",params); + String error = null; + text = params.get(TEXT); + Window win = properties(params); + return new Tag("span").content(error).addTo(win); + } +} diff --git a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java index da53f3d..2d9b650 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java +++ b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java @@ -19,10 +19,7 @@ public class TriggerContact extends Action { @Override public boolean fire(Context context) throws IOException { - if (isSet(contact)) { - System.err.println("triggering "+contact); - contact.trigger(200); - } + if (isSet(contact)) return contact.trigger(200); return false; } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index 6fb4948..a9299ca 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -304,7 +304,7 @@ public abstract class Block extends StretchableTile implements Comparable return this; } - public static Tag selector(Block preselected,Collection exclude) { + public static Select selector(Block preselected,Collection exclude) { if (isNull(exclude)) exclude = new Vector(); Select select = new Select(Block.class.getSimpleName()); new Tag("option").attr("value","0").content(t("unset")).addTo(select); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java index 0d2502c..df67594 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java @@ -204,7 +204,7 @@ public class Contact extends Tile{ return trigger; } - public void trigger(int duration) throws IOException { + public boolean trigger(int duration) throws IOException { activate(true); new Thread() { public void run() { @@ -214,6 +214,7 @@ public class Contact extends Tile{ } catch (Exception e) {} } }.start(); + return true; } @Override public Tile update(HashMap params) throws IOException { diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java b/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java new file mode 100644 index 0000000..ed6d17c --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java @@ -0,0 +1,75 @@ +package de.srsoftware.web4rail.tiles; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.json.JSONObject; + +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tags.Label; + +public class TextDisplay extends StretchableTile { + private static final String TEXT = "text"; + private String text = "Hello, world!"; + + @Override + public JSONObject json() { + return super.json().put(TEXT, text); + } + + @Override + protected Tile load(JSONObject json) throws IOException { + super.load(json); + if (json.has(TEXT)) text = json.getString(TEXT); + return this; + } + + @Override + public Tag tag(Map replacements) throws IOException { + if (isNull(replacements)) replacements = new HashMap(); + replacements.put("%text%",text); + return super.tag(replacements); + } + + @Override + public Form propForm(String id) { + noTrack(); + Form form = super.propForm(id); + new Tag("h4").content(t("Text")).addTo(form); + + new Input(TEXT, text).addTo(new Label(t("Text")+":"+NBSP)).addTo(new Tag("p")).addTo(form); + + return form; + } + + @Override + protected String stretchType() { + return t("Width"); + } + + public TextDisplay text(String tx) { + text = tx; + return this; + } + + @Override + public Tile update(HashMap params) throws IOException { + for (Entry entry : params.entrySet()) { + switch (entry.getKey()) { + case TEXT: + text(entry.getValue()); + break; + } + } + return super.update(params); + } + + @Override + public int width() { + return stretch; + } +} diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 3d65e47..7ccdd98 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -58,6 +58,7 @@ public abstract class Tile extends BaseClass{ private static final String Y = "y"; private boolean disabled = false; + private boolean isTrack = true; private int length = DEFAUT_LENGTH; protected Direction oneWay = null; protected Route route = null; @@ -142,7 +143,7 @@ public abstract class Tile extends BaseClass{ } public Tile length(int newLength) { - length = newLength; + length = Math.max(0, newLength); return this; } @@ -187,6 +188,10 @@ public abstract class Tile extends BaseClass{ if (json.has(ONEW_WAY)) oneWay = Direction.valueOf(json.getString(ONEW_WAY)); return this; } + + protected void noTrack() { + isTrack = false; + } public Tile position(int x, int y) { this.x = x; @@ -242,12 +247,14 @@ public abstract class Tile extends BaseClass{ if (isSet(route)) link("p",Map.of(REALM,REALM_ROUTE,ID,route.id(),ACTION,ACTION_PROPS),t("Locked by {}",route)).addTo(window); Form form = propForm("tile-properties-"+id()); - new Tag("h4").content(t("Length")).addTo(form); - new Input(LENGTH,length).numeric().addTo(new Label(t("Length")+":"+NBSP)).addTo(form); - new Tag("h4").content(t("Availability")).addTo(form); - Checkbox cb = new Checkbox(DISABLED, t("disabled"), disabled); - if (disabled) cb.clazz("disabled"); - cb.addTo(form); + if (isTrack) { + new Tag("h4").content(t("Length")).addTo(form); + new Input(LENGTH,length).numeric().addTo(new Label(t("Length")+":"+NBSP)).addTo(form); + new Tag("h4").content(t("Availability")).addTo(form); + Checkbox cb = new Checkbox(DISABLED, t("disabled"), disabled); + if (disabled) cb.clazz("disabled"); + cb.addTo(form); + } new Button(t("Apply"),form).addTo(form); form.addTo(window);