From a8156d0626dd5e0b77bc89ce502ccebc2ac25624 Mon Sep 17 00:00:00 2001
From: Stephan Richter <github@keawe.de>
Date: Wed, 16 Sep 2020 09:48:31 +0200
Subject: [PATCH] added contacts and signals

---
 resources/css/style.css                       | 17 ++++++++++++++-
 resources/svg/ContactH.svg                    |  4 ++++
 resources/svg/ContactV.svg                    |  4 ++++
 resources/svg/SignalE.svg                     |  7 +++++++
 resources/svg/SignalN.svg                     |  7 +++++++
 resources/svg/SignalS.svg                     |  7 +++++++
 resources/svg/SignalW.svg                     |  7 +++++++
 resources/svg/StraightV.svg                   |  2 +-
 .../java/de/srsoftware/web4rail/Plan.java     | 12 +++++++++++
 .../de/srsoftware/web4rail/tiles/Contact.java |  2 +-
 .../srsoftware/web4rail/tiles/ContactH.java   | 20 ++++++++++++++++++
 .../srsoftware/web4rail/tiles/ContactV.java   | 21 +++++++++++++++++++
 .../de/srsoftware/web4rail/tiles/Shadow.java  |  3 ++-
 .../de/srsoftware/web4rail/tiles/Signal.java  |  9 ++++++++
 .../de/srsoftware/web4rail/tiles/SignalE.java | 20 ++++++++++++++++++
 .../de/srsoftware/web4rail/tiles/SignalN.java | 21 +++++++++++++++++++
 .../de/srsoftware/web4rail/tiles/SignalS.java | 21 +++++++++++++++++++
 .../de/srsoftware/web4rail/tiles/SignalV.java | 21 +++++++++++++++++++
 .../de/srsoftware/web4rail/tiles/SignalW.java | 20 ++++++++++++++++++
 .../de/srsoftware/web4rail/tiles/Tile.java    |  5 +++++
 20 files changed, 226 insertions(+), 4 deletions(-)
 create mode 100644 resources/svg/ContactH.svg
 create mode 100644 resources/svg/ContactV.svg
 create mode 100644 resources/svg/SignalE.svg
 create mode 100644 resources/svg/SignalN.svg
 create mode 100644 resources/svg/SignalS.svg
 create mode 100644 resources/svg/SignalW.svg
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/ContactH.java
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/ContactV.java
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/Signal.java
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/SignalE.java
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/SignalN.java
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/SignalS.java
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/SignalV.java
 create mode 100644 src/main/java/de/srsoftware/web4rail/tiles/SignalW.java

diff --git a/resources/css/style.css b/resources/css/style.css
index 5920c32..4d6226e 100644
--- a/resources/css/style.css
+++ b/resources/css/style.css
@@ -30,6 +30,8 @@ body{
 	height: 60px !important;
 }
 
