You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/04/25 06:20:31 UTC

isis git commit: ISIS-1603: teases apart ScalarPanelAbstract.

Repository: isis
Updated Branches:
  refs/heads/ISIS-1603-no-xeditable 328a29710 -> b3dab4952


ISIS-1603: teases apart ScalarPanelAbstract.

Some of its subclasses completely overrode its markup, whereas ScalarPanelTextField extended it   So, trying to clarify/simplify.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/b3dab495
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/b3dab495
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/b3dab495

Branch: refs/heads/ISIS-1603-no-xeditable
Commit: b3dab4952540d718d71f92086cb210694d8df31c
Parents: 328a297
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Apr 25 07:20:21 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Apr 25 07:20:21 2017 +0100

----------------------------------------------------------------------
 .../applib/layout/component/component.xsd       |   6 +-
 .../actions/ActionParametersFormPanel.java      |   9 +-
 .../ui/components/scalars/PanelWithChoices.java |  26 ++
 .../components/scalars/ScalarPanelAbstract.html |  84 -----
 .../components/scalars/ScalarPanelAbstract.java | 361 ++++++++-----------
 .../scalars/ScalarPanelAbstract2.html           |  84 +++++
 .../scalars/ScalarPanelAbstract2.java           | 130 +++++++
 .../scalars/ScalarPanelTextFieldAbstract.java   |   2 +-
 .../scalars/reference/ReferencePanel.java       |   9 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  |   6 +-
 10 files changed, 406 insertions(+), 311 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
index cd1d56f..9d9749b 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
@@ -60,12 +60,15 @@
       <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
     </xs:sequence>
     <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="promptStyle" type="tns:promptStyle"/>
     <xs:attribute name="hidden" type="tns:where"/>
     <xs:attribute name="id" type="xs:string" use="required"/>
     <xs:attribute name="labelPosition" type="tns:labelPosition"/>
     <xs:attribute name="multiLine" type="xs:int"/>
     <xs:attribute name="namedEscaped" type="xs:boolean"/>
+
+    <!-- 1.15.0-SNAPSHOT -->
+    <xs:attribute name="promptStyle" type="tns:promptStyle"/>
+
     <xs:attribute name="renderedAsDayBefore" type="xs:boolean"/>
     <xs:attribute name="typicalLength" type="xs:int"/>
   </xs:complexType>
@@ -101,6 +104,7 @@
     </xs:restriction>
   </xs:simpleType>
 
+  <!-- 1.15.0-SNAPSHOT -->
   <xs:simpleType name="promptStyle">
     <xs:restriction base="xs:string">
       <xs:enumeration value="DIALOG"/>

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index daf7c62..0ee44c9 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -38,6 +38,7 @@ import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.ActionArgumentModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.scalars.PanelWithChoices;
 import org.apache.isis.viewer.wicket.ui.panels.PromptFormPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber;
