From 06a80a2a8d99a4b09b89976bc996ad4052a2f88c Mon Sep 17 00:00:00 2001
From: Stephan Richter <github@keawe.de>
Date: Fri, 6 Nov 2020 09:50:00 +0100
Subject: [PATCH] added new action TriggerContact

---
 pom.xml                                       |  2 +-
 .../translations/Application.de.translation   |  6 ++
 .../srsoftware/web4rail/actions/Action.java   |  2 +-
 .../srsoftware/web4rail/actions/SetRelay.java | 12 ++--
 .../web4rail/actions/TriggerContact.java      | 72 +++++++++++++++++++
 .../de/srsoftware/web4rail/tiles/Contact.java | 25 ++++++-
 6 files changed, 110 insertions(+), 9 deletions(-)
 create mode 100644 src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java

diff --git a/pom.xml b/pom.xml
index fc2ca75..dac6610 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.srsoftware</groupId>
 	<artifactId>web4rail</artifactId>
-	<version>0.10.5</version>
+	<version>0.10.6</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 21d510f..bd465c9 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -20,6 +20,8 @@ Condition type\: : Bedingungs-Typ:
 Control unit : Zentrale
 Current location\: : Aktueller Ort:
 Actions and contacts : Aktionen und Kontakte
+click here to setup contact : Hier klicken, um Kontakt auszuwählen
+click here to setup relay : Hier klicken, um Relay einzurichten
 Create action : Aktion erzeugen
 DelayedAction : verzögerte Aktion
 delete : entfernen
@@ -71,9 +73,12 @@ Routes using this tile\: : Fahrstraßen, die diesen Abschnitt verwenden:
 Route will only be available to trains fulfilling all conditions. : Route ist nur für Züge verfügbar, die alle Bedingungen erfüllen.
 save : speichern
 Save plan : Plan speichern
+Select contact\: : Kotakt auswählen:
+Select relay\: : Relais auswählen:
 SetRelay : Relais schalten
 SetSignalsToStop : Signale auf Halt stellen
 SetSpeed : Geschwindigkeit ändern
+Set speed to : Geschwindigkeit setzen
 Setup actions : Aktivierungs-Aktionen
 Signals : Signale
 SOUTH : Süden
@@ -95,6 +100,7 @@ Trains\: : Züge:
 TrainHasTag : Zug mit Tag
 TrainLength : Zuglänge
 TrainSelect : Zug-Auswahl
+TriggerContact : Kontakt auslösen
 Turn allowed : Wenden erlaubt
 Turnouts : Weichen
 TurnTrain : Fahrtrichtung umkehren
diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java
index 302cc18..7eb61b6 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/Action.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java
@@ -3,7 +3,6 @@ package de.srsoftware.web4rail.actions;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TreeMap;
 