+svg circle,
+svg line,
 svg polygon,
 svg rect{
 	fill:#617de4;
@@ -40,10 +42,15 @@ svg rect{
 svg text{
 	font-size: 50px;
 }
+
 svg .block{
 	fill: #ffffff;
 }
 
+svg circle{
+	fill: gray;
+}
+
 .menu{
 	position: fixed;
 	width: 100%;
@@ -125,4 +132,12 @@ h2{
 
 #Eraser polygon{
 	stroke: red;
-}
\ No newline at end of file
+}
+
+.sig_a{
+	fill: red;
+}
+
+.sig_b{
+	fill: black;
+}
diff --git a/resources/svg/ContactH.svg b/resources/svg/ContactH.svg
new file mode 100644
index 0000000..0e6a209
--- /dev/null
+++ b/resources/svg/ContactH.svg
@@ -0,0 +1,4 @@
+<svg width="%width%" height="100" viewbox="0 0 100 100">
+	<rect x="0" y="35" width="100" height="30" />
+	<circle cx="50" cy="50" r="25" />
+</svg>
\ No newline at end of file
diff --git a/resources/svg/ContactV.svg b/resources/svg/ContactV.svg
new file mode 100644
index 0000000..021ddc9
--- /dev/null
+++ b/resources/svg/ContactV.svg
@@ -0,0 +1,4 @@
+<svg width="100" height="" viewbox="0 0 100 100">
+	<rect x="35" y="0" width="30" height="100" />
+	<circle cx="50" cy="50" r="25" />
+</svg>
\ No newline at end of file
diff --git a/resources/svg/SignalE.svg b/resources/svg/SignalE.svg
new file mode 100644
index 0000000..53e18c2
--- /dev/null
+++ b/resources/svg/SignalE.svg
@@ -0,0 +1,7 @@
+<svg width="%width%" height="100" viewbox="0 0 100 100">
+	<rect x="0" y="35" width="100" height="30" />
+	<rect class="sig_a" x="5" y="5" height="20" width="20" />
+	<rect class="sig_B" x="25" y="5" height="20" width="20" />
+	<line x1="45" y1="15" x2="70" y2="15" />
+	<line x1="70" y1="10" x2="70" y2="20" />
+</svg>
\ No newline at end of file
diff --git a/resources/svg/SignalN.svg b/resources/svg/SignalN.svg
new file mode 100644
index 0000000..f9796ff
--- /dev/null
+++ b/resources/svg/SignalN.svg
@@ -0,0 +1,7 @@
+<svg width="100" height="" viewbox="0 0 100 100">
+	<rect x="35" y="0" width="30" height="100" />
+	<rect class="sig_a" x="5" y="75" height="20" width="20" />
+	<rect class="sig_B" x="5" y="55" height="20" width="20" />
+	<line x1="15" y1="30" x2="15" y2="55" />
+	<line x1="10" y1="30" x2="20" y2="30" />
+</svg>
\ No newline at end of file
diff --git a/resources/svg/SignalS.svg b/resources/svg/SignalS.svg
new file mode 100644
index 0000000..dc0c620
--- /dev/null
+++ b/resources/svg/SignalS.svg
@@ -0,0 +1,7 @@
+<svg width="100" height="" viewbox="0 0 100 100">
+	<rect x="35" y="0" width="30" height="100" />
+	<rect class="sig_a" x="75" y="5" height="20" width="20" />
+	<rect class="sig_B" x="75" y="25" height="20" width="20" />
+	<line x1="85" y1="45" x2="85" y2="70" />
+	<line x1="80" y1="70" x2="90" y2="70" />
+</svg>
\ No newline at end of file
diff --git a/resources/svg/SignalW.svg b/resources/svg/SignalW.svg
new file mode 100644
index 0000000..490188b
--- /dev/null
+++ b/resources/svg/SignalW.svg
@@ -0,0 +1,7 @@
+<svg width="%width%" height="100" viewbox="0 0 100 100">
+	<rect x="0" y="35" width="100" height="30" />
+	<rect class="sig_a" x="75" y="75" height="20" width="20" />
+	<rect class="sig_B" x="55" y="75" height="20" width="20" />
+	<line x1="30" y1="85" x2="55" y2="85" />
+	<line x1="30" y1="80" x2="30" y2="90" />
+</svg>
\ No newline at end of file
diff --git a/resources/svg/StraightV.svg b/resources/svg/StraightV.svg
index 05c35b8..6f7be89 100644
--- a/resources/svg/StraightV.svg
+++ b/resources/svg/StraightV.svg
@@ -1,3 +1,3 @@
-<svg width="100" height="" viewbox="0 0 100 100">
+<svg width="100" height="" viewbox="0 0 100 %height%">
 	<rect x="35" y="0" width="30" height="%height%" />	
 </svg>
\ No newline at end of file
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index ba686db..2cce1af 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -23,6 +23,8 @@ import de.srsoftware.tools.Tag;
 import de.srsoftware.web4rail.tiles.Block;
 import de.srsoftware.web4rail.tiles.BlockH;
 import de.srsoftware.web4rail.tiles.BlockV;
+import de.srsoftware.web4rail.tiles.ContactH;
+import de.srsoftware.web4rail.tiles.ContactV;
 import de.srsoftware.web4rail.tiles.CrossH;
 import de.srsoftware.web4rail.tiles.CrossV;
 import de.srsoftware.web4rail.tiles.DiagES;
@@ -35,6 +37,10 @@ import de.srsoftware.web4rail.tiles.EndS;
 import de.srsoftware.web4rail.tiles.EndW;
 import de.srsoftware.web4rail.tiles.Eraser;
 import de.srsoftware.web4rail.tiles.Shadow;
+import de.srsoftware.web4rail.tiles.SignalE;
+import de.srsoftware.web4rail.tiles.SignalN;
+import de.srsoftware.web4rail.tiles.SignalS;
+import de.srsoftware.web4rail.tiles.SignalW;
 import de.srsoftware.web4rail.tiles.StraightH;
 import de.srsoftware.web4rail.tiles.StraightV;
 import de.srsoftware.web4rail.tiles.Tile;
@@ -311,6 +317,12 @@ public class Plan {
 		StringBuffer tiles = new StringBuffer();
 		tiles.append(new StraightH().tag(null));
 		tiles.append(new StraightV().tag(null));
+		tiles.append(new ContactH().tag(null));
+		tiles.append(new ContactV().tag(null));
+		tiles.append(new SignalW().tag(null));
+		tiles.append(new SignalE().tag(null));
+		tiles.append(new SignalS().tag(null));
+		tiles.append(new SignalN().tag(null));
 		tiles.append(new BlockH().tag(null));
 		tiles.append(new BlockV().tag(null));
 		tiles.append(new DiagES().tag(null));
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
index 2130f8d..1a51197 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
@@ -1,5 +1,5 @@
 package de.srsoftware.web4rail.tiles;
 
-public class Contact {
+public abstract class Contact extends Tile{
 
 }
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/ContactH.java b/src/main/java/de/srsoftware/web4rail/tiles/ContactH.java
new file mode 100644
index 0000000..e133d73
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/ContactH.java
@@ -0,0 +1,20 @@
+package de.srsoftware.web4rail.tiles;
+
+import java.util.List;
+import java.util.Vector;
+
+import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan;
+
+public class ContactH extends Contact {
+	@Override
+	public List<Connector> connections(String from) {
+		switch (from) {
+			case Plan.WEST:
+				return List.of(new Connector(x+1,y,from));
+			case Plan.EAST:
+				return List.of(new Connector(x-1,y,from));
+		}
+		return new Vector<>();
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/ContactV.java b/src/main/java/de/srsoftware/web4rail/tiles/ContactV.java
new file mode 100644
index 0000000..8126b5d
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/ContactV.java
@@ -0,0 +1,21 @@
+package de.srsoftware.web4rail.tiles;
+
+import java.util.List;
+import java.util.Vector;
+
+import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan;
+
+public class ContactV extends Contact {
+	
+	@Override
+	public List<Connector> connections(String from) {
+		switch (from) {
+			case Plan.NORTH:
+				return List.of(new Connector(x,y+1,from));
+			case Plan.SOUTH:
+				return List.of(new Connector(x,y-1,from));
+		}
+		return new Vector<>();
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java
index 4f32cca..b186e73 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java
@@ -15,8 +15,9 @@ public class Shadow extends Tile{
 		return super.connections(from);
 	}
 
-	public Shadow(Tile overlay) {
+	public Shadow(Tile overlay) {		
 		this.overlay = overlay;
+		overlay.addShadow(this);
 	}
 
 	public Tile overlay() {
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Signal.java b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
new file mode 100644
index 0000000..13f5c0d
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Signal.java
@@ -0,0 +1,9 @@
+package de.srsoftware.web4rail.tiles;
+
+public abstract class Signal extends Tile{
+
+	public Signal() {
+		super();
+		classes.add("signal");
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalE.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalE.java
new file mode 100644
index 0000000..c7a1eca
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalE.java
@@ -0,0 +1,20 @@
+package de.srsoftware.web4rail.tiles;
+
+import java.util.List;
+import java.util.Vector;
+
+import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan;
+
+public class SignalE extends Signal{
+	@Override
+	public List<Connector> connections(String from) {
+		switch (from) {
+			case Plan.WEST:
+				return List.of(new Connector(x+1,y,from));
+			case Plan.EAST:
+				return List.of(new Connector(x-1,y,from));
+		}
+		return new Vector<>();
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalN.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalN.java
new file mode 100644
index 0000000..527a8d9
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalN.java
@@ -0,0 +1,21 @@
+package de.srsoftware.web4rail.tiles;
+
+import java.util.List;
+import java.util.Vector;
+
+import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan;
+
+public class SignalN extends Signal {
+	
+	@Override
+	public List<Connector> connections(String from) {
+		switch (from) {
+			case Plan.NORTH:
+				return List.of(new Connector(x,y+1,from));
+			case Plan.SOUTH:
+				return List.of(new Connector(x,y-1,from));
+		}
+		return new Vector<>();
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalS.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalS.java
new file mode 100644
index 0000000..b094be2
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalS.java
@@ -0,0 +1,21 @@
+package de.srsoftware.web4rail.tiles;
+
+import java.util.List;
+import java.util.Vector;
+
+import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan;
+
+public class SignalS extends Signal{
+	
+	@Override
+	public List<Connector> connections(String from) {
+		switch (from) {
+			case Plan.NORTH:
+				return List.of(new Connector(x,y+1,from));
+			case Plan.SOUTH:
+				return List.of(new Connector(x,y-1,from));
+		}
+		return new Vector<>();
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalV.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalV.java
new file mode 100644
index 0000000..798fa99
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalV.java
@@ -0,0 +1,21 @@
+package de.srsoftware.web4rail.tiles;
+
+import java.util.List;
+import java.util.Vector;
+
+import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan;
+
+public class SignalV extends Signal {
+	
+	@Override
+	public List<Connector> connections(String from) {
+		switch (from) {
+			case Plan.NORTH:
+				return List.of(new Connector(x,y+1,from));
+			case Plan.SOUTH:
+				return List.of(new Connector(x,y-1,from));
+		}
+		return new Vector<>();
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalW.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalW.java
new file mode 100644
index 0000000..1c60396
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalW.java
@@ -0,0 +1,20 @@
+package de.srsoftware.web4rail.tiles;
+
+import java.util.List;
+import java.util.Vector;
+
+import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan;
+
+public class SignalW extends Signal{
+	@Override
+	public List<Connector> connections(String from) {
+		switch (from) {
+			case Plan.WEST:
+				return List.of(new Connector(x+1,y,from));
+			case Plan.EAST:
+				return List.of(new Connector(x-1,y,from));
+		}
+		return new Vector<>();
+	}
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
index 99095ad..1dddf67 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
@@ -25,6 +25,7 @@ public abstract class Tile {
 	
 	protected int x = -1,y = -1;
 	protected HashSet<String> classes = new HashSet<String>();
+	protected HashSet<Shadow> shadows = new HashSet<Shadow>();
 	protected static Logger LOG = LoggerFactory.getLogger(Tile.class);
 	
 	public Tile() {
@@ -148,4 +149,8 @@ public abstract class Tile {
 		LOG.debug("{}.update({})",getClass().getSimpleName(),params);
 		return this;
 	}
+
+	public void addShadow(Shadow shadow) {
+		shadows.add(shadow);
+	}
 }