diff --git a/pom.xml b/pom.xml
index 2039ffc..15f2906 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.0.14
+ 1.0.15
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation
index c5323f1..ec8aefa 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -19,6 +19,7 @@ Analyze : analysieren
Apply : Übernehmen
Auto pilot : Autopilot
Availability : Verfügbarkeit
+Back : zurück
Basic properties : Grundlegende Eigenschaften
BlockFree : Blockbelegung
Block {} is free : Block {} ist frei
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index 7727128..9c4b1d8 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -7,11 +7,19 @@ import java.util.Random;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
+import de.srsoftware.web4rail.tags.Button;
public abstract class BaseClass implements Constants{
protected static Plan plan; // the track layout in use
public static final Random random = new Random();
+ public static Button contextButton(String context,String text) {
+ String[] parts = context.split(":");
+ String realm = parts[0];
+ String id = parts.length>1 ? parts[1] : null;
+ return new Button(text,Map.of(REALM,realm,ID,id,ACTION,ACTION_PROPS));
+ }
+
public static Tag link(String tagClass,Map params,Object caption) {
String json = new JSONObject(params).toString().replace("\"", "'");
return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(caption.toString());
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 9b3f146..b6f8c5e 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory;
import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
+import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.moving.Car;
import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tags.Div;
@@ -714,7 +715,10 @@ public class Plan extends BaseClass{
return route(Integer.parseInt(id)).properties(params);
case REALM_PLAN:
Tile tile = get(id, false);
- return tile == null? null : tile.propMenu();
+ return isNull(tile) ? null : tile.propMenu();
+ case REALM_ACTIONS:
+ Action action = Action.get(Integer.parseInt(id));
+ return (isSet(action)) ? action.properties(params) : null;
}
return null;
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index 9ad4946..4675920 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -546,7 +546,7 @@ public class Route extends BaseClass implements Comparable{
for (int i=0; i{
return win;
}
+
+ public Route remove(Condition condition) {
+ conditions.remove(condition);
+ return this;
+ }
public boolean reset() {
setSignals(Signal.STOP);
@@ -710,7 +715,7 @@ public class Route extends BaseClass implements Comparable{
Condition condition = Condition.create(params.get(REALM_CONDITION));
if (isSet(condition)) {
- conditions.add(condition);
+ conditions.add(condition.parent(this));
return properties(params);
}
String message = t("{} updated.",this);
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
index 632d608..3917005 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
@@ -43,12 +43,17 @@ public class ConditionalAction extends Action {
private Tag conditionForm(HashMap params) {
Fieldset fieldset = new Fieldset(t("Conditions"));
+ String context = params.get(CONTEXT);
new Tag("p").content(t("Actions will only fire, if all conditions are fullfilled.")).addTo(fieldset);
if (!conditions.isEmpty()) {
Tag list = new Tag("ul");
for (Condition condition : conditions) {
- link("li", Map.of(REALM,REALM_CONDITION,ID,condition.id(),ACTION,ACTION_PROPS,CONTEXT,params.get(CONTEXT)), condition).addTo(list);
+ HashMap props = new HashMap(Map.of(REALM,REALM_CONDITION,ID,condition.id(),ACTION,ACTION_PROPS,CONTEXT, context));
+ Tag li = link("span", props, condition+NBSP).addTo(new Tag("li"));
+ props.put(ACTION, ACTION_DROP);
+ props.put(CONTEXT,REALM_ACTIONS+":"+id());
+ new Button(t("delete"), props).addTo(li).addTo(list);
}
list.addTo(fieldset);
}
@@ -57,12 +62,14 @@ public class ConditionalAction extends Action {
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(CONTEXT,context).hideIn(form);
Condition.selector().addTo(form);
- return new Button(t("Add condition"),form).addTo(form).addTo(fieldset);
+
+ new Button(t("Add condition"),form).addTo(form);
+ return contextButton(context,t("Back")).addTo(form).addTo(fieldset);
}
-
+
public boolean equals(ConditionalAction other) {
return (conditions()+":"+actions).equals(other.conditions()+":"+other.actions);
}
@@ -92,7 +99,7 @@ public class ConditionalAction extends Action {
if (o instanceof JSONObject) {
JSONObject j = (JSONObject) o;
Condition condition = Condition.create(j.getString(TYPE));
- if (condition != null) conditions.add(condition.load(j));
+ if (isSet(condition)) conditions.add(condition.parent(this).load(j));
}
}
actions = ActionList.load(json.getJSONArray(ACTIONS));
@@ -107,6 +114,11 @@ public class ConditionalAction extends Action {
return win;
}
+ public ConditionalAction remove(Condition condition) {
+ conditions.remove(condition);
+ return this;
+ }
+
@Override
public String toString() {
if (conditions.isEmpty()) return t("[Click here to add condition]");
@@ -117,8 +129,8 @@ public class ConditionalAction extends Action {
protected Object update(HashMap params) {
String conditionClass = params.get(REALM_CONDITION);
Condition condition = Condition.create(conditionClass);
- if (condition == null) return t("Unknown type of condition: {}",conditionClass);
- conditions.add(condition);
+ if (isNull(condition)) return t("Unknown type of condition: {}",conditionClass);
+ conditions.add(condition.parent(this));
return super.update(params);
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
index 77b0d44..13c241c 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
@@ -2,6 +2,7 @@ package de.srsoftware.web4rail.conditions;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
@@ -14,8 +15,10 @@ import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Plan;
+import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action.Context;
+import de.srsoftware.web4rail.actions.ConditionalAction;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Checkbox;
import de.srsoftware.web4rail.tags.Form;
@@ -30,6 +33,7 @@ public abstract class Condition extends BaseClass {
private static HashMap conditions = new HashMap();
public boolean inverted = false;
protected int id;
+ private Object parent;
public Condition() {
this(Application.createId());
@@ -55,6 +59,9 @@ public abstract class Condition extends BaseClass {
case ACTION_UPDATE:
condition.update(params);
return plan.showContext(params);
+ case ACTION_DROP:
+ condition.drop();
+ return plan.showContext(params);
}
return t("Unknown action: {}",action);
}
@@ -69,6 +76,18 @@ public abstract class Condition extends BaseClass {
return null;
}
+ private void drop() {
+ if (parent instanceof ConditionalAction) {
+ ConditionalAction ca = (ConditionalAction) parent;
+ ca.remove(this);
+ }
+ if (parent instanceof Route) {
+ Route route = (Route) parent;
+ route.remove(this);
+ }
+ conditions.remove(this.id());
+ }
+
public abstract boolean fulfilledBy(Context context);
public int id() {
@@ -81,11 +100,20 @@ public abstract class Condition extends BaseClass {
return json;
}
- public Condition load(JSONObject json) {
- inverted = json.has(INVERTED) && json.getBoolean(INVERTED);
- return this;
+ /**
+ * If arguments are given, the first is taken as content, the second as tag type.
+ * If no content is supplied, name is set as content.
+ * If no type is supplied, "span" is preset.
+ * @param args
+ * @return
+ */
+ public Tag link(String...args) {
+ String tx = args.length<1 ? toString()+NBSP : args[0];
+ String type = args.length<2 ? "span" : args[1];
+ String context = args.length<3 ? null : args[2];
+ return link(type, Map.of(REALM,REALM_CONDITION,ID,id(),ACTION,ACTION_PROPS,CONTEXT,context), tx);
}
-
+
private static List> list() {
return List.of(
BlockFree.class,
@@ -95,12 +123,18 @@ public abstract class Condition extends BaseClass {
TrainLength.class);
}
+ public Condition load(JSONObject json) {
+ 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);
- new Input(CONTEXT,params.get(CONTEXT)).hideIn(form);
+ String context = params.get(CONTEXT);
+ if (isSet(context)) new Input(CONTEXT,context).hideIn(form);
return form;
}
@@ -138,4 +172,9 @@ public abstract class Condition extends BaseClass {
inverted = "on".equals(params.get(INVERTED));
return t("updated {}.",this);
}
+
+ public Condition parent(Object parent) {
+ this.parent = parent;
+ return this;
+ }
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
index 132de6e..78e5ed3 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
@@ -46,7 +46,7 @@ public class Contact extends Tile{
public void run() {
try {
for (int ticks = 0; ticks<10; ticks++) {
- if (!aborted) sleep(100);
+ if (!aborted) sleep(10);
}
timer = null;
if (aborted) return;