@@ -102,6 +101,7 @@ public abstract class Action extends BaseClass {
 			SetSpeed.class,
 			SetSignalsToStop.class,
 			FinishRoute.class,
+			TriggerContact.class,
 			TurnTrain.class,
 			StopAuto.class,
 			PowerOff.class,
diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
index 4eff2ab..ffaf302 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
@@ -32,7 +32,7 @@ public class SetRelay extends Action {
 	@Override
 	public JSONObject json() {
 		JSONObject json = super.json();
-		if (relay != null) {
+		if (isSet(relay)) {
 			json.put(RELAY, relay.id());
 			json.put(Relay.STATE, state);
 		}
@@ -43,7 +43,7 @@ public class SetRelay extends Action {
 	public Action load(JSONObject json) {
 		super.load(json);
 		String relayId = json.getString(RELAY);
-		if (relayId != null) {
+		if (isSet(relayId)) {
 			relay = Relay.get(relayId);
 			state = json.getBoolean(Relay.STATE);
 		}
@@ -67,8 +67,8 @@ public class SetRelay extends Action {
 		select.addTo(new Label(t("Select relay:")+NBSP)).addTo(form);
 		
 		Select state = new Select(Relay.STATE);
-		state.addOption(true,relay == null?Relay.DEFAULT_LABEL_A:relay.stateLabelA);
-		state.addOption(false,relay == null?Relay.DEFAULT_LABEL_B:relay.stateLabelB);
+		state.addOption(true,isNull(relay)?Relay.DEFAULT_LABEL_A:relay.stateLabelA);
+		state.addOption(false,isNull(relay)?Relay.DEFAULT_LABEL_B:relay.stateLabelB);
 		state.addTo(new Label(t("Select state:")+NBSP)).addTo(form);
 		
 		
@@ -77,7 +77,7 @@ public class SetRelay extends Action {
 	}
 
 	public String toString() {
-		if (relay == null) return t("[click here to setup relay]");
+		if (isNull(relay)) return "["+t("click here to setup relay")+"]";
 		return t("Set "+relay+" to "+(state?relay.stateLabelA:relay.stateLabelB));
 	};
 	
@@ -87,7 +87,7 @@ public class SetRelay extends Action {
 		String relayId = params.get(RELAY);
 		relay = Relay.get(relayId);
 		String st = params.get(Relay.STATE);
-		if (st != null) state = st.equals("true");
+		if (isSet(st)) state = st.equals("true");
 		return properties(params);
 	}
 }
diff --git a/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
new file mode 100644
index 0000000..da53f3d
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/actions/TriggerContact.java
@@ -0,0 +1,72 @@
+package de.srsoftware.web4rail.actions;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import org.json.JSONObject;
+
+import de.srsoftware.web4rail.Window;
+import de.srsoftware.web4rail.tags.Button;
+import de.srsoftware.web4rail.tags.Form;
+import de.srsoftware.web4rail.tags.Input;
+import de.srsoftware.web4rail.tags.Label;
+import de.srsoftware.web4rail.tags.Select;
+import de.srsoftware.web4rail.tiles.Contact;
+
+public class TriggerContact extends Action {
+		
+	private Contact contact = null;
+	
+	@Override
+	public boolean fire(Context context) throws IOException {
+		if (isSet(contact)) {
+			System.err.println("triggering "+contact);
+			contact.trigger(200);
+		}
+		return false;
+	}
+	
+	@Override
+	public JSONObject json() {
+		JSONObject json = super.json();
+		if (isSet(contact)) json.put(CONTACT, contact.id());
+		return json;
+	}
+	
+	@Override
+	public Action load(JSONObject json) {
+		super.load(json);
+		String contactId = json.getString(CONTACT);
+		if (isSet(contactId)) contact = Contact.get(contactId);
+		return this;
+	}
+	
+	@Override
+	public Window properties(HashMap<String, String> params) {
+		Window win = super.properties(params);
+		Form form = new Form("action-prop-form-"+id);
+		new Input(REALM,REALM_ACTIONS).hideIn(form);
+		new Input(ID,params.get(ID)).hideIn(form);
+		new Input(ACTION,ACTION_UPDATE).hideIn(form);
+		new Input(CONTEXT,params.get(CONTEXT)).hideIn(form);
+		
+		Select select = Contact.selector(contact);
+		select.addTo(new Label(t("Select contact:")+NBSP)).addTo(form);
+		
+		new Button(t("Apply"),form).addTo(form).addTo(win);		
+		return win;
+	}
+	
+	public String toString() {
+		return isSet(contact) ? t("Trigger {}",contact) : "["+t("click here to setup contact")+"]";
+	};
+	
+	@Override
+	protected Object update(HashMap<String, String> params) {
+		LOG.debug("update: {}",params);
+		String contactId = params.get(CONTACT);
+		if (isSet(contactId)) contact = Contact.get(contactId);
+		return properties(params);
+	}
+
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
index 260d948..c4ec0be 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
@@ -1,8 +1,11 @@
 package de.srsoftware.web4rail.tiles;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
 
 import org.json.JSONObject;
 
@@ -11,6 +14,7 @@ import de.srsoftware.web4rail.tags.Button;
 import de.srsoftware.web4rail.tags.Form;
 import de.srsoftware.web4rail.tags.Input;
 import de.srsoftware.web4rail.tags.Label;
+import de.srsoftware.web4rail.tags.Select;
 
 public abstract class Contact extends Tile{
 	
@@ -65,6 +69,10 @@ public abstract class Contact extends Tile{
 		return contactsByAddr.get(addr);
 	}
 	
+	public static Contact get(String contactId) {
+		return contactsById.get(contactId);
+	}
+	
 	@Override
 	public JSONObject json() {
 		JSONObject json = super.json();
@@ -72,6 +80,11 @@ public abstract class Contact extends Tile{
 		return json;
 	}
 	
+	public static Collection<Contact> list() {
+		return contactsById.values();
+	}
+
+	
 	@Override
 	protected Tile load(JSONObject json) throws IOException {
 		super.load(json);
@@ -134,5 +147,15 @@ public abstract class Contact extends Tile{
 		return super.update(params);
 	}
 
-
+	public static Select selector(Contact preselect) {
+		TreeMap<String,Contact> sortedSet = new TreeMap<String, Contact>(); // Map from Name to Contact
+		for (Contact contact : contactsById.values()) sortedSet.put(contact.toString(), contact);
+		Select select = new Select(CONTACT);
+		for (Entry<String, Contact> entry : sortedSet.entrySet()) {
+			Contact contact = entry.getValue();
+			Tag option = select.addOption(contact.id(),contact);
+			if (contact == preselect) option.attr("selected", "selected");
+		}
+		return select;
+	}
 }