improved error messages

This commit is contained in:
Stephan Richter
2021-03-12 16:04:08 +01:00
parent 2556ea7cd9
commit 6bf7882f3b
63 changed files with 205 additions and 184 deletions

View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.srsoftware</groupId>
<artifactId>web4rail</artifactId>
<version>1.3.56</version>
<version>1.3.57</version>
<name>Web4Rail</name>
<packaging>jar</packaging>
<description>Java Model Railway Control</description>

View File

@@ -256,7 +256,14 @@ fieldset{
border-radius: 5px;
}
.error{
background: red;
background: orange;
margin: 30px 10px 5px;
padding: 0;
border-radius: 10px;
}
.error p{
padding: 5px;
}
h4,ul{

View File

@@ -37,7 +37,7 @@ function arrangeTabs(){
var tabs = $('<div/>',{'class':'tabs'});
var winId = $('.window').attr('id')+"-";
tabs.insertAfter($('.swapbtn'));
tabs.insertAfter($('.error'));
var target = null;
var index = null;
$('.window > fieldset > legend').each(function(){

View File

@@ -1,4 +1,5 @@
abort : abbrechen
Aborting route allocation... : Routen-Reservierung wird abgebrochen...
Accessory : Zubehör
Action : Aktion
Actions : Aktionen

View File

@@ -423,14 +423,22 @@ public abstract class BaseClass implements Constants{
return (T) this;
}
public Window properties() {
return properties(new ArrayList<>(), new FormInput(), new ArrayList<>());
public Window properties(String...error) {
return properties(new ArrayList<>(), new FormInput(), new ArrayList<>(),error);
}
protected Window properties(List<Fieldset> preForm,FormInput formInputs,List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm,FormInput formInputs,List<Fieldset> postForm, String...errorMessages) {
Window win = new Window(getClass().getSimpleName()+"-properties", t("Properties of {}",this.title()));
Tag errorDiv = new Tag("div").clazz("error").content("");
if (errorMessages != null && errorMessages.length > 0) {
for (String errorMessage : errorMessages) {
if (isSet(errorMessage)) new Tag("p").content(errorMessage).addTo(errorDiv);
}
}
errorDiv.addTo(win);
preForm.forEach(fieldset -> fieldset.addTo(win));
formInputs.add(new AbstractMap.SimpleEntry<String, Tag>(null,new Input(ACTION, ACTION_UPDATE)));

View File

@@ -88,7 +88,7 @@ public class Route extends BaseClass {
public Direction endDirection;
private Vector<Tile> path;
private Vector<Signal> signals;
private Train train;
//private Train train;
private HashMap<String,ActionList> triggeredActions = new HashMap<String, ActionList>();
private HashMap<Turnout,Turnout.State> turnouts;
private Block startBlock = null;
@@ -214,7 +214,7 @@ public class Route extends BaseClass {
private Fieldset basicProperties() {
Fieldset fieldset = new Fieldset(t("Route properties"));
if (isSet(train)) train.link("span",t("Train")+": "+train).addTo(fieldset);
// if (isSet(train)) train.link("span",t("Train")+": "+train).addTo(fieldset);
Tag list = new Tag("ul");
startBlock.link("li",t("Origin: {} to {}",startBlock.name,startDirection)).addTo(list);
endBlock.link("li",t("Destination: {} from {}",endBlock.name,endDirection.inverse())).addTo(list);
@@ -319,15 +319,16 @@ public class Route extends BaseClass {
* @param contact
* @param trainHead
*/
public void contact(Contact contact) {
public void contact(Context context) {
Contact contact = context.contact();
if (triggeredContacts.contains(contact)) return; // don't trigger contact a second time
triggeredContacts.add(contact);
LOG.debug("{} on {} activated {}.",train,this,contact);
LOG.debug("{} on {} activated {}.",context.train(),this,contact);
ActionList actions = triggeredActions.get(contact.trigger());
LOG.debug("Contact has id {} / trigger {} and is assigned with {}",contact.id(),contact.trigger(),isNull(actions)?t("nothing"):actions);
if (isNull(actions)) return;
Context context = new Context(this).train(train).contact(contact);
actions.fire(context,"Route.Contact("+contact.addr()+")");
//Context context = new Context(this).train(train).contact(contact);
actions.fire(context.route(this),"Route.Contact("+contact.addr()+")");
}
public Vector<Contact> contacts() {
@@ -375,7 +376,7 @@ public class Route extends BaseClass {
return endBlock;
}
public void finish() {
public void finish(Train train) {
LOG.debug("{}.finish()",this);
train.endRoute();
free();
@@ -386,6 +387,7 @@ public class Route extends BaseClass {
private void free() {
for (Tile tile : path) {
Train train = tile.train();
if (isSet(train) && train.onTrace(tile)) {
tile.setState(Status.OCCUPIED, train);
} else tile.free();
@@ -687,7 +689,7 @@ public class Route extends BaseClass {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
preForm.add(conditions.list(t("Route will only be available, if all conditions are fulfilled.")));
preForm.add(contactsAndActions());
@@ -703,7 +705,7 @@ public class Route extends BaseClass {
postForm.add(basicProperties());
if (!turnouts.isEmpty()) postForm.add(turnouts());
postForm.add(brakeTimes());
Window win = super.properties(preForm, formInputs, postForm);
Window win = super.properties(preForm, formInputs, postForm,errors);
previewScript().addTo(win);
return win;
}
@@ -715,7 +717,7 @@ public class Route extends BaseClass {
@Override
public BaseClass remove() {
LOG.debug("Removing route ({}) {}",id(),this);
if (isSet(train)) train.removeChild(this);
// if (isSet(train)) train.removeChild(this);
for (Tile tile : path) {
tile.removeChild(this);
}
@@ -734,7 +736,7 @@ public class Route extends BaseClass {
if (child == endBlock) endBlock = null;
path.remove(child);
signals.remove(child);
if (child == train) train = null;
// if (child == train) train = null;
for (ActionList list : triggeredActions.values()) {
list.removeChild(child);
}
@@ -746,8 +748,9 @@ public class Route extends BaseClass {
public boolean reset() {
LOG.debug("{}.reset()",this);
setSignals(Signal.RED);
free();
train = null;
// train = null;
return true;
}
@@ -794,15 +797,15 @@ public class Route extends BaseClass {
// if (state == State.STARTED) return true;
LOG.debug("{}.start()",this);
if (isNull(newTrain)) return false; // can't set route's train to null
if (isSet(train)) {
/* if (isSet(train)) {
if (newTrain != train) return false; // can't alter route's train
} else train = newTrain.setRoute(this); // set new train
} else train = */newTrain.setRoute(this); // set new train
ActionList startActions = triggeredActions.get(ROUTE_START);
if (isSet(startActions)) {
Context context = new Context(train).route(this);
if (!startActions.fire(context,this+".start("+train.name()+")")) return false; // start actions failed
Context context = new Context(newTrain).route(this);
if (!startActions.fire(context,this+".start("+newTrain.name()+")")) return false; // start actions failed
}
// state = State.STARTED;
triggeredContacts.clear();
@@ -822,12 +825,12 @@ public class Route extends BaseClass {
@Override
public String toString() {
return getClass().getSimpleName()+"("+(isSet(train)?train+":":"")+name()+")";
return getClass().getSimpleName()+"("+name()+")";
}
public Train train() {
/* public Train train() {
return train;
}
}*/
private Fieldset turnouts() {
Fieldset win = new Fieldset(t("Turnouts"));

View File

@@ -138,10 +138,10 @@ public abstract class Action extends BaseClass {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Edit json"),button(t("export"), Map.of(ACTION, ACTION_SAVE)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public static Tag selector() {

View File

@@ -252,11 +252,11 @@ public class ActionList extends Action implements Iterable<Action>{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Fieldset fieldset = new Fieldset(t("Actions"));
list().addTo(fieldset);
postForm.add(fieldset);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -86,14 +86,14 @@ public class AddRemoveDestination extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag span = new Tag("span");
button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,Train.DESTINATION)).addTo(span);
button(t("Clear destinations"),Map.of(ACTION,ACTION_UPDATE,Train.DESTINATION,"0")).addTo(span);
formInputs.add(t("Destination")+": "+(isNull(destination) ? t("Clear destinations") : destination),span);
formInputs.add(t("Turn at destination"),new Checkbox(TURN, t("Turn"), turnAtDestination));
formInputs.add(t("Shunting"),new Checkbox(SHUNTING, t("Shunting"), shunting));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -51,13 +51,13 @@ public class AddRemoveTag extends Action{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Tag"),new Input(TAG, tag));
Tag div = new Tag("div");
new Radio(TYPE, ACTION_ADD, t("add"), !remove).addTo(div);
new Radio(TYPE, ACTION_DROP, t("delete"), remove).addTo(div);
formInputs.add(t("Action"),div);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -77,14 +77,14 @@ public class AlterDirection extends Action{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag radios = new Tag("div");
for (NEWDIR d : NEWDIR.values()) {
new Radio(NEW_DIRECTION, d, t("{}",d), newDir == d).addTo(radios);
}
formInputs.add(t("new direction"),radios);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@SuppressWarnings("incomplete-switch")

View File

@@ -70,9 +70,9 @@ public class ConditionalAction extends ActionList {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
preForm.add(conditions.list());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}

View File

@@ -56,10 +56,10 @@ public class CoupleTrain extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Couple"),new Checkbox(LAST, t("last parked train"), last));
formInputs.add(t("Swap order"),new Checkbox(SWAP, t("Swap order of trains"), swap));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -61,10 +61,10 @@ public class DelayedAction extends ActionList {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Minimum delay"),new Input(MIN_DELAY,min_delay).numeric().addTo(new Tag("span")).content(NBSP+"ms"));
formInputs.add(t("Maximum delay"),new Input(MAX_DELAY,max_delay).numeric().addTo(new Tag("span")).content(NBSP+"ms"));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public DelayedAction setMaxDelay(int max_delay) {

View File

@@ -55,9 +55,9 @@ public class DetermineTrainInBlock extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Block")+": "+(isNull(block) ? t("unset") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -64,13 +64,13 @@ public class DisableEnableBlock extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Block")+": "+(isNull(block) ? t("block from context") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,Block.class.getSimpleName())));
Tag radios = new Tag("p");
new Radio(STATE, "enable", t("enable"), !disable).addTo(radios);
new Radio(STATE, "disable", t("disable"), disable).addTo(radios);
formInputs.add(t("Action"),radios);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -57,10 +57,10 @@ public class EngageDecoupler extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Decoupler")+": "+(isNull(decoupler) ? t("unset") : decoupler),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,DECOUPLER)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -2,6 +2,7 @@ package de.srsoftware.web4rail.actions;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.moving.Train;
public class FinishRoute extends Action {
@@ -12,7 +13,9 @@ public class FinishRoute extends Action {
@Override
public boolean fire(Context context,Object cause) {
Route route = context.route();
if (isSet(route)) route.finish();
Train train = context.train();
if (isNull(train)) return false;
if (isSet(route)) route.finish(train);
return true;
}
}

View File

@@ -73,9 +73,9 @@ public class Loop extends ActionList {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Select object"),typeSelector());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public String toString() {

View File

@@ -71,13 +71,13 @@ public class SendCommand extends Action{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Command to send"),new Input(COMMAND, command));
Tag div = new Tag("div");
new Radio(TARGET, Target.SYSTEM, t("Operating System"), target == Target.SYSTEM).addTo(div);
new Radio(TARGET, Target.SRCP, t("SRCP daemon"), target == Target.SRCP).addTo(div);
formInputs.add(t("Send command to"),div);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -52,9 +52,9 @@ public class SetContextTrain extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Select train"),Train.selector(train, null));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -62,9 +62,9 @@ public class SetDisplayText extends TextAction{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Display")+": "+(isNull(display) ? t("unset") : display),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,DISPLAY)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -58,14 +58,14 @@ public class SetPower extends Action{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag div = new Tag("div");
new Radio(STATE, POWERCHANGE.ON, t("On"), pc == POWERCHANGE.ON).addTo(div);
new Radio(STATE, POWERCHANGE.OFF, t("Off"), pc == POWERCHANGE.OFF).addTo(div);
new Radio(STATE, POWERCHANGE.TOGGLE, t("Toggle"), pc == POWERCHANGE.TOGGLE).addTo(div);
formInputs.add(t("Set state to"),div);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -79,7 +79,7 @@ public class SetRelayOrSwitch extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag span = new Tag("span");
if (isSet(relayOrSwitch)) span.content(relayOrSwitch+NBSP);
button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,Relay.class.getSimpleName())).addTo(span);
@@ -96,7 +96,7 @@ public class SetRelayOrSwitch extends Action {
}
formInputs.add(t("Select state"),state);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -59,7 +59,7 @@ public class SetSignal extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Signal")+": "+(isNull(signal) ? t("unset") : signal),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,SIGNAL)));
Select state = new Select(Signal.STATE);
for (String st:Signal.knownStates) {
@@ -68,7 +68,7 @@ public class SetSignal extends Action {
}
formInputs.add(t("Select state"),state);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -47,9 +47,9 @@ public class SetSpeed extends Action{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Set speed to"),new Input(MAX_SPEED, speed).numeric().addTo(new Tag("span")).content(NBSP+speedUnit));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public int getSpeed() {

View File

@@ -66,7 +66,7 @@ public class SetTurnout extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Turnout")+": "+(isNull(turnout) ? t("unset") : turnout),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,TURNOUT)));
if (isSet(turnout)) {
@@ -79,7 +79,7 @@ public class SetTurnout extends Action {
formInputs.add(t("Select state"),select);
}
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -47,9 +47,9 @@ public class SplitTrain extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Split behind"),new Input(POSITION, position).numeric().addTo(new Tag("span")).content(t("&nbsp;cars")));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -41,13 +41,13 @@ public class StartStopAuto extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag radios = new Tag("div");
new Radio(INVERTED, "on", t("Start autopilot"), inverted).addTo(radios);
new Radio(INVERTED, "off", t("Stop autopilot"), !inverted).addTo(radios);
formInputs.add(t("Action"), radios);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -61,7 +61,7 @@ public class SwitchFunction extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Select selector = new Select(FUNCTION);
for (int i=1; i<5;i++) {
@@ -76,7 +76,7 @@ public class SwitchFunction extends Action {
new Radio(EFFECT, OFF, t("Off"), effect == OFF).addTo(radioGroup);
formInputs.add(t("Effect"),radioGroup);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -46,9 +46,9 @@ public abstract class TextAction extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Text"),new Input(TEXT, text));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -41,9 +41,9 @@ public class TriggerContact extends Action {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Select contact")+": "+(isNull(contact) ? t("unset") : contact),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,CONTACT)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -99,7 +99,7 @@ public class WaitForContact extends ActionList {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Contact")+": "+(isNull(contact) ? t("unset") : contact),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,CONTACT)));
formInputs.add(t("Timeout"),new Input(TIMEOUT,timeout).numeric().addTo(new Tag("span")).content(NBSP+"ms"));
@@ -108,7 +108,7 @@ public class WaitForContact extends ActionList {
timeoutActions.list().addTo(fieldset);
postForm.add(fieldset);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -51,9 +51,9 @@ public class BlockFree extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Block")+": "+(isNull(block) ? t("unset") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -38,10 +38,10 @@ public class CarInTrain extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Select car"),Car.selector(car, null));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -59,7 +59,7 @@ public class CarOrientation extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Select car"),Car.selector(isSet(car) ? car : t("Car of train"), null));
formInputs.add(t("If car of train: inspect car number"),new Input(POSITION, position).numeric().addTo(new Tag("span")).content(NBSP+"("+t("Use negative number to count from end.")+")"));
@@ -67,7 +67,7 @@ public class CarOrientation extends Condition {
new Radio(ORIENTATION, "f", t("forward"), orientation).addTo(radioGroup);
new Radio(ORIENTATION, "r", t("revers"), !orientation).addTo(radioGroup);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -142,9 +142,9 @@ public abstract class Condition extends BaseClass {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
inversionOption(formInputs);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public static Select selector() {

View File

@@ -114,10 +114,10 @@ public class ConditionList extends Condition implements Iterable<Condition>{
}
@Override
public Window properties() {
public Window properties(String...errors) {
BaseClass parent = parent();
if (isSet(parent)) return parent.properties();
return super.properties();
if (isSet(parent)) return parent.properties(errors);
return super.properties(errors);
}
@Override

View File

@@ -57,9 +57,9 @@ public class RouteEndBlock extends Condition{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Block")+": "+(isNull(block) ? t("unset") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -61,10 +61,10 @@ public class SwitchIsOn extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Select switch")+": "+(isNull(swtch) ? t("unset") : swtch),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,SWITCH)));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -46,9 +46,9 @@ public class TrainHasTag extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Tag"),new Input(TAG, tag == null ? "" : tag));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -34,9 +34,9 @@ public class TrainLength extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Maximum train length"),new Input(LENGTH, treshold).numeric().addTo(new Tag("span")).content(lengthUnit));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -34,9 +34,9 @@ public class TrainSelect extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Select train")+":",Train.selector(train, null));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -33,9 +33,9 @@ public class TrainSpeed extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Train speed"),new Input(SPEED, treshold).numeric().addTo(new Tag("span")).content(speedUnit));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -48,10 +48,10 @@ public class TrainWasInBlock extends Condition {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Block")+": "+(isNull(block) ? t("block from context") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
formInputs.add(t("Seek in last"), new Input(COUNT, count).numeric().addTo(new Tag("span")).content(NBSP+t("blocks of train")));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -243,7 +243,7 @@ public class Car extends BaseClass implements Comparable<Car>{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Name"),new Input(NAME,name));
formInputs.add(t("Stock ID"),new Input(STOCK_ID,stockId));
formInputs.add(t("Length"),new Input(LENGTH,length).attr("type", "number").addTo(new Tag("span")).content(NBSP+lengthUnit));
@@ -255,7 +255,7 @@ public class Car extends BaseClass implements Comparable<Car>{
if (train != null) formInputs.add(t("Train"), train.link());
formInputs.add(t("Current orientation"),new Tag("span").content(orientation ? t("forward") : t("reverse")));
return super.properties(preForm,formInputs,postForm);
return super.properties(preForm,formInputs,postForm,errors);
}
@Override

View File

@@ -142,7 +142,7 @@ public class Locomotive extends Car implements Constants,Device{
par.addTo(fieldset);
Tag direction = new Tag("p");
if ((isSet(train) && (train.speed > 0 || isSet(train.route()))) || (isSet(loco) && loco.speed > 0)) {
if ((isSet(train) && train.isStoppable()) || (isSet(loco) && loco.speed > 0)) {
params.put(ACTION, ACTION_STOP);
new Button(t("Stop"),params).clazz(ACTION_STOP).addTo(direction);
}
@@ -338,7 +338,7 @@ public class Locomotive extends Car implements Constants,Device{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
preForm.add(cockpit(this));
Tag div = new Tag("div");
for (Protocol proto : Protocol.values()) {
@@ -347,7 +347,7 @@ public class Locomotive extends Car implements Constants,Device{
formInputs.add(t("Protocol"),div);
formInputs.add(t("Address"),new Input(ADDRESS, address).numeric());
postForm.add(programming());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
private void queue() {

View File

@@ -48,15 +48,6 @@ import de.srsoftware.web4rail.tiles.Tile.Status;
* @author Stephan Richter, SRSoftware 2020-2021 *
*/
public class Train extends BaseClass implements Comparable<Train> {
public interface Listener {
enum Signal {
STOP
}
public void on(Signal signal);
}
private static final Logger LOG = LoggerFactory.getLogger(Train.class);
private static final String CAR_ID = "carId";
@@ -101,10 +92,10 @@ public class Train extends BaseClass implements Comparable<Train> {
private static final String SHUNTING = "shunting";
private boolean shunting = false;
private HashSet<Listener> listeners = new HashSet<Train.Listener>();
private BrakeProcessor brakeProcessor;
private PathFinder pathFinder;
public static Object action(HashMap<String, String> params, Plan plan) throws IOException {
String action = params.get(ACTION);
if (isNull(action)) return t("No action passed to Train.action!");
@@ -150,8 +141,8 @@ public class Train extends BaseClass implements Comparable<Train> {
case ACTION_SLOWER10:
return train.slower(10);
case ACTION_START:
train.start();
return train.properties();
String error = train.start();
return train.properties(error);
case ACTION_STOP:
return train.stopNow();
case ACTION_TIMES:
@@ -186,10 +177,6 @@ public class Train extends BaseClass implements Comparable<Train> {
return properties();
}
public void addListener(Listener listener) {
listeners.add(listener);
}
public boolean automatic() {
return false;
}
@@ -323,7 +310,7 @@ public class Train extends BaseClass implements Comparable<Train> {
public void contact(Contact contact) {
if (isSet(route)) {
Route lastRoute = route; // route field might be set to null during route.contact(...)!
route.contact(contact);
route.contact(new Context(contact).train(this));
traceFrom(contact,lastRoute);
}
}
@@ -625,7 +612,7 @@ public class Train extends BaseClass implements Comparable<Train> {
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag propList = new Tag("ul").clazz("proplist");
if (isSet(currentBlock)) currentBlock.button(currentBlock.toString()).addTo(new Tag("li").content(t("Current location")+COL)).addTo(propList);
@@ -675,7 +662,7 @@ public class Train extends BaseClass implements Comparable<Train> {
postForm.add(blockHistory());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public Object quitAutopilot() {
@@ -878,34 +865,37 @@ public class Train extends BaseClass implements Comparable<Train> {
}
public void start() {
new PathFinder(this,currentBlock,direction) {
public String start() {
if (isSet(pathFinder)) return t("Pathfinder already active for {}!",this);
pathFinder = new PathFinder(this,currentBlock,direction) {
@Override
public void aborted() {
LOG.debug("Aborted");
plan.stream(t("Aborting route allocation..."));
LOG.debug("{} aborted",this);
}
@Override
public void found(Route newRoute) {
// TODO Auto-generated method stub
LOG.debug("Found route {} for {}",newRoute,Train.this);
}
@Override
public void locked(Route newRoute) {
// TODO Auto-generated method stub
LOG.debug("Locked route {} for {}",newRoute,Train.this);
}
@Override
public void prepared(Route newRoute) {
LOG.debug("Prepared route {} for {}",newRoute,Train.this);
newRoute.start(Train.this);
route = newRoute;
pathFinder = null;
route.start(Train.this);
}
}.start();
return null;
}
public static void startAll() {
@@ -930,9 +920,12 @@ public class Train extends BaseClass implements Comparable<Train> {
brakeProcessor = new BrakeProcessor(this).start();
}
public Object stopNow() {
public Window stopNow() {
setSpeed(0);
listeners.forEach(listener -> listener.on(Listener.Signal.STOP)); // abort PathFinder
if (isSet(pathFinder)) {
pathFinder.abort();
pathFinder = null;
}
if (isSet(route)) {
route.reset();
route = null;
@@ -986,8 +979,7 @@ public class Train extends BaseClass implements Comparable<Train> {
newTrace.add(tile);
remainingLength -= tile.length();
} else if (Route.freeBehindTrain) {
// TODO
tile.free();
} else break;
}
}
@@ -1031,4 +1023,11 @@ public class Train extends BaseClass implements Comparable<Train> {
public boolean usesAutopilot() {
return false; // TODO
}
public boolean isStoppable() {
if (speed > 0) return true;
if (isSet(pathFinder)) return true;
if (isSet(route)) return true;
return false;
}
}

View File

@@ -39,10 +39,12 @@ public class BrakeProcessor extends BaseClass implements Runnable {
int step = brakeTime;
for (int i = 0; i < 15; i++) {
long calculatedDistance = calculate(brakeTime, startSpeed);
step /= 2;
if (step < 1) step = 1;
if (measuredDistance > calculatedDistance) brakeTime += step;
if (measuredDistance < calculatedDistance) brakeTime -= step;
if (measuredDistance > calculatedDistance) brakeTime += brakeTime/2;
if (measuredDistance < calculatedDistance) {
step /= 2;
if (step < 1) step = 1;
brakeTime -= step;
}
LOG.debug("new brake time: {}, calculated distance: {}", brakeTime, calculatedDistance);
}
route.brakeTime(train.brakeId(), brakeTime);

View File

@@ -18,7 +18,7 @@ import de.srsoftware.web4rail.tiles.Block;
/**
* @author Stephan Richter, SRSoftware 2020-2021
*/
public abstract class PathFinder extends BaseClass implements Runnable, Train.Listener{
public abstract class PathFinder extends BaseClass implements Runnable{
public static final Logger LOG = LoggerFactory.getLogger(PathFinder.class);
// private Context context;
private boolean aborted = false;
@@ -152,12 +152,19 @@ public abstract class PathFinder extends BaseClass implements Runnable, Train.Li
if (aborted) return;
Route route = chooseRoute();
if (isSet(route)) {
found(route);
if (aborted) return;
found(route);
if (route.allocateFor(train)) {
if (aborted) {
route.reset();
return;
}
locked(route);
if (aborted) return;
if (route.prepareFor(train)) {
if (aborted) {
route.reset();
return;
}
prepared(route);
return;
}
@@ -172,19 +179,10 @@ public abstract class PathFinder extends BaseClass implements Runnable, Train.Li
public abstract void found(Route r);
public abstract void prepared(Route r);
@Override
public void on(Signal signal) {
switch (signal) {
case STOP:
abort();
break;
}
}
public void start() {
train.addListener(this);
public PathFinder start() {
Thread thread = new Thread(this);
thread.setName("Pathfinder("+train+")");
thread.start();
return this;
}
}

View File

@@ -325,14 +325,14 @@ public abstract class Block extends StretchableTile{
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Name"),new Input(NAME, name));
formInputs.add("",new Checkbox(ALLOW_TURN,t("Turn allowed"),turnAllowed));
formInputs.add(t("Train"),Train.selector(train, null));
postForm.add(contactForm());
postForm.add(waitTimeForm());
if (!parkedTrains.isEmpty()) postForm.add(parkedTrainList());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public Tile raise(String tag) {

View File

@@ -75,12 +75,12 @@ public abstract class Bridge extends Tile {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Fieldset fieldset = new Fieldset(t("Counterpart"));
new Tag("p").content(isSet(counterpart) ? t("Connected to {}.",counterpart) : t("Not connected to other bridge part!")).addTo(fieldset);
button(t("Select counterpart"),Map.of(ACTION,ACTION_CONNECT)).addTo(fieldset);
preForm.add(fieldset);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public Window propMenu() {

View File

@@ -190,7 +190,7 @@ public class Contact extends Tile{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag span = new Tag("span");
new Input(ADDRESS, addr).numeric().addTo(span).content(NBSP);
button(t("learn"),Map.of(ACTION,ACTION_ANALYZE)).addTo(span);
@@ -199,7 +199,7 @@ public class Contact extends Tile{
Fieldset fieldset = new Fieldset(t("Actions")).id("props-actions");
actions.list().addTo(fieldset);
postForm.add(fieldset);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -111,7 +111,7 @@ public abstract class Decoupler extends Tile implements Device{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag div = new Tag("div");
for (Protocol proto : Protocol.values()) {
new Radio(PROTOCOL, proto.toString(), t(proto.toString()), proto == protocol).addTo(div);
@@ -120,7 +120,7 @@ public abstract class Decoupler extends Tile implements Device{
formInputs.add(t("Address"),new Input(ADDRESS, address).numeric());
formInputs.add(t("Port"),new Input(PORT, port).numeric());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
private char proto() {

View File

@@ -124,7 +124,7 @@ public class Relay extends Tile implements Device{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Name"),new Input(NAME,name));
Tag div = new Tag("div");
for (Protocol proto : Protocol.values()) {
@@ -136,7 +136,7 @@ public class Relay extends Tile implements Device{
formInputs.add(t("Label for state {}","B"),new Input(LABEL_B, stateLabelB));
formInputs.add(t("Port for state {}",stateLabelA),new Input(PORT_A, portA).numeric());
formInputs.add(t("Port for state {}",stateLabelB),new Input(PORT_B, portB).numeric());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
private char proto() {

View File

@@ -127,7 +127,7 @@ public abstract class Signal extends Tile {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Fieldset aspectEditor = new Fieldset(t("Aspects")).id("props-aspects");
Form form = new Form("aspect-form");
new Input(REALM,REALM_PLAN).hideIn(form);
@@ -158,7 +158,7 @@ public abstract class Signal extends Tile {
form.addTo(aspectEditor);
postForm.add(aspectEditor);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public boolean state(String aspect) {

View File

@@ -56,9 +56,9 @@ public abstract class StretchableTile extends TileWithShadow {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(stretchType(),new Input(STRETCH_LENGTH, stretch).numeric().addTo(new Tag("span")).content(NBSP+t("Tile(s)")));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -126,7 +126,7 @@ public class Switch extends Tile{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Fieldset fieldset = new Fieldset(t("Actions (On)"));
fieldset.id("actionsOn");
actionsOn.list().addTo(fieldset);
@@ -135,7 +135,7 @@ public class Switch extends Tile{
fieldset.id("actionsOff");
actionsOff.list().addTo(fieldset);
postForm.add(fieldset);
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -33,9 +33,9 @@ public class TextDisplay extends StretchableTile {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Text"),new Input(TEXT, text));
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
public static Select selector(TextDisplay preselected,Collection<TextDisplay> exclude) {

View File

@@ -260,7 +260,7 @@ public abstract class Tile extends BaseClass implements Comparable<Tile>{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Fieldset fieldset = null;
if (isSet(train)) {
@@ -332,7 +332,7 @@ public abstract class Tile extends BaseClass implements Comparable<Tile>{
}
}
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
private static String replace(String line, Entry<String, Object> replacement) {

View File

@@ -116,14 +116,14 @@ public abstract class Turnout extends Tile implements Device{
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
Tag div = new Tag("div");
for (Protocol proto : Protocol.values()) {
new Radio(PROTOCOL, proto.toString(), t(proto.toString()), proto == protocol).addTo(div);
}
formInputs.add(t("Protocol"),div);
formInputs.add(t("Address"),new Input(ADDRESS, address).numeric());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
private char proto() {

View File

@@ -36,10 +36,10 @@ public abstract class TurnoutL extends Turnout {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Straight port")+COL,new Input(STRAIGHT, portA).numeric());
formInputs.add(t("Left port")+COL,new Input(LEFT, portB).numeric());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override

View File

@@ -37,10 +37,10 @@ public abstract class TurnoutR extends Turnout {
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
formInputs.add(t("Straight port")+COL,new Input(STRAIGHT, portA).numeric());
formInputs.add(t("Right port")+COL,new Input(RIGHT, portB).numeric());
return super.properties(preForm, formInputs, postForm);
return super.properties(preForm, formInputs, postForm,errors);
}
@Override