diff --git a/pom.xml b/pom.xml
index 531daa9..e2f59c1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.2.46
+ 1.2.47
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/css/style.css b/resources/css/style.css
index 765eceb..f107ebe 100644
--- a/resources/css/style.css
+++ b/resources/css/style.css
@@ -230,6 +230,9 @@ svg.straight .right{
.active circle{
fill: #f57900;
}
+.Block.active{
+ background: #f57900;
+}
polygon.oneway{
fill: lime;
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 3845f7b..f23ac59 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -33,6 +33,7 @@ import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tags.Table;
import de.srsoftware.web4rail.tiles.Block;
+import de.srsoftware.web4rail.tiles.BlockContact;
import de.srsoftware.web4rail.tiles.BlockH;
import de.srsoftware.web4rail.tiles.BlockV;
import de.srsoftware.web4rail.tiles.Bridge;
@@ -301,7 +302,7 @@ public class Plan extends BaseClass{
Vector results = new Vector<>();
if (tile == null) return results;
Tile addedTile = route.add(tile,connector.from.inverse());
- if (addedTile instanceof Block) {
+ if (addedTile instanceof Block) { // Route wird mit einem Block abgeschlossen
Map cons = addedTile.connections(connector.from);
LOG.debug("Found {}, coming from {}.",addedTile,connector.from);
for (Connector con : cons.keySet()) { // falls direkt nach dem Block noch ein Kontakt kommt: diesen mit zu Route hinzufügen
@@ -711,7 +712,6 @@ public class Plan extends BaseClass{
learningContact = null;
return;
}
-
if (isSet(contact)) contact.activate(active);
}
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index def87c1..b5dae03 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -194,6 +194,7 @@ public class Route extends BaseClass {
if (tile instanceof Block) {
endBlock = (Block) tile;
endDirection = direrction;
+ contacts.addAll(endBlock.contacts());
}
path.add(tile);
if (tile instanceof Contact) contacts.add((Contact) tile);
@@ -296,11 +297,11 @@ public class Route extends BaseClass {
public Route begin(Block block,Direction to) {
// add those fields to clone, too!
- contacts = new Vector();
+ startBlock = block;
+ contacts = new Vector(startBlock.contacts());
signals = new Vector();
path = new Vector();
turnouts = new HashMap<>();
- startBlock = block;
startDirection = to;
path.add(block);
return this;
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
index 1c5ea32..e15154e 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
@@ -159,6 +159,10 @@ public abstract class Block extends StretchableTile{
return fieldset;
}
+ public Collection extends Contact> contacts() {
+ return internalContacts;
+ }
+
public abstract Direction directionA();
public abstract Direction directionB();
@@ -194,6 +198,10 @@ public abstract class Block extends StretchableTile{
}
return getWaitTime(NO_TAG).get(dir);
}
+
+ public int indexOf(BlockContact contact) {
+ return 1+internalContacts.indexOf(contact);
+ }
@Override
public JSONObject json() {
@@ -203,6 +211,15 @@ public abstract class Block extends StretchableTile{
JSONArray jWaitTimes = new JSONArray();
for (WaitTime wt : waitTimes) jWaitTimes.put(wt.json());
json.put(WAIT_TIMES, jWaitTimes);
+ JSONObject jContacts = null;
+ for (BlockContact contact : internalContacts) {
+ int addr = contact.addr();
+ if (addr != 0) {
+ if (isNull(jContacts)) jContacts = new JSONObject();
+ jContacts.put(contact.id().toString(), contact.addr());
+ }
+ }
+ if (isSet(jContacts)) json.put(CONTACT, jContacts);
return json;
}
@@ -230,6 +247,10 @@ public abstract class Block extends StretchableTile{
if (object instanceof JSONObject) waitTimes.add(new WaitTime(null).load((JSONObject) object));
});
}
+ if (json.has(CONTACT)) {
+ JSONObject jContact = json.getJSONObject(CONTACT);
+ for (String key : jContact.keySet()) new BlockContact(this).addr(jContact.getInt(key));
+ }
return super.load(json);
}
@@ -260,6 +281,16 @@ public abstract class Block extends StretchableTile{
return contact;
}
+ @Override
+ public void removeChild(BaseClass child) {
+ super.removeChild(child);
+ internalContacts.remove(child);
+ }
+
+ public void removeContact(BlockContact blockContact) {
+ internalContacts.remove(blockContact);
+ }
+
public static Select selector(Block preselected,Collection exclude) {
if (isNull(exclude)) exclude = new Vector();
Select select = new Select(Block.class.getSimpleName());
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/BlockContact.java b/src/main/java/de/srsoftware/web4rail/tiles/BlockContact.java
index e0b70ff..f2f1074 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/BlockContact.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/BlockContact.java
@@ -1,5 +1,10 @@
package de.srsoftware.web4rail.tiles;
+import java.io.IOException;
+import java.util.Map;
+
+import de.srsoftware.tools.Tag;
+import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window;
public class BlockContact extends Contact {
@@ -11,14 +16,16 @@ public class BlockContact extends Contact {
@Override
public Contact addr(int address) {
super.addr(address);
- Block block = (Block) parent();
- return block.register(this);
+ Block block = (Block) parent();
+ block.removeContact(this);
+ if (address != 0) block.register(this);
+ return this;
}
@Override
public Id id() {
- if (id == null) id = new Id();
- return id;
+ Block block = ((Block)parent());
+ return new Id(block.name+":"+block.indexOf(this));
}
@Override
@@ -26,8 +33,18 @@ public class BlockContact extends Contact {
return parent().properties();
}
+ @Override
+ public Route route() {
+ return ((Block)parent()).route();
+ }
+
+ @Override
+ public Tag tag(Map replacements) throws IOException {
+ return ((Block)parent()).tag(replacements);
+ }
+
@Override
public String toString() {
- return getClass().getSimpleName()+"("+addr+")";
+ return id().toString()+" ("+addr+")";
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
index 0e19c71..ec331f3 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
@@ -12,6 +12,7 @@ import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.BaseClass;
+import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.actions.ActionList;
@@ -74,6 +75,7 @@ public class Contact extends Tile{
state = true;
if (isSet(timer)) timer.abort();
Context context = null;
+ Route route = route();
if (isSet(route)) {
context = route.context();
actions.fire(context);
@@ -95,7 +97,7 @@ public class Contact extends Tile{
}
public Contact addr(int address) {
- contactsByAddr.remove(addr); // alte ID aus der Map löschen
+ Contact oldContact = contactsByAddr.remove(addr); // alte ID aus der Map löschen
addr = address;
if (addr != 0) contactsByAddr.put(addr, this); // neue ID setzen
return this;
@@ -204,7 +206,7 @@ public class Contact extends Tile{
public void stream() {
try {
- Tag tag = super.tag(null);
+ Tag tag = tag(null);
if (state) tag.clazz(tag.get("class")+" active");
plan.stream("place "+tag);
} catch (IOException e) {