diff --git a/pom.xml b/pom.xml
index 3f82a6c..9a3c8e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.2.8
+ 1.2.9
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation
index 0854789..6994b4b 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -17,6 +17,7 @@ Add tile : Kachel hinzufügen
Address : Adresse
Address\: : Adresse:
Analyze : analysieren
+and : und
Apply : Übernehmen
Auto pilot : Autopilot
Availability : Verfügbarkeit
@@ -37,9 +38,10 @@ Car manager : Waggon-Verwaltung
Cars\: : Waggons:
Click here to select train! : HIer klicken, um Zug auszuwählen!
[Click here to select block!] : [Hier klicken, um Block auszuwählen!]
-[Click here to add condition] : [Hier klicken, um Bedingung hinzuzufügen]
+Click to setup tag : Hier klicken, um Markierung anzugeben
+Click here to add conditions : Hier klicken, um Bedingungen hinzuzufügen
[Click here to select display!] : [Hier klicken, um Anzeige auszuwählen!]
-[Click here to select train!] : [Hier klicken, um Zug auszuwählen!]
+Click here to select train! : Hier klicken, um Zug auszuwählen!
click here to setup contact : Hier klicken, um Kontakt auszuwählen
click here to setup relay : Hier klicken, um Relais einzurichten
Click on a name to edit the entry. : Klicke auf einen Namen, um einen Eintrag zu bearbeiten.
@@ -69,7 +71,7 @@ Determine, which train is in {} : Bestimmen, welcher Zug sich in {} befindet
Direction : Richtung
Direction\: heading {} : Richtung: nach {}
disabled : deaktiviert
-Display "{}" on clients. : „{}“ auf den Clients anzeigen.
+Display "{}" on {}. : „{}“ auf {} anzeigen.
Drop : Verwerfen
Dropped destination of {}. : Ziel von {} verworfen.
1) Duration between 5 {} steps during brake process. : 1) Zeit zwischen 5 {}-Schritten beim Bremsvorgang.
@@ -124,8 +126,10 @@ Notes : Notizen
Occupied area\: : Belegte Abschnitte:
Off : Aus
On : An
+One of : eine von
One way : Richtung
Online Documentation : Online-Dokumentation
+or : oder
OrCondition : Oder-Bedingung
other train properties : andere Zug-Eigenschaften
Origin and destination : Start und Ziel
@@ -148,10 +152,10 @@ Route will only be available, if all conditions are fulfilled. : Route ist nur v
Save : speichern
Select block : Block auswählen
Select contact\: : Kotakt auswählen:
-Select display\: : Anzeige auswählen:
+Select display : Anzeige auswählen
Select from plan : Auf Plan auswählen
Select relay\: : Relais auswählen:
-Select train\: : Zug auswählen:
+Select train: : Zug auswählen
SendCommand : Kommando senden
Send command "{}" to control unit : Kommando „{}“ an Zentrale senden
Set {} as context : {} als Kontext setzen
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index 1c83504..14aaff4 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -238,11 +238,7 @@ public abstract class BaseClass implements Constants{
if (this instanceof Train) return REALM_TRAIN;
return REALM_PLAN;
}
-
- public Map contextAction(String action){
- return Map.of(ACTION,action,CONTEXT,realm()+":"+id());
- }
-
+
public Form form(String id,List> elements) {
Form form = new Form(id);
@@ -356,7 +352,7 @@ public abstract class BaseClass implements Constants{
protected Window properties(List preForm,FormInput formInputs,List postForm) {
- Window win = new Window(getClass().getSimpleName()+"-properties", t("Properties of {}",this));
+ Window win = new Window(getClass().getSimpleName()+"-properties", t("Properties of {} ({})",this.title(),id));
preForm.forEach(fieldset -> fieldset.addTo(win));
@@ -375,6 +371,10 @@ public abstract class BaseClass implements Constants{
return win;
}
+ private String title() {
+ return getClass().getSimpleName();
+ }
+
private Map props(Map additionalProps){
HashMap props = new HashMap(Map.of(REALM, realm(), ACTION, ACTION_PROPS, ID, id().toString()));
if (isSet(additionalProps)) props.putAll(additionalProps);
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 91ddcdc..8d1b766 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -716,10 +716,10 @@ public class Plan extends BaseClass{
* @throws IOException
*/
public void set(int x,int y,Tile tile) throws IOException {
- if (tile == null) return;
- for (int i=1; i{
switch (params.get(ACTION)) {
case ACTION_DROP:
route.remove();
- return t("Removed {}.",route);
-
+ return t("Removed {}.",route);
case ACTION_PROPS:
return route.properties();
case ACTION_UPDATE:
@@ -552,9 +551,9 @@ public class Route extends BaseClass implements Comparable{
for (Object signalId : json.getJSONArray(SIGNALS)) addSignal((Signal) plan.get(new Id((String) signalId), false));
}
if (json.has(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS));
- if (json.has(CONDITIONS)) conditions.load(json.getJSONArray(CONDITIONS));
- if (json.has(SETUP_ACTIONS)) setupActions.load(json.getJSONArray(SETUP_ACTIONS));
- if (json.has(START_ACTIONS)) startActions.load(json.getJSONArray(START_ACTIONS));
+ if (json.has(CONDITIONS)) conditions.load(json.getJSONArray(CONDITIONS)).parent(this);
+ if (json.has(SETUP_ACTIONS)) setupActions.load(json.getJSONArray(SETUP_ACTIONS)).parent(this);
+ if (json.has(START_ACTIONS)) startActions.load(json.getJSONArray(START_ACTIONS)).parent(this);
if (json.has(DISABLED)) disabled = json.getBoolean(DISABLED);
if (json.has(BRAKE_TIMES)) {
JSONObject dummy = json.getJSONObject(BRAKE_TIMES);
@@ -568,6 +567,7 @@ public class Route extends BaseClass implements Comparable{
JSONObject json = arr.getJSONObject(i);
String trigger = json.getString(TRIGGER);
ActionList actionList = new ActionList(this).load(json.getJSONArray(ACTIONS));
+ actionList.parent(this);
triggers.put(trigger, actionList);
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java
index 8204102..45abda3 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/Action.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java
@@ -13,7 +13,6 @@ import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass;
-import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tags.Select;
@@ -32,6 +31,12 @@ public abstract class Action extends BaseClass {
parent(parent);
}
+ public BaseClass context() {
+ BaseClass context = this;
+ while (context instanceof Action && isSet(context.parent())) context = context.parent();
+ return context;
+ }
+
public static Action create(String type,BaseClass parent) {
try {
return (Action) Class.forName(PREFIX+"."+type).getDeclaredConstructor(BaseClass.class).newInstance(parent);
@@ -41,16 +46,6 @@ public abstract class Action extends BaseClass {
return null;
}
- public boolean drop() {
- BaseClass parent = parent();
- if (parent instanceof ActionList) {
- ActionList actionList = (ActionList) parent;
- return actionList.drop(this);
- }
- LOG.error("Action.drop() called on Action ({}) whose parent ({}) is not an ActionList!",this,parent);
- return false;
- }
-
public boolean equals(Action other) {
return this.toString().equals(other.toString());
}
@@ -104,10 +99,10 @@ public abstract class Action extends BaseClass {
return false;
}
- @Override
+/* @Override
public Window properties() { // goes up to first ancestor, which is not an Action
return parent().properties();
- }
+ }*/
public static Tag selector() {
Select select = new Select(TYPE);
@@ -134,6 +129,6 @@ public abstract class Action extends BaseClass {
@Override
protected Object update(HashMap params) {
super.update(params);
- return properties();
+ return context().properties();
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
index 4ff7131..ce10ecf 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
@@ -3,6 +3,7 @@ package de.srsoftware.web4rail.actions;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Vector;
import org.json.JSONArray;
@@ -29,12 +30,12 @@ public class ActionList extends Action implements Iterable{
actions = new Vector();
}
- private Object actionTypeForm(Window win, String context) {
+ private Tag actionTypeForm() {
+ Window win = new Window("add-action-form", t("Add action to action list"));
Form typeForm = new Form("add-action-to-"+id);
new Input(REALM, REALM_ACTIONS).hideIn(typeForm);
new Input(ID,id).hideIn(typeForm);
new Input(ACTION,ACTION_ADD).hideIn(typeForm);
- new Input(CONTEXT,context).hideIn(typeForm);
Action.selector().addTo(typeForm);
return new Button(t("Create action"),typeForm).addTo(typeForm).addTo(win);
}
@@ -45,18 +46,14 @@ public class ActionList extends Action implements Iterable{
}
private Object addActionForm(HashMap params, Plan plan) {
- Window win = new Window("add-action-form", t("Add action to action list"));
String type = params.get(TYPE);
- String context = params.get(CONTEXT);
- if (type == null) return actionTypeForm(win,context);
+ if (isNull(type)) return actionTypeForm();
Action action = Action.create(type,this);
if (action instanceof Action) {
add(action);
- return parent().properties();
+ return context().properties();
}
- actionTypeForm(win,context);
- new Tag("span").content(t("Unknown action type: {}",type)).addTo(win);
- return win;
+ return new Tag("span").content(t("Unknown action type: {}",type)).addTo(actionTypeForm());
}
public void addActionsFrom(ActionList other) {
@@ -117,18 +114,18 @@ public class ActionList extends Action implements Iterable{
}
public Tag list() {
- Button button = button(t("add action"), contextAction(ACTION_ADD_ACTION));
Tag span = new Tag("span");
- button.addTo(span);
+ button(t("add action"), Map.of(ACTION, ACTION_ADD)).addTo(span);
if (!isEmpty()) {
Tag list = new Tag("ol");
boolean first = true;
for (Action action : actions) {
- Tag item = action.link("span",action).addTo(new Tag("li"));
+ Tag item = action.link("span",action).addTo(new Tag("li")).content(NBSP);
+ action.button("-", Map.of(ACTION,ACTION_DROP)).addTo(item);
if (first) {
first = false;
- } else action.button("↑", contextAction(ACTION_MOVE)).addTo(item.content(NBSP));
+ } else action.button("↑", Map.of(ACTION,ACTION_MOVE)).addTo(item);
if (action instanceof ActionList) ((ActionList) action).list().addTo(item);
item.addTo(list);
}
@@ -174,7 +171,10 @@ public class ActionList extends Action implements Iterable{
if (isNull(actionList)) return t("Id ({}) does not belong to ActionList!",actionId);
return actionList.addActionForm(params,plan);
case ACTION_DROP:
- return action.drop() ? action.properties() : t("No action with id {} found!",actionId);
+ if (isNull(action)) return t("No action with id {} found!",actionId);
+ BaseClass context = action.context();
+ action.remove();
+ return context.properties();
case ACTION_MOVE:
return action.moveUp() ? action.properties() : t("No action with id {} found!",actionId);
case ACTION_PROPS:
@@ -189,7 +189,7 @@ public class ActionList extends Action implements Iterable{
protected Window properties(List preForm, FormInput formInputs, List postForm) {
Fieldset fieldset = new Fieldset(t("Actions"));
list().addTo(fieldset);
- preForm.add(fieldset);
+ postForm.add(fieldset);
return super.properties(preForm, formInputs, postForm);
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
index c3c72d9..ab49412 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java
@@ -2,68 +2,29 @@ package de.srsoftware.web4rail.actions;
import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import java.util.Vector;
import org.json.JSONArray;
import org.json.JSONObject;
-import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.conditions.Condition;
-import de.srsoftware.web4rail.tags.Button;
+import de.srsoftware.web4rail.conditions.ConditionList;
import de.srsoftware.web4rail.tags.Fieldset;
-import de.srsoftware.web4rail.tags.Form;
-import de.srsoftware.web4rail.tags.Input;
public class ConditionalAction extends ActionList {
private static final String CONDITIONS = "conditions";
private static final String ACTIONS = "actions";
- private Vector conditions = new Vector();
+ private ConditionList conditions = new ConditionList();
public ConditionalAction(BaseClass parent) {
super(parent);
- }
-
- private StringBuffer conditions() {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i0) sb.append(t(" and "));
- sb.append(conditions.get(i).toString());
- }
- return sb;
- }
-
- private Fieldset conditionForm() {
- Fieldset fieldset = new Fieldset(t("Conditions"));
-
- 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) {
- Tag li = link("span", condition+NBSP,Map.of()).addTo(new Tag("li"));
- HashMap props = new HashMap(Map.of(REALM,REALM_CONDITION,ID,condition.id(),ACTION,ACTION_DROP,CONTEXT, REALM_ACTIONS+":"+id()));
- new Button(t("delete"), props).addTo(li).addTo(list);
- }
- list.addTo(fieldset);
- }
-
- Form form = new Form("action-prop-form-"+id);
- new Input(REALM,REALM_ACTIONS).hideIn(form);
- new Input(ID,id()).hideIn(form);
- new Input(ACTION,ACTION_UPDATE).hideIn(form);
-
- Condition.selector().addTo(form);
-
- new Button(t("Add condition"),form).addTo(form);
- button(t("Back")).addTo(form).addTo(fieldset);
- return fieldset;
+ conditions.parent(this);
}
public boolean equals(ConditionalAction other) {
- return (conditions()+":"+actions).equals(other.conditions()+":"+other.actions);
+ return (conditions+":"+actions).equals(other.conditions+":"+other.actions);
}
@Override
@@ -103,10 +64,7 @@ public class ConditionalAction extends ActionList {
@Override
protected Window properties(List preForm, FormInput formInputs, List postForm) {
- preForm.add(conditionForm());
- Fieldset fieldset = new Fieldset(t("Actions"));
- list().addTo(fieldset);
- postForm.add(fieldset);
+ preForm.add(conditions.list());
return super.properties(preForm, formInputs, postForm);
}
@@ -118,8 +76,8 @@ public class ConditionalAction extends ActionList {
@Override
public String toString() {
- if (conditions.isEmpty()) return t("[Click here to add condition]");
- return t("if ({}):",conditions());
+ if (conditions.isEmpty()) return "["+t("Click here to add conditions")+"]";
+ return t("if ({}):",conditions);
}
@Override
diff --git a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java
index 2600a31..aee2eb3 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java
@@ -61,9 +61,6 @@ public class DelayedAction extends ActionList {
@Override
protected Window properties(List preForm, FormInput formInputs, List postForm) {
formInputs.add(t("Delay"),new Input(DELAY,delay).numeric().addTo(new Tag("span")).content(NBSP+"ms"));
- Fieldset fieldset = new Fieldset(t("Actions"));
- list().addTo(fieldset);
- postForm.add(fieldset);
return super.properties(preForm, formInputs, postForm);
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
index 84784f5..149db68 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
@@ -68,10 +68,9 @@ public class SetDisplayText extends TextAction{
}
@Override
- protected Object update(HashMap params) {
- super.update(params);
+ protected Object update(HashMap params) {
String displayId = params.get(TextDisplay.class.getSimpleName());
if (isSet(displayId)) display = (TextDisplay) plan.get(new Id(displayId), false);
- return properties();
+ return super.update(params);
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/TextAction.java b/src/main/java/de/srsoftware/web4rail/actions/TextAction.java
index 91a1a03..cef4da0 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/TextAction.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/TextAction.java
@@ -55,6 +55,6 @@ public abstract class TextAction extends Action {
protected Object update(HashMap params) {
LOG.debug("update: {}",params);
text = params.get(TEXT);
- return properties();
+ 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 c32e4dc..ed39cd4 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java
@@ -16,9 +16,9 @@ import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Plan;
import de.srsoftware.web4rail.Window;
+import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.tags.Checkbox;
import de.srsoftware.web4rail.tags.Fieldset;
-import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tags.Select;
public abstract class Condition extends BaseClass {
@@ -40,48 +40,36 @@ public abstract class Condition extends BaseClass {
String action = params.get(ACTION);
if (action == null) return t("No action passed to Condition.action!");
- Id cid = Id.from(params);
-
- if (isSet(cid)) {
- Condition condition = BaseClass.get(cid);
- if (isNull(condition)) return t("No condition with id {}!",cid);
-
- switch (action) {
- case ACTION_PROPS:
- return condition.properties();
- case ACTION_UPDATE:
- condition.update(params);
- return condition.parent().properties();
- case ACTION_DROP:
- condition.remove();
- return condition.parent().properties();
- }
- return t("Unknown action: {}",action);
- }
+ Id id = Id.from(params);
+ Condition condition = BaseClass.get(id);
switch (action) {
case ACTION_ADD:
return addCondition(params);
-
+ case ACTION_DROP:
+ BaseClass context = condition.context();
+ condition.remove();
+ return context.properties();
+ case ACTION_PROPS:
+ return condition.properties();
+ case ACTION_UPDATE:
+ condition.update(params);
+ return condition.context().properties();
}
return t("Unknown action: {}",action);
-
}
private static Object addCondition(HashMap params) {
String type = params.get(REALM_CONDITION);
if (isNull(type)) return t("No type supplied to addCondition!");
- Id parentId = Id.from(params, PARENT);
+ Id parentId = Id.from(params);
if (isNull(parentId)) return t("No parent id supplied to addCondition");
- BaseClass parent = BaseClass.get(parentId);
- if (isNull(parent)) return t("No condition with id {} found!",parentId);
+ ConditionList conditionList = BaseClass.get(parentId);
+ if (isNull(conditionList)) return t("No condition list with id {} found!",parentId);
- Condition condition = Condition.create(type);
- if (isNull(condition)) return t("Unknown type \"{}\" of condition!",type);
-
- return condition.parent(parent).properties();
+ return conditionList.add(Condition.create(type)).properties();
}
public static Condition create(String type) {
@@ -94,6 +82,14 @@ public abstract class Condition extends BaseClass {
return null;
}
+ public BaseClass context() {
+ BaseClass context = this;
+ while (isSet(context.parent()) && (context instanceof Condition || context instanceof Action)) {
+ context = context.parent();
+ }
+ return context;
+ }
+
public abstract boolean fulfilledBy(Context context);
public JSONObject json() {
@@ -137,7 +133,7 @@ public abstract class Condition extends BaseClass {
return super.properties(preForm, formInputs, postForm);
}
- public static Tag selector() {
+ public static Select selector() {
Select select = new Select(REALM_CONDITION);
TreeMap names = new TreeMap(String.CASE_INSENSITIVE_ORDER);
@@ -147,7 +143,7 @@ public abstract class Condition extends BaseClass {
}
for (Entry entry : names.entrySet()) select.addOption(entry.getValue(), entry.getKey());
- return select.addTo(new Label(t("Condition type:")+NBSP));
+ return select;
}
public static String t(String text, Object...fills) {
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
index 67a0968..50eaedf 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
@@ -1,6 +1,7 @@
package de.srsoftware.web4rail.conditions;
import java.util.Iterator;
+import java.util.Map;
import java.util.Vector;
import java.util.stream.Stream;
@@ -9,6 +10,7 @@ import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.BaseClass;
+import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Form;
@@ -18,8 +20,10 @@ public class ConditionList extends Condition implements Iterable{
private Vector conditions = new Vector();
- public void add(Condition condition) {
+ public ConditionList add(Condition condition) {
conditions.add(condition);
+ condition.parent(this);
+ return this;
}
public void addAll(ConditionList conditions) {
@@ -34,6 +38,10 @@ public class ConditionList extends Condition implements Iterable{
return true;
}
+ protected String glue() {
+ return t("and");
+ }
+
public boolean isEmpty() {
return conditions.isEmpty();
}
@@ -62,14 +70,26 @@ public class ConditionList extends Condition implements Iterable{
public Fieldset list(String caption) {
Fieldset fieldset = new Fieldset(t("Conditions"));
if (caption != null) new Tag("p").content(caption).addTo(fieldset);
+ listInternal().addTo(fieldset);
+ return fieldset;
+ }
+
+ private Tag listInternal() {
Tag list = new Tag("ul");
+ for (Condition condition : conditions) {
+ Tag item = new Tag("li");
+ condition.link("span", condition).addTo(item);
+ condition.button(t("delete"), Map.of(ACTION,ACTION_DROP)).addTo(item.content(NBSP)).addTo(list);
+ if (condition instanceof ConditionList) {
+ ((ConditionList)condition).listInternal().addTo(item);
+ }
+ }
newConditionForm().addTo(new Tag("li")).addTo(list);
- conditions.forEach(condition -> condition.link("li", condition).addTo(list));
- list.addTo(fieldset);
- return fieldset;
+ return list;
+
}
- public void load(JSONArray arr) {
+ public ConditionList load(JSONArray arr) {
for (int i=0; i{
conditions.add(condition.load(json));
}
}
+ return this;
}
private Form newConditionForm() {
- Form form = new Form("add-condition-form");
+ Form form = new Form("new-condition-form-"+id());
new Input(REALM, REALM_CONDITION).hideIn(form);
new Input(ACTION,ACTION_ADD).hideIn(form);
- new Input(PARENT,id());
+ new Input(ID,id()).hideIn(form);
Condition.selector().addTo(form);
new Button(t("Add condition"), form).addTo(form);
return form;
}
+ @Override
+ public Window properties() {
+ BaseClass parent = parent();
+ if (isSet(parent)) return parent.properties();
+ return super.properties();
+ }
+
@Override
public BaseClass remove() {
super.remove();
@@ -110,4 +138,13 @@ public class ConditionList extends Condition implements Iterable{
public Stream stream() {
return conditions.stream();
}
+
+ @Override
+ public String toString() {
+ if (conditions.isEmpty()) return "["+t("Click here to add conditions")+"]";
+ StringBuffer sb = new StringBuffer(conditions.firstElement().toString());
+ String glue = glue();
+ for (int i=1; i preForm, FormInput formInputs, List postForm) {
- formInputs.add(t("Select train"),Train.selector(train, null));
+ formInputs.add(t("Select train")+":",Train.selector(train, null));
return super.properties(preForm, formInputs, postForm);
}
@@ -44,7 +44,7 @@ public class TrainSelect extends Condition {
@Override
public String toString() {
- if (train == null) return t("[Click here to select train!]");
+ if (train == null) return "["+t("Click here to select train!")+"]";
return t("Train")+ (inverted?"≠":"=") + train;
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
index cebc260..0f26a8f 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
@@ -30,7 +30,7 @@ import de.srsoftware.web4rail.tags.Select;
* @author Stephan Richter, SRSoftware
*
*/
-public abstract class Block extends StretchableTile implements Comparable{
+public abstract class Block extends StretchableTile{
private static final String ALLOW_TURN = "allowTurn";
private static final String NAME = "name";
private static final String NO_TAG = "[default]";
@@ -127,7 +127,6 @@ public abstract class Block extends StretchableTile implements Comparable
return super.click();
}
- @Override
public int compareTo(Block other) {
return name.compareTo(other.name);
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java
index 9ebcbd3..2db3ce0 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java
@@ -20,8 +20,10 @@ public class Shadow extends Tile{
return super.connections(from);
}
- public Shadow(Tile overlay) {
+ public Shadow(Tile overlay, int x, int y) {
this.overlay = overlay;
+ this.x = x;
+ this.y = y;
overlay.addShadow(this);
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
index 0fa7365..12c780d 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
@@ -9,7 +9,7 @@ import java.util.Vector;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Plan.Direction;
-public abstract class Signal extends Tile implements Comparable{
+public abstract class Signal extends Tile {
public static final String STATE = "state";
public static final String STOP = "stop";
public static final String GO = "go";
@@ -29,13 +29,6 @@ public abstract class Signal extends Tile implements Comparable{
return classes;
}
- @Override
- public int compareTo(Signal other) {
- Id tid = this.id();
- Id oid = other.id();
- return tid.compareTo(oid);
- }
-
public abstract boolean isAffectedFrom(Direction dir);
public boolean state(String state) {
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
index 5d9428d..c42b0b9 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
@@ -7,7 +7,6 @@ import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -37,7 +36,7 @@ import de.srsoftware.web4rail.tags.Radio;
* @author Stephan Richter, SRSoftware
*
*/
-public abstract class Tile extends BaseClass{
+public abstract class Tile extends BaseClass implements Comparable{
protected static Logger LOG = LoggerFactory.getLogger(Tile.class);
private static int DEFAUT_LENGTH = 100; // 10cm
@@ -57,7 +56,7 @@ public abstract class Tile extends BaseClass{
protected Direction oneWay = null;
protected Route route = null;
private TreeSet routes = new TreeSet<>();
- protected HashSet shadows = new HashSet<>();
+ protected TreeSet shadows = new TreeSet<>();
protected Train train = null;
public Integer x = null;
public Integer y = null;
@@ -85,6 +84,12 @@ public abstract class Tile extends BaseClass{
return properties();
}
+ @Override
+ public int compareTo(Tile other) {
+ if (x == other.x) return y-other.y;
+ return x - other.x;
+ }
+
public JSONObject config() {
return new JSONObject();
}
@@ -207,14 +212,14 @@ public abstract class Tile extends BaseClass{
} else fieldset = new Fieldset(t("Train"));
train.link("span", t("Train")+":"+NBSP+train+NBSP).addTo(fieldset);
if (isSet(train.route)) {
- train.button(t("stop"), contextAction(ACTION_STOP)).addTo(fieldset);
+ train.button(t("stop"), Map.of(ACTION,ACTION_STOP)).addTo(fieldset);
} else {
- train.button(t("start"), contextAction(ACTION_START)).addTo(fieldset);
+ train.button(t("start"), Map.of(ACTION,ACTION_START)).addTo(fieldset);
}
if (train.usesAutopilot()) {
- train.button(t("quit autopilot"), contextAction(ACTION_QUIT)).addTo(fieldset);
+ train.button(t("quit autopilot"), Map.of(ACTION,ACTION_QUIT)).addTo(fieldset);
} else {
- train.button(t("auto"), contextAction(ACTION_AUTO)).addTo(fieldset);
+ train.button(t("auto"), Map.of(ACTION,ACTION_AUTO)).addTo(fieldset);
}
}
@@ -241,7 +246,7 @@ public abstract class Tile extends BaseClass{
Tag routeList = new Tag("ol");
for (Route route : routes) {
Tag li = route.link("span", route.name()+(route.isDisabled()?" ["+t("disabled")+"]" : "")+NBSP).addTo(new Tag("li").clazz("link"));
- route.button(t("delete route"),contextAction(ACTION_DROP)).addTo(li);
+ route.button(t("delete route"),Map.of(ACTION,ACTION_DROP)).addTo(li);
li.addTo(routeList);
}
routeList.addTo(fieldset);
@@ -376,12 +381,8 @@ public abstract class Tile extends BaseClass{
@Override
public BaseClass remove() {
super.remove();
- routes.forEach(route -> {
- route.remove();
- });
- shadows.forEach(shadow -> {
- shadow.remove();
- });
+ while (!routes.isEmpty()) routes.first().remove();
+ while (!shadows.isEmpty()) shadows.first().remove();
return this;
}