From 8164b106fc75a5953479d5a3105e50d1830e8328 Mon Sep 17 00:00:00 2001 From: Arnaud Lievre Date: Thu, 18 Aug 2016 15:24:59 +0200 Subject: [PATCH] Merge --- .../org/genericsystem/carcolor/GSModal.java | 2 +- .../genericsystem/carcolor/GSUserGuide.java | 34 ++++----- .../example/reactor/AppHtml.java | 16 +++- .../java/org/genericsystem/reactor/Model.java | 7 +- .../java/org/genericsystem/reactor/Tag.java | 12 +++ .../gs/GSAttributeOfInstanceEditor.java | 41 ++++++++++ .../reactor/gs/GSBooleanHolderEditor.java | 4 +- .../genericsystem/reactor/gs/GSComposite.java | 16 ++-- .../genericsystem/reactor/gs/GSEditor.java | 73 +----------------- .../reactor/gs/GSHolderEditor.java | 4 +- .../reactor/gs/GSInstanceBuilder.java | 2 +- .../reactor/gs/GSLinkEditor.java | 2 +- .../genericsystem/reactor/gs/GSMonitor.java | 4 +- .../genericsystem/reactor/gs/GSSelect.java | 6 +- .../gs/GSSingleLinkComponentEditor.java | 2 +- .../reactor/gs/GSStepEditor.java | 50 +++++++++++++ .../reactor/gs/GSSubcellDisplayer.java | 2 +- .../org/genericsystem/reactor/gs/GSTable.java | 12 +-- .../org/genericsystem/reactor/gs/GSTag.java | 15 ++++ .../reactor/gs/GenericStringDefaults.java | 33 +++----- .../reactor/gs/SwitchDefaults.java | 75 +++++++++++++++++++ .../org/genericsystem/reactor/gstag/GSH1.java | 2 +- .../genericsystem/reactor/gstag/GSHeader.java | 4 +- .../reactor/gstag/GSHyperLink.java | 9 ++- .../genericsystem/reactor/gstag/GSLabel.java | 2 +- .../genericsystem/reactor/html/HtmlH1.java | 2 +- .../reactor/html/HtmlHyperLink.java | 2 +- .../reactor/html/TextPropertyDefaults.java | 31 +++++--- .../java/org/genericsystem/todomvc/Todo.java | 2 +- .../org/genericsystem/todomvc/TodoApp.java | 14 ++-- .../org/genericsystem/todomvc/TodoList.java | 2 +- 31 files changed, 313 insertions(+), 169 deletions(-) create mode 100644 gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSAttributeOfInstanceEditor.java create mode 100644 gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSStepEditor.java create mode 100644 gs-reactor/src/main/java/org/genericsystem/reactor/gs/SwitchDefaults.java diff --git a/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSModal.java b/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSModal.java index 1517deae2..b5fd17dab 100644 --- a/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSModal.java +++ b/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSModal.java @@ -33,7 +33,7 @@ public GSModal(GSTag parent, FlexDirection direction, Consumer contentTag new GSHyperLink(this) { { addStyleClass("close"); - setText(this, "×"); + setText("×"); bindAction(model -> getSelectionProperty(model).setValue(null)); } }; diff --git a/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSUserGuide.java b/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSUserGuide.java index 6d72c493e..55570f887 100644 --- a/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSUserGuide.java +++ b/gs-carcolor/src/main/java/org/genericsystem/carcolor/GSUserGuide.java @@ -31,7 +31,7 @@ public GSUserGuide(GSTag parent) { new HtmlHyperLink(this) { { addStyleClass("close"); - setText(this, "×"); + setText("×"); bindAction(model -> { this.getParent().getProperty(ReactorStatics.DISPLAY, model).setValue("none"); }); @@ -39,47 +39,47 @@ public GSUserGuide(GSTag parent) { }; new GSSection(this, FlexDirection.COLUMN) { { - setText(this, "How to use CarColor Demo"); + setText("How to use CarColor Demo"); new GSUl(this) { { - setText(this, "Car(s) Managment"); + setText("Car(s) Managment"); GSLi li1 = new GSLi(this); GSLi li2 = new GSLi(this); GSLi li3 = new GSLi(this); - setText(li1, "Insert Car model"); - setText(li2, "Select color in the ComboBox"); - setText(li3, "Use \"add Button\" to update data"); + li1.setText("Insert Car model"); + li2.setText("Select color in the ComboBox"); + li3.setText("Use \"add Button\" to update data"); } }; new GSUl(this) { { - setText(this, "Color Managment"); + setText("Color Managment"); GSLi li1 = new GSLi(this); GSLi li2 = new GSLi(this); GSLi li3 = new GSLi(this); - setText(li1, "Add new color"); - setText(li2, "Select car in the ComboBox"); - setText(li3, "Use \"add Button\" to update data"); + li1.setText("Add new color"); + li2.setText("Select car in the ComboBox"); + li3.setText("Use \"add Button\" to update data"); } }; new GSUl(this) { { - setText(this, "Global Tips"); + setText("Global Tips"); GSLi li1 = new GSLi(this); GSLi li2 = new GSLi(this); GSLi li3 = new GSLi(this); GSLi li4 = new GSLi(this); - setText(li1, "Use \"Add Button\" to add an entry in the cache"); - setText(li2, "Use the \"Remove Button\" to delete the entry in your cache"); - setText(li3, "Use \"Save Button\" to persist the cache"); - setText(li4, "Use \"Cancel Button\" to release the cache"); + li1.setText("Use \"Add Button\" to add an entry in the cache"); + li2.setText("Use the \"Remove Button\" to delete the entry in your cache"); + li3.setText("Use \"Save Button\" to persist the cache"); + li4.setText("Use \"Cancel Button\" to release the cache"); } }; new GSSection(this, FlexDirection.COLUMN) { { addStyle("text-align", "center"); - setText(this, "To plenty enjoy the power of GS-REACTOR, go to Learning / Get Started"); + setText("To plenty enjoy the power of GS-REACTOR, go to Learning / Get Started"); } }; } @@ -91,7 +91,7 @@ public GSUserGuide(GSTag parent) { new GSButton(this) { { - setText(this, "User Guide"); + setText("User Guide"); addStyleClass("buttonUser"); addStyle("flex", "1/3"); diff --git a/gs-example-reactor/src/main/java/org/genericsystem/example/reactor/AppHtml.java b/gs-example-reactor/src/main/java/org/genericsystem/example/reactor/AppHtml.java index 0cd61a5df..91541f0e2 100644 --- a/gs-example-reactor/src/main/java/org/genericsystem/example/reactor/AppHtml.java +++ b/gs-example-reactor/src/main/java/org/genericsystem/example/reactor/AppHtml.java @@ -23,8 +23,10 @@ import org.genericsystem.reactor.gs.GSEditor; import org.genericsystem.reactor.gs.GSMonitor; import org.genericsystem.reactor.gs.GSSelect.ColorsSelect; +import org.genericsystem.reactor.gs.GSStepEditor; import org.genericsystem.reactor.gs.GSTable; import org.genericsystem.reactor.gs.SelectionDefaults; +import org.genericsystem.reactor.model.ObservableListExtractor; @DependsOnModel({ Car.class, Power.class, Diesel.class, Color.class, CarColor.class }) @RunScript(ExampleReactorScript.class) @@ -52,8 +54,20 @@ public AppHtml(Root engine, ServerWebSocket webSocket) { addStyle("justify-content", "center"); } }; - new GSEditor(this, FlexDirection.COLUMN).select_(model -> getSelectionProperty(model)); + new GSStepEditor(this, FlexDirection.ROW) { + { + select_(model -> getSelectionProperty(model)); + switcher_(ObservableListExtractor.ATTRIBUTES_OF_INSTANCES); + } + }; + new GSStepEditor(this, FlexDirection.COLUMN) { + { + select_(model -> getSelectionProperty(model)); + switcher_(ObservableListExtractor.ATTRIBUTES_OF_INSTANCES); + } + }; + new GSTable(this).select(Color.class); new GSTable(this).select(Engine.class); diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/Model.java b/gs-reactor/src/main/java/org/genericsystem/reactor/Model.java index c0cde775e..abe439925 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/Model.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/Model.java @@ -71,13 +71,18 @@ public Collection>> getPropertiesMaps() { return propertiesMap.values(); } - public void storeProperty(Tag tag, String propertyName, ObservableValue value) { + protected void storeProperty(Tag tag, String propertyName, ObservableValue value) { assert viewContextsMap.keySet().contains(tag); if (getProperties(tag).containsKey(propertyName)) throw new IllegalStateException("Unable to store an already used property : " + propertyName); getProperties(tag).put(propertyName, (ObservableValue) value); } + protected void storePropertyWithoutCheck(Tag tag, String propertyName, ObservableValue value) { + assert viewContextsMap.keySet().contains(tag); + getProperties(tag).put(propertyName, (ObservableValue) value); + } + public List subContexts() { return subModelsMap.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList()); } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/Tag.java b/gs-reactor/src/main/java/org/genericsystem/reactor/Tag.java index 90cbe2bbb..b1dbeb2dc 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/Tag.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/Tag.java @@ -90,6 +90,7 @@ public ServerWebSocket getWebSocket() { return getParent().getWebSocket(); } + @Override public void addPrefixBinding(Consumer consumer) { preFixedBindings.add((modelContext, node) -> consumer.accept((M) modelContext)); } @@ -146,6 +147,7 @@ protected void setSubModels(Model model, Tag child, model.setSubContexts(child, subModels); } + @Override public Property getProperty(String propertyName, Model model) { return getProperty(propertyName, new Model[] { model }); } @@ -244,6 +246,11 @@ public void storeProperty(String propertyName, Function modelContext.storeProperty(this, propertyName, applyOnModel.apply(modelContext))); } + @Override + public void storePropertyWithoutCheck(String propertyName, M model, Function> applyOnModel) { + model.storePropertyWithoutCheck(this, propertyName, applyOnModel.apply(model)); + } + public void addStyle(String propertyName, String value) { addPrefixBinding(model -> model.getObservableStyles(this).put(propertyName, value)); } @@ -309,6 +316,11 @@ public Boolean fromString(String string) { }); } + @Override + public ViewContext getViewContext(M model) { + return model.getViewContext(this); + } + protected abstract HtmlDomNode createNode(String parentId); protected List> getChildren() { diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSAttributeOfInstanceEditor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSAttributeOfInstanceEditor.java new file mode 100644 index 000000000..d1376e203 --- /dev/null +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSAttributeOfInstanceEditor.java @@ -0,0 +1,41 @@ +package org.genericsystem.reactor.gs; + +import java.util.stream.Collectors; + +import org.genericsystem.api.core.ApiStatics; +import org.genericsystem.reactor.gs.GSSubcellDisplayer.GSSubcellAdder; +import org.genericsystem.reactor.gs.GSSubcellDisplayer.GSSubcellEditor; +import org.genericsystem.reactor.gs.GSSubcellDisplayer.GSSubcellEditorWithRemoval; +import org.genericsystem.reactor.model.GenericModel; + +import javafx.collections.FXCollections; + +public class GSAttributeOfInstanceEditor extends GSSection { + + public GSAttributeOfInstanceEditor(GSTag parent) { + super(parent, FlexDirection.COLUMN); + addStyle("flex", "1"); + addStyle("overflow", "hidden"); + new GSSubcellEditor(this) { + { + addStyle("flex", "1"); + // forEach_ should work here, but it causes errors… + select((model, holders) -> model.getGeneric().isRequiredConstraintEnabled(ApiStatics.BASE_POSITION) && holders.size() == 1 + ? FXCollections.observableArrayList(holders.stream().map(holder -> new GenericModel(model, GenericModel.addToGenerics(holder, model.getGenerics()))).collect(Collectors.toList())) : FXCollections.emptyObservableList()); + } + }; + new GSSubcellEditorWithRemoval(this) { + { + addStyle("flex", "1"); + select((model, holders) -> (!model.getGeneric().isRequiredConstraintEnabled(ApiStatics.BASE_POSITION) && holders.size() == 1) || holders.size() > 1 + ? FXCollections.observableArrayList(holders.stream().map(holder -> new GenericModel(model, GenericModel.addToGenerics(holder, model.getGenerics()))).collect(Collectors.toList())) : FXCollections.emptyObservableList()); + } + }; + new GSSubcellAdder(this) { + { + select((model, holders) -> holders.isEmpty() || (model.getGeneric().getComponents().size() < 2 && !model.getGeneric().isPropertyConstraintEnabled()) + || (model.getGeneric().getComponents().size() >= 2 && !model.getGeneric().isSingularConstraintEnabled(ApiStatics.BASE_POSITION)) ? FXCollections.singletonObservableList(model) : FXCollections.emptyObservableList()); + } + }; + } +} diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSBooleanHolderEditor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSBooleanHolderEditor.java index 5b6e96861..945c20597 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSBooleanHolderEditor.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSBooleanHolderEditor.java @@ -50,7 +50,7 @@ public GSBooleanHolderEditorWithRemoval(GSTag parent) { addStyle("justify-content", "center"); addStyle("text-decoration", "none"); addStyle("height", "100%"); - setText(this, "×"); + setText("×"); bindAction(GenericModel::remove); } }; @@ -70,7 +70,7 @@ public GSBooleanHolderAdder(GSTag parent) { addStyle("justify-content", "center"); addStyle("text-decoration", "none"); addStyle("height", "100%"); - setText(this, "+"); + setText("+"); bindAction(model -> { Property observable = checkbox.getProperty(ReactorStatics.VALUE, model); Boolean newValue = observable.getValue(); diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSComposite.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSComposite.java index ad3ee35a3..082356ffa 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSComposite.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSComposite.java @@ -35,7 +35,7 @@ protected void sections() { forEach(GSComposite.this); new GSLabel(this) { { - bindGenericText(this); + bindGenericText(); } }; } @@ -63,8 +63,8 @@ protected void header() { addStyle("background-color", "#ffa500"); new GSH1(this) { { - setStringExtractor(this, StringExtractor.MANAGEMENT); - bindGenericText(this); + setStringExtractor(StringExtractor.MANAGEMENT); + bindGenericText(); } }; }; @@ -86,11 +86,11 @@ public ColorTitleCompositeFlexElement(GSTag parent) { protected void sections() { new GSSection(this, ColorTitleCompositeFlexElement.this.getReverseDirection()) { { - bindStyle("background-color", ReactorStatics.BACKGROUND, model -> getGenericStringProperty(this, model)); + bindStyle("background-color", ReactorStatics.BACKGROUND, model -> getGenericStringProperty(model)); forEach(ColorTitleCompositeFlexElement.this); new GSLabel(this) { { - bindGenericText(this); + bindGenericText(); } }; } @@ -112,7 +112,7 @@ protected void sections() { new GSRadio(this); new GSLabel(this) { { - bindGenericText(this); + bindGenericText(); } }; } @@ -146,11 +146,11 @@ protected void sections() { flexSubElement = new GSSection(this, ColorCompositeRadio.this.getReverseDirection()) { { forEach(ColorCompositeRadio.this); - bindStyle("background-color", ReactorStatics.BACKGROUND, model -> getGenericStringProperty(this, model)); + bindStyle("background-color", ReactorStatics.BACKGROUND, model -> getGenericStringProperty(model)); new GSRadio(this); new GSLabel(this) { { - bindGenericText(this); + bindGenericText(); } }; } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSEditor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSEditor.java index a14babb62..11664612e 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSEditor.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSEditor.java @@ -1,22 +1,11 @@ package org.genericsystem.reactor.gs; -import java.util.stream.Collectors; - -import org.genericsystem.api.core.ApiStatics; -import org.genericsystem.common.Generic; -import org.genericsystem.reactor.gs.GSSubcellDisplayer.GSSubcellAdder; import org.genericsystem.reactor.gs.GSSubcellDisplayer.GSSubcellEditor; -import org.genericsystem.reactor.gs.GSSubcellDisplayer.GSSubcellEditorWithRemoval; import org.genericsystem.reactor.gs.GSSubcellDisplayer.InstanceLinkTitleDisplayer; import org.genericsystem.reactor.gstag.GSH1; -import org.genericsystem.reactor.model.GenericModel; import org.genericsystem.reactor.model.ObservableListExtractor; import org.genericsystem.reactor.model.StringExtractor; -import javafx.beans.binding.ListBinding; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; - /** * @author Nicolas Feybesse * @@ -46,8 +35,8 @@ protected void header() { addStyle("align-items", "center"); new GSH1(this) { { - setStringExtractor(this, StringExtractor.TYPE_INSTANCE_EXTRACTOR); - bindGenericText(this); + setStringExtractor(StringExtractor.TYPE_INSTANCE_EXTRACTOR); + bindGenericText(); } }; } @@ -93,65 +82,9 @@ protected void sections() { new GSSubcellEditor(this); } }; - new GSSection(this, FlexDirection.COLUMN) { + new GSAttributeOfInstanceEditor(this) { { forEach_(ObservableListExtractor.ATTRIBUTES_OF_INSTANCES); - addStyle("flex", "1"); - addStyle("overflow", "hidden"); - new GSSubcellEditor(this) { - { - addStyle("flex", "1"); - // forEach_ should work here, but it causes errors… - select__(model -> new ListBinding() { - ObservableList holders = ObservableListExtractor.HOLDERS.apply(model.getGenerics()); - { - bind(holders); - } - - @Override - protected ObservableList computeValue() { - return model.getGeneric().isRequiredConstraintEnabled(ApiStatics.BASE_POSITION) && holders.size() == 1 - ? FXCollections.observableArrayList(holders.stream().map(holder -> new GenericModel(model, GenericModel.addToGenerics(holder, model.getGenerics()))).collect(Collectors.toList())) - : FXCollections.emptyObservableList(); - } - }); - } - }; - new GSSubcellEditorWithRemoval(this) { - { - addStyle("flex", "1"); - select__(model -> new ListBinding() { - ObservableList holders = ObservableListExtractor.HOLDERS.apply(model.getGenerics()); - { - bind(holders); - } - - @Override - protected ObservableList computeValue() { - return (!model.getGeneric().isRequiredConstraintEnabled(ApiStatics.BASE_POSITION) && holders.size() == 1) || holders.size() > 1 - ? FXCollections.observableArrayList(holders.stream().map(holder -> new GenericModel(model, GenericModel.addToGenerics(holder, model.getGenerics()))).collect(Collectors.toList())) - : FXCollections.emptyObservableList(); - } - }); - } - }; - new GSSubcellAdder(this) { - { - select__(model -> new ListBinding() { - ObservableList holders = ObservableListExtractor.HOLDERS.apply(model.getGenerics()); - { - bind(holders); - } - - @Override - protected ObservableList computeValue() { - return holders.isEmpty() || (model.getGeneric().getComponents().size() < 2 && !model.getGeneric().isPropertyConstraintEnabled()) - || (model.getGeneric().getComponents().size() >= 2 && !model.getGeneric().isSingularConstraintEnabled(ApiStatics.BASE_POSITION)) ? FXCollections.singletonObservableList(model) - : FXCollections.emptyObservableList(); - } - }); - } - }; } }; } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSHolderEditor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSHolderEditor.java index 0dae8eccb..30458d896 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSHolderEditor.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSHolderEditor.java @@ -43,7 +43,7 @@ public GSHolderEditorWithRemoval(GSTag parent) { addStyle("justify-content", "center"); addStyle("text-decoration", "none"); addStyle("height", "100%"); - setText(this, "×"); + setText("×"); bindAction(GenericModel::remove); } }; @@ -63,7 +63,7 @@ public GSHolderAdder(GSTag parent) { addStyle("justify-content", "center"); addStyle("text-decoration", "none"); addStyle("height", "100%"); - setText(this, "+"); + setText("+"); bindAction(model -> { Property observable = input.getProperty(ReactorStatics.VALUE, model); if (observable.getValue() != null) { diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSInstanceBuilder.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSInstanceBuilder.java index 52e5e934a..ac076b599 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSInstanceBuilder.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSInstanceBuilder.java @@ -78,7 +78,7 @@ protected void footer() { } instanceValueInput.input.getProperty(ReactorStatics.VALUE, model).setValue(null); }); - setText(this, "Add"); + setText("Add"); addStyle("width", "100%"); addStyle("height", "100%"); } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSLinkEditor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSLinkEditor.java index 89715c26e..b358229bf 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSLinkEditor.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSLinkEditor.java @@ -45,7 +45,7 @@ public GSLinkEditorWithRemoval(GSTag parent) { addStyle("justify-content", "center"); addStyle("text-decoration", "none"); addStyle("height", "100%"); - setText(this, "×"); + setText("×"); bindAction(GenericModel::remove); } }; diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSMonitor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSMonitor.java index ed6c4d572..93b4bbe8b 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSMonitor.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSMonitor.java @@ -15,13 +15,13 @@ public GSMonitor(GSTag parent, FlexDirection direction) { addStyle("padding", "10px"); new GSButton(this) { { - setText(this, "Save"); + setText("Save"); bindAction(GenericModel::flush); } }; new GSButton(this) { { - setText(this, "Cancel"); + setText("Cancel"); bindAction(GenericModel::cancel); } }; diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSelect.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSelect.java index 7c56b47bf..3a7bb97db 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSelect.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSelect.java @@ -34,7 +34,7 @@ protected SelectableHtmlDomNode createNode(String parentId) { protected void options() { optionElement = new GSOption(this) { { - bindGenericText(this); + bindGenericText(); forEach(GSSelect.this); } }; @@ -59,7 +59,7 @@ public CompositeSelectWithEmptyEntry(GSTag parent) { }); optionElement.addPrefixBinding(model -> { if ("Color".equals(StringExtractor.SIMPLE_CLASS_EXTRACTOR.apply(model.getGeneric().getMeta()))) - model.getObservableStyles(optionElement).put("background-color", getGenericStringProperty(optionElement, model).getValue()); + model.getObservableStyles(optionElement).put("background-color", optionElement.getGenericStringProperty(model).getValue()); }); } @@ -80,7 +80,7 @@ public static class ColorsSelect extends GSSelect { public ColorsSelect(GSTag parent) { super(parent); bindStyle("background-color", ReactorStatics.SELECTION_STRING); - optionElement.bindStyle("background-color", ReactorStatics.BACKGROUND, model -> getGenericStringProperty(optionElement, model)); + optionElement.bindStyle("background-color", ReactorStatics.BACKGROUND, model -> optionElement.getGenericStringProperty(model)); } } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSingleLinkComponentEditor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSingleLinkComponentEditor.java index 1493e26da..7c06010e6 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSingleLinkComponentEditor.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSingleLinkComponentEditor.java @@ -35,7 +35,7 @@ public GSSingleLinkComponentEditor(GSTag parent, GSSelectConstructor constructor }); select.optionElement.addPrefixBinding(model -> { if ("Color".equals(StringExtractor.SIMPLE_CLASS_EXTRACTOR.apply(model.getGeneric().getMeta()))) - model.getObservableStyles(select.optionElement).put("background-color", getGenericStringProperty(select.optionElement, model).getValue()); + model.getObservableStyles(select.optionElement).put("background-color", select.optionElement.getGenericStringProperty(model).getValue()); }); select.addStyle("width", "100%"); select.addStyle("height", "100%"); diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSStepEditor.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSStepEditor.java new file mode 100644 index 000000000..f5809d4eb --- /dev/null +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSStepEditor.java @@ -0,0 +1,50 @@ +package org.genericsystem.reactor.gs; + +import org.genericsystem.reactor.gs.GSSubcellDisplayer.InstanceLinkTitleDisplayer; +import org.genericsystem.reactor.gstag.GSHyperLink; + +public class GSStepEditor extends GSEditor implements SwitchDefaults { + + private GSTag switchedTag; + + public GSStepEditor(GSTag parent) { + this(parent, FlexDirection.COLUMN); + } + + public GSStepEditor(GSTag parent, FlexDirection direction) { + super(parent, direction); + } + + @Override + public GSTag getSwitchedTag() { + return switchedTag; + } + + @Override + protected void sections() { + switchedTag = new GSSection(this, getDirection()) { + { + addStyle("flex", "1"); + new InstanceLinkTitleDisplayer(this).addStyle("flex", "0.3"); + new GSAttributeOfInstanceEditor(this); + new GSSection(this, getReverseDirection()) { + { + addStyle("justify-content", "space-between"); + new GSHyperLink(this) { + { + setText("<"); + bindAction(model -> prev(model)); + } + }; + new GSHyperLink(this) { + { + setText(">"); + bindAction(model -> next(model)); + } + }; + } + }; + } + }; + } +} diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSubcellDisplayer.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSubcellDisplayer.java index 46aa37a67..7c073a990 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSubcellDisplayer.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSSubcellDisplayer.java @@ -141,7 +141,7 @@ public GSInstanceSubcellDisplayer(GSTag parent) { public void style(GSTag tag) { super.style(tag); tag.addPrefixBinding(modelContext -> ((Model) modelContext).getObservableStyles(tag).put("background-color", - "Color".equals(StringExtractor.SIMPLE_CLASS_EXTRACTOR.apply(modelContext.getGeneric().getMeta())) ? getGenericStringProperty(tag, modelContext).getValue() : "#dda5e2")); + "Color".equals(StringExtractor.SIMPLE_CLASS_EXTRACTOR.apply(modelContext.getGeneric().getMeta())) ? tag.getGenericStringProperty(modelContext).getValue() : "#dda5e2")); } } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTable.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTable.java index 7e42de7ac..32e87f4be 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTable.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTable.java @@ -43,8 +43,8 @@ protected void titleHeader() { addStyle("justify-content", "center"); new GSH1(this) { { - setStringExtractor(this, StringExtractor.MANAGEMENT); - bindGenericText(this); + setStringExtractor(StringExtractor.MANAGEMENT); + bindGenericText(); } }; } @@ -67,7 +67,7 @@ protected void header() { addStyle("align-items", "center"); new GSLabel(this) { { - bindGenericText(this); + bindGenericText(); } }; @@ -125,10 +125,10 @@ protected void header() { addStyle("margin-bottom", "1px"); addStyle("overflow", "hidden"); addPrefixBinding(modelContext -> modelContext.getObservableStyles(this).put("background-color", - "Color".equals(StringExtractor.SIMPLE_CLASS_EXTRACTOR.apply(modelContext.getGeneric().getMeta())) ? getGenericStringProperty(this, modelContext).getValue() : "#bba5ff")); + "Color".equals(StringExtractor.SIMPLE_CLASS_EXTRACTOR.apply(modelContext.getGeneric().getMeta())) ? getGenericStringProperty(modelContext).getValue() : "#bba5ff")); new GSHyperLink(this) { { - bindGenericText(this); + bindGenericText(); bindAction(model -> getSelectionProperty(model).setValue(model)); } }; @@ -168,7 +168,7 @@ protected void footer() { addStyle("margin-bottom", "1px"); new GSButton(this) { { - setText(this, "Remove"); + setText("Remove"); bindAction(GenericModel::remove); addStyle("width", "100%"); addStyle("height", "100%"); diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTag.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTag.java index ae8b2a305..59421e75d 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTag.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GSTag.java @@ -1,5 +1,6 @@ package org.genericsystem.reactor.gs; +import java.util.function.BiFunction; import java.util.function.Function; import org.genericsystem.common.Generic; @@ -51,6 +52,20 @@ public void select__(Function> applyO super.forEach(model -> applyOnModelContext.apply((GenericModel) model), (model, subElement) -> new GenericModel(model, subElement.getGenerics())); } + public void select(BiFunction, ObservableList> applyOnModel) { + select__(model -> new ListBinding() { + ObservableList holders = ObservableListExtractor.HOLDERS.apply(model.getGenerics()); + { + bind(holders); + } + + @Override + protected ObservableList computeValue() { + return applyOnModel.apply(model, holders); + } + }); + } + public void select(Class genericClass) { forEach_((ObservableListExtractor) gs -> FXCollections.singletonObservableList(gs[0].getRoot().find(genericClass))); } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GenericStringDefaults.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GenericStringDefaults.java index 786af725b..e58ce186e 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GenericStringDefaults.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/GenericStringDefaults.java @@ -1,13 +1,11 @@ package org.genericsystem.reactor.gs; -import java.util.function.Consumer; - -import org.genericsystem.reactor.Model; import org.genericsystem.reactor.html.TextPropertyDefaults; import org.genericsystem.reactor.model.GenericModel; import org.genericsystem.reactor.model.StringExtractor; import javafx.beans.property.Property; +import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.ReadOnlyStringWrapper; import javafx.beans.value.ObservableValue; @@ -16,32 +14,21 @@ public interface GenericStringDefaults extends TextPropertyDefaults consumer); - - void createNewProperty(String propertyName); - - Property getProperty(String property, Model model); - - default ObservableValue getGenericStringProperty(GSTag tag, GenericModel model) { - if (!model.containsProperty(tag, GENERIC_STRING)) - model.storeProperty(tag, GENERIC_STRING, new ReadOnlyStringWrapper(getStringExtractor(tag, model).apply(model.getGeneric()))); - return tag.getProperty(GENERIC_STRING, model); + default ObservableValue getGenericStringProperty(GenericModel model) { + storePropertyWithoutCheck(GENERIC_STRING, model, m -> new ReadOnlyStringWrapper(getStringExtractor(m).apply(m.getGeneric()))); + return getProperty(GENERIC_STRING, model); } - default void bindGenericText(GSTag tag) { - addPrefixBinding(model -> getTextProperty(tag, model).bind(getGenericStringProperty(tag, model))); + default void bindGenericText() { + addPrefixBinding(model -> getTextProperty(model).bind(getGenericStringProperty(model))); } - default StringExtractor getStringExtractor(GSTag tag, GenericModel model) { - Property stringExtractorProperty = tag.getProperty(EXTRACTOR, model); + default StringExtractor getStringExtractor(GenericModel model) { + Property stringExtractorProperty = getProperty(EXTRACTOR, model); return stringExtractorProperty != null ? stringExtractorProperty.getValue() : StringExtractor.SIMPLE_CLASS_EXTRACTOR; } - default void setStringExtractor(GSTag tag, StringExtractor extractor) { - addPrefixBinding(modelContext -> { - if (!modelContext.containsProperty(tag, EXTRACTOR)) - modelContext.createNewProperty(tag, EXTRACTOR); - tag.getProperty(EXTRACTOR, modelContext).setValue(extractor); - }); + default void setStringExtractor(StringExtractor extractor) { + addPrefixBinding(model -> storePropertyWithoutCheck(EXTRACTOR, model, m -> new ReadOnlyObjectWrapper<>(extractor))); } } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gs/SwitchDefaults.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/SwitchDefaults.java new file mode 100644 index 000000000..fc8de4942 --- /dev/null +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gs/SwitchDefaults.java @@ -0,0 +1,75 @@ +package org.genericsystem.reactor.gs; + +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.genericsystem.reactor.Model; +import org.genericsystem.reactor.model.GenericModel; +import org.genericsystem.reactor.model.ObservableListExtractor; + +import javafx.beans.property.Property; +import javafx.beans.property.ReadOnlyIntegerWrapper; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +public interface SwitchDefaults { + + public static final String SUBMODELS = "subModels"; + public static final String INDEX = "index"; + public static final String CURRENT_MODEL = "currentModel"; + + void addPrefixBinding(Consumer consumer); + + void storePropertyWithoutCheck(String propertyName, GenericModel model, Function> applyOnModel); + + Property getProperty(String property, Model model); + + GSTag getSwitchedTag(); + + default ObservableList getSwitchModels(GenericModel model) { + Property> modelsProperty = getProperty(SUBMODELS, model); + return modelsProperty != null ? modelsProperty.getValue() : null; + } + + default Property getCurrentModel(GenericModel model) { + return getProperty(CURRENT_MODEL, model); + } + + default Property getIteratorIndexProperty(GenericModel model) { + return getProperty(INDEX, model); + } + + default void switcher_(ObservableListExtractor observableListExtractor) { + switcher(model -> FXCollections.observableArrayList(observableListExtractor.apply(model.getGenerics()).stream().map(g -> new GenericModel(model, GenericModel.addToGenerics(g, model.getGenerics()))).collect(Collectors.toList()))); + } + + default void switcher(Function> applyOnModel) { + addPrefixBinding(model -> { + storePropertyWithoutCheck(SUBMODELS, model, m -> new SimpleObjectProperty<>(applyOnModel.apply(model))); + storePropertyWithoutCheck(CURRENT_MODEL, model, m -> new SimpleObjectProperty<>(getSwitchModels(model).get(0))); + storePropertyWithoutCheck(INDEX, model, m -> new ReadOnlyIntegerWrapper(0)); + }); + getSwitchedTag().select_(model -> getCurrentModel(model)); + } + + default void next(GenericModel model) { + Property index = getIteratorIndexProperty(model); + ObservableList models = getSwitchModels(model); + if (index.getValue() + 1 < models.size()) { + index.setValue(index.getValue() + 1); + getCurrentModel(model).setValue(models.get(index.getValue())); + } + } + + default void prev(GenericModel model) { + Property index = getIteratorIndexProperty(model); + ObservableList models = getSwitchModels(model); + if (index.getValue() > 0) { + index.setValue(index.getValue() - 1); + getCurrentModel(model).setValue(models.get(index.getValue())); + } + } +} diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSH1.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSH1.java index d07473ee0..fd07689c9 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSH1.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSH1.java @@ -14,7 +14,7 @@ public GSH1(GSTag parent) { public GSH1(GSTag parent, String text) { super(parent, "h1"); - setText(this, text); + setText(text); } @Override diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHeader.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHeader.java index abe7ae763..f10b2156b 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHeader.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHeader.java @@ -15,7 +15,7 @@ public GSHeader(GSTag parent, String string, GSTagConstructor tag1, String strin if (tag1 != null) { GSTag leftTag = tag1.build(this); leftTag.addStyle("flex", "1"); - setText(leftTag, string1); + leftTag.setText(string1); } else { GSTag leftTag = new GSSection(this, FlexDirection.COLUMN); leftTag.addStyle("flex", "1"); @@ -28,7 +28,7 @@ public GSHeader(GSTag parent, String string, GSTagConstructor tag1, String strin if (tag2 != null) { GSTag rightTag = tag2.build(this); rightTag.addStyle("flex", "1"); - setText(rightTag, string2); + rightTag.setText(string2); } else { GSTag rightTag = new GSSection(this, FlexDirection.COLUMN); rightTag.addStyle("flex", "1"); diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHyperLink.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHyperLink.java index b7172b389..f46cc9aee 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHyperLink.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSHyperLink.java @@ -4,13 +4,14 @@ import org.genericsystem.reactor.gs.GSTag; import org.genericsystem.reactor.gs.SelectionDefaults; +import org.genericsystem.reactor.gs.SwitchDefaults; import org.genericsystem.reactor.model.GenericModel; /** * @author Nicolas Feybesse * */ -public class GSHyperLink extends GSTag implements SelectionDefaults { +public class GSHyperLink extends GSTag implements SelectionDefaults, SwitchDefaults { public GSHyperLink(GSTag parent) { super(parent, "a"); @@ -18,7 +19,7 @@ public GSHyperLink(GSTag parent) { public GSHyperLink(GSTag parent, String text) { super(parent, "a"); - setText(this, text); + setText(text); } public GSHyperLink(GSTag parent, String text, Consumer action) { @@ -35,4 +36,8 @@ protected ActionHtmlNode createNode(String parentId) { return new ActionHtmlNode(parentId); } + @Override + public GSTag getSwitchedTag() { + return null; + } } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSLabel.java b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSLabel.java index eb9fcb0aa..b8ace1e02 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSLabel.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/gstag/GSLabel.java @@ -21,7 +21,7 @@ public static class GSLabelDisplayer extends GSLabel { public GSLabelDisplayer(GSTag parent) { super(parent); - bindGenericText(this); + bindGenericText(); } } } diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlH1.java b/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlH1.java index 65b115a2f..a70aaad13 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlH1.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlH1.java @@ -15,7 +15,7 @@ public HtmlH1(Tag parent) { public HtmlH1(Tag parent, String text) { super(parent, "h1"); - setText(this, text); + setText(text); } @Override diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlHyperLink.java b/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlHyperLink.java index c46394c58..26b2d052b 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlHyperLink.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/html/HtmlHyperLink.java @@ -17,7 +17,7 @@ public HtmlHyperLink(Tag parent) { public HtmlHyperLink(Tag parent, String text) { super(parent, "a"); - setText(this, text); + setText(text); } public HtmlHyperLink(Tag parent, String text, Consumer action) { diff --git a/gs-reactor/src/main/java/org/genericsystem/reactor/html/TextPropertyDefaults.java b/gs-reactor/src/main/java/org/genericsystem/reactor/html/TextPropertyDefaults.java index 8d2dfa880..0d7ef5937 100644 --- a/gs-reactor/src/main/java/org/genericsystem/reactor/html/TextPropertyDefaults.java +++ b/gs-reactor/src/main/java/org/genericsystem/reactor/html/TextPropertyDefaults.java @@ -1,9 +1,10 @@ package org.genericsystem.reactor.html; +import java.util.function.Consumer; import java.util.function.Function; import org.genericsystem.reactor.Model; -import org.genericsystem.reactor.Tag; +import org.genericsystem.reactor.ViewContext; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; @@ -14,20 +15,26 @@ public interface TextPropertyDefaults { public static final String TEXT = "text"; - default Property getTextProperty(Tag tag, M model) { - if (!model.containsProperty(tag, TEXT)) { - model.storeProperty(tag, TEXT, new SimpleStringProperty()); - Property text = tag.getProperty(TEXT, model); - text.addListener(new WeakChangeListener<>(model.getViewContext(tag).getNode().getTextListener())); - } - return tag.getProperty(TEXT, model); + void storePropertyWithoutCheck(String propertyName, M model, Function> applyOnModel); + + void addPrefixBinding(Consumer consumer); + + Property getProperty(String property, Model model); + + ViewContext getViewContext(M model); + + default Property getTextProperty(M model) { + storePropertyWithoutCheck(TEXT, model, m -> new SimpleStringProperty()); + Property text = getProperty(TEXT, model); + text.addListener(new WeakChangeListener<>(getViewContext(model).getNode().getTextListener())); + return text; } - default void setText(Tag tag, String value) { - tag.addPrefixBinding(model -> getTextProperty(tag, model).setValue(value)); + default void setText(String value) { + addPrefixBinding(model -> getTextProperty(model).setValue(value)); } - default void bindText(Tag tag, Function> applyOnModel) { - tag.addPrefixBinding(model -> getTextProperty(tag, model).bind(applyOnModel.apply(model))); + default void bindText(Function> applyOnModel) { + addPrefixBinding(model -> getTextProperty(model).bind(applyOnModel.apply(model))); } } diff --git a/gs-todomvc/src/main/java/org/genericsystem/todomvc/Todo.java b/gs-todomvc/src/main/java/org/genericsystem/todomvc/Todo.java index 08854f1e1..88dc0caf6 100644 --- a/gs-todomvc/src/main/java/org/genericsystem/todomvc/Todo.java +++ b/gs-todomvc/src/main/java/org/genericsystem/todomvc/Todo.java @@ -25,7 +25,7 @@ public class Todo extends Model { this.generic = generic; todoString = new ReadOnlyObjectWrapper<>(Objects.toString(generic)); ObservableValue observableHolder = generic.getObservableHolder(generic.getRoot().find(Completed.class)); - if (observableHolder.getValue() != null && Boolean.TRUE.equals((Boolean) observableHolder.getValue().getValue())) { + if (observableHolder.getValue() != null && Boolean.TRUE.equals(observableHolder.getValue().getValue())) { completed.setValue(true); } // completed = Bindings.createBooleanBinding(() -> observableHolder.getValue() != null ? (Boolean) observableHolder.getValue().getValue() : false, observableHolder); diff --git a/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoApp.java b/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoApp.java index 0f9e49dbf..c196ba879 100644 --- a/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoApp.java +++ b/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoApp.java @@ -46,7 +46,7 @@ public TodoApp(Root engine, ServerWebSocket webSocket) { addStyleClass("header"); new HtmlH1(this) { { - setText(this, "todos"); + setText("todos"); } }; new HtmlInputText(this) { @@ -99,7 +99,7 @@ public TodoApp(Root engine, ServerWebSocket webSocket) { }; new HtmlLabel(this) { { - bindText(this, Todo::getTodoString); + bindText(Todo::getTodoString); } }; new HtmlButton(this) { @@ -129,12 +129,12 @@ public TodoApp(Root engine, ServerWebSocket webSocket) { addStyleClass("todo-count"); new HtmlStrong(this) { { - bindText(this, TodoList::getActiveCount); + bindText(TodoList::getActiveCount); } }; new HtmlSpan(this) { { - bindText(this, TodoList::getItems); + bindText(TodoList::getItems); } }; } @@ -163,7 +163,7 @@ public TodoApp(Root engine, ServerWebSocket webSocket) { { addStyleClass("clear-completed"); bindAction(TodoList::removeCompleted); - bindText(this, TodoList::getClearCompleted); + bindText(TodoList::getClearCompleted); bindOptionalStyleClass("hide", "hasNoCompleted", TodoList::getHasNoCompleted); } }; @@ -182,14 +182,14 @@ public TodoApp(Root engine, ServerWebSocket webSocket) { new HtmlButton(this) { { addStyleClass("save"); - bindText(this, TodoList::getSave); + bindText(TodoList::getSave); bindAction(TodoList::save); } }; new HtmlButton(this) { { addStyleClass("cancel"); - bindText(this, TodoList::getCancel); + bindText(TodoList::getCancel); bindAction(TodoList::cancel); } }; diff --git a/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoList.java b/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoList.java index 666e5424d..ac2d26a0c 100644 --- a/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoList.java +++ b/gs-todomvc/src/main/java/org/genericsystem/todomvc/TodoList.java @@ -51,7 +51,7 @@ public TodoList(Root engine) { this.engine = engine; todos = new TransformationObservableList<>(engine.find(Todos.class).getObservableSubInstances(), g -> new Todo(this, g), todo -> new Observable[] { todo.getCompleted() }); filtered = new FilteredList<>(todos); - filtered.predicateProperty().bind(Bindings.createObjectBinding(() -> mode.getValue(), mode)); + filtered.predicateProperty().bind(mode); completedCount = Bindings.size(todos.filtered(COMPLETE)); activeCount = Bindings.size(todos.filtered(ACTIVE)); clearButtonText = Bindings.createStringBinding(() -> "Clear completed (" + completedCount.getValue() + ")", completedCount);