diff --git a/pom.xml b/pom.xml index 16b86f5..3da1f9d 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.3.6</version> + <version>0.3.7</version> <name>Web4Rail</name> <description>Java Model Railway Control</description> <url>https://github.com/StephanRichter/Web4Rail</url> diff --git a/resources/js/plan.js b/resources/js/plan.js index 62dcce9..30550c5 100644 --- a/resources/js/plan.js +++ b/resources/js/plan.js @@ -23,6 +23,10 @@ function addTile(x,y){ return request({action:mode,tile:selected.id,x:x,y:y}); } +function car(id,mode){ + return request({action:"car",id:id,mode:mode}); +} + function clickTile(x,y){ var id = x+"-"+y; console.log("clickTile:",id); @@ -171,6 +175,7 @@ window.onload = function () { $('.menu .addtile .list svg').click(enableAdding); $('.menu .move .list div').click(enableMove); $('.menu .actions .list > div').click(runAction); + $('.menu .trains .list > div').click(runAction); $(PLAN).click(planClick); (new EventSource("stream")).onmessage = stream; } diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 97c52e0..a3567ed 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory; import de.keawe.tools.translations.Translation; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.moving.Car; +import de.srsoftware.web4rail.moving.Locomotive; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tags.Div; import de.srsoftware.web4rail.tiles.Block; @@ -105,6 +106,8 @@ public class Plan { private static final String ROUTE = "route"; private static final HashMap<OutputStreamWriter,Integer> clients = new HashMap<OutputStreamWriter, Integer>(); private static final String ACTION_TRAIN = "train"; + private static final String ACTION_LOCOS = "locos"; + private static final String ACTION_TRAINS = "trains"; public HashMap<String,Tile> tiles = new HashMap<String,Tile>(); private HashSet<Block> blocks = new HashSet<Block>(); @@ -351,6 +354,8 @@ public class Plan { return click(get(params.get(Tile.ID),true)); case ACTION_ANALYZE: return analyze(); + case ACTION_LOCOS: + return Locomotive.manager(); case ACTION_MOVE: return moveTile(params.get(DIRECTION),params.get(Tile.ID)); case ACTION_ROUTE: @@ -359,6 +364,8 @@ public class Plan { return saveTo(params.get(FILE)); case ACTION_TRAIN: return trainAction(params); + case ACTION_TRAINS: + return Train.manager(); case ACTION_UPDATE: return update(params); default: @@ -499,9 +506,10 @@ public class Plan { } private Tag trainMenu() throws IOException { - Tag tileMenu = new Tag("div").clazz("trains").title(t("Manage trains")).content(t("Trains")); - + Tag tileMenu = new Tag("div").clazz("trains").content(t("Trains")); StringBuffer tiles = new StringBuffer(); + tiles.append(new Div("trains").content(t("Manage trains"))); + tiles.append(new Div("locos").content(t("Manage locos"))); return new Tag("div").clazz("list").content(tiles.toString()).addTo(tileMenu); } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index ee90abc..e131089 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -11,10 +11,15 @@ import java.util.Map.Entry; import org.json.JSONObject; +import de.keawe.tools.translations.Translation; +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Application; + public class Car { private static final String ID = "id"; private static final String NAME = "name"; private static final String LENGTH = "length"; + private static final String SHOW = "show"; static HashMap<String,Car> cars = new HashMap<String, Car>(); public int length; private String name; @@ -37,9 +42,8 @@ public class Car { } public static Car get(String nameOrId) { - HashMap<String, Car> cs = cars; - Car car = cars.get(nameOrId); - if (car == null) { + Car car = cars.get(nameOrId); // try to get by id + if (car == null) { // try to get by name for (Car c : cars.values()) { if (c.name.equals(nameOrId)) car = c; } @@ -59,6 +63,10 @@ public class Car { json.put(LENGTH, length); return json; } + + public Tag link(String tagClass) { + return new Tag(tagClass).clazz("link").attr("onclick","car("+id+",'"+Car.SHOW+"')").content(name()); + } String name(){ return name; @@ -93,4 +101,8 @@ public class Car { } file.close(); } + + protected static String t(String txt, Object...fills) { + return Translation.get(Application.class, txt, fills); + } } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java index 35522f0..3f2656d 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java @@ -2,6 +2,9 @@ package de.srsoftware.web4rail.moving; import org.json.JSONObject; +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Window; + public class Locomotive extends Car { private static final String REVERSE = "reverse"; @@ -30,8 +33,23 @@ public class Locomotive extends Car { super.load(json); if (json.has(REVERSE)) reverse = json.getBoolean(REVERSE); } + public void setSpeed(int v) { // TODO Auto-generated method stub } + + public static Object manager() { + Window win = new Window("loco-manager", t("Locomotive manager")); + new Tag("h4").content(t("known locomotives")).addTo(win); + Tag list = new Tag("ul"); + for (Car car : cars.values()) { + if (car instanceof Locomotive) { + Locomotive loco = (Locomotive) car; + loco.link("li").addTo(list); + } + } + list.addTo(win); + return win; + } } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 2c6aa73..cfffcec 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -107,24 +107,6 @@ public class Train { trains.put(id, this); } - - private JSONObject json() { - JSONObject json = new JSONObject(); - json.put(ID, id); - json.put(NAME,name); - if (route != null) json.put(ROUTE, route.id()); - if (direction != null) json.put(DIRECTION, direction); - json.put(PUSH_PULL, pushPull); - Vector<String> locoIds = new Vector<String>(); - for (Locomotive loco : locos) locoIds.add(loco.id()); - json.put(LOCOS, locoIds); - Vector<String> carIds = new Vector<String>(); - for (Car car : cars) carIds.add(car.id()); - json.put(CARS,carIds); - return json; - } - - public static Object action(HashMap<String, String> params) throws IOException { if (!params.containsKey(Train.ID)) return t("No train id passed!"); long id = Long.parseLong(params.get(Train.ID)); @@ -176,6 +158,22 @@ public class Train { public Train heading(Direction dir) { direction = dir; return this; + } + + private JSONObject json() { + JSONObject json = new JSONObject(); + json.put(ID, id); + json.put(NAME,name); + if (route != null) json.put(ROUTE, route.id()); + if (direction != null) json.put(DIRECTION, direction); + json.put(PUSH_PULL, pushPull); + Vector<String> locoIds = new Vector<String>(); + for (Locomotive loco : locos) locoIds.add(loco.id()); + json.put(LOCOS, locoIds); + Vector<String> carIds = new Vector<String>(); + for (Car car : cars) carIds.add(car.id()); + json.put(CARS,carIds); + return json; } public int length() { @@ -185,6 +183,10 @@ public class Train { return result; } + public Tag link(String tagClass) { + return new Tag(tagClass).clazz("link").attr("onclick","train("+id+",'"+Train.MODE_SHOW+"')").content(name()); + } + public static void loadAll(String filename) throws IOException { BufferedReader file = new BufferedReader(new FileReader(filename)); String line = file.readLine(); @@ -206,6 +208,17 @@ public class Train { for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get((String)id)); for (Object id : json.getJSONArray(CARS)) add(Car.get((String)id)); } + + public static Object manager() { + Window win = new Window("train-manager", t("Train manager")); + new Tag("h4").content(t("known trains")).addTo(win); + Tag list = new Tag("ul"); + for (Train train : trains.values()) { + train.link("li").addTo(list); + } + list.addTo(win); + return win; + } public String name() { String result = (name != null ? name : locos.firstElement().name()); @@ -242,13 +255,14 @@ public class Train { new Tag("li").content(t("Current location: {}",block)).addTo(list); new Tag("li").content(t("Direction: heading {}",direction)).addTo(list); - new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_START+"')").content(t("start")).addTo(list).addTo(window); + new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_START+"')").content(t("start")).addTo(list); if (autopilot == null) { - new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_AUTO+"')").content(t("auto")).addTo(list).addTo(window); + new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_AUTO+"')").content(t("auto")).addTo(list); } else { - new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_STOP+"')").content(t("stop")).addTo(list).addTo(window); + new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_STOP+"')").content(t("stop")).addTo(list); } + list.addTo(window); return window; } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index 35ada1e..8d68597 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -73,7 +73,7 @@ public abstract class Block extends StretchableTile{ if (train != null) { new Tag("h4").content(t("Train:")).addTo(window); - new Tag("span").clazz("link").attr("onclick","train("+train.id+",'"+Train.MODE_SHOW+"')").content(train.name()).addTo(window); + train.link("span").addTo(window); new Tag("span").clazz("link").attr("onclick","train("+train.id+",'"+Train.MODE_START+"')").content(" - "+t("start")).addTo(window); } return window;