added switch tile and corresponding condition
This commit is contained in:
@@ -71,6 +71,7 @@ import de.srsoftware.web4rail.tiles.SignalS;
|
||||
import de.srsoftware.web4rail.tiles.SignalW;
|
||||
import de.srsoftware.web4rail.tiles.StraightH;
|
||||
import de.srsoftware.web4rail.tiles.StraightV;
|
||||
import de.srsoftware.web4rail.tiles.Switch;
|
||||
import de.srsoftware.web4rail.tiles.TextDisplay;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
import de.srsoftware.web4rail.tiles.TileWithShadow;
|
||||
@@ -938,6 +939,7 @@ public class Plan extends BaseClass{
|
||||
new DecouplerV().tag(null).addTo(tiles);
|
||||
new Relay().setLabel(true,"RL").tag(null).addTo(tiles);
|
||||
new Contact().tag(null).addTo(tiles);
|
||||
new Switch().tag(null).addTo(tiles);
|
||||
new TextDisplay().text("tx").tag(null).addTo(tiles);
|
||||
new Eraser().tag(null).addTo(tiles);
|
||||
return tiles.addTo(tileMenu);
|
||||
|
||||
@@ -123,6 +123,7 @@ public abstract class Condition extends BaseClass {
|
||||
OrCondition.class,
|
||||
PushPullTrain.class,
|
||||
RouteEndBlock.class,
|
||||
SwitchIsOn.class,
|
||||
TrainHasTag.class,
|
||||
TrainIsShunting.class,
|
||||
TrainLength.class,
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
package de.srsoftware.web4rail.conditions;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.tiles.Switch;
|
||||
|
||||
public class SwitchIsOn extends Condition {
|
||||
|
||||
private Switch swtch = null;
|
||||
private static final String SWITCH = "switch";
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean fulfilledBy(Context context) {
|
||||
if (isSet(swtch)) return swtch.isOn() != inverted;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject json() {
|
||||
JSONObject json = super.json();
|
||||
if (isSet(swtch)) json.put(SWITCH, swtch.id().toString());
|
||||
return json;
|
||||
}
|
||||
|
||||
public Condition load(JSONObject json) {
|
||||
super.load(json);
|
||||
if (json.has(SWITCH)) swtch = BaseClass.get(new Id(json.getString(SWITCH)));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
formInputs.add(t("Select switch"),Switch.selector(swtch));
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (isNull(SWITCH)) return "["+t("Click here to select switch!")+"]";
|
||||
return t(inverted ? "{} is off" : "{} is on",swtch) ;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object update(HashMap<String, String> params) {
|
||||
String switchId = params.get(Switch.class.getSimpleName());
|
||||
if (isSet(switchId)) swtch = BaseClass.get(new Id(switchId));
|
||||
return super.update(params);
|
||||
}
|
||||
}
|
||||
194
src/main/java/de/srsoftware/web4rail/tiles/Switch.java
Normal file
194
src/main/java/de/srsoftware/web4rail/tiles/Switch.java
Normal file
@@ -0,0 +1,194 @@
|
||||
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.Entry;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.Application;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.actions.Action;
|
||||
import de.srsoftware.web4rail.actions.ActionList;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Select;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
|
||||
public class Switch extends Tile{
|
||||
|
||||
private boolean state = false;
|
||||
private ActionList actionsOn,actionsOff;
|
||||
private static final String ON = "ON";
|
||||
private static final String OFF = "OFF";
|
||||
|
||||
public Switch() {
|
||||
actionsOn = new ActionList(this);
|
||||
actionsOff = new ActionList(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HashSet<String> classes() {
|
||||
HashSet<String> classes = super.classes();
|
||||
classes.add(state?"on":"off");
|
||||
return classes;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Object click() throws IOException {
|
||||
state = !state;
|
||||
Application.threadPool.execute(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
Context context = new Context(Switch.this);
|
||||
if (state) {
|
||||
actionsOn.fire(context);
|
||||
} else actionsOff.fire(context);
|
||||
}
|
||||
});
|
||||
stream();
|
||||
return super.click();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject json() {
|
||||
JSONObject json = super.json();
|
||||
if (!actionsOn.isEmpty()) json.put(ON, actionsOn.json());
|
||||
if (!actionsOff.isEmpty()) json.put(OFF, actionsOff.json());
|
||||
json.put(STATE, state);
|
||||
return json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tile load(JSONObject json) {
|
||||
if (json.has(ON)) {
|
||||
Object dummy = json.get(ON);
|
||||
if (dummy instanceof JSONArray) {
|
||||
JSONArray jarr = (JSONArray) dummy;
|
||||
for (Object o : jarr) {
|
||||
if (o instanceof JSONObject) {
|
||||
JSONObject jo = (JSONObject) o;
|
||||
String type = jo.getString("type");
|
||||
Action action = Action.create(type, actionsOn);
|
||||
if (isSet(action)) {
|
||||
action.load(jo);
|
||||
actionsOn.add(action);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dummy instanceof JSONObject) {
|
||||
actionsOn.load((JSONObject) dummy);
|
||||
}
|
||||
}
|
||||
if (json.has(OFF)) {
|
||||
Object dummy = json.get(OFF);
|
||||
if (dummy instanceof JSONArray) {
|
||||
JSONArray jarr = (JSONArray) dummy;
|
||||
for (Object o : jarr) {
|
||||
if (o instanceof JSONObject) {
|
||||
JSONObject jo = (JSONObject) o;
|
||||
String type = jo.getString("type");
|
||||
Action action = Action.create(type, actionsOff);
|
||||
if (isSet(action)) {
|
||||
action.load(jo);
|
||||
actionsOff.add(action);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dummy instanceof JSONObject) {
|
||||
actionsOff.load((JSONObject) dummy);
|
||||
}
|
||||
}
|
||||
if (json.has(STATE)) state =json.getBoolean(STATE);
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tile position(int x, int y) {
|
||||
super.position(x, y);
|
||||
return this;
|
||||
}
|
||||
|
||||
public static Object process(HashMap<String, String> params) {
|
||||
String action = params.get(ACTION);
|
||||
Id id = Id.from(params);
|
||||
if (action == null) return t("Missing ACTION on call to {}.process()",Switch.class.getSimpleName());
|
||||
Switch swtch = isSet(id) ? BaseClass.get(id) : null;
|
||||
switch (action) {
|
||||
case ACTION_DROP:
|
||||
if (isNull(id)) return t("Missing ID on call to {}.process()",Switch.class.getSimpleName());
|
||||
if (isNull(swtch)) return t("No contact with id {} found!",id);
|
||||
swtch.remove();
|
||||
return t("Removed {}.",id);
|
||||
case ACTION_PROPS:
|
||||
return swtch.properties();
|
||||
case ACTION_UPDATE:
|
||||
return plan.update(params);
|
||||
}
|
||||
return t("Unknown action: {}",action);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
Fieldset fieldset = new Fieldset(t("Actions (On)"));
|
||||
fieldset.id("actionsOn");
|
||||
actionsOn.list().addTo(fieldset);
|
||||
postForm.add(fieldset);
|
||||
fieldset = new Fieldset(t("Actions (Off)"));
|
||||
fieldset.id("actionsOff");
|
||||
actionsOff.list().addTo(fieldset);
|
||||
postForm.add(fieldset);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeChild(BaseClass child) {
|
||||
if (child == actionsOn) actionsOn = null;
|
||||
if (child == actionsOff) actionsOff = null;
|
||||
super.removeChild(child);
|
||||
}
|
||||
|
||||
public static Select selector(Switch preselect) {
|
||||
TreeMap<String,Switch> sortedSet = new TreeMap<String, Switch>(); // Map from Name to Contact
|
||||
for (Switch contact : BaseClass.listElements(Switch.class)) sortedSet.put(contact.toString(), contact);
|
||||
Select select = new Select("Switch");
|
||||
for (Entry<String, Switch> entry : sortedSet.entrySet()) {
|
||||
Switch contact = entry.getValue();
|
||||
Tag option = select.addOption(contact.id(),contact);
|
||||
if (contact == preselect) option.attr("selected", "selected");
|
||||
}
|
||||
return select;
|
||||
}
|
||||
|
||||
public boolean isOn() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void stream() {
|
||||
try {
|
||||
Tag tag = tag(null);
|
||||
if (state) tag.clazz(tag.get("class")+" active");
|
||||
plan.stream("place "+tag);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String title() {
|
||||
return t("Switch @ ({}, {})",x,y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return t("Switch")+"("+x+","+y+")";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user