diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 7e2dcce..3032d7a 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -47,8 +47,10 @@ Command to send to control unit\: : Kommando, welches zur Zentrale gesendet werd ConditionalAction : bedingte Aktion Conditions : Bedingungen Condition type\: : Bedingungs-Typ: +Connected to {}. : Mit {} verbunden. Control : Steuerung Control unit : Zentrale +Counterpart : Gegenstück Create action : Aktion erzeugen Current location\: : Aktueller Ort: Current location : Aufenthaltsort @@ -114,13 +116,14 @@ new train : neuer Zug No : keine No free routes from {} : keine Route von {} frei NORTH : Norden +Not connected to other bridge part! : Nicht mit anderem Brücken-Teil verbunden! Notes : Notizen {} now heading for {} : {} ist nun unterweg nach {} {} now in auto-mode : {} ist nun im Automatikmodus Occupied area\: : Belegte Abschnitte: Off : Aus On : An -One way\: : Richtung: +One way : Richtung Online Documentation : Online-Dokumentation OrCondition : Oder-Bedingung other train properties : andere Zug-Eigenschaften @@ -139,7 +142,7 @@ Relay/Turnout : Relais/Weiche Report Issue : Problem melden RIGHT : rechts Right port\: : Port für rechts -Routes using this tile\: : Fahrstraßen, die diesen Abschnitt verwenden: +Routes using this tile : Fahrstraßen, die diesen Abschnitt verwenden Route will only be available, if all conditions are fulfilled. : Route ist nur verfügbar, wenn alle Bedingungen erfüllt sind. Save : speichern Select block\: : Block auswählen: @@ -172,6 +175,7 @@ Speed unit : Geschwindigkeits-Einheit Start actions : Start-Aktionen Stock ID : Inventarnummer Started {} : {} gestartet +State : Status StopAllTrains : Alle Züge stoppen StopAuto : Automatikmodus abschalten {} stopping at next block. : {} hält im nächsten Block. diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java index 11c2946..de9a2b1 100644 --- a/src/main/java/de/srsoftware/web4rail/BaseClass.java +++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java @@ -40,6 +40,7 @@ public abstract class BaseClass implements Constants{ public static class Context { + private BaseClass main = null; private Tile tile; private Block block; @@ -125,6 +126,16 @@ public abstract class BaseClass implements Constants{ } } + public class FormInput extends ArrayList>{ + + private static final long serialVersionUID = -2371203388908395216L; + + public FormInput add(String caption,Tag tag) { + add(new AbstractMap.SimpleEntry(caption,tag)); + return this; + } + } + public static class Id implements CharSequence, Comparable{ private String internalId; @@ -296,11 +307,11 @@ public abstract class BaseClass implements Constants{ } public Window properties() { - return properties(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + return properties(new ArrayList<>(), new FormInput(), new ArrayList<>()); } - protected Window properties(List
preForm,List> formInputs,List
postForm) { + protected Window properties(List
preForm,FormInput formInputs,List
postForm) { Window win = new Window(getClass().getSimpleName()+"-properties", t("Properties of {}",this)); preForm.forEach(fieldset -> fieldset.addTo(win)); diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 1b6b359..f080a0d 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -611,7 +611,7 @@ public class Plan extends BaseClass{ private Window properties(HashMap params) { if (params.containsKey(ID)) { Tile tile = get(Id.from(params), true); - if (isSet(tile)) return tile.propMenu(); + if (isSet(tile)) return tile.properties(); } Window win = new Window("plan-properties", t("Properties")); @@ -780,7 +780,7 @@ public class Plan extends BaseClass{ contact.addr(0); LOG.debug("unsibscribed {} from {}",contact,addr); } - stream(learningContact.addr(addr).propMenu().toString()); + stream(learningContact.addr(addr).properties().toString()); learningContact = null; LOG.debug("learned: {} = {}",addr,learningContact); return; @@ -804,7 +804,7 @@ public class Plan extends BaseClass{ case REALM_CONTACT: case REALM_PLAN: Tile tile = get(id, false); - return isNull(tile) ? null : tile.propMenu(); + return isNull(tile) ? null : tile.properties(); case REALM_ACTIONS: Action action = Action.get(id); return (isSet(action)) ? action.properties(params) : null; @@ -937,7 +937,7 @@ public class Plan extends BaseClass{ if (tile instanceof Block) { Block block = (Block) tile; place(block.updateTimes(params)); - return tile.propMenu(); + return tile.properties(); } return t("updateTimes called on non-block tile!"); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index 18cdb76..8693653 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -19,6 +19,7 @@ import de.srsoftware.web4rail.Constants; import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Button; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; @@ -132,6 +133,12 @@ public class ActionList extends Vector implements Constants{ } } + public Fieldset properties() { + Fieldset fieldset = new Fieldset(t("Actions")); + new Tag("p").content("replace ActionList.addTo(...) by ActionsList.properties()!").addTo(fieldset); + return fieldset; + } + public boolean drop(Id actionId) { for (Action action : this) { if (action.id().equals(actionId)) { diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index 068ea87..c0f56ef 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -5,7 +5,6 @@ import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.util.AbstractMap; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -200,12 +199,12 @@ public class Car extends BaseClass implements Comparable{ } @Override - protected Window properties(List
preForm, List> formInputs, List
postForm) { - formInputs.add(new AbstractMap.SimpleEntry<>(t("Name"),new Input(NAME,name))); - formInputs.add(new AbstractMap.SimpleEntry<>(t("Stock ID"),new Input(STOCK_ID,stockId))); - formInputs.add(new AbstractMap.SimpleEntry<>(t("Length"),new Input(LENGTH,length).attr("type", "number").addTo(new Tag("span")).content(NBSP+lengthUnit))); - formInputs.add(new AbstractMap.SimpleEntry<>(t("Tag"), new Input(TAGS,String.join(", ", tags)))); - formInputs.add(new AbstractMap.SimpleEntry<>(t("Maximum Speed"),new Input(MAX_SPEED, maxSpeed).numeric().addTo(new Tag("span")).content(NBSP+speedUnit))); + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Name"),new Input(NAME,name)); + formInputs.add(t("Stock ID"),new Input(STOCK_ID,stockId)); + formInputs.add(t("Length"),new Input(LENGTH,length).attr("type", "number").addTo(new Tag("span")).content(NBSP+lengthUnit)); + formInputs.add(t("Tag"), new Input(TAGS,String.join(", ", tags))); + formInputs.add(t("Maximum Speed"),new Input(MAX_SPEED, maxSpeed).numeric().addTo(new Tag("span")).content(NBSP+speedUnit)); Fieldset fieldset = new Fieldset(t("Train")); if (train != null) train.link().addTo(fieldset); diff --git a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java index d7414bd..afd0b24 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java @@ -1,13 +1,11 @@ package de.srsoftware.web4rail.moving; import java.io.IOException; -import java.util.AbstractMap; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Vector; -import java.util.Map.Entry; import org.json.JSONObject; @@ -263,14 +261,14 @@ public class Locomotive extends Car implements Constants,Device{ } @Override - protected Window properties(List
preForm, List> formInputs, List
postForm) { + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { preForm.add(cockpit(this)); Tag div = new Tag("div"); for (Protocol proto : Protocol.values()) { new Radio(PROTOCOL, proto.toString(), t(proto.toString()), proto == this.proto).addTo(div); } - formInputs.add(new AbstractMap.SimpleEntry(t("Protocol"),div)); - formInputs.add(new AbstractMap.SimpleEntry(t("Address"),new Input(ADDRESS, address).numeric())); + formInputs.add(t("Protocol"),div); + formInputs.add(t("Address"),new Input(ADDRESS, address).numeric()); return super.properties(preForm, formInputs, postForm); } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index ec1702d..5e5053f 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -5,7 +5,6 @@ import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.util.AbstractMap; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -505,7 +504,7 @@ public class Train extends BaseClass implements Comparable { } @Override - protected Window properties(List
preForm, List> formInputs, List
postForm) { + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { Fieldset otherTrainProsps = new Fieldset(t("other train properties")); Tag propList = new Tag("ul").clazz("proplist"); @@ -546,9 +545,9 @@ public class Train extends BaseClass implements Comparable { propList.addTo(otherTrainProsps); - formInputs.add(new AbstractMap.SimpleEntry<>(t("Name"), new Input(NAME,name))); - formInputs.add(new AbstractMap.SimpleEntry<>(t("Push-pull train"),new Checkbox(PUSH_PULL, t("Push-pull train"), pushPull))); - formInputs.add(new AbstractMap.SimpleEntry<>(t("Tags"), new Input(TAGS,String.join(", ", tags)))); + formInputs.add(t("Name"), new Input(NAME,name)); + formInputs.add(t("Push-pull train"),new Checkbox(PUSH_PULL, t("Push-pull train"), pushPull)); + formInputs.add(t("Tags"), new Input(TAGS,String.join(", ", tags))); preForm.add(Locomotive.cockpit(this)); postForm.add(otherTrainProsps); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index 2d7bba2..2391481 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -227,9 +227,8 @@ public abstract class Block extends StretchableTile implements Comparable return form; } - @Override public Window propMenu() { - Window win = super.propMenu(); + Window win = new Window("test", "Replace Block.propmenu by Block.properties!"); Form form = new Form("train-wait-form"); new Tag("h4").content(t("Stop settings")).addTo(win); new Input(REALM,REALM_PLAN).hideIn(form); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java index 69d4836..9ba44ca 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; +import java.util.List; import java.util.Map; import org.json.JSONObject; @@ -10,6 +11,7 @@ import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.moving.Train; +import de.srsoftware.web4rail.tags.Fieldset; public abstract class Bridge extends Tile { private static final String COUNTERPART = "counterpart"; @@ -75,10 +77,18 @@ public abstract class Bridge extends Tile { if (isSet(counterpart) && counterpart.route != route) counterpart.setRoute(route); return this; } - + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + Fieldset fieldset = new Fieldset(t("Counterpart")); + new Tag("p").content(isSet(counterpart) ? t("Connected to {}.",counterpart) : t("Not connected to other bridge part!")).addTo(fieldset); + button(t("Select counterpart"),Map.of(ACTION,ACTION_CONNECT)).addTo(fieldset); + preForm.add(fieldset); + return super.properties(preForm, formInputs, postForm); + } + public Window propMenu() { - Window win = super.propMenu(); + Window win = new Window("test", "test"); new Tag("h4").content("Counterpart").addTo(win); new Tag("p").content(isSet(counterpart) ? t("Connected to {}.",counterpart) : t("Not connected to other bridge part!")).addTo(win); button(t("Select counterpart"),Map.of(ACTION,ACTION_CONNECT)).addTo(win); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java index 8739966..224f196 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java @@ -3,6 +3,7 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; @@ -12,9 +13,8 @@ import org.json.JSONObject; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.actions.ActionList; -import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; -import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Select; public class Contact extends Tile{ @@ -140,7 +140,7 @@ public class Contact extends Tile{ if (id == null) return t("Missing ID on call to {}.process()",Contact.class.getSimpleName()); contact = contactsById.get(id); if (contact == null) return t("No contact with id {} found!",id); - Tag propMenu = contact.propMenu(); + Tag propMenu = contact.properties(); propMenu.children().insertElementAt(new Tag("div").content(t("Trigger a feedback sensor to assign it with this contact!")), 1); plan.learn(contact); return propMenu; @@ -148,22 +148,15 @@ public class Contact extends Tile{ return t("Unknown action: {}",action); } - @Override - public Form propForm(String formId) { - Form form = super.propForm(formId); - new Tag("h4").content(t("Hardware settings")).addTo(form); - Tag label = new Input(ADDRESS, addr).numeric().addTo(new Label(t("Address:")+NBSP)); - button(t("learn"),Map.of(ACTION,ACTION_ANALYZE)).addTo(label).addTo(form); - return form; - } - - @Override - public Window propMenu() { - Window win = super.propMenu(); - new Tag("h4").content(t("Actions")).addTo(win); - actions.addTo(win, REALM_PLAN+":"+id()); - return win; + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + Tag span = new Tag("span"); + new Input(ADDRESS, addr).numeric().addTo(span).content(NBSP); + button(t("learn"),Map.of(ACTION,ACTION_ANALYZE)).addTo(span); + formInputs.add(t("Hardware settings"),span); + + postForm.add(actions.properties()); + return super.properties(preForm, formInputs, postForm); } public static Select selector(Contact preselect) { diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java index 80b4374..feb7256 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Relay.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Relay.java @@ -127,9 +127,8 @@ public class Relay extends Tile implements Device{ return this; } - @Override public Form propForm(String id) { - Form form = super.propForm(id); + Form form = new Form(id); Fieldset fieldset = new Fieldset(t("Decoder settings")); Label protocol = new Label(t("Protocol:")); for (Protocol proto : Protocol.values()) { diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java index 0f7be9b..3931c1c 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StretchableTile.java @@ -34,9 +34,8 @@ public abstract class StretchableTile extends Tile { return super.load(json); } - @Override public Form propForm(String id) { - Form form = super.propForm(id); + Form form = new Form(id); new Tag("h4").content(stretchType()).addTo(form); new Input(STRETCH_LENGTH, stretch).numeric().addTo(new Label(stretchType()+":"+NBSP)).addTo(new Tag("p")).addTo(form); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 66b19e3..eb853a3 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -27,11 +27,9 @@ import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.moving.Train; -import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Checkbox; -import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; -import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Radio; /** @@ -84,7 +82,7 @@ public abstract class Tile extends BaseClass{ public Object click() throws IOException { LOG.debug("{}.click()",getClass().getSimpleName()); - return propMenu(); + return properties(); } public JSONObject config() { @@ -194,73 +192,58 @@ public abstract class Tile extends BaseClass{ return new Vector(); } - public Form propForm(String formId) { - Form form = new Form(formId); - new Input(ACTION, ACTION_UPDATE).hideIn(form); - new Input(REALM, REALM_PLAN).hideIn(form); - new Input(ID,id()).hideIn(form); + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + Fieldset fieldset = new Fieldset(t("Route and Train")); - List pd = possibleDirections(); - if (!pd.isEmpty()) { - new Tag("h4").content(t("One way:")).addTo(form); - new Radio("oneway","none",t("No"),isNull(oneWay)).addTo(form); - for (Direction d:pd) { - new Radio("oneway",d.toString(),t(d.toString()),d == oneWay).addTo(form); - } - } - return form; - } - - public Window propMenu() { - Window window = new Window("tile-properties",t("Properties of {} @ ({},{})",title(),x,y)); - if (isSet(train)) { - HashMap props = new HashMap(Map.of(REALM,REALM_TRAIN,ID,train.id())); + train.link("span", train+NBSP).addTo(fieldset); if (isSet(train.route)) { - props.put(ACTION, ACTION_STOP); - window.children().insertElementAt(new Button(t("stop"),props), 1); + train.button(t("stop"), contextAction(ACTION_STOP)).addTo(fieldset); } else { - props.put(ACTION, ACTION_START); - window.children().insertElementAt(new Button(t("start"),props), 1); + train.button(t("start"), contextAction(ACTION_START)).addTo(fieldset); } if (train.usesAutopilot()) { - props.put(ACTION, ACTION_QUIT); - window.children().insertElementAt(new Button(t("quit autopilot"),props),2); + train.button(t("quit autopilot"), contextAction(ACTION_QUIT)).addTo(fieldset); } else { - props.put(ACTION, ACTION_AUTO); - window.children().insertElementAt(new Button(t("auto"),props),2); + train.button(t("auto"), contextAction(ACTION_AUTO)).addTo(fieldset); } - - window.children().insertElementAt(train.link(), 1); - window.children().insertElementAt(new Tag("h4").content(t("Train:")), 1); } - - if (isSet(route)) route.link("p",t("Locked by {}",route)).addTo(window); - - Form form = propForm("tile-properties-"+id()); + + if (isSet(route)) { + route.link("span",t("Locked by {}",route)).addTo(fieldset); + } + preForm.add(fieldset); + if (isTrack) { - new Tag("h4").content(t("Length")).addTo(form); - new Input(LENGTH,length).numeric().addTo(new Label(t("Length")+":"+NBSP)).content(NBSP+lengthUnit).addTo(form); - new Tag("h4").content(t("Availability")).addTo(form); - Checkbox cb = new Checkbox(DISABLED, t("disabled"), disabled); - if (disabled) cb.clazz("disabled"); - cb.addTo(form); + formInputs.add(t("Length"),new Input(LENGTH,length).numeric().addTo(new Tag("span")).content(NBSP+lengthUnit)); + formInputs.add(t("State"),new Checkbox(DISABLED, t("disabled"), disabled)); } - new Button(t("Apply"),form).addTo(form); - form.addTo(window); + List pd = possibleDirections(); + if (!pd.isEmpty()) { + Tag div = new Tag("div"); + new Radio("oneway","none",t("No"),isNull(oneWay)).addTo(div); + for (Direction d:pd) { + new Radio("oneway",d.toString(),t(d.toString()),d == oneWay).addTo(div); + } + formInputs.add(t("One way"),div); + } + if (!routes.isEmpty()) { - new Tag("h4").content(t("Routes using this tile:")).addTo(window); + fieldset = new Fieldset(t("Routes using this tile")); Tag routeList = new Tag("ol"); for (Route route : routes) { Tag li = route.link("span", route.name()+(route.isDisabled()?" ["+t("disabled")+"]" : "")+NBSP).addTo(new Tag("li").clazz("link")); route.button(t("delete route"),contextAction(ACTION_DROP)).addTo(li); li.addTo(routeList); } - routeList.addTo(window); - } - return window; + routeList.addTo(fieldset); + postForm.add(fieldset); + } + + return super.properties(preForm, formInputs, postForm); } public void remove(Route route) { @@ -268,7 +251,7 @@ public abstract class Tile extends BaseClass{ } private static String replace(String line, Entry replacement) { - String key = replacement.getKey(); + String key = replacement.getKey(); Object val = replacement.getValue(); int start = line.indexOf(key); int len = key.length(); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java index c682e40..d2bbdb7 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java @@ -112,9 +112,8 @@ public abstract class Turnout extends Tile implements Device{ return super.load(json); } - @Override public Form propForm(String id) { - Form form = super.propForm(id); + Form form = new Form(id); Fieldset fieldset = new Fieldset(t("Decoder settings")); Label protocol = new Label(t("Protocol:")); for (Protocol proto : Protocol.values()) {