From b23be0fcdcb7d4bff85494cc63aedad9a64a5bc6 Mon Sep 17 00:00:00 2001
From: Stephan Richter <s.richter@srsoftware.de>
Date: Sun, 14 Nov 2021 00:07:25 +0100
Subject: [PATCH] usability improvements

---
 pom.xml                                       |  2 +-
 .../translations/Application.de.translation   |  2 ++
 .../de/srsoftware/web4rail/BaseClass.java     |  1 +
 .../web4rail/actions/ActionList.java          |  2 +-
 .../actions/DetermineTrainInBlock.java        |  3 ++-
 .../web4rail/conditions/TrainWasInBlock.java  | 22 ++++++++++++++-----
 6 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/pom.xml b/pom.xml
index 887d090..567d640 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.srsoftware</groupId>
 	<artifactId>web4rail</artifactId>
-	<version>1.5.32</version>
+	<version>1.5.33</version>
 	<name>Web4Rail</name>
 	<packaging>jar</packaging>
 	<description>Java Model Railway Control</description>
diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation
index a57d7e7..bd8c8be 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -463,8 +463,10 @@ train has tag "{}" : Zug hat Markierung „{}“
 TrainHasTag : Zug hat Markierung
 train is a push-pull train : Zug ist ein Wendezug
 train is faster than {} {} : Zug ist schneller als {} {}
+Train is in "{}" :  Zug ist in „{}“
 train is longer than {} {} : Zug ist länger als {} {}
 train is not a push-pull train : Zug ist kein Wendezug
+Train is not in "{}" :  Zug ist nicht in „{}“
 train is not shunting : Zug rangiert nicht
 train is shorter than {} {} : Zug ist kürzer als {} {}
 TrainIsShunting : Rangierfahrt
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index 6a7ad01..00bd60a 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -377,6 +377,7 @@ public abstract class BaseClass implements Constants{
 	
 	@SuppressWarnings("unchecked")
 	public static <T extends BaseClass> T get(Id id) {
+		if (isNull(id)) return null;
 		return (T) registry.get(id);
 	}
 	
diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
index 5bbcd49..bdf72ca 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java
@@ -54,7 +54,7 @@ public class ActionList extends Action implements Iterable<Action>{
 		Action action = Action.create(type,this);
 		if (action instanceof Action) {
 			add(action);
-			return context().properties();
+			return action.properties();
 		} 
 		return new Tag("span").content(t("Unknown action type: {}",type)).addTo(actionTypeForm());
 	}
diff --git a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
index 810a111..a6a5f70 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
@@ -83,13 +83,14 @@ public class DetermineTrainInBlock extends Action {
 	@Override
 	protected Object update(Params params) {
 		LOG.debug("update: {}",params);
+		parked = ("on".equals(params.get(PARKED_TRAIN)));
 		if (params.containsKey(BLOCK)) {
 			Tile tile = plan.get(new Id(params.getString(BLOCK)), true);
 			if (tile instanceof Block) {
 				block = (Block) tile;
+				return properties();
 			} else return t("Clicked tile is not a {}!",t("block"));
 		}
-		parked = ("on".equals(params.get(PARKED_TRAIN)));
 		return context().properties();
 	}
 }
diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java
index f553b72..5fac21f 100644
--- a/src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java
+++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java
@@ -7,6 +7,7 @@ import org.json.JSONObject;
 
 import de.srsoftware.tools.Tag;
 import de.srsoftware.web4rail.BaseClass;
+import de.srsoftware.web4rail.LoadCallback;
 import de.srsoftware.web4rail.Params;
 import de.srsoftware.web4rail.moving.Train;
 import de.srsoftware.web4rail.tags.Fieldset;
@@ -31,7 +32,8 @@ public class TrainWasInBlock extends Condition {
 	@Override
 	public boolean fulfilledBy(Context context) {
 		Train train = context.train();
-		if (isNull(train)) return false;		
+		if (isNull(train)) return false;
+		if (count == 0) return (train.currentBlock() == block) != inverted;
 		return train.lastBlocks(count).contains(block) != inverted;
 	}
 	
@@ -42,8 +44,14 @@ public class TrainWasInBlock extends Condition {
 	
 	public Condition load(JSONObject json) {
 		super.load(json);
-		if (json.has(BLOCK)) block(Block.get(new Id(json.getString(BLOCK))));
 		if (json.has(COUNT)) count = json.getInt(COUNT);
+		new LoadCallback() {
+			
+			@Override
+			public void afterLoad() {
+				if (json.has(BLOCK)) block(Block.get(Id.from(json, BLOCK)));	
+			}
+		};
 		return this;
 	}
 
@@ -63,18 +71,22 @@ public class TrainWasInBlock extends Condition {
 	@Override
 	public String toString() {
 		if (block == null) return "["+t("Click here to select block!")+"]";
+		if (count == 0) return t(inverted ? "Train is not in \"{}\"" : "Train is in \"{}\"", block);
 		return t(inverted ? "{} not within last {} blocks of train":"{} within last {} blocks of train",block,count);
 	}
 
 
 	@Override
 	protected Object update(Params params) {
-		if (!params.containsKey(BLOCK)) return t("No block id passed to TrainWasInBlock.update()!");
-		Id bid = new Id(params.getString(BLOCK));
+		Id bid = Id.from(params, BLOCK);
 		Tile tile = BaseClass.get(bid);
 		if (tile instanceof Shadow) tile = ((Shadow)tile).overlay();
-		if (tile instanceof Block) block = (Block) tile;
 		if (params.containsKey(COUNT)) count=params.getInt(COUNT);
+		if (tile instanceof Block) {
+			block = (Block) tile;
+			super.update(params);
+			return properties();
+		}
 		return super.update(params);
 	}
 }