You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/10/11 08:06:15 UTC

[isis] 01/01: ISIS-2877: comments and renaming viewer classes

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

ahuber pushed a commit to branch 2877-compound.value.types
in repository https://gitbox.apache.org/repos/asf/isis.git

commit e54c21f7159c8356f0e6f4ce62bd572ba7d7c2c2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Oct 11 10:06:00 2021 +0200

    ISIS-2877: comments and renaming viewer classes
---
 .../webapp/wicket/jpa/DemoAppWicketJpa.java        |   3 +-
 .../value/CalendarEventSemanticsProvider.java      |  16 +++-
 .../viewer/wicket/model/models/ValueModel.java     |   5 +-
 .../actionresponse/ActionResultResponseType.java   |   3 +
 .../scalars/ComponentFactoryScalarAbstract.java    |   9 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |   8 +-
 .../scalars/ScalarPanelTextFieldAbstract.java      |   2 +-
 .../ScalarPanelTextFieldParseableAbstract.java     |   3 +-
 .../scalars/value/compound/ValueCompoundPanel.java | 100 +++++++++++++++++++++
 .../ValueCompoundPanelFactory.java}                |  28 +++---
 .../scalars/value/compound/ValueCompoundPanex.html |  62 +++++++++++++
 .../ValueFallbackPanel.java}                       |   8 +-
 .../ValueFallbackPanelFactory.java}                |  15 ++--
 .../value/StandaloneValuePanelFactory.java         |   7 +-
 .../ComponentFactoryRegistrarDefault.java          |  36 +++++---
 15 files changed, 252 insertions(+), 53 deletions(-)

diff --git a/examples/demo/wicket/jpa/src/main/java/demoapp/webapp/wicket/jpa/DemoAppWicketJpa.java b/examples/demo/wicket/jpa/src/main/java/demoapp/webapp/wicket/jpa/DemoAppWicketJpa.java
index 8d11d3f..ed14087 100644
--- a/examples/demo/wicket/jpa/src/main/java/demoapp/webapp/wicket/jpa/DemoAppWicketJpa.java
+++ b/examples/demo/wicket/jpa/src/main/java/demoapp/webapp/wicket/jpa/DemoAppWicketJpa.java
@@ -33,6 +33,7 @@ import org.apache.isis.valuetypes.markdown.persistence.jpa.IsisModuleValMarkdown
 import org.apache.isis.valuetypes.markdown.ui.wkt.IsisModuleValMarkdownUiWkt;
 import org.apache.isis.valuetypes.sse.ui.wkt.IsisModuleValSseUiWkt;
 import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer;
+import org.apache.isis.viewer.wicket.viewer.registries.components.ComponentFactoryRegistryDefault;
 
 import demoapp.web.DemoAppManifestJpa;
 import demoapp.webapp.wicket.common.ui.DemoAppWicketCommon;