@@ -148,11 +149,13 @@ public class ActionParametersFormPanel extends PromptFormPanelAbstract<ActionMod
                 final int numParams = action.getParameterCount();
                 for (int i = 0; i < numParams; i++) {
                     final ScalarPanelAbstract paramPanel = paramPanels.get(i);
-                    if(paramPanel != null) {
-                        // this could throw a ConcurrencyException as we may have to reload the 
+                    if(paramPanel != null && paramPanel instanceof PanelWithChoices) {
+                        final PanelWithChoices panelWithChoices = (PanelWithChoices) paramPanel;
+
+                        // this could throw a ConcurrencyException as we may have to reload the
                         // object adapter of the action in order to compute the choices
                         // (and that object adapter might have changed)
-                        if (paramPanel.updateChoices(pendingArguments)) {
+                        if (panelWithChoices.updateChoices(pendingArguments)) {
                             paramPanel.repaint(target);
                         }
                     }

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/PanelWithChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/PanelWithChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/PanelWithChoices.java
new file mode 100644
index 0000000..3b80a26
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/PanelWithChoices.java
@@ -0,0 +1,26 @@
+/**
+ *  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;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+
+public interface PanelWithChoices {
+
+    boolean updateChoices(ObjectAdapter[] argsIfAvailable);
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
deleted file mode 100644
index 6238772..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<?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 wicket:id="scalarTypeContainer"
-                 class="scalarNameAndValueComponentType" >
-
-                <div wicket:id="scalarIfRegular"
-                     class="form-group" >
-
-                    <label wicket:id="scalarName"
-                           class="scalarName control-label"
-                    >[Label text]</label>
-
-                    <span class="scalarValueWrapper">
-                        <div class="scalarPlaceholder">
-                            <span class="scalarValueInput">
-                                <span class="editing">
-                                    <wicket:child/>
-                                    <a wicket:id="editProperty"
-                                       href="#"
-                                       class="edit fa fa-pencil-square-o"></a>
-                                    <a
-                                            href="#"
-                                            name="scalarValueEditInline"
-                                            class="form-control input-sm scalarValueEditInline"
-                                            wicket:id="scalarValueEditInline">
-                                        <span wicket:id="scalarValueEditInlineLabel"></span>
-                                    </a>
-                                </span>
-                            </span>
-
-                            <span wicket:id="associatedActionLinksRight"
-                                  class="associatedActionLinksRight"
-                            >[drop down]</span>
-                        </div>
-                        <span wicket:id="feedback" class="help-block"></span>
-                        <span wicket:id="associatedActionLinksBelow"></span>
-                    </span>
-                    <div class="clearfix"></div>
-
-                </div>
-
-                <div wicket:id="scalarIfRegularInlineEditForm" class="inlineEditForm" >
-                    <div><span>property edit form</span></div>
-                </div>
-
-                <wicket:container wicket:id="scalarIfCompact"></wicket:container>
-            </div>
-
-            <wicket:fragment wicket:id="compactAsInputCheckbox">
-                <input wicket:id="scalarIfCompact"
-                       type="checkbox"
-                       class="form-control" />
-            </wicket:fragment>
-
-            <wicket:fragment wicket:id="compactAsSpan">
-                <span wicket:id="scalarIfCompact"></span>
-            </wicket:fragment>
-        </wicket:panel>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index acf22d3..eb06d58 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -31,11 +31,8 @@ import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.LabeledWebMarkupContainer;
-import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -43,18 +40,15 @@ import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
-import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
-import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormExecutor;
-import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormPanel;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPanel;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPromptHeaderPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
@@ -64,134 +58,35 @@ import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 
-/**
- * Adapter for {@link PanelAbstract panel}s that use a {@link ScalarModel} as
- * their backing model.
- * 
- * <p>
- * Supports the concept of being {@link Rendering#COMPACT} (eg within a table) or
- * {@link Rendering#REGULAR regular} (eg within a form).
- */
 public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> implements ScalarModelProvider {
 
     private static final long serialVersionUID = 1L;
 
-    protected static final String ID_SCALAR_TYPE_CONTAINER = "scalarTypeContainer";
-
+    protected static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
     protected static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular";
     protected static final String ID_SCALAR_NAME = "scalarName";
     protected static final String ID_SCALAR_VALUE = "scalarValue";
 
-    protected static final String ID_SCALAR_VALUE_EDIT_INLINE = "scalarValueEditInline";
-    protected static final String ID_SCALAR_VALUE_EDIT_INLINE_LABEL = "scalarValueEditInlineLabel";
-
-    protected static final String ID_SCALAR_IF_REGULAR_INLINE_EDIT_FORM = "scalarIfRegularInlineEditForm";
-
-    protected static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
-
-    private static final String ID_ASSOCIATED_ACTION_LINKS_BELOW = "associatedActionLinksBelow";
-    private static final String ID_ASSOCIATED_ACTION_LINKS_RIGHT = "associatedActionLinksRight";
 
     private static final String ID_EDIT_PROPERTY = "editProperty";
     private static final String ID_FEEDBACK = "feedback";
+    private static final String ID_ASSOCIATED_ACTION_LINKS_BELOW = "associatedActionLinksBelow";
+    private static final String ID_ASSOCIATED_ACTION_LINKS_RIGHT = "associatedActionLinksRight";
 
-    public enum CompactType {
-        INPUT_CHECKBOX,
-        SPAN
-    }
-
-    public enum Rendering {
-        /**
-         * Does not show labels, eg for use in tables
-         */
-        COMPACT {
-            @Override
-            public String getLabelCaption(final LabeledWebMarkupContainer labeledContainer) {
-                return "";
-            }
-
-            @Override
-            public void buildGui(final ScalarPanelAbstract panel) {
-                panel.getComponentForRegular().setVisible(false);
-            }
-
-            @Override
-            public Where getWhere() {
-                return Where.PARENTED_TABLES;
-            }
-        },
-        /**
-         * Does show labels, eg for use in forms.
-         */
-        REGULAR {
-            @Override
-            public String getLabelCaption(final LabeledWebMarkupContainer labeledContainer) {
-                return labeledContainer.getLabel().getObject();
-            }
-
-            @Override
-            public void buildGui(final ScalarPanelAbstract panel) {
-                panel.getLabelForCompact().setVisible(false);
-            }
-
-            @Override
-            public Where getWhere() {
-                return Where.OBJECT_FORMS;
-            }
-        };
-
-        public abstract String getLabelCaption(LabeledWebMarkupContainer labeledContainer);
-
-        public abstract void buildGui(ScalarPanelAbstract panel);
-
-        public abstract Where getWhere();
-
-        private static Rendering renderingFor(RenderingHint renderingHint) {
-            return renderingHint.isInTable()? Rendering.COMPACT: Rendering.REGULAR;
-        }
-    }
+    // ///////////////////////////////////////////////////////////////////
 
     protected final ScalarModel scalarModel;
 
-    protected WebMarkupContainer scalarTypeContainer;
-
     protected Component scalarIfCompact;
     protected Component scalarIfRegular;
-    protected WebMarkupContainer scalarIfRegularInlineEditForm;
-
-    protected WebMarkupContainer editInlineLink;
-
 
     public ScalarPanelAbstract(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
         this.scalarModel = scalarModel;
     }
 
-    protected Fragment getCompactFragment(CompactType type) {
-        Fragment compactFragment;
-        switch (type) {
-            case INPUT_CHECKBOX:
-                compactFragment = new Fragment("scalarIfCompact", "compactAsInputCheckbox", ScalarPanelAbstract.this);
-                break;
-            case SPAN:
-            default:
-                compactFragment = new Fragment("scalarIfCompact", "compactAsSpan", ScalarPanelAbstract.this);
-                break;
-        }
-        return compactFragment;
-    }
-
-    protected Rendering getRendering() {
-        return Rendering.renderingFor(scalarModel.getRenderingHint());
-    }
-
-    protected Component getLabelForCompact() {
-        return scalarIfCompact;
-    }
 
-    public Component getComponentForRegular() {
-        return scalarIfRegular;
-    }
+    // ///////////////////////////////////////////////////////////////////
 
     @Override
     protected void onBeforeRender() {
@@ -215,6 +110,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         super.onBeforeRender();
     }
 
+
     /**
      * hook for highly dynamic components, eg conditional choices.
      *
@@ -228,27 +124,65 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
     /**
      * Builds GUI lazily prior to first render.
-     * 
+     *
      * <p>
      * This design allows the panel to be configured first.
      *
      * @see #onBeforeRender()
      */
     private void buildGui() {
-        
+
         // REVIEW: this is nasty, both write to the same entityLink field
         // even though only one is used
         scalarIfCompact = addComponentForCompact();
         scalarIfRegular = addComponentForRegular();
-        
+
         getRendering().buildGui(this);
         addCssForMetaModel();
-        
+
         if(!subscribers.isEmpty()) {
             addFormComponentBehavior(new ScalarUpdatingBehavior());
         }
     }
 
+
+    /**
+     * Optional hook.
+     */
+    protected void onBeforeRenderWhenViewMode() {
+    }
+
+    /**
+     * Optional hook.
+     */
+    protected void onBeforeRenderWhenDisabled(final String disableReason) {
+    }
+
+    /**
+     * Optional hook.
+     */
+    protected void onBeforeRenderWhenEnabled() {
+    }
+
+
+    private void addCssForMetaModel() {
+        final String cssForMetaModel = getModel().getLongName();
+        if (cssForMetaModel != null) {
+            add(new AttributeAppender("class", Model.of(cssForMetaModel), " "));
+        }
+
+        ScalarModel model = getModel();
+        final CssClassFacet facet = model.getFacet(CssClassFacet.class);
+        if(facet != null) {
+            final ObjectAdapter parentAdapter = model.getParentObjectAdapterMemento().getObjectAdapter(
+                    AdapterManager.ConcurrencyChecking.NO_CHECK,
+                    getPersistenceSession(), getSpecificationLoader());
+            final String cssClass = facet.cssClass(parentAdapter);
+            CssClassAppender.appendCssClassTo(this, cssClass);
+        }
+    }
+
+
     protected class ScalarUpdatingBehavior extends AjaxFormComponentUpdatingBehavior {
         private static final long serialVersionUID = 1L;
 
@@ -272,27 +206,83 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         }
     }
 
+
+    // //////////////////////////////////////
+
+    private final List<ScalarModelSubscriber> subscribers = Lists.newArrayList();
+
+    public void notifyOnChange(final ScalarModelSubscriber subscriber) {
+        subscribers.add(subscriber);
+    }
+
+
+    // ///////////////////////////////////////////////////////////////////
+
     /**
      * Mandatory hook.
      */
     protected abstract void addFormComponentBehavior(Behavior behavior);
 
-    private void addCssForMetaModel() {
-        final String cssForMetaModel = getModel().getLongName();
-        if (cssForMetaModel != null) {
-            add(new AttributeAppender("class", Model.of(cssForMetaModel), " "));
-        }
+    // ///////////////////////////////////////////////////////////////////
 
-        ScalarModel model = getModel();
-        final CssClassFacet facet = model.getFacet(CssClassFacet.class);
-        if(facet != null) {
-            final ObjectAdapter parentAdapter = model.getParentObjectAdapterMemento().getObjectAdapter(ConcurrencyChecking.NO_CHECK,
-                    getPersistenceSession(), getSpecificationLoader());
-            final String cssClass = facet.cssClass(parentAdapter);
-            CssClassAppender.appendCssClassTo(this, cssClass);
+    public enum Rendering {
+        /**
+         * Does not show labels, eg for use in tables
+         */
+        COMPACT {
+            @Override
+            public String getLabelCaption(final LabeledWebMarkupContainer labeledContainer) {
+                return "";
+            }
+
+            @Override
+            public void buildGui(final ScalarPanelAbstract panel) {
+                panel.getComponentForRegular().setVisible(false);
+            }
+
+            @Override
+            public Where getWhere() {
+                return Where.PARENTED_TABLES;
+            }
+        },
+        /**
+         * Does show labels, eg for use in forms.
+         */
+        REGULAR {
+            @Override
+            public String getLabelCaption(final LabeledWebMarkupContainer labeledContainer) {
+                return labeledContainer.getLabel().getObject();
+            }
+
+            @Override
+            public void buildGui(final ScalarPanelAbstract panel) {
+                panel.getLabelForCompact().setVisible(false);
+            }
+
+            @Override
+            public Where getWhere() {
+                return Where.OBJECT_FORMS;
+            }
+        };
+
+        public abstract String getLabelCaption(LabeledWebMarkupContainer labeledContainer);
+
+        public abstract void buildGui(ScalarPanelAbstract panel);
+
+        public abstract Where getWhere();
+
+        private static Rendering renderingFor(EntityModel.RenderingHint renderingHint) {
+            return renderingHint.isInTable()? Rendering.COMPACT: Rendering.REGULAR;
         }
     }
 
+    protected Rendering getRendering() {
+        return Rendering.renderingFor(scalarModel.getRenderingHint());
+    }
+
+
+    // ///////////////////////////////////////////////////////////////////
+
     /**
      * Mandatory hook method to build the component to render the model when in
      * {@link Rendering#REGULAR regular} format.
@@ -301,10 +291,17 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
     protected abstract Component addComponentForCompact();
 
-    protected void addFeedbackOnlyTo(final MarkupContainer markupContainer, final Component component) {
-        markupContainer.addOrReplace(new NotificationPanel(ID_FEEDBACK, component, new ComponentFeedbackMessageFilter(component)));
+    protected Component getLabelForCompact() {
+        return scalarIfCompact;
     }
 
+    public Component getComponentForRegular() {
+        return scalarIfRegular;
+    }
+
+
+    // ///////////////////////////////////////////////////////////////////
+
     protected void addEditPropertyTo(
             final MarkupContainer scalarIfRegularFormGroup) {
 
@@ -342,66 +339,24 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
     }
 
-    protected void configureInlineEditCallback() {
-
-        final PromptStyle editStyle = this.scalarModel.getPromptStyle();
-        if(editStyle == PromptStyle.INLINE) {
-
-            if(editInlineLink != null) {
-                editInlineLink.add(new AjaxEventBehavior("click") {
-                    @Override
-                    protected void onEvent(final AjaxRequestTarget target) {
-
-                        scalarModel.toEditMode();
-
-                        // dynamically update the edit form.
-                        final PropertyEditFormExecutor formExecutor =
-                                new PropertyEditFormExecutor(ScalarPanelAbstract.this, scalarModel);
-                        scalarModel.setFormExecutor(formExecutor);
-                        scalarModel.setInlinePromptContext(
-                                new ScalarModel.InlinePromptContext(scalarIfRegular, scalarIfRegularInlineEditForm));
-
-                        scalarIfRegularInlineEditForm = (PropertyEditFormPanel) getComponentFactoryRegistry().addOrReplaceComponent(
-                                scalarTypeContainer, ID_SCALAR_IF_REGULAR_INLINE_EDIT_FORM, ComponentType.PROPERTY_EDIT_FORM, scalarModel);
-
 
-                        scalarIfRegular.setVisible(false);
-                        scalarIfRegularInlineEditForm.setVisible(true);
-
-                        target.add(scalarTypeContainer);
-                    }
-
-                    @Override
-                    public boolean isEnabled(final Component component) {
-                        return true;
-                    }
-                });
-            }
-        }
+    protected void addFeedbackOnlyTo(final MarkupContainer markupContainer, final Component component) {
+        markupContainer.addOrReplace(new NotificationPanel(ID_FEEDBACK, component, new ComponentFeedbackMessageFilter(component)));
     }
 
-    /**
-     * Optional hook.
-     */
-    protected void onBeforeRenderWhenViewMode() {
-    }
 
-    /**
-     * Optional hook.
-     */
-    protected void onBeforeRenderWhenDisabled(final String disableReason) {
-    }
+    protected void addEntityActionLinksBelowAndRight(final MarkupContainer labelIfRegular, final List<LinkAndLabel> entityActions) {
+        final List<LinkAndLabel> entityActionsBelow = LinkAndLabel.positioned(entityActions, ActionLayout.Position.BELOW);
+        AdditionalLinksPanel.addAdditionalLinks(labelIfRegular, ID_ASSOCIATED_ACTION_LINKS_BELOW, entityActionsBelow, AdditionalLinksPanel.Style.INLINE_LIST);
 
-    /**
-     * Optional hook.
-     */
-    protected void onBeforeRenderWhenEnabled() {
+        final List<LinkAndLabel> entityActionsRight = LinkAndLabel.positioned(entityActions, ActionLayout.Position.RIGHT);
+        AdditionalLinksPanel.addAdditionalLinks(labelIfRegular, ID_ASSOCIATED_ACTION_LINKS_RIGHT, entityActionsRight, AdditionalLinksPanel.Style.DROPDOWN);
     }
 
     /**
-     * Applies the {@literal @}{@link org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet} and also CSS based on
-     * whether any of the associated actions have {@literal @}{@link org.apache.isis.applib.annotation.ActionLayout layout} positioned to
-     * the {@link org.apache.isis.applib.annotation.ActionLayout.Position#RIGHT right}.
+     * Applies the {@literal @}{@link LabelAtFacet} and also CSS based on
+     * whether any of the associated actions have {@literal @}{@link ActionLayout layout} positioned to
+     * the {@link ActionLayout.Position#RIGHT right}.
      *
      * @param markupContainer The form group element
      * @param entityActionLinks
@@ -411,26 +366,18 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         CssClassAppender.appendCssClassTo(markupContainer, determineActionLayoutPositioningCss(entityActionLinks));
     }
 
-    protected void addEntityActionLinksBelowAndRight(final MarkupContainer labelIfRegular, final List<LinkAndLabel> entityActions) {
-        final List<LinkAndLabel> entityActionsBelow = LinkAndLabel.positioned(entityActions, ActionLayout.Position.BELOW);
-        AdditionalLinksPanel.addAdditionalLinks(labelIfRegular, ID_ASSOCIATED_ACTION_LINKS_BELOW, entityActionsBelow, AdditionalLinksPanel.Style.INLINE_LIST);
-
-        final List<LinkAndLabel> entityActionsRight = LinkAndLabel.positioned(entityActions, ActionLayout.Position.RIGHT);
-        AdditionalLinksPanel.addAdditionalLinks(labelIfRegular, ID_ASSOCIATED_ACTION_LINKS_RIGHT, entityActionsRight, AdditionalLinksPanel.Style.DROPDOWN);
-    }
-
     private static String determinePropParamLayoutCss(ScalarModel model) {
         final LabelAtFacet facet = model.getFacet(LabelAtFacet.class);
         if (facet != null) {
             switch (facet.label()) {
-                case LEFT:
-                    return "label-left";
-                case RIGHT:
-                    return "label-right";
-                case NONE:
-                    return "label-none";
-                case TOP:
-                    return "label-top";
+            case LEFT:
+                return "label-left";
+            case RIGHT:
+                return "label-right";
+            case NONE:
+                return "label-none";
+            case TOP:
+                return "label-top";
             }
         }
         return "label-left";
@@ -450,24 +397,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         return false;
     }
 
-    // //////////////////////////////////////
-
-    private final List<ScalarModelSubscriber> subscribers = Lists.newArrayList();
-
-    public void notifyOnChange(final ScalarModelSubscriber subscriber) {
-        subscribers.add(subscriber);
-    }
-
-    // //////////////////////////////////////
-
-    /**
-     * Optional hook method
-     * 
-     * @return true - indicates has been updated, so update dynamically via ajax
-     */
-    public boolean updateChoices(ObjectAdapter[] pendingArguments) {
-        return false;
-    }
+    // ///////////////////////////////////////////////////////////////////
 
     /**
      * Repaints this panel of just some of its children
@@ -478,7 +408,6 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         target.add(this);
     }
 
-
     // ///////////////////////////////////////////////////////////////////
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.html
new file mode 100644
index 0000000..6238772
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.html
@@ -0,0 +1,84 @@
+<?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 wicket:id="scalarTypeContainer"
+                 class="scalarNameAndValueComponentType" >
+
+                <div wicket:id="scalarIfRegular"
+                     class="form-group" >
+
+                    <label wicket:id="scalarName"
+                           class="scalarName control-label"
+                    >[Label text]</label>
+
+                    <span class="scalarValueWrapper">
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <wicket:child/>
+                                    <a wicket:id="editProperty"
+                                       href="#"
+                                       class="edit fa fa-pencil-square-o"></a>
+                                    <a
+                                            href="#"
+                                            name="scalarValueEditInline"
+                                            class="form-control input-sm scalarValueEditInline"
+                                            wicket:id="scalarValueEditInline">
+                                        <span wicket:id="scalarValueEditInlineLabel"></span>
+                                    </a>
+                                </span>
+                            </span>
+
+                            <span wicket:id="associatedActionLinksRight"
+                                  class="associatedActionLinksRight"
+                            >[drop down]</span>
+                        </div>
+                        <span wicket:id="feedback" class="help-block"></span>
+                        <span wicket:id="associatedActionLinksBelow"></span>
+                    </span>
+                    <div class="clearfix"></div>
+
+                </div>
+
+                <div wicket:id="scalarIfRegularInlineEditForm" class="inlineEditForm" >
+                    <div><span>property edit form</span></div>
+                </div>
+
+                <wicket:container wicket:id="scalarIfCompact"></wicket:container>
+            </div>
+
+            <wicket:fragment wicket:id="compactAsInputCheckbox">
+                <input wicket:id="scalarIfCompact"
+                       type="checkbox"
+                       class="form-control" />
+            </wicket:fragment>
+
+            <wicket:fragment wicket:id="compactAsSpan">
+                <span wicket:id="scalarIfCompact"></span>
+            </wicket:fragment>
+        </wicket:panel>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
new file mode 100644
index 0000000..7b37a52
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -0,0 +1,130 @@
+/*
+ *  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;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.panel.Fragment;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormExecutor;
+import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormPanel;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+/**
+ * Adapter for {@link PanelAbstract panel}s that use a {@link ScalarModel} as
+ * their backing model.
+ * 
+ * <p>
+ * Supports the concept of being {@link Rendering#COMPACT} (eg within a table) or
+ * {@link Rendering#REGULAR regular} (eg within a form).
+ */
+public abstract class ScalarPanelAbstract2 extends ScalarPanelAbstract  {
+
+    private static final long serialVersionUID = 1L;
+
+    protected static final String ID_SCALAR_TYPE_CONTAINER = "scalarTypeContainer";
+
+
+    protected static final String ID_SCALAR_VALUE_EDIT_INLINE = "scalarValueEditInline";
+    protected static final String ID_SCALAR_VALUE_EDIT_INLINE_LABEL = "scalarValueEditInlineLabel";
+
+    protected static final String ID_SCALAR_IF_REGULAR_INLINE_EDIT_FORM = "scalarIfRegularInlineEditForm";
+
+
+    public enum CompactType {
+        INPUT_CHECKBOX,
+        SPAN
+    }
+
+
+    protected WebMarkupContainer scalarTypeContainer;
+    protected WebMarkupContainer scalarIfRegularInlineEditForm;
+    protected WebMarkupContainer editInlineLink;
+
+
+    public ScalarPanelAbstract2(final String id, final ScalarModel scalarModel) {
+        super(id, scalarModel);
+    }
+
+    protected Fragment getCompactFragment(CompactType type) {
+        Fragment compactFragment;
+        switch (type) {
+            case INPUT_CHECKBOX:
+                compactFragment = new Fragment("scalarIfCompact", "compactAsInputCheckbox", ScalarPanelAbstract2.this);
+                break;
+            case SPAN:
+            default:
+                compactFragment = new Fragment("scalarIfCompact", "compactAsSpan", ScalarPanelAbstract2.this);
+                break;
+        }
+        return compactFragment;
+    }
+
+
+
+
+    protected void configureInlineEditCallback() {
+
+        final PromptStyle editStyle = this.scalarModel.getPromptStyle();
+        if(editStyle == PromptStyle.INLINE) {
+
+            if(editInlineLink != null) {
+                editInlineLink.add(new AjaxEventBehavior("click") {
+                    @Override
+                    protected void onEvent(final AjaxRequestTarget target) {
+
+                        scalarModel.toEditMode();
+
+                        // dynamically update the edit form.
+                        final PropertyEditFormExecutor formExecutor =
+                                new PropertyEditFormExecutor(ScalarPanelAbstract2.this, scalarModel);
+                        scalarModel.setFormExecutor(formExecutor);
+                        scalarModel.setInlinePromptContext(
+                                new ScalarModel.InlinePromptContext(scalarIfRegular, scalarIfRegularInlineEditForm));
+
+                        scalarIfRegularInlineEditForm = (PropertyEditFormPanel) getComponentFactoryRegistry().addOrReplaceComponent(
+                                scalarTypeContainer, ID_SCALAR_IF_REGULAR_INLINE_EDIT_FORM, ComponentType.PROPERTY_EDIT_FORM, scalarModel);
+
+
+                        scalarIfRegular.setVisible(false);
+                        scalarIfRegularInlineEditForm.setVisible(true);
+
+                        target.add(scalarTypeContainer);
+                    }
+
+                    @Override
+                    public boolean isEnabled(final Component component) {
+                        return true;
+                    }
+                });
+            }
+        }
+    }
+
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 4009df4..de9bfdd 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -57,7 +57,7 @@ import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
  * Adapter for {@link ScalarPanelAbstract scalar panel}s that are implemented
  * using a simple {@link TextField}.
  */
-public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> extends ScalarPanelAbstract {
+public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> extends ScalarPanelAbstract2 {
 
     private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 3b5fa18..435312b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -23,13 +23,11 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.google.common.collect.Lists;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Settings;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -38,6 +36,8 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Settings;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -55,6 +55,7 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.scalars.PanelWithChoices;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
@@ -69,7 +70,7 @@ import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
  * Panel for rendering scalars which of are of reference type (as opposed to
  * value types).
  */
-public class ReferencePanel extends ScalarPanelAbstract {
+public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoices {
 
     private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/b3dab495/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 7fb8a56..4c1c2c6 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -41,13 +41,15 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithMultiPending;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.scalars.PanelWithChoices;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
-public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
+public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending,
+        PanelWithChoices {
 
     private static final long serialVersionUID = 1L;