You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
5.2 KiB
199 lines
5.2 KiB
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(boolean shift) throws IOException { |
|
if (!shift) state(!state); |
|
return super.click(shift); |
|
} |
|
|
|
@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,String...errors) { |
|
Fieldset fieldset = new Fieldset(t("Actions (On)")); |
|
fieldset.id("actionsOn"); |
|
actionsOn.listAt(fieldset); |
|
postForm.add(fieldset); |
|
fieldset = new Fieldset(t("Actions (Off)")); |
|
fieldset.id("actionsOff"); |
|
actionsOff.listAt(fieldset); |
|
postForm.add(fieldset); |
|
return super.properties(preForm, formInputs, postForm,errors); |
|
} |
|
|
|
@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 state(boolean newState) { |
|
state = newState; |
|
|
|
new Thread(Application.threadName(this)) { |
|
|
|
@Override |
|
public void run() { |
|
Context context = new Context(Switch.this); |
|
if (state) { |
|
actionsOn.fire(context,Switch.this); |
|
} else actionsOff.fire(context,Switch.this); |
|
} |
|
}.start(); |
|
stream(); |
|
} |
|
|
|
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+")"; |
|
} |
|
}
|
|
|