diff --git a/pom.xml b/pom.xml
index 98d428a..44c5cfb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.4.31
+ 1.4.32
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/css/style.css b/resources/css/style.css
index 0791ec3..b8fdcea 100644
--- a/resources/css/style.css
+++ b/resources/css/style.css
@@ -538,3 +538,8 @@ input[type=range]:focus::-ms-fill-lower {
input[type=range]:focus::-ms-fill-upper {
background: #3071A9;
}
+
+.highlight{
+ margin: -6px;
+ border: 6px solid purple;
+}
\ No newline at end of file
diff --git a/resources/js/plan.js b/resources/js/plan.js
index 725a484..f5f2e6f 100644
--- a/resources/js/plan.js
+++ b/resources/js/plan.js
@@ -197,6 +197,14 @@ function heartbeat(data){
return false;
}
+function highlight(id,enable = true){
+ if (enable) {
+ $('#'+id).addClass('highlight');
+ } else {
+ $('#'+id).removeClass('highlight');
+ }
+}
+
function keypress(ev){
if (ev.code === 'Escape') return request({realm:"cu",action:"emergency"});
if (ev.code === 'Enter') {
diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation
index e5e5289..be099de 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -445,7 +445,7 @@ value : Wert
WaitForContact : Auf Kontakt warten
Wait for {}, then : auf {} warten, dann
Wait {} ms, then : {} ms warten, dann
-{} waiting {} secs... : {} wartet {} Sekunden...
+{} waiting {} secs. : {} wartet {} Sekunden.
Wait times : Wartezeiten
Was not able to assign {} to {}! : Konnte {} nicht an {} zuweisen!
Was not able to lock {} : Konnte {} nicht reservieren
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index 966404f..f8d97a7 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -403,18 +403,29 @@ public abstract class BaseClass implements Constants{
}
public Tag link(String tagClass,Object caption) {
- return link(tagClass,caption,null);
+ String highlightId = (caption instanceof BaseClass) ? ((BaseClass)caption).id().toString() : null;
+ return link(tagClass,caption,highlightId);
}
- public Tag link(String tagClass,Object caption,Map additionalProps) {
+ public Tag link(String tagClass,Object caption, String highlightId) {
+ return link(tagClass,caption,null,highlightId);
+ }
+
+
+ public Tag link(String tagClass,Object caption,Map additionalProps,String highlightId) {
Tag link = link(tagClass,caption.toString(),props(additionalProps));
+ if (isSet(highlightId)) link.attr("onmouseover", "highlight('"+highlightId+"',true);").attr("onmouseout", "highlight('"+highlightId+"',false);");
+
if (isSet(notes) && !notes.isEmpty()) link.title(notes);
return link;
}
public static Tag link(String tagClass,String caption,Map props) {
String json = new JSONObject(props).toString().replace("\"", "'");
- return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(caption.toString());
+ return new Tag(tagClass)
+ .clazz("link")
+ .attr("onclick","request("+json+");")
+ .content(caption.toString());
}
@SuppressWarnings("unchecked")
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index 2654549..f190c66 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -330,7 +330,7 @@ public class Route extends BaseClass {
if (isNull(actions)) return context;
actions.fire(context,"Route.Contact("+contact.addr()+")");
Context previousContext = context;
- if (context.invalidated()) context = null; // route has been freed in between.
+ if (isSet(context) && context.invalidated()) context = null; // route has been freed in between.
return previousContext;
}
@@ -358,12 +358,12 @@ public class Route extends BaseClass {
}
startActions.listAt(start).addTo(list);
- for (Contact c : contacts) {
- Tag item = c.link("span", c).addTo(new Tag("li")).content(NBSP);
- ActionList actions = triggeredActions.get(c.trigger());
+ for (Contact contact : contacts) {
+ Tag item = contact.link("span", contact).addTo(new Tag("li")).content(NBSP);
+ ActionList actions = triggeredActions.get(contact.trigger());
if (isNull(actions)) {
actions = new ActionList(this);
- triggeredActions.put(c.trigger(), actions);
+ triggeredActions.put(contact.trigger(), actions);
}
actions.listAt(item).addTo(list);
}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java
index 6cac058..e0d1caf 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/Action.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java
@@ -98,6 +98,10 @@ public abstract class Action extends BaseClass {
public static Action get(Id actionId) {
return actions.get(actionId);
}
+
+ protected String highlightId() {
+ return null;
+ }
public JSONObject json() {
return new JSONObject().put(TYPE, getClass().getSimpleName());
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
index 1b25f00..bc05e2e 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
@@ -129,7 +129,7 @@ public class ActionList extends Action implements Iterable{
if (!isEmpty()) {
Tag list = new Tag("ol");
for (Action action : actions) {
- Tag item = action.link("span",action).addTo(new Tag("li")).content(NBSP);
+ Tag item = action.link("span",action, action.highlightId()).addTo(new Tag("li")).content(NBSP);
action.button("↑", Map.of(ACTION,ACTION_MOVE)).title(t("move up")).addTo(item);
action.button("-", Map.of(ACTION,ACTION_DROP)).title(t("delete")).addTo(item);
if (action instanceof ActionList) ((ActionList) action).listAt(item);
diff --git a/src/main/java/de/srsoftware/web4rail/actions/AddRemoveDestination.java b/src/main/java/de/srsoftware/web4rail/actions/AddRemoveDestination.java
index 1fead2e..a4d4dea 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/AddRemoveDestination.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/AddRemoveDestination.java
@@ -56,6 +56,12 @@ public class AddRemoveDestination extends Action {
return true;
}
+ @Override
+ protected String highlightId() {
+ return isSet(destination) ? destination.id().toString() : null;
+ }
+
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
index 0739d5e..03a7773 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
@@ -34,6 +34,11 @@ public class DetermineTrainInBlock extends Action {
return (isSet(train));
}
+ @Override
+ protected String highlightId() {
+ return isSet(block) ? block.id().toString() : null;
+ }
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/actions/DisableEnableBlock.java b/src/main/java/de/srsoftware/web4rail/actions/DisableEnableBlock.java
index e022403..28f6c65 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/DisableEnableBlock.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/DisableEnableBlock.java
@@ -41,6 +41,12 @@ public class DisableEnableBlock extends Action {
return json;
}
+ @Override
+ protected String highlightId() {
+ return isSet(block) ? block.id().toString() : null;
+ }
+
+
@Override
public Action load(JSONObject json) {
if (json.has(STATE)) disable = !json.getBoolean(STATE);
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
index 8353483..b6cea5c 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
@@ -29,6 +29,12 @@ public class SetDisplayText extends TextAction{
return true;
}
+ @Override
+ protected String highlightId() {
+ return isSet(display) ? display.id().toString() : null;
+ }
+
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java b/src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java
index 8dd21ba..e4085be 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java
@@ -35,6 +35,12 @@ public class SetRelayOrSwitch extends Action {
return true;
}
+ @Override
+ protected String highlightId() {
+ return isSet(relayOrSwitch) ? relayOrSwitch.id().toString() : null;
+ }
+
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java b/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
index e776bed..d588d13 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
@@ -40,6 +40,11 @@ public class SetSignal extends Action {
return signal.state(state);
}
+ @Override
+ protected String highlightId() {
+ return isSet(signal) ? signal.id().toString() : null;
+ }
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java b/src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java
index e72e6af..5de9447 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java
@@ -34,6 +34,11 @@ public class SetTurnout extends Action {
return true;
}
+ @Override
+ protected String highlightId() {
+ return isSet(turnout) ? turnout.id().toString() : null;
+ }
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
index d825322..facaaa4 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
@@ -25,6 +25,12 @@ public class TriggerContact extends Action {
return false;
}
+ @Override
+ protected String highlightId() {
+ return isSet(contact) ? contact.id().toString() : null;
+ }
+
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/actions/WaitForContact.java b/src/main/java/de/srsoftware/web4rail/actions/WaitForContact.java
index e3a48ae..5c6efb1 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/WaitForContact.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/WaitForContact.java
@@ -57,6 +57,12 @@ public class WaitForContact extends ActionList {
return true;
}
+ @Override
+ protected String highlightId() {
+ return isSet(contact) ? contact.id().toString() : null;
+ }
+
+
@Override
public JSONObject json() {
JSONObject json = super.json();
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
index 14402a0..7fe9db4 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/ConditionList.java
@@ -79,7 +79,7 @@ public class ConditionList extends Condition implements Iterable{
Tag list = new Tag("ul");
for (Condition condition : conditions) {
Tag item = new Tag("li");
- condition.link("span", condition).addTo(item);
+ condition.link("span", condition, null).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);
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java
index e2caffc..518934d 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Car.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java
@@ -274,7 +274,7 @@ public class Car extends BaseClass implements Comparable{
car.link(),
maxSpeed+speedUnit,
car.length+NBSP+lengthUnit,
- isSet(car.train) ? car.train.link("span", car.train) : "",
+ isSet(car.train) ? car.train.link("span", car.train, null) : "",
String.join(", ", car.tags()),
car.distanceCounter,
actions
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java
index 2df1fad..4177807 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java
@@ -435,7 +435,7 @@ public class Locomotive extends Car implements Constants,Device{
if (speed < 0) speed = 0;
queue();
- plan.stream(t("Speed of {} set to {} {}.",this,speed,BaseClass.speedUnit));
+ //plan.stream(t("Speed of {} set to {} {}.",this,speed,BaseClass.speedUnit));
return properties();
}
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java
index 50b2bcf..7192383 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Train.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java
@@ -770,7 +770,7 @@ public class Train extends BaseClass implements Comparable {
Tag dest = new Tag("li").content(t("Destination")+COL);
if (isSet(destination)) {
- link("span",destination,Map.of(REALM,REALM_PLAN,ID,destination.id().toString(),ACTION,ACTION_CLICK)).addTo(dest);
+ link("span",destination,Map.of(REALM,REALM_PLAN,ID,destination.id().toString(),ACTION,ACTION_CLICK),null).addTo(dest);
new Button(t("Drop"),Map.of(REALM,REALM_TRAIN,ID,id,ACTION,ACTION_MOVE,DESTINATION,"")).addTo(dest);
}
button(t("Select from plan"),Map.of(ACTION,ACTION_MOVE,ASSIGN,DESTINATION)).addTo(dest);
@@ -812,7 +812,10 @@ public class Train extends BaseClass implements Comparable {
}
public String quitAutopilot() {
- if (isSet(routePrepper)) routePrepper.stop();
+ if (isSet(routePrepper)) {
+ routePrepper.stop();
+ routePrepper = null;
+ }
if (autopilot) {
autopilot = false;
if (isSet(currentBlock)) plan.place(currentBlock);
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
index 81f87e5..0036739 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
@@ -227,7 +227,7 @@ public abstract class Block extends StretchableTile{
if (!internalContacts.isEmpty()) {
Tag ul = new Tag("ul");
for (BlockContact contact : internalContacts) {
- Tag li = contact.link("span", contact).content(NBSP).addTo(new Tag("li"));
+ Tag li = contact.link("span", contact, contact.id().toString()).content(NBSP).addTo(new Tag("li"));
contact.button(t("learn"),Map.of(ACTION,ACTION_ANALYZE)).addTo(li);
contact.button(t("delete"),Map.of(ACTION,ACTION_DROP)).addTo(li);
li.addTo(ul);
@@ -490,7 +490,7 @@ public abstract class Block extends StretchableTile{
Fieldset fieldset = new Fieldset(t("Trains"));
Tag list = new Tag("ul");
for (Train t : parkedTrains) {
- if (isSet(t)) t.link("li", t).addTo(list);
+ if (isSet(t)) t.link("li", t, null).addTo(list);
}
list.addTo(fieldset);
return fieldset;
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
index 803ba5d..62b080e 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
@@ -139,7 +139,7 @@ public abstract class Signal extends Tile {
for (String aspect : knownStates) {
HashSet commands = aspects.get(aspect);
if (isSet(commands)) {
- Tag link = this.link("span", (Object)aspect, Map.of(ACTION,ACTION_POWER,STATE,aspect));
+ Tag link = this.link("span", (Object)aspect, Map.of(ACTION,ACTION_POWER,STATE,aspect),null);
for (int[] command : aspects.get(aspect)) {
Button delete = this.button(t("delete"), Map.of(ACTION,ACTION_UPDATE,ACTION_DROP+"-"+aspect,command[0]+"-"+command[1]+"-"+command[2]));
table.addRow(link,command[0],command[1],command[2],command[3]==1?"✓":"",delete);
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
index 1a7a88e..8cd8c9a 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
@@ -199,7 +199,7 @@ public abstract class Tile extends BaseClass implements Comparable {
public Tag link(String... args) {
String tx = args.length < 1 ? id() + NBSP : args[0];
String type = args.length < 2 ? "span" : args[1];
- return super.link(type, (Object) tx, Map.of(ACTION, ACTION_CLICK));
+ return super.link(type, (Object) tx, Map.of(ACTION, ACTION_CLICK),this.id().toString());
}
public static void load(Object object, Plan plan) {