This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 684837a  ISIS-2340: fx: naive LocalDate support
684837a is described below

commit 684837ae0f2d74aa58669997d8117da8d9b4bb42
Author: Andi Huber <[email protected]>
AuthorDate: Thu Aug 13 16:04:28 2020 +0200

    ISIS-2340: fx: naive LocalDate support
---
 .../javafx/ui/IsisModuleIncViewerJavaFxUi.java     |  2 +
 .../components/temporal/TemporalFieldFactory.java  | 87 ++++++++++++++++++++++
 .../binding/NumberConverterForStringComponent.java |  2 +-
 .../common/model/binding/TemporalConverter.java    | 63 ++++++++++++++++
 4 files changed, 153 insertions(+), 1 deletion(-)

diff --git 
a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java
 
b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java
index 461b965..bf8701a 100644
--- 
a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java
+++ 
b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java
@@ -27,6 +27,7 @@ import 
org.apache.isis.incubator.viewer.javafx.ui.components.markup.MarkupFieldF
 import 
org.apache.isis.incubator.viewer.javafx.ui.components.number.NumberFieldFactory;
 import 
org.apache.isis.incubator.viewer.javafx.ui.components.objectref.ObjectReferenceFieldFactory;
 import 
org.apache.isis.incubator.viewer.javafx.ui.components.other.FallbackFieldFactory;
+import 
org.apache.isis.incubator.viewer.javafx.ui.components.temporal.TemporalFieldFactory;
 import 
org.apache.isis.incubator.viewer.javafx.ui.components.text.TextFieldFactory;
 import 
org.apache.isis.incubator.viewer.javafx.ui.decorator.disabling.DisablingDecoratorForButton;
 import 
org.apache.isis.incubator.viewer.javafx.ui.decorator.disabling.DisablingDecoratorForFormField;
@@ -61,6 +62,7 @@ import 
org.apache.isis.viewer.common.model.IsisModuleViewerCommon;
         MarkupFieldFactory.class,
         ObjectReferenceFieldFactory.class,
         NumberFieldFactory.class,
+        TemporalFieldFactory.class,
         FallbackFieldFactory.class,
         
         // Decorators
diff --git 
a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/temporal/TemporalFieldFactory.java
 
b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/temporal/TemporalFieldFactory.java
new file mode 100644
index 0000000..2c68854
--- /dev/null
+++ 
b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/temporal/TemporalFieldFactory.java
@@ -0,0 +1,87 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.incubator.viewer.javafx.ui.components.temporal;
+
+import javax.inject.Inject;
+
+import org.springframework.core.annotation.Order;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.core.metamodel.interactions.managed.ManagedParameter;
+import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
+import org.apache.isis.incubator.viewer.javafx.model.binding.BindingsFx;
+import 
org.apache.isis.incubator.viewer.javafx.ui.components.UiComponentHandlerFx;
+import org.apache.isis.viewer.common.model.binding.TemporalConverter;
+import 
org.apache.isis.viewer.common.model.components.UiComponentFactory.ComponentRequest;
+
+import javafx.scene.Node;
+import javafx.scene.control.DatePicker;
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+
[email protected]
+@Order(OrderPrecedence.MIDPOINT)
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
+public class TemporalFieldFactory implements UiComponentHandlerFx {
+
+    @Override
+    public boolean isHandling(ComponentRequest request) {
+        return 
request.hasFeatureTypeFacetAnyOf(TemporalConverter.getSupportedFacets());
+    }
+
+    @Override
+    public Node handle(ComponentRequest request) {
+
+        val uiComponent = new DatePicker();
+        val valueSpec = request.getFeatureTypeSpec();
+        val converter = new TemporalConverter(valueSpec);
+        
+        if(request.getManagedFeature() instanceof ManagedParameter) {
+
+            val managedParameter = 
(ManagedParameter)request.getManagedFeature();
+
+            BindingsFx.bindBidirectional(
+                    uiComponent.valueProperty(),
+                    managedParameter.getValue(),
+                    converter);
+
+            //TODO bind parameter validation feedback
+
+        } else if(request.getManagedFeature() instanceof ManagedProperty) {
+
+            val managedProperty = (ManagedProperty)request.getManagedFeature();
+
+            // readonly binding
+            BindingsFx.bind(
+                    uiComponent.valueProperty(),
+                    managedProperty.getValue(),
+                    converter);
+
+            //TODO allow property editing
+            //TODO bind property validation feedback
+        }
+
+        return uiComponent;
+    }
+
+    // -- HELPER
+
+
+
+}
diff --git 
a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
 
b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
index 0c31776..a55a705 100644
--- 
a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
+++ 
b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
@@ -49,7 +49,7 @@ public final class NumberConverterForStringComponent 
implements BindingConverter
 
         this.valueFacet = lookupFacetOneOf(getSupportedFacets())
                 .map(ValueSemanticsProviderAndFacetAbstract.class::cast)
-                .orElseThrow(()->_Exceptions.noSuchElement("missing 'double' 
or 'float' value facet"));
+                .orElseThrow(()->_Exceptions.noSuchElement("missing 'number' 
value facet"));
     }
 
     @Override
diff --git 
a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/TemporalConverter.java
 
b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/TemporalConverter.java
new file mode 100644
index 0000000..64e1a96
--- /dev/null
+++ 
b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/TemporalConverter.java
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.common.model.binding;
+
+import java.time.LocalDate;
+
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacet;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+import lombok.Getter;
+import lombok.val;
+
+public final class TemporalConverter implements BindingConverter<LocalDate> {
+
+    @Getter(onMethod_ = {@Override})
+    private final ObjectSpecification valueSpecification;
+    private final TemporalValueFacet<?> valueFacet; 
+
+    public TemporalConverter(final ObjectSpecification valueSpecification) {
+        this.valueSpecification = valueSpecification;
+
+        this.valueFacet = (TemporalValueFacet<?>) 
lookupFacetOneOf(getSupportedFacets())
+                .orElseThrow(()->_Exceptions.noSuchElement("missing 'temporal' 
value facet"));
+    }
+
+    @Override
+    public ManagedObject wrap(LocalDate localDate) {
+        return ManagedObject.of(getValueSpecification(), localDate);
+    }
+
+    @Override
+    public LocalDate unwrap(ManagedObject object) {
+        val localDate = (LocalDate) ManagedObjects.UnwrapUtil.single(object);
+        return localDate;
+    }
+    
+    // for performance reasons in order of likelihood (just guessing)
+    @Getter
+    private final static Can<Class<? extends Facet>> supportedFacets = Can.of(
+            TemporalValueFacet.class);
+
+}
\ No newline at end of file

Reply via email to