From 4180d72d43833ab88ebc390ea6cd61c44b5b8f1b Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 3 Dec 2020 16:04:21 +0100 Subject: [PATCH] more refactoring --- pom.xml | 2 +- .../translations/Application.de.translation | 14 +++-- .../de/srsoftware/web4rail/BaseClass.java | 12 ++-- .../java/de/srsoftware/web4rail/Plan.java | 6 +- .../java/de/srsoftware/web4rail/Route.java | 10 ++-- .../srsoftware/web4rail/actions/Action.java | 23 +++----- .../web4rail/actions/ActionList.java | 30 +++++----- .../web4rail/actions/ConditionalAction.java | 56 +++---------------- .../web4rail/actions/DelayedAction.java | 3 - .../web4rail/actions/SetDisplayText.java | 5 +- .../web4rail/actions/TextAction.java | 2 +- .../web4rail/conditions/Condition.java | 56 +++++++++---------- .../web4rail/conditions/ConditionList.java | 51 ++++++++++++++--- .../web4rail/conditions/OrCondition.java | 10 ++-- .../web4rail/conditions/TrainHasTag.java | 2 +- .../web4rail/conditions/TrainSelect.java | 4 +- .../de/srsoftware/web4rail/tiles/Block.java | 3 +- .../de/srsoftware/web4rail/tiles/Shadow.java | 4 +- .../de/srsoftware/web4rail/tiles/Signal.java | 9 +-- .../de/srsoftware/web4rail/tiles/Tile.java | 29 +++++----- 20 files changed, 155 insertions(+), 176 deletions(-) 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; }