Browse Source

improved window tiling

lookup-tables
Stephan Richter 5 years ago
parent
commit
8e747cb2a0
  1. 2
      pom.xml
  2. 39
      resources/css/style.css
  3. 20
      resources/js/plan.js
  4. 51
      src/main/java/de/srsoftware/web4rail/Application.java
  5. 9
      src/main/java/de/srsoftware/web4rail/Constants.java
  6. 96
      src/main/java/de/srsoftware/web4rail/Plan.java
  7. 6
      src/main/java/de/srsoftware/web4rail/Window.java
  8. 16
      src/main/java/de/srsoftware/web4rail/moving/Car.java
  9. 26
      src/main/java/de/srsoftware/web4rail/moving/Locomotive.java

2
pom.xml

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.srsoftware</groupId> <groupId>de.srsoftware</groupId>
<artifactId>web4rail</artifactId> <artifactId>web4rail</artifactId>
<version>0.6.1</version> <version>0.6.3</version>
<name>Web4Rail</name> <name>Web4Rail</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<description>Java Model Railway Control</description> <description>Java Model Railway Control</description>

39
resources/css/style.css

@ -7,12 +7,21 @@ html{
} }
body{ body{
min-height: 100%; min-height: 100%;
background: #c6dbd2;
} }
#plan{ #plan,
background: #c6dbd2; .window{
height: 100%; height: 100%;
width: 100%; width: 100%;
overflow: auto;
position: absolute;
}
.window{
bottom: 0;
right: 0;
background: white;
} }
.tile{ .tile{
@ -69,7 +78,7 @@ svg circle{
position: fixed; position: fixed;
width: 100%; width: 100%;
height: 30px; height: 30px;
bottom: 0px; bottom: 20px;
} }
.menu > div{ .menu > div{
@ -95,8 +104,9 @@ svg circle{
.menu > div > .list{ .menu > div > .list{
position: fixed; position: fixed;
height: 30px; height: 30px;
bottom: 30px; bottom: 50px;
width: 100%; width: 100%;
z-index: 10;
} }
.menu > div > .list > *{ .menu > div > .list > *{
@ -119,32 +129,29 @@ svg circle{
z-index: 100; z-index: 100;
} }
.window{
position: fixed;
top: 50%;
bottom: 10px;
left: 10px;
right: 10px;
background: #ecffa2;
padding: 5px;
overflow: scroll;
}
h2{ h2{
margin: 0 0 10px; margin: 0 0 10px;
text-align: center; text-align: center;
background: #627fda; background: #627fda;
} }
.swapbtn,
.closebtn{ .closebtn{
position: absolute; position: absolute;
right: 10px;
top: 10px; top: 10px;
font-size: 30px; font-size: 30px;
background: red; background: red;
color: white; color: white;
} }
.closebtn{
right: 10px;
}
.swapbtn{
right: 50px;
}
#Eraser polygon{ #Eraser polygon{
stroke: red; stroke: red;
} }

20
resources/js/plan.js

@ -51,6 +51,7 @@ function closeMenu(ev){
function closeWindows(){ function closeWindows(){
$('.window').remove(); $('.window').remove();
$('#plan').css('height','').css('width','');
} }
function connectCu(){ function connectCu(){
@ -158,8 +159,13 @@ function request(data){
if (resp.startsWith('<svg')){ if (resp.startsWith('<svg')){
$(PLAN).append($(resp)); $(PLAN).append($(resp));
} else if (resp.startsWith('<')) { } else if (resp.startsWith('<')) {
// console.log("appending to body: "+resp.substring(0,10)); var isWindow = $(resp).attr('class') == 'window';
if (isWindow){
$('.window').remove();
$('#plan').css('height','50%');
}
$(BODY).append($(resp)); $(BODY).append($(resp));
$('.window').css('height','50%');
} else { } else {
addMessage(resp); addMessage(resp);
} }
@ -185,6 +191,18 @@ function stream(ev){
if (data.startsWith("dropclass")) return dropClass(data.substring(10)); if (data.startsWith("dropclass")) return dropClass(data.substring(10));
} }
function swapTiling(ev){
if ($('.swapbtn').text() == '◧'){
$('.swapbtn').text('⬒');
$('.window').css('height','').css('width','50%');
$(PLAN).css('height','').css('width','50%');
} else {
$('.swapbtn').text('◧');
$('.window').css('height','50%').css('width','');
$(PLAN).css('height','50%').css('width','');
}
}
function train(id,action){ function train(id,action){
return request({realm:'train',action:action,id:id}); return request({realm:'train',action:action,id:id});
} }

51
src/main/java/de/srsoftware/web4rail/Application.java

@ -11,8 +11,6 @@ import java.lang.reflect.InvocationTargetException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.URI; import java.net.URI;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -25,16 +23,18 @@ import com.sun.net.httpserver.HttpServer;
import de.keawe.localconfig.Configuration; import de.keawe.localconfig.Configuration;
import de.keawe.tools.translations.Translation; 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;
public class Application { public class Application implements Constants{
private static Plan plan; private static Plan plan;
private static final Logger LOG = LoggerFactory.getLogger(Application.class); private static final Logger LOG = LoggerFactory.getLogger(Application.class);
private static final String PORT = "port";
private static final Charset UTF8 = StandardCharsets.UTF_8;
public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
Configuration config = new Configuration(Configuration.dir("Web4Rail")+"/app.config"); Configuration config = new Configuration(Configuration.dir("Web4Rail")+"/app.config");
LOG.debug("Config: {}",config); LOG.debug("config: {}",config);
InetSocketAddress addr = new InetSocketAddress(config.getOrAdd(PORT, 8080)); InetSocketAddress addr = new InetSocketAddress(config.getOrAdd(PORT, 8080));
HttpServer server = HttpServer.create(addr, 0); HttpServer server = HttpServer.create(addr, 0);
server.createContext("/plan", client -> sendPlan(client)); server.createContext("/plan", client -> sendPlan(client));
@ -51,6 +51,32 @@ public class Application {
Desktop.getDesktop().browse(URI.create("http://localhost:"+config.getInt(PORT)+"/plan")); Desktop.getDesktop().browse(URI.create("http://localhost:"+config.getInt(PORT)+"/plan"));
} }
private static Object handle(HashMap<String, String> params) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
String realm = params.get(REALM);
if (realm == null) throw new NullPointerException(REALM+" should not be null!");
String action = params.get(ACTION);
if (action == null) throw new NullPointerException(ACTION+" should not be null!");
switch (realm) {
case REALM_CAR:
return Car.action(params);
case REALM_CU:
return plan.controlUnit().process(params);
case REALM_LOCO:
return Locomotive.action(params);
case REALM_PLAN:
return plan.action(params);
case REALM_ROUTE:
return plan.routeAction(params);
case REALM_TRAIN:
return Train.action(params);
}
return t("Unknown realm: {}",params.get(REALM));
}
private static HashMap<String, String> inflate(String data) { private static HashMap<String, String> inflate(String data) {
//LOG.debug("inflate({})",data); //LOG.debug("inflate({})",data);
HashMap<String, String> params = new HashMap<String, String>(); HashMap<String, String> params = new HashMap<String, String>();
@ -130,13 +156,22 @@ public class Application {
private static void sendPlan(HttpExchange client) throws IOException { private static void sendPlan(HttpExchange client) throws IOException {
try { try {
HashMap<String, String> params = inflate(client.getRequestBody().readAllBytes()); HashMap<String, String> params = inflate(client.getRequestBody().readAllBytes());
send(client,params.isEmpty() ? plan.html() : plan.action(params)); LOG.debug("sendPlan({})",params);
if (params.isEmpty()) {
send(client,plan.html());
return;
}
Object response = handle(params);
LOG.debug("response ({}): {}",response.getClass().getSimpleName(),response);
send(client,response instanceof String || response instanceof Tag ? response : plan.html());
} catch (Exception e) { } catch (Exception e) {
LOG.error("Error during sendPlan(): {}",e); LOG.error("Error during sendPlan(): {}",e);
send(client,new Page().append(e.getMessage())); send(client,new Page().append(e.getMessage()));
} }
} }
private static void stream(HttpExchange client) throws IOException { private static void stream(HttpExchange client) throws IOException {
client.getResponseHeaders().set("content-type", "text/event-stream"); client.getResponseHeaders().set("content-type", "text/event-stream");
client.sendResponseHeaders(200, 0); client.sendResponseHeaders(200, 0);

9
src/main/java/de/srsoftware/web4rail/Constants.java

@ -1,5 +1,11 @@
package de.srsoftware.web4rail; package de.srsoftware.web4rail;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public interface Constants { public interface Constants {
public static final String ACTION = "action"; public static final String ACTION = "action";
public static final String ACTION_ADD = "add"; public static final String ACTION_ADD = "add";
@ -30,4 +36,7 @@ public interface Constants {
public static final String REALM_TRAIN = "train"; public static final String REALM_TRAIN = "train";
public static final String ID = "id"; public static final String ID = "id";
public static final String PORT = "port";
public static final Charset UTF8 = StandardCharsets.UTF_8;
} }

96
src/main/java/de/srsoftware/web4rail/Plan.java

@ -21,7 +21,6 @@ import org.slf4j.LoggerFactory;
import de.keawe.tools.translations.Translation; import de.keawe.tools.translations.Translation;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.moving.Car; import de.srsoftware.web4rail.moving.Car;
import de.srsoftware.web4rail.moving.Locomotive;
import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tags.Div; import de.srsoftware.web4rail.tags.Div;
import de.srsoftware.web4rail.tiles.Block; import de.srsoftware.web4rail.tiles.Block;
@ -106,49 +105,8 @@ public class Plan implements Constants{
new Heartbeat().start(); new Heartbeat().start();
} }
public Object action(HashMap<String, String> params) { public ControlUnit controlUnit() {
try { return controlUnit;
LOG.debug("Plan.action: {}",params);
String realm = params.get(REALM);
if (realm == null) throw new NullPointerException(REALM+" should not be null!");
String action = params.get(ACTION);
if (action == null) throw new NullPointerException(ACTION+" should not be null!");
switch (realm) {
case REALM_CAR:
return carAction(params);
case REALM_CU:
return controlUnit.process(params);
case REALM_LOCO:
return locoAction(params);
case REALM_PLAN:
return planAction(params);
case REALM_ROUTE:
return routeAction(params);
case REALM_TRAIN:
Object result = Train.action(params);
if (result instanceof Train) return html();
return result;
}
return t("Unknown realm: {}",realm);
} catch (Exception e) {
String msg = e.getMessage();
if (msg == null || msg.isEmpty()) msg = t("An unknown error occured!");
LOG.debug(msg,e);
return msg;
}
}
private Object routeAction(HashMap<String, String> params) throws IOException {
Route route = route(Integer.parseInt(params.get(ID)));
if (route == null) return t("Unknown route: {}",params.get(ID));
switch (params.get(ACTION)) {
case ACTION_PROPS:
return route.properties();
case ACTION_UPDATE:
route.update(params);
return html();
}
return t("Unknown action: {}",params.get(ACTION));
} }
private Tag actionMenu() throws IOException { private Tag actionMenu() throws IOException {
@ -204,19 +162,6 @@ public class Plan implements Constants{
return blocks; return blocks;
} }
private Object carAction(HashMap<String, String> params) throws IOException {
Car car = Car.get(params.get(Car.ID));
if (car == null) return t("No car with id {} found!",params.get(Car.ID));
switch (params.get(ACTION)) {
case ACTION_UPDATE:
car.update(params);
return html();
case ACTION_PROPS:
return car.properties();
}
return t("Unknown action: {}",params.get(ACTION));
}
private Object click(Tile tile) throws IOException { private Object click(Tile tile) throws IOException {
if (tile == null) return null; if (tile == null) return null;
return tile.click(); return tile.click();
@ -326,28 +271,6 @@ public class Plan implements Constants{
return plan; return plan;
} }
private Object locoAction(HashMap<String, String> params) throws IOException {
switch (params.get(ACTION)) {
case ACTION_ADD:
new Locomotive(params.get(Locomotive.NAME));
return html();
case ACTION_FASTER10:
return Locomotive.get(params.get(ID)).faster(10);
case ACTION_PROPS:
String id = params.get(ID);
if (id == null) return Locomotive.manager();
return Locomotive.get(params.get(ID)).properties();
case ACTION_SLOWER10:
return Locomotive.get(params.get(ID)).faster(-10);
case ACTION_STOP:
return Locomotive.get(params.get(ID)).stop();
case ACTION_TURN:
return Locomotive.get(params.get(ID)).turn();
}
return t("Unknown action: {}",params.get(ACTION));
}
private Tag menu() throws IOException { private Tag menu() throws IOException {
Tag menu = new Tag("div").clazz("menu"); Tag menu = new Tag("div").clazz("menu");
actionMenu().addTo(menu); actionMenu().addTo(menu);
@ -432,7 +355,7 @@ public class Plan implements Constants{
return tile; return tile;
} }
private Object planAction(HashMap<String, String> params) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, IOException { public Object action(HashMap<String, String> params) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
switch (params.get(ACTION)) { switch (params.get(ACTION)) {
case ACTION_ADD: case ACTION_ADD:
return addTile(params.get(TILE),params.get(X),params.get(Y),null); return addTile(params.get(TILE),params.get(X),params.get(Y),null);
@ -473,6 +396,19 @@ public class Plan implements Constants{
LOG.debug("removed {} from tile list",tiles.remove(Tile.id(x, y))); LOG.debug("removed {} from tile list",tiles.remove(Tile.id(x, y)));
} }
Object routeAction(HashMap<String, String> params) throws IOException {
Route route = route(Integer.parseInt(params.get(ID)));
if (route == null) return t("Unknown route: {}",params.get(ID));
switch (params.get(ACTION)) {
case ACTION_PROPS:
return route.properties();
case ACTION_UPDATE:
route.update(params);
return html();
}
return t("Unknown action: {}",params.get(ACTION));
}
private String saveTo(String name) throws IOException { private String saveTo(String name) throws IOException {
if (name == null || name.isEmpty()) throw new NullPointerException("Name must not be empty!"); if (name == null || name.isEmpty()) throw new NullPointerException("Name must not be empty!");
Car.saveAll(name+".cars"); Car.saveAll(name+".cars");

6
src/main/java/de/srsoftware/web4rail/Window.java

@ -14,7 +14,11 @@ public class Window extends Tag{
.content(title).addTo(this); .content(title).addTo(this);
new Tag("div") new Tag("div")
.clazz("closebtn") .clazz("closebtn")
.attr("onclick", "$('#"+id+"').remove(); return false") .attr("onclick", "return closeWindows();")
.content("&times;").addTo(this); .content("&times;").addTo(this);
new Tag("div")
.clazz("swapbtn")
.attr("onclick", "return swapTiling();")
.content("◧").addTo(this);
} }
} }

16
src/main/java/de/srsoftware/web4rail/moving/Car.java

@ -56,6 +56,18 @@ public class Car implements Constants {
cars.put(id, this); cars.put(id, this);
} }
public static Object action(HashMap<String, String> params) throws IOException {
Car car = Car.get(params.get(Car.ID));
if (car == null) return t("No car with id {} found!",params.get(Car.ID));
switch (params.get(ACTION)) {
case ACTION_UPDATE:
return car.update(params);
case ACTION_PROPS:
return car.properties();
}
return t("Unknown action: {}",params.get(ACTION));
}
protected Tag cockpit(String realm) { protected Tag cockpit(String realm) {
return null; return null;
} }
@ -177,10 +189,10 @@ public class Car implements Constants {
this.train = train; this.train = train;
} }
public Object update(HashMap<String, String> params) { public Car update(HashMap<String, String> params) {
if (params.containsKey(NAME)) name = params.get(NAME); if (params.containsKey(NAME)) name = params.get(NAME);
if (params.containsKey(STOCK_ID)) stockId = params.get(STOCK_ID); if (params.containsKey(STOCK_ID)) stockId = params.get(STOCK_ID);
if (params.containsKey(LENGTH)) length = Integer.parseInt(params.get(LENGTH)); if (params.containsKey(LENGTH)) length = Integer.parseInt(params.get(LENGTH));
return null; return this;
} }
} }

26
src/main/java/de/srsoftware/web4rail/moving/Locomotive.java

@ -1,5 +1,6 @@
package de.srsoftware.web4rail.moving; package de.srsoftware.web4rail.moving;
import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Vector; import java.util.Vector;
@ -35,6 +36,27 @@ public class Locomotive extends Car implements Constants,Device{
super(name,id); super(name,id);
} }
public static Object action(HashMap<String, String> params) throws IOException {
String id = params.get(ID);
Locomotive loco = id == null ? null : Locomotive.get(id);
switch (params.get(ACTION)) {
case ACTION_ADD:
return new Locomotive(params.get(Locomotive.NAME));
case ACTION_FASTER10:
return loco.faster(10);
case ACTION_PROPS:
return loco == null ? Locomotive.manager() : loco.properties();
case ACTION_SLOWER10:
return loco.faster(-10);
case ACTION_STOP:
return loco.stop();
case ACTION_TURN:
return loco.turn();
}
return Car.action(params);
}
protected Tag cockpit(String realm) { protected Tag cockpit(String realm) {
Fieldset fieldset = new Fieldset(t("Control")); Fieldset fieldset = new Fieldset(t("Control"));
String request = "return request({realm:'"+realm+"',id:"+id()+",action:'{}'})"; String request = "return request({realm:'"+realm+"',id:"+id()+",action:'{}'})";
@ -171,10 +193,10 @@ public class Locomotive extends Car implements Constants,Device{
} }
@Override @Override
public Object update(HashMap<String, String> params) { public Car update(HashMap<String, String> params) {
super.update(params); super.update(params);
if (params.containsKey(PROTOCOL)) proto = Protocol.valueOf(params.get(PROTOCOL)); if (params.containsKey(PROTOCOL)) proto = Protocol.valueOf(params.get(PROTOCOL));
if (params.containsKey(ADDRESS)) address = Integer.parseInt(params.get(ADDRESS)); if (params.containsKey(ADDRESS)) address = Integer.parseInt(params.get(ADDRESS));
return t("Updated locomotive."); return this;
} }
} }

Loading…
Cancel
Save