diff --git a/pom.xml b/pom.xml
index abacc18..eabad51 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.2.30
+ 1.2.31
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation
index d6cecc5..8568b0f 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -54,8 +54,10 @@ ConditionalAction : bedingte Aktion
Conditions : Bedingungen
Condition type\: : Bedingungs-Typ:
Connected to {}. : Mit {} verbunden.
+Contact : Kontakt
Control : Steuerung
Control unit : Zentrale
+copy : kopieren
Counterpart : Gegenstück
Create action : Aktion erzeugen
Current location\: : Aktueller Ort:
@@ -218,16 +220,20 @@ Train : Zug
Train\: : Zug:
train does not have tag "{}" : Zug hat keine Markierung „{}“
train has tag "{}" : Zug hat Markierung „{}“
+TrainHasTag : Zug mit Tag
train is a push-pull train : Zug ist ein Wendezug
-train is longer than {} : Zug ist länger als {}
+train is faster than {} {} : Zug ist schneller als {} {}
+train is longer than {} {} : Zug ist länger als {} {}
train is not a push-pull train : Zug ist kein Wendezug
-train is shorter than {} : Zug ist kürzer als {}
+train is shorter than {} {} : Zug ist kürzer als {} {}
+train is slower than {} {} : Zug ist langsamer als {} {}
+TrainLength : Zug-Länge
Train manager : Zug-Verwaltung
Trains : Züge
Trains\: : Züge:
-TrainHasTag : Zug mit Tag
-TrainLength : Zug-Länge
TrainSelect : Zug-Auswahl
+TrainSpeed : Zug-Geschwindigkeit
+Train speed : Zug-Geschwindigkeit
Trigger {} : {} betätigen
TriggerContact : Kontakt auslösen
Turn : Richtung wechseln
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index 46fc742..9fb6505 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -59,15 +59,7 @@ public abstract class BaseClass implements Constants{
private Direction direction;
public Context(BaseClass object) {
- main = object;
- if (main instanceof Tile) this.tile = (Tile) main;
- if (main instanceof Contact) this.contact = (Contact) main;
- if (main instanceof Block) this.block = (Block) main;
- if (main instanceof Train) this.train = (Train) main;
- if (main instanceof Route) this.route = (Route) main;
- if (main instanceof Action) this.action = (Action) main;
- if (main instanceof Condition) this.condition = (Condition) main;
- if (main instanceof Car) this.car = (Car) main;
+ setMain(object);
}
public Action action() {
@@ -139,7 +131,19 @@ public abstract class BaseClass implements Constants{
public boolean invalidated() {
return isNull(main);
}
-
+
+ public Context setMain(BaseClass object) {
+ main = object;
+ if (main instanceof Tile) this.tile = (Tile) main;
+ if (main instanceof Contact) this.contact = (Contact) main;
+ if (main instanceof Block) this.block = (Block) main;
+ if (main instanceof Train) this.train = (Train) main;
+ if (main instanceof Route) this.route = (Route) main;
+ if (main instanceof Action) this.action = (Action) main;
+ if (main instanceof Condition) this.condition = (Condition) main;
+ if (main instanceof Car) this.car = (Car) main;
+ return this;
+ }
public Route route() {
return route;
diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java
index 981b102..ecf19fa 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/Action.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java
@@ -48,6 +48,7 @@ public abstract class Action extends BaseClass {
DelayedAction.class,
DetermineTrainInBlock.class,
FinishRoute.class,
+ Loop.class,
PreserveRoute.class,
SavePlan.class,
SendCommand.class,
diff --git a/src/main/java/de/srsoftware/web4rail/actions/Loop.java b/src/main/java/de/srsoftware/web4rail/actions/Loop.java
new file mode 100644
index 0000000..60106f2
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/actions/Loop.java
@@ -0,0 +1,105 @@
+package de.srsoftware.web4rail.actions;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.json.JSONObject;
+
+import de.srsoftware.tools.Tag;
+import de.srsoftware.web4rail.BaseClass;
+import de.srsoftware.web4rail.Route;
+import de.srsoftware.web4rail.Window;
+import de.srsoftware.web4rail.moving.Train;
+import de.srsoftware.web4rail.tags.Fieldset;
+import de.srsoftware.web4rail.tags.Select;
+import de.srsoftware.web4rail.tiles.Block;
+import de.srsoftware.web4rail.tiles.Contact;
+import de.srsoftware.web4rail.tiles.Signal;
+import de.srsoftware.web4rail.tiles.Turnout;
+
+public class Loop extends ActionList {
+
+ private String subject = Train.class.getSimpleName();
+ private static final String SUBJECT = "subject";
+
+ public Loop(BaseClass parent) {
+ super(parent);
+ }
+
+ @Override
+ public boolean fire(Context context) {
+ if (isNull(subject)) return false;
+ List extends BaseClass> elements = null;
+ switch (subject) {
+ case "Block":
+ elements = BaseClass.listElements(Block.class);
+ break;
+ case "Contact":
+ elements = BaseClass.listElements(Contact.class);
+ break;
+ case "Route":
+ elements = BaseClass.listElements(Route.class);
+ break;
+ case "Signal":
+ elements = BaseClass.listElements(Signal.class);
+ break;
+ case "Turnout":
+ elements = BaseClass.listElements(Turnout.class);
+ break;
+ case "Train":
+ elements = BaseClass.listElements(Train.class);
+ break;
+ }
+ if (elements == null) return false;
+ for (BaseClass element : elements) super.fire(context.setMain(element));
+ return true;
+ }
+
+ @Override
+ public JSONObject json() {
+ JSONObject json = super.json();
+ if (isSet(subject)) json.put(SUBJECT, subject);
+ return json;
+ }
+
+ @Override
+ public Action load(JSONObject json) {
+ super.load(json);
+ if (json.has(SUBJECT)) subject = json.getString(SUBJECT);
+ return this;
+ }
+
+ @Override
+ protected Window properties(List