@@ -77,7 +78,7 @@ public class DemoAppWicketJpa extends SpringBootServletInitializer {
     public static void main(final String[] args) {
     	IsisPresets.prototyping();
         //IsisPresets.logging(WebRequestCycleForIsis.class, "debug");
-        //IsisPresets.logging(ComponentFactoryRegistryDefault.class, "debug");
+        IsisPresets.logging(ComponentFactoryRegistryDefault.class, "debug");
         //IsisPresets.logging(EntityModel.class, "debug");
         //IsisPresets.logging(FormExecutorDefault.class, "debug");
 
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
index 33105bd..78df77e 100644
--- a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
@@ -22,14 +22,17 @@ import java.time.Instant;
 
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.applib.adapters.ValueSemanticsAbstract;
 import org.apache.isis.applib.adapters.DefaultsProvider;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsAbstract;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
 public class CalendarEventSemanticsProvider
 extends ValueSemanticsAbstract<CalendarEvent>
-implements DefaultsProvider<CalendarEvent>{
+implements
+    DefaultsProvider<CalendarEvent>,
+    Renderer<CalendarEvent> {
 
     @Override
     public Class<CalendarEvent> getCorrespondingClass() {
@@ -41,10 +44,19 @@ implements DefaultsProvider<CalendarEvent>{
         return UNREPRESENTED;
     }
 
+    // -- DEFAULTS PROVIDER
+
     @Override
     public CalendarEvent getDefaultValue() {
         return new CalendarEvent(
                 Instant.now().toEpochMilli(), "Default Calendar", "New Event", "empty");
     }
 
+    // -- RENDERER
+
+    @Override
+    public String simpleTextRepresentation(final Context context, final CalendarEvent value) {
+        return render(value, v->v.toString());
+    }
+
 }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
index adb583f..12ca57a 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
@@ -28,7 +28,7 @@ import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import lombok.NonNull;
 
 /**
- * Represents a standalone value.
+ * Represents a standalone value (used for standalone value page).
  */
 public class ValueModel extends ModelAbstract<ManagedObject> {
 
@@ -79,7 +79,4 @@ public class ValueModel extends ModelAbstract<ManagedObject> {
         this.actionModelHint = actionModelHint;
     }
 
-
-
-
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index e2b450f..51ca86e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -78,6 +78,9 @@ public enum ActionResultResponseType {
             return ActionResultResponse.toPage(new StandaloneCollectionPage(collectionModel));
         }
     },
+    /**
+     * Renders the value-type in its own <i>Standalone Value Page</i>.
+     */
     VALUE {
         @Override
         public ActionResultResponse interpretResult(
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
index ee4da87..bfb12ca 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
@@ -25,15 +25,16 @@ import org.apache.isis.viewer.common.model.components.ComponentType;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
 
-public abstract class ComponentFactoryScalarAbstract extends ComponentFactoryAbstract {
+public abstract class ComponentFactoryScalarAbstract
+extends ComponentFactoryAbstract {
 
     private static final long serialVersionUID = 1L;
 
     private final Class<?>[] scalarTypes;
 
-    public ComponentFactoryScalarAbstract(
-            Class<?> componentClass,
-            Class<?>... scalarTypes) {
+    protected ComponentFactoryScalarAbstract(
+            final Class<?> componentClass,
+            final Class<?>... scalarTypes) {
 
         super(ComponentType.SCALAR_NAME_AND_VALUE, componentClass);
         this.scalarTypes = scalarTypes;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index 5a9d242..d90b3b3 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -655,15 +655,15 @@ implements ScalarModelSubscriber {
             throw new IllegalStateException(this.getClass().getName() + ": obtainInlinePromptModel() returning null is not compatible with supportsInlinePrompt() returning true ");
         }
 
-        final WebMarkupContainer inlinePromptLink = new WebMarkupContainer(ID_SCALAR_VALUE_INLINE_PROMPT_LINK);
+        final WebMarkupContainer inlinePromptLink =
+                new WebMarkupContainer(ID_SCALAR_VALUE_INLINE_PROMPT_LINK);
         inlinePromptLink.setOutputMarkupId(true);
         inlinePromptLink.setOutputMarkupPlaceholderTag(true);
 
         configureInlinePromptLink(inlinePromptLink);
 
-        final Component editInlineLinkLabel = createInlinePromptComponent(ID_SCALAR_VALUE_INLINE_PROMPT_LABEL,
-                inlinePromptModel
-                );
+        final Component editInlineLinkLabel =
+                createInlinePromptComponent(ID_SCALAR_VALUE_INLINE_PROMPT_LABEL, inlinePromptModel);
         inlinePromptLink.add(editInlineLinkLabel);
 
         return inlinePromptLink;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 6358d77..0395a18 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -272,7 +272,7 @@ implements TextFieldValueModel.ScalarModelProvider {
 
     /**
      * Mandatory hook method to build the component to render the model when in
-     * {@link org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract.Rendering#COMPACT compact}
+     * {@link org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract.Rendering#COMPACT}
      * format.
      * <p>
      * This default implementation uses a {@link Label}, however it may be overridden if required.
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
index 7ad32d7..1e019fc 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
@@ -31,7 +31,8 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
  * s where moreover the scalar parameter or property is a value type that is
  * parseable.
  */
-public abstract class ScalarPanelTextFieldParseableAbstract extends ScalarPanelTextFieldAbstract<String> {
+public abstract class ScalarPanelTextFieldParseableAbstract
+extends ScalarPanelTextFieldAbstract<String> {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanel.java
new file mode 100644
index 0000000..f3eec78
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanel.java
@@ -0,0 +1,100 @@
+/*
+ *  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.wicket.ui.components.scalars.value.compound;
+
+import org.apache.wicket.markup.html.form.AbstractTextComponent;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.LambdaModel;
+
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldParseableAbstract;
+
+/**
+ * Panel for rendering any value types that do not have their own custom
+ * {@link ScalarPanelAbstract panel} to render them.
+ *
+ * <p>
+ * This is a fallback panel; values are expected to be {@link Parser parseable}
+ * (typically through the Isis' {@link Value} annotation.
+ */
+//FIXME[ISIS-2877] introduced for experiments, should be removed before merge into 'master'
+public class ValueCompoundPanel
+extends ScalarPanelTextFieldParseableAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public ValueCompoundPanel(final String id, final ScalarModel scalarModel) {
+        super(id, scalarModel);
+    }
+
+    @Override
+    protected String getScalarPanelType() {
+        return "valuePanel";
+    }
+
+    @Override
+    protected void onInitialize() {
+        super.onInitialize();
+        onInitializeReadonly(null);
+    }
+
+//    @Override
+//    protected InlinePromptConfig getInlinePromptConfig() {
+//        return InlinePromptConfig.notSupported();
+//    }
+
+    @Override
+    protected AbstractTextComponent<String> createTextFieldForRegular(final String id) {
+        return new TextField<>(id, LambdaModel.of(()->
+            renderer().simpleTextRepresentation(null, scalarModel.getObject().getPojo())));
+    }
+
+
+//    @Override
+//    protected Component createComponentForCompact() {
+//        val objAdapter = getModel().getObject();
+//        return new Label(ID_SCALAR_IF_COMPACT, "compact");
+//                //renderer().simpleTextRepresentation(null, objAdapter.getPojo()));
+//    }
+//
+//    @Override
+//    protected MarkupContainer createComponentForRegular() {
+//        return new LabeledWebMarkupContainer(ID_SCALAR_IF_REGULAR, Model.of("regular")) {};
+//    }
+//
+//    @Override
+//    protected Component getScalarValueComponent() {
+//        return new Label(ID_SCALAR_VALUE, "regular");
+//
+////        val formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, null);
+////        return formGroup;
+//    }
+
+    // -- HELPER
+
+    private Renderer renderer() {
+        final ValueFacet<?> valueFacet = scalarModel.getScalarTypeSpec().getFacet(ValueFacet.class);
+        return valueFacet.selectDefaultRenderer().get();
+    }
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanelFactory.java
similarity index 69%
copy from viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
copy to viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanelFactory.java
index dc64544..3cab8b9 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanelFactory.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.wicket.ui.components.scalars.value;
+package org.apache.isis.viewer.wicket.ui.components.scalars.value.compound;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
@@ -26,15 +26,19 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ComponentFactoryScalarAbstract;
 
+import lombok.val;
+
 /**
- * {@link ComponentFactory} for the {@link ValuePanel}.
+ * {@link ComponentFactory} for the {@link ValueCompoundPanel}.
  */
-public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
+//FIXME[ISIS-2877] introduced for experiments, should be removed before merge into 'master'
+public class ValueCompoundPanelFactory
+extends ComponentFactoryScalarAbstract {
 
     private static final long serialVersionUID = 1L;
 
-    public ValuePanelFactory() {
-        super(ValuePanel.class); // not asking the supertype to validate types, so no value types need be provided.
+    public ValueCompoundPanelFactory() {
+        super(ValueCompoundPanel.class);
     }
 
     @Override
@@ -42,20 +46,20 @@ public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
         if (!(model instanceof ScalarModel)) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
-        final ScalarModel scalarModel = (ScalarModel) model;
-        final ValueFacet valueFacet = scalarModel.getScalarTypeSpec().getFacet(ValueFacet.class);
+        val scalarModel = (ScalarModel) model;
+        if(scalarModel.isCollection()) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        final ValueFacet<?> valueFacet = scalarModel.getScalarTypeSpec().getFacet(ValueFacet.class);
         if(valueFacet == null) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
-        final boolean hasChoices = scalarModel.hasChoices();
-        // autoComplete not supported on values, only references
-        // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
-        return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
+        return appliesIf(valueFacet.selectDefaultRenderer().isPresent());
     }
 
     @Override
     public Component createComponent(final String id, final ScalarModel scalarModel) {
-        return new ValuePanel(id, scalarModel);
+        return new ValueCompoundPanel(id, scalarModel);
     }
 
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanex.html b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanex.html
new file mode 100644
index 0000000..ffb7411
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanex.html
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:wicket="http://wicket.apache.org"
+      xml:lang="en"
+      lang="en">
+<body>
+<wicket:panel>
+    <div class="scalarNameAndValueComponentType"
+         wicket:id="scalarTypeContainer">
+
+        <div class="form-group"
+             wicket:id="scalarIfRegular">
+
+            <label class="scalarName col-form-label"
+                   wicket:id="scalarName"
+            >[Label text]</label>
+
+            <span class="scalarValueWrapper">
+                <div class="scalarPlaceholder">
+                    <span class="scalarValueInput">
+                        <span class="editing">
+                            <span class="scalarValue text-right">
+                                <span name="scalarValue" wicket:id="scalarValue" />
+                            </span>
+                        </span>
+                    </span>
+                    <span class="associatedActionLinksRight"
+                          wicket:id="associatedActionLinksRight"
+                    >[drop down]</span>
+                </div>
+                <span wicket:id="feedback" class="form-text"></span>
+                <span wicket:id="associatedActionLinksBelow"></span>
+            </span>
+            <div class="clearfix"></div>
+        </div>
+
+        <wicket:container wicket:id="scalarIfCompact"></wicket:container>
+    </div>
+
+</wicket:panel>
+</body>
+</html>
+
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanel.java
similarity index 88%
rename from viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanel.java
rename to viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanel.java
index d875e3f..3736dce 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanel.java
@@ -16,8 +16,9 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.wicket.ui.components.scalars.value;
+package org.apache.isis.viewer.wicket.ui.components.scalars.value.fallback;
 
+import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
@@ -31,11 +32,12 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldP
  * This is a fallback panel; values are expected to be {@link Parser parseable}
  * (typically through the Isis' {@link Value} annotation.
  */
-public class ValuePanel extends ScalarPanelTextFieldParseableAbstract {
+public class ValueFallbackPanel
+extends ScalarPanelTextFieldParseableAbstract {
 
     private static final long serialVersionUID = 1L;
 
-    public ValuePanel(final String id, final ScalarModel scalarModel) {
+    public ValueFallbackPanel(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanelFactory.java
similarity index 81%
rename from viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
rename to viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanelFactory.java
index dc64544..ae86a4f 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanelFactory.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.wicket.ui.components.scalars.value;
+package org.apache.isis.viewer.wicket.ui.components.scalars.value.fallback;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
@@ -27,14 +27,15 @@ import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ComponentFactoryScalarAbstract;
 
 /**
- * {@link ComponentFactory} for the {@link ValuePanel}.
+ * {@link ComponentFactory} for the {@link ValueFallbackPanel}.
  */
-public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
+public class ValueFallbackPanelFactory
+extends ComponentFactoryScalarAbstract {
 
     private static final long serialVersionUID = 1L;
 
-    public ValuePanelFactory() {
-        super(ValuePanel.class); // not asking the supertype to validate types, so no value types need be provided.
+    public ValueFallbackPanelFactory() {
+        super(ValueFallbackPanel.class); // not asking the supertype to validate types, so no value types need be provided.
     }
 
     @Override
@@ -43,7 +44,7 @@ public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
         final ScalarModel scalarModel = (ScalarModel) model;
-        final ValueFacet valueFacet = scalarModel.getScalarTypeSpec().getFacet(ValueFacet.class);
+        final ValueFacet<?> valueFacet = scalarModel.getScalarTypeSpec().getFacet(ValueFacet.class);
         if(valueFacet == null) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
@@ -55,7 +56,7 @@ public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
 
     @Override
     public Component createComponent(final String id, final ScalarModel scalarModel) {
-        return new ValuePanel(id, scalarModel);
+        return new ValueFallbackPanel(id, scalarModel);
     }
 
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanelFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanelFactory.java
index 393eaa9..e6f7786 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanelFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanelFactory.java
@@ -29,7 +29,8 @@ import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
 /**
  * {@link ComponentFactory} for rendering standalone values..
  */
-public class StandaloneValuePanelFactory extends ComponentFactoryAbstract {
+public class StandaloneValuePanelFactory
+extends ComponentFactoryAbstract {
 
     private static final long serialVersionUID = 1L;
 
@@ -39,7 +40,9 @@ public class StandaloneValuePanelFactory extends ComponentFactoryAbstract {
 
     @Override
     public ApplicationAdvice appliesTo(final IModel<?> model) {
-        return ApplicationAdvice.appliesIf(model instanceof ValueModel && ((ValueModel)model).getObject() != null);
+        return ApplicationAdvice.appliesIf(
+                model instanceof ValueModel
+                    && ((ValueModel)model).getObject() != null);
     }
 
     @Override
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 69dfcfc..e2c70a2 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -18,7 +18,14 @@
  */
 package org.apache.isis.viewer.wicket.viewer.registries.components;
 
-import lombok.extern.log4j.Log4j2;
+import java.util.List;
+
+import javax.annotation.Priority;
+import javax.inject.Named;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
@@ -64,11 +71,19 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.JodaLocalTim
 import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanelFactories;
 import org.apache.isis.viewer.wicket.ui.components.scalars.oiddto.OidDtoPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.passwd.IsisPasswordPanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.*;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BooleanPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BytePanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.CharacterPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.DoublePanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.FloatPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.IntegerPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.LongPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.ShortPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.uuid.UuidPanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.scalars.value.ValuePanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.value.compound.ValueCompoundPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.value.fallback.ValueFallbackPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2PanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.standalonecollection.StandaloneCollectionPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.tree.TreePanelFactories;
@@ -77,12 +92,8 @@ import org.apache.isis.viewer.wicket.ui.components.value.StandaloneValuePanelFac
 import org.apache.isis.viewer.wicket.ui.components.voidreturn.VoidReturnPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.welcome.WelcomePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanelFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
 
-import javax.annotation.Priority;
-import javax.inject.Named;
-import java.util.List;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Default implementation of {@link ComponentFactoryRegistrar} that registers a
@@ -156,11 +167,11 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
         addComponentFactoriesForUnknown(componentFactories);
     }
 
-    protected void addComponentFactoriesForPageHeader(ComponentFactoryList componentFactories) {
+    protected void addComponentFactoriesForPageHeader(final ComponentFactoryList componentFactories) {
         componentFactories.add(new HeaderPanelFactory());
     }
 
-    protected void addComponentFactoriesForPageFooter(ComponentFactoryList componentFactories) {
+    protected void addComponentFactoriesForPageFooter(final ComponentFactoryList componentFactories) {
         componentFactories.add(new FooterPanelFactory());
     }
 
@@ -246,7 +257,8 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
         componentFactories.add(new Jdk8LocalDatePanelFactory());
         componentFactories.add(new Jdk8LocalDateTimePanelFactory());
 
-        componentFactories.add(new ValuePanelFactory());
+        componentFactories.add(new ValueCompoundPanelFactory());
+        componentFactories.add(new ValueFallbackPanelFactory());
 
         // or for choices
         componentFactories.add(new ValueChoicesSelect2PanelFactory());
@@ -284,7 +296,7 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
         componentFactories.add(new TertiaryMenuPanelFactory());
     }
 
-    protected void addComponentFactoriesForBreadcrumbs(ComponentFactoryList componentFactories) {
+    protected void addComponentFactoriesForBreadcrumbs(final ComponentFactoryList componentFactories) {
         componentFactories.add(new BookmarkedPagesPanelFactory());
     }