diff --git a/resources/css/style.css b/resources/css/style.css index f847940..a1707df 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -141,3 +141,7 @@ h2{ .sig_b{ fill: black; } + +.link{ + cursor: pointer; +} diff --git a/resources/js/plan.js b/resources/js/plan.js index 9bf4723..7786226 100644 --- a/resources/js/plan.js +++ b/resources/js/plan.js @@ -15,8 +15,6 @@ function addMessage(txt){ function addTile(x,y){ console.log("addTile:",selected.id,x,y); - x = Math.floor(x/SQUARE); - y = Math.floor(y/SQUARE); $.ajax({ url : PLAN, method: POST, @@ -33,35 +31,28 @@ function addTile(x,y){ function bodyClick(ev){ console.log('bodyClick:',ev); + var x = Math.floor(ev.clientX/SQUARE); + var y = Math.floor(ev.clientY/SQUARE); + switch (mode){ case undefined: case null: - return clickTile(ev.clientX,ev.clientY); + return clickTile(x,y); case ADD: - return addTile(ev.clientX,ev.clientY); + return addTile(x,y); case MOVE: - return moveTile(ev.clientX,ev.clientY); + return moveTile(x,y); } console.log('unknown action "'+mode+'" @ ('+ev.clientX+','+ev.clientY+')'); } function clickTile(x,y){ console.log("clickTile:",x,y); - x = Math.floor(x/SQUARE); - y = Math.floor(y/SQUARE); - if ($('#tile-'+x+'-'+y).length > 0){ - $.ajax({ - url : PLAN, - method : POST, - data : {action:'openProps',x:x,y:y}, - success: function(resp){ - $('body').append($(resp)); - } - }); - } + if ($('#tile-'+x+'-'+y).length > 0) request({action:'openProps',x:x,y:y}); return false; } + function closeMenu(ev){ console.log('closeMenu:',ev); if (selected != null) $(selected).css('border',''); @@ -107,8 +98,6 @@ function enableMove(ev){ function moveTile(x,y){ console.log("moveTile:",selected.id,x,y); - x = Math.floor(x/SQUARE); - y = Math.floor(y/SQUARE); $.ajax({ url : PLAN, method: POST, @@ -130,20 +119,26 @@ function moveTile(x,y){ } function openRoute(id){ - closeWindows(); + request({action:'openRoute',id:id}); + return false; +} + +function request(data){ $.ajax({ url : PLAN, method : POST, - data : {action:'openRoute',id:id}, + data : data, success: function(resp){ + closeWindows(); if (resp.startsWith('<')){ $('body').append($(resp)); } else { addMessage(resp); } } - }); + }); } + function runAction(ev){ console.log("runAction: ",ev.target.id); $.ajax({ diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index d596e5d..f9835f4 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -1,8 +1,17 @@ Actions : Aktionen Added {} : {} hinzugefügt Add tile : Kachel hinzufügen +Analyze plan : Plan analysieren +Contacts : Kontakte +length\: : Länge: +name\: : Name: Plan saved as "{}". : Plan als „{}“ gespeichert. Properties : Eigenschaften +Properties of {} : Eigenschaften von {} Properties of {} @ ({},{}) : Eigenschaften von {} @ ({},{}) +Routes using this tile\: : Fahrstraßen, die diesen Abschnitt verwenden: +save : speichern Save plan : Plan speichern +Signals : Signale +Turnouts : Weichen Unknown action\: {} : Unbekannte Aktion: {} \ 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 aa3b69d..f61e5c0 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -88,6 +88,10 @@ public class Plan { return new Tag("div").clazz("list").content(tiles.toString()).addTo(tileMenu); } + public static void addLink(Tile tile,String content,Tag list) { + new Tag("li").clazz("link").attr("onclick", "return clickTile("+tile.x+","+tile.y+");").content(content).addTo(list); + } + private Tile addTile(String clazz, String xs, String ys, String configJson) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { int x = Integer.parseInt(xs); int y = Integer.parseInt(ys); @@ -103,12 +107,14 @@ public class Plan { private String analyze() { Vector routes = new Vector(); for (Block block : blocks) { - block.routes().clear(); for (Connector con : block.startPoints()) routes.addAll(follow(new Route().start(block),con)); } this.routes.clear(); + for (HashMap column: tiles.values()) { + for (Tile tile : column.values()) tile.routes().clear(); + } for (Route route : routes) { - route.start().add(route); + for (Tile tile: route.path()) tile.add(route); this.routes.put(route.id(), route); } return t("Found {} routes.",routes.size()); diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 3165faa..464581b 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -75,22 +75,29 @@ public class Route { return name; } + public Vector path() { + return new Vector(path); + } + public Window properties() { - Window win = new Window("route-properties",t("Properties of {})",this)); + Window win = new Window("route-properties",t("Properties of {}",this)); new Tag("h4").content(t("Signals")).addTo(win); Tag list = new Tag("ul"); - for (Signal s : signals) new Tag("li").content(s.toString()).addTo(list); + for (Signal s : signals) Plan.addLink(s,s.toString(),list); list.addTo(win); new Tag("h4").content(t("Contacts")).addTo(win); list = new Tag("ul"); - for (Contact c : contacts) new Tag("li").content(c.toString()).addTo(list); + for (Contact c : contacts) Plan.addLink(c,c.toString(),list); list.addTo(win); new Tag("h4").content(t("Turnouts")).addTo(win); list = new Tag("ul"); - for (Entry entry : turnouts.entrySet()) new Tag("li").content(entry.getKey()+" : "+entry.getValue()).addTo(list); + for (Entry entry : turnouts.entrySet()) { + Turnout turnout = entry.getKey(); + Plan.addLink(turnout, turnout+": "+entry.getValue(), list); + } list.addTo(win); return win; @@ -110,7 +117,7 @@ public class Route { return getClass().getSimpleName()+"("+name()+")"; } - public Block start() { + public Block startBlock() { return (Block) path.get(0); } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index 7188d67..1d14445 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -2,21 +2,17 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import org.json.JSONObject; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Connector; -import de.srsoftware.web4rail.Route; public abstract class Block extends StretchableTile{ private static final String NAME = "name"; public String name = "Block"; - private HashSet routes = new HashSet(); @Override public JSONObject config() { @@ -31,16 +27,8 @@ public abstract class Block extends StretchableTile{ if (config.has(NAME)) name = config.getString(NAME); } - public Set routes(){ - return routes; - } - public abstract List startPoints(); - public void add(Route route) { - routes.add(route); - } - @Override public Tag propForm() { Tag form = super.propForm(); @@ -49,13 +37,6 @@ public abstract class Block extends StretchableTile{ new Tag("input").attr("type", "text").attr(NAME,"name").attr("value", name).addTo(label); label.addTo(form); - new Tag("h4").content(t("Routes from here:")).addTo(form); - Tag routeList = new Tag("ul"); - for (Route route : routes) { - new Tag("li").content(route.id()).attr("onclick","openRoute('"+route.id()+"')").addTo(routeList); - } - routeList.addTo(form); - return form; } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java index f4b2275..702cadd 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java @@ -6,7 +6,6 @@ import java.util.Map.Entry; import org.json.JSONObject; import de.srsoftware.tools.Tag; -import de.srsoftware.web4rail.tags.Form; public abstract class StretchableTile extends Tile { private static final String LENGTH = "length"; @@ -27,10 +26,7 @@ public abstract class StretchableTile extends Tile { @Override public Tag propForm() { - Form form = new Form(); - new Tag("input").attr("type", "hidden").attr("name","action").attr("value", "update").addTo(form); - new Tag("input").attr("type", "hidden").attr("name","x").attr("value", x).addTo(form); - new Tag("input").attr("type", "hidden").attr("name","y").attr("value", y).addTo(form); + Tag form = super.propForm(); Tag label = new Tag("label").content(t("length:")); new Tag("input").attr("type", "number").attr("name","length").attr("value", length).addTo(label); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 6bbbaed..94e42ba 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -5,11 +5,9 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; -import java.util.Vector; import org.json.JSONObject; import org.slf4j.Logger; @@ -19,14 +17,18 @@ import de.keawe.tools.translations.Translation; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Application; import de.srsoftware.web4rail.Connector; -import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.Plan.Direction; +import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.Route; +import de.srsoftware.web4rail.Window; public abstract class Tile { public int x = -1,y = -1; - protected HashSet classes = new HashSet(); - protected HashSet shadows = new HashSet(); + protected HashSet classes = new HashSet<>(); + protected HashSet shadows = new HashSet<>(); + private HashSet routes = new HashSet<>(); + protected static Logger LOG = LoggerFactory.getLogger(Tile.class); public Tile() { @@ -64,7 +66,21 @@ public abstract class Tile { } public Tag propForm() { - return null; + Form form = new Form(); + new Tag("input").attr("type", "hidden").attr("name","action").attr("value", "update").addTo(form); + new Tag("input").attr("type", "hidden").attr("name","x").attr("value", x).addTo(form); + new Tag("input").attr("type", "hidden").attr("name","y").attr("value", y).addTo(form); + + if (!routes.isEmpty()) { + new Tag("h4").content(t("Routes using this tile:")).addTo(form); + Tag routeList = new Tag("ul"); + for (Route route : routes) { + new Tag("li").clazz("link").attr("onclick","openRoute('"+route.id()+"')").content(route.id()).addTo(routeList); + } + routeList.addTo(form); + } + + return form; } public Tag propMenu() { @@ -153,5 +169,13 @@ public abstract class Tile { public Tile update(HashMap params) { LOG.debug("{}.update({})",getClass().getSimpleName(),params); return this; + } + + public HashSet routes() { + return routes; + } + + public void add(Route route) { + this.routes.add(route); } }