working on lookup tables

This commit is contained in:
Stephan Richter
2021-09-17 16:19:06 +02:00
parent f6ef4a7ba3
commit 5890e7966e
4 changed files with 180 additions and 13 deletions

View File

@@ -1,8 +1,23 @@
package de.srsoftware.web4rail;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;
import org.json.JSONArray;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.moving.Car;
import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tags.Table;
import de.srsoftware.web4rail.tags.Window;
public class LookupTable extends BaseClass{
@@ -10,14 +25,35 @@ public class LookupTable extends BaseClass{
private static final String ADD_FORM = "add_lookup";
private static final String COLUMNS = "columns";
private static final String ROWS = "rows";
private static final String DEFAULT_VALUE = "default";
private static final String NEW_ROW = "new_row";
private static final String NEW_COL = "new_col";
private String colType;
private String rowType;
private String name;
private int defaultValue = 0;
private HashSet<Object> cols = new HashSet<>();
private HashSet<Object> rows = new HashSet<>();
private HashMap<Object,HashMap<Object,Integer>> values = new HashMap<>();
public LookupTable(String name, String cols, String rows) {
this.name = name;
this.colType = cols;
this.rowType = rows;
}
public static Object action(Params params) {
String action = params.getString(ACTION);
if (isNull(action)) throw new NullPointerException(ACTION+" should not be null!");
LookupTable table = get(Id.from(params));
switch (action) {
case ACTION_ADD:
return addForm(params);
case ACTION_PROPS:
return isSet(table) ? table.properties() : plan.properties();
case ACTION_UPDATE:
return isSet(table) ? table.update(params) : plan.properties();
}
return plan.properties(t("Unknown action: {}",action));
}
@@ -39,18 +75,130 @@ public class LookupTable extends BaseClass{
new Input(ACTION, ACTION_ADD).hideIn(form);
return form.addTo(win);
}
private static Object create(String name, String cols, String rows) {
return new LookupTable(name, cols, rows).register().properties();
}
@Override
public JSONObject json() {
JSONObject json = super.json();
json.put(COLUMNS, colType);
json.put(DEFAULT_VALUE, defaultValue);
json.put(NAME, name);
json.put(ROWS, rowType);
return json;
}
public static JSONArray jsonList() {
JSONArray list = new JSONArray();
listElements(LookupTable.class).forEach(table -> list.put(table.json()));
return list;
}
private static Object create(String name, String cols, String rows2) {
// TODO Auto-generated method stub
return null;
public String name() {
return name;
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm, String... errorMessages) {
formInputs.add(t(NAME),new Input(NAME,name));
formInputs.add(t("default value"),new Input(DEFAULT_VALUE, defaultValue).numeric().title(t("This value is used, when no entry is set for a specific input pair.")));
postForm.add(table());
return super.properties(preForm, formInputs, postForm, errorMessages);
}
@Override
public String realm() {
return REALM_LOOKUP;
}
private static Select selector(String name) {
Select selector = new Select(name);
selector.addOption(REALM_LOCO, t("Locomotives"));
selector.addOption(REALM_CAR, t("Cars"));
selector.addOption(REALM_TRAIN, t("Trains"));
selector.addOption(REALM_TRAIN+"_length", t("TrainLength"));
return selector;
}
private Fieldset table() {
Fieldset fieldset = new Fieldset(t("Values"));
rowAdder().addTo(fieldset);
Table table = new Table();
Vector<Object> head = new Vector<Object>();
head.add("");
head.addAll(cols);
table.addHead(head.toArray());
for (Object row : rows) {
Vector<Object> entries = new Vector<>();
entries.add(row);
HashMap<Object, Integer> items = values.get(row);
for (Object col : cols) {
Integer item = isSet(items) ? items.get(col) : defaultValue;
entries.add(item);
}
table.addRow(entries.toArray());
}
return table.addTo(fieldset);
}
private Tag rowAdder() {
Fieldset fieldset = new Fieldset("Add column/row");
Form form = new Form("add_row_form");
new Input(REALM,REALM_LOOKUP).hideIn(form);
new Input(ID,id()).hideIn(form);
new Input(ACTION,ACTION_UPDATE).hideIn(form);
Tag select = null;
switch (colType) {
case REALM_CAR:
select = Car.selector(null, null).attr(NAME, NEW_COL);
break;
case REALM_TRAIN:
select = Train.selector(null, null).attr(NAME, NEW_COL);
break;
}
if (isSet(select)) select.addTo(new Label(t("add column ({})",t(colType))+':'+NBSP)).addTo(form);
select = null;
switch (rowType) {
case REALM_CAR:
select = Car.selector(null, null).attr(NAME, NEW_ROW);
break;
case REALM_TRAIN:
select = Train.selector(null, null).attr(NAME, NEW_ROW);
break;
}
if (isSet(select)) select.addTo(new Label(t("add row ({})",t(rowType))+':'+NBSP)).addTo(form);
return new Button(t("add"), form).addTo(form).addTo(fieldset);
}
@Override
public String toString() {
return t("{} \"{}\"",getClass().getSimpleName(),name);
}
@Override
protected Object update(Params params) {
if (params.containsKey(NAME)) name = params.getString(NAME);
if (params.containsKey(DEFAULT_VALUE)) defaultValue = params.getInt(DEFAULT_VALUE);
if (params.containsKey(NEW_COL)) {
Object o = BaseClass.get(Id.from(params, NEW_COL));
if (isSet(o) && !cols.contains(o)) cols.add(o);
}
if (params.containsKey(NEW_ROW)) {
Object o = BaseClass.get(Id.from(params, NEW_ROW));
if (isSet(o) && !rows.contains(o)) rows.add(o);
}
super.update(params);
return properties();
}
}

View File

@@ -543,7 +543,8 @@ public class Plan extends BaseClass{
.put(LENGTH_UNIT, lengthUnit)
.put(SPEED_UNIT, speedUnit)
.put(Turnout.DELAY, Turnout.delay)
.put(TILE, jTiles);
.put(TILE, jTiles)
.put(REALM_LOOKUP, LookupTable.jsonList());
}
/**
@@ -613,6 +614,14 @@ public class Plan extends BaseClass{
Fieldset fieldset = new Fieldset(t("lookup tables"));
Button button = button(t("add"),Map.of(REALM,REALM_LOOKUP,ACTION,ACTION_ADD));
button.addTo(fieldset);
List<LookupTable> tables = BaseClass.listElements(LookupTable.class);
if (!tables.isEmpty()) {
new Tag("div").content("known lookup tables:").addTo(fieldset);
Tag list = new Tag("ul");
for (LookupTable table : tables) table.button(table.name()).addTo(list);
list.addTo(fieldset);
}
return fieldset;
}