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 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) {