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/26 22:17:07 UTC

isis git commit: ISIS-1603: value choices and reference panel now working adequately with inline prompt.

Repository: isis
Updated Branches:
  refs/heads/ISIS-1603-no-xeditable 3dccc4c17 -> 2d3232a90


ISIS-1603: value choices and reference panel now working adequately with inline prompt.

Need to improve the layout of reference panel.


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

Branch: refs/heads/ISIS-1603-no-xeditable
Commit: 2d3232a90ef1e0251539cc3ad7d4a880e73fe8d9
Parents: 3dccc4c
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Apr 26 23:16:59 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Apr 26 23:16:59 2017 +0100

----------------------------------------------------------------------
 .../components/scalars/ScalarPanelAbstract.java | 194 ++++++++++++-------
 .../scalars/ScalarPanelTextFieldAbstract.html   |   2 -
 .../scalars/ScalarPanelTextFieldAbstract.java   |  89 ++++-----
 .../isisapplib/IsisBlobOrClobPanelAbstract.java |  61 +++---
 .../scalars/primitive/BooleanPanel.java         |  20 +-
 .../scalars/reference/ReferencePanel.java       |  53 +++--
 .../valuechoices/ValueChoicesSelect2Panel.java  |  39 ++--
 .../ui/components/widgets/select2/Select2.java  |   2 +-
 8 files changed, 257 insertions(+), 203 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/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 f948384..2e57e8b 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
@@ -51,6 +51,7 @@ 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.actionmenu.entityactions.EntityActionUtil;
 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;
@@ -95,6 +96,36 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     private static final String ID_ASSOCIATED_ACTION_LINKS_BELOW = "associatedActionLinksBelow";
     private static final String ID_ASSOCIATED_ACTION_LINKS_RIGHT = "associatedActionLinksRight";
 
+    public static class InlinePromptConfig {
+        private final boolean supported;
+        private final Component componentToHideIfAny;
+
+        public static InlinePromptConfig supported() {
+            return new InlinePromptConfig(true, null);
+        }
+
+        public static InlinePromptConfig notSupported() {
+            return new InlinePromptConfig(false, null);
+        }
+
+        public static InlinePromptConfig supportedAndHide(final Component componentToHideIfAny) {
+            return new InlinePromptConfig(true, componentToHideIfAny);
+        }
+
+        private InlinePromptConfig(final boolean supported, final Component componentToHideIfAny) {
+            this.supported = supported;
+            this.componentToHideIfAny = componentToHideIfAny;
+        }
+
+        boolean isSupported() {
+            return supported;
+        }
+
+        Component getComponentToHideIfAny() {
+            return componentToHideIfAny;
+        }
+    }
+
     // ///////////////////////////////////////////////////////////////////
 
     protected final ScalarModel scalarModel;
@@ -105,6 +136,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     private WebMarkupContainer scalarTypeContainer;
 
     /**
+     * Populated
      * Used by most subclasses ({@link ScalarPanelAbstract}, {@link ReferencePanel}, {@link ValueChoicesSelect2Panel}) but not all ({@link IsisBlobOrClobPanelAbstract}, {@link BooleanPanel})
      */
     private WebMarkupContainer scalarIfRegularInlinePromptForm;
@@ -131,8 +163,27 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
     }
 
+    /**
+     * Mandatory hook; simply determines the CSS that is added to the outermost 'scalarTypeContainer' div.
+     */
     protected abstract String getScalarPanelType();
 
+    /**
+     * Mandatory hook for implementations to indicate whether it supports the {@link PromptStyle#INLINE} inline prompt,
+     * and if so, how.
+     *
+     * <p>
+     *     For those that do, both {@link #createInlinePromptForm()} and
+     *     {@link #createInlinePromptLink()} must return non-null values (and their corresponding markup
+     *     must define the corresponding elements).
+     * </p>
+     *
+     * <p>
+     *     Implementations that support inline prompts are: ({@link ScalarPanelAbstract}, {@link ReferencePanel} and
+     *     {@link ValueChoicesSelect2Panel}; those that don't are {@link IsisBlobOrClobPanelAbstract} and {@link BooleanPanel}.
+     * </p>
+     */
+    protected abstract InlinePromptConfig getInlinePromptConfig();
 
     @Override
     protected void onBeforeRender() {
@@ -180,20 +231,38 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
         this.scalarIfCompact = createComponentForCompact();
         this.scalarIfRegular = createComponentForRegular();
-        this.scalarIfRegularInlinePromptForm = createInlinePromptFormIfRequired();
-
         scalarTypeContainer.addOrReplace(scalarIfCompact, scalarIfRegular);
-        if(scalarIfRegularInlinePromptForm != null) {
-            scalarTypeContainer.addOrReplace(scalarIfRegularInlinePromptForm);
-        }
 
-        inlinePromptLink = createInlinePromptLinkIfRequired();
-        if(this.inlinePromptLink != null) {
+        final List<LinkAndLabel> entityActions =
+                EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+        addPositioningCssTo(scalarIfRegular, entityActions);
+        addEntityActionLinksBelowAndRight(scalarIfRegular, entityActions);
+
+        addEditPropertyTo(scalarIfRegular);
+        addFeedbackOnlyTo(scalarIfRegular, getScalarValueComponent());
+
+        final InlinePromptConfig inlinePromptConfig = getInlinePromptConfig();
+
+        if(inlinePromptConfig.isSupported()) {
+            this.scalarIfRegularInlinePromptForm = createInlinePromptForm();
+            scalarTypeContainer.addOrReplace(scalarIfRegularInlinePromptForm);
+            inlinePromptLink = createInlinePromptLink();
             scalarIfRegular.add(inlinePromptLink);
-            configureInlinePromptLinkCallback();
-            configureEditVisibility(scalarIfRegular, inlinePromptLink);
-        }
 
+            final PromptStyle promptStyle = this.scalarModel.getPromptStyle();
+            if(promptStyle == PromptStyle.INLINE) {
+                configureInlinePromptLinkCallback(inlinePromptLink);
+            }
+
+            Component componentToHideIfAny = inlinePromptConfig.getComponentToHideIfAny();
+            if (componentToHideIfAny != null || promptStyle == PromptStyle.DIALOG) {
+                if (scalarModel.canEnterEditMode() && scalarModel.getPromptStyle() == PromptStyle.INLINE) {
+                    componentToHideIfAny.setVisibilityAllowed(false);
+                } else {
+                    inlinePromptLink.setVisibilityAllowed(false);
+                }
+            }
+        }
 
         getRendering().buildGui(this);
         addCssForMetaModel();
@@ -204,6 +273,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     }
 
 
+
     /**
      * Optional hook.
      */
@@ -368,16 +438,9 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
 
     /**
-     * Optional hook method to return a container holding an empty form.  This can be switched out using {@link #switchFormForInlinePrompt()}.
-     *
-     * <p>
-     *     Implementations that don't support inline prompts can override and return <tt>null</tt>.
-     * </p>
-     * <p>
-     *     If non-null, is added to {@link #scalarTypeContainer}.
-     * </p>
+     * Returns a container holding an empty form.  This can be switched out using {@link #switchFormForInlinePrompt()}.
      */
-    protected WebMarkupContainer createInlinePromptFormIfRequired() {
+    private WebMarkupContainer createInlinePromptForm() {
 
         // (placeholder initially, create dynamically when needed - otherwise infinite loop because form references regular)
 
@@ -389,78 +452,61 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         return scalarIfRegularInlinePromptForm;
     }
 
-    private WebMarkupContainer createInlinePromptLinkIfRequired() {
-        final IModel<?> textFieldModel = obtainPromptInlineLinkModelIfAvailable();
-        if(textFieldModel == null) {
-            return null;
+    private WebMarkupContainer createInlinePromptLink() {
+        final IModel<?> inlineLinkModel = obtainPromptInlineLinkModel();
+        if(inlineLinkModel == null) {
+            throw new IllegalStateException(this.getClass().getName() + ": obtainPromptInlineLinkModel() returning null is not compatible with supportsInlinePrompt() returning true ");
         }
 
         final WebMarkupContainer inlinePromptLink = new WebMarkupContainer(ID_SCALAR_VALUE_INLINE_PROMPT_LINK);
         inlinePromptLink.setOutputMarkupId(true);
 
-        final Label editInlineLinkLabel = new Label(ID_SCALAR_VALUE_INLINE_PROMPT_LABEL, textFieldModel);
+        final Label editInlineLinkLabel = new Label(ID_SCALAR_VALUE_INLINE_PROMPT_LABEL, inlineLinkModel);
         inlinePromptLink.add(editInlineLinkLabel);
 
         return inlinePromptLink;
     }
 
-    /**
-     * Optional hook; if returns non null then the model will be used to set up a link representing the
-     * component for inline prompt.
-     */
-    protected IModel<?> obtainPromptInlineLinkModelIfAvailable() {
-        return null;
-    }
-
+    // ///////////////////////////////////////////////////////////////////
 
     /**
-     * Optional hook to set the visibility of subfields according to editability.
-     *
-     * <p>
-     * Only implementations that support inline prompts need override.
-     * </p>
+     * Components returning true for {@link #getInlinePromptConfig()} are required to override and return a non-null value.
      */
-    protected void configureEditVisibility(
-            final MarkupContainer scalarIfRegularFormGroup,
-            final WebMarkupContainer inlinePromptLink) {
+    protected IModel<?> obtainPromptInlineLinkModel() {
+        return null;
     }
 
-    private void configureInlinePromptLinkCallback() {
 
-        final PromptStyle promptStyle = this.scalarModel.getPromptStyle();
-        if(promptStyle == PromptStyle.INLINE) {
+    private void configureInlinePromptLinkCallback(final WebMarkupContainer inlinePromptLink) {
 
-            if(inlinePromptLink != null) {
-                inlinePromptLink.add(new AjaxEventBehavior("click") {
-                    @Override
-                    protected void onEvent(final AjaxRequestTarget target) {
+        inlinePromptLink.add(new AjaxEventBehavior("click") {
+            @Override
+            protected void onEvent(final AjaxRequestTarget target) {
 
-                        scalarModel.toEditMode();
+                scalarModel.toEditMode();
 
-                        // dynamically update the edit form.
-                        final PropertyEditFormExecutor formExecutor =
-                                new PropertyEditFormExecutor(ScalarPanelAbstract.this, scalarModel);
-                        scalarModel.setFormExecutor(formExecutor);
-                        scalarModel.setInlinePromptContext(
-                                new ScalarModel.InlinePromptContext(
-                                        getComponentForRegular(),
-                                        scalarIfRegularInlinePromptForm));
+                // dynamically update the edit form.
+                final PropertyEditFormExecutor formExecutor =
+                        new PropertyEditFormExecutor(ScalarPanelAbstract.this, scalarModel);
+                scalarModel.setFormExecutor(formExecutor);
+                scalarModel.setInlinePromptContext(
+                        new ScalarModel.InlinePromptContext(
+                                getComponentForRegular(),
+                                scalarIfRegularInlinePromptForm));
 
-                        switchFormForInlinePrompt();
+                switchFormForInlinePrompt();
 
-                        getComponentForRegular().setVisible(false);
-                        scalarIfRegularInlinePromptForm.setVisible(true);
+                getComponentForRegular().setVisible(false);
+                scalarIfRegularInlinePromptForm.setVisible(true);
 
-                        target.add(scalarTypeContainer);
-                    }
+                target.add(scalarTypeContainer);
+            }
 
-                    @Override
-                    public boolean isEnabled(final Component component) {
-                        return true;
-                    }
-                });
+            @Override
+            public boolean isEnabled(final Component component) {
+                return true;
             }
-        }
+        });
     }
 
     private void switchFormForInlinePrompt() {
@@ -508,13 +554,19 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
     }
 
+    /**
+     * Mandatory hook, used to determine which component to attach feedback to.
+     * @return
+     */
+    protected abstract Component getScalarValueComponent();
 
-    protected void addFeedbackOnlyTo(final MarkupContainer markupContainer, final Component component) {
+    private void addFeedbackOnlyTo(final MarkupContainer markupContainer, final Component component) {
         markupContainer.addOrReplace(new NotificationPanel(ID_FEEDBACK, component, new ComponentFeedbackMessageFilter(component)));
     }
 
-
-    protected void addEntityActionLinksBelowAndRight(final MarkupContainer labelIfRegular, final List<LinkAndLabel> entityActions) {
+    private 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);
 
@@ -530,7 +582,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
      * @param markupContainer The form group element
      * @param entityActionLinks
      */
-    protected void addPositioningCssTo(final MarkupContainer markupContainer, final List<LinkAndLabel> entityActionLinks) {
+    private void addPositioningCssTo(final MarkupContainer markupContainer, final List<LinkAndLabel> entityActionLinks) {
         CssClassAppender.appendCssClassTo(markupContainer, determinePropParamLayoutCss(getModel()));
         CssClassAppender.appendCssClassTo(markupContainer, determineActionLayoutPositioningCss(entityActionLinks));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
index 77ce949..c827e7f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
@@ -49,8 +49,6 @@
 
                                 <wicket:container wicket:id="scalarValueContainer"/>
 
-
-
                                 <a href="#"
                                    class="edit fa fa-pencil-square-o"
                                    wicket:id="editProperty"></a>

http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/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 c3bdcc6..a0066d9 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
@@ -20,7 +20,6 @@
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
 import java.io.Serializable;
-import java.util.List;
 
 import com.google.common.base.Strings;
 
@@ -29,7 +28,6 @@ import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.markup.html.form.TextField;
@@ -40,16 +38,13 @@ import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.SingleIntValueFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
@@ -99,17 +94,23 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         return textField;
     }
 
+    /**
+     * Optional hook for subclasses to override
+     */
     protected AbstractTextComponent<T> createTextFieldForRegular(final String id) {
         return createTextField(id);
     }
 
+    protected TextField<T> createTextField(final String id) {
+        return new TextField<>(id, newTextFieldValueModel(), cls);
+    }
+
     TextFieldValueModel<T> newTextFieldValueModel() {
         return new TextFieldValueModel<>(this);
     }
 
-    protected TextField<T> createTextField(final String id) {
-        return new TextField<>(id, newTextFieldValueModel(), cls);
-    }
+    // ///////////////////////////////////////////////////////////////////
+
 
     @Override
     protected MarkupContainer createComponentForRegular() {
@@ -131,50 +132,16 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
 
         final MarkupContainer scalarIfRegularFormGroup = createScalarIfRegularFormGroup();
 
-
-        // find the links...
-        final List<LinkAndLabel> entityActions =
-                EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
-
-        addPositioningCssTo(scalarIfRegularFormGroup, entityActions);
-
-
         final String describedAs = getModel().getDescribedAs();
         if(describedAs != null) {
             scalarIfRegularFormGroup.add(new AttributeModifier("title", Model.of(describedAs)));
         }
 
-        addFeedbackOnlyTo(scalarIfRegularFormGroup, textField);
-
-        // ... add entity links to panel (below and to right)
-        addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);
-
-
         return scalarIfRegularFormGroup;
     }
 
-    @Override
-    protected void configureEditVisibility(
-            final MarkupContainer scalarIfRegularFormGroup,
-            final WebMarkupContainer inlinePromptLink) {
-
-        addEditPropertyTo(scalarIfRegularFormGroup);
-
-        if (scalarModel.canEnterEditMode() && scalarModel.getPromptStyle() == PromptStyle.INLINE) {
-            textField.setVisibilityAllowed(false);
-        } else {
-            inlinePromptLink.setVisibilityAllowed(false);
-        }
-    }
-
-    @Override
-    protected WebMarkupContainer createInlinePromptFormIfRequired() {
-        return super.createInlinePromptFormIfRequired();
-    }
-
-    @Override
-    protected IModel<T> obtainPromptInlineLinkModelIfAvailable() {
-        return textField.getModel();
+    protected Component getScalarValueComponent() {
+        return textField;
     }
 
     private void addReplaceDisabledTagWithReadonlyTagBehaviourIfRequired(final Component component) {
@@ -269,11 +236,9 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
     }
 
 
-    private static Integer getValueOf(ScalarModel model, Class<? extends SingleIntValueFacet> facetType) {
-        final SingleIntValueFacet facet = model.getFacet(facetType);
-        return facet != null ? facet.value() : null;
-    }
-    
+    // //////////////////////////////////////
+
+
     /**
      * Mandatory hook method to build the component to render the model when in
      * {@link Rendering#COMPACT compact} format.
@@ -310,6 +275,22 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
     }
 
 
+    // //////////////////////////////////////
+
+    @Override
+    protected InlinePromptConfig getInlinePromptConfig() {
+        return InlinePromptConfig.supportedAndHide(textField);
+    }
+
+    @Override
+    protected IModel<T> obtainPromptInlineLinkModel() {
+        return textField.getModel();
+    }
+
+
+    // //////////////////////////////////////
+
+
     @Override
     protected void onBeforeRenderWhenViewMode() {
         super.onBeforeRenderWhenViewMode();
@@ -348,15 +329,19 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
 
     @Override
     protected void addFormComponentBehavior(Behavior behavior) {
-
         textField.add(behavior);
-
     }
 
 
+    // //////////////////////////////////////
+
+    private static Integer getValueOf(ScalarModel model, Class<? extends SingleIntValueFacet> facetType) {
+        final SingleIntValueFacet facet = model.getFacet(facetType);
+        return facet != null ? facet.value() : null;
+    }
 
     @com.google.inject.Inject
-    private WicketViewerSettings settings;
+    WicketViewerSettings settings;
     protected WicketViewerSettings getSettings() {
         return settings;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
index becdc3b..79d5957 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
@@ -98,10 +98,6 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         final Label scalarName = new Label(ID_SCALAR_NAME, getModel().getName());
         scalarIfRegularFormGroup.add(scalarName);
 
-        // find the links...
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
-
-        addPositioningCssTo(scalarIfRegularFormGroup, entityActions);
 
         wicketImage = asWicketImage(ID_IMAGE);
         if(wicketImage != null) {
@@ -113,48 +109,65 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         
         updateFileNameLabel(ID_FILE_NAME, scalarIfRegularFormGroup);
         updateDownloadLink(ID_SCALAR_IF_REGULAR_DOWNLOAD, scalarIfRegularFormGroup);
-        
-        addFeedbackOnlyTo(scalarIfRegularFormGroup, fileUploadField);
-        addEditPropertyTo(scalarIfRegularFormGroup);
 
-        // ... add entity links to panel (below and to right)
-        addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);
 
         return scalarIfRegularFormGroup;
     }
 
+    protected Component getScalarValueComponent() {
+        return fileUploadField;
+    }
+
+    // //////////////////////////////////////
+
     /**
      * Inline prompts are <i>not</i> supported by this component.
      */
     @Override
-    protected WebMarkupContainer createInlinePromptFormIfRequired() {
-        return null;
+    protected InlinePromptConfig getInlinePromptConfig() {
+        return InlinePromptConfig.notSupported();
+    }
+
+
+    // //////////////////////////////////////
+
+    @Override
+    protected Component createComponentForCompact() {
+        final MarkupContainer scalarIfCompact = new WebMarkupContainer(ID_SCALAR_IF_COMPACT);
+        MarkupContainer downloadLink = updateDownloadLink(ID_SCALAR_IF_COMPACT_DOWNLOAD, scalarIfCompact);
+        if(downloadLink != null) {
+            updateFileNameLabel("fileNameIfCompact", downloadLink);
+        }
+
+        return scalarIfCompact;
     }
 
 
+    // //////////////////////////////////////
+
     private Image asWicketImage(String id) {
-        
+
         final ObjectAdapter adapter = getModel().getObject();
         if(adapter == null) {
             return null;
         }
-        
+
         final Object object = adapter.getObject();
         if(!(object instanceof Blob)) {
             return null;
-        } 
-        
+        }
+
         final Blob blob = (Blob)object;
         final MimeType mimeType = blob.getMimeType();
         if(mimeType == null || !mimeType.getPrimaryType().equals("image")) {
             return null;
-        } 
-        
+        }
+
         final BufferedImage image = asBufferedImage(blob);
         if(image == null) {
             return null;
         }
-        
+
         final BufferedDynamicImageResource imageResource = new BufferedDynamicImageResource();
         imageResource.setImage(image);
         final ThumbnailImageResource thumbnailImageResource = new ThumbnailImageResource(imageResource, 300);
@@ -167,7 +180,7 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         if(bytes == null) {
             return null;
         }
-        
+
         final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
         try {
             return ImageIO.read(bais);
@@ -178,16 +191,8 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         }
     }
 
-    @Override
-    protected Component createComponentForCompact() {
-        final MarkupContainer scalarIfCompact = new WebMarkupContainer(ID_SCALAR_IF_COMPACT);
-        MarkupContainer downloadLink = updateDownloadLink(ID_SCALAR_IF_COMPACT_DOWNLOAD, scalarIfCompact);
-        if(downloadLink != null) {
-            updateFileNameLabel("fileNameIfCompact", downloadLink);
-        }
 
-        return scalarIfCompact;
-    }
+    // //////////////////////////////////////
 
     protected void onBeforeRenderWhenViewMode() {
         updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE);

http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
index 63348b1..ca21a39 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
@@ -25,7 +25,6 @@ import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
 
@@ -91,20 +90,12 @@ public class BooleanPanel extends ScalarPanelAbstract {
             scalarName.setEscapeModelStrings(namedFacet.escaped());
         }
 
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
-
-        addPositioningCssTo(scalarIfRegularFormGroup, entityActions);
-
-        addFeedbackOnlyTo(scalarIfRegularFormGroup, checkBox);
-        addEditPropertyTo(scalarIfRegularFormGroup);
-
-        // ... add entity links to panel (below and to right)
-        addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);
-
         return scalarIfRegularFormGroup;
     }
 
-
+    protected Component getScalarValueComponent() {
+        return checkBox;
+    }
 
     /**
      * Mandatory hook method to build the component to render the model when in
@@ -115,12 +106,13 @@ public class BooleanPanel extends ScalarPanelAbstract {
         return createCheckBox(ID_SCALAR_IF_COMPACT);
     }
 
+
     /**
      * Inline prompts are <i>not</i> supported by this component.
      */
     @Override
-    protected WebMarkupContainer createInlinePromptFormIfRequired() {
-        return null;
+    protected InlinePromptConfig getInlinePromptConfig() {
+        return InlinePromptConfig.notSupported();
     }
 
     private CheckBoxX createCheckBox(final String id) {

http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/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 bc624ce..01568f6 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
@@ -46,7 +46,6 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
@@ -54,7 +53,6 @@ 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.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;
@@ -152,17 +150,7 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
         }
 
 
-        // find the links...
-        final List<LinkAndLabel> entityActions =
-                EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
 
-        addPositioningCssTo(scalarIfRegularFormGroup, entityActions);
-
-        addFeedbackOnlyTo(scalarIfRegularFormGroup, select2.component()); // this is a placeholder; when select2.component() is available, we use that instead
-        addEditPropertyTo(scalarIfRegularFormGroup);
-
-        // ... add entity links to panel (below and to right)
-        addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);
 
         // add semantics
         entityLink.setRequired(getModel().isRequired());
@@ -186,6 +174,11 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
         return scalarIfRegularFormGroup;
     }
 
+    @Override
+    protected Component getScalarValueComponent() {
+        return select2.component();
+    }
+
     private Select2 createSelect2() {
 
         final Select2 select2;
@@ -225,17 +218,43 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
         return select2;
     }
 
+    // //////////////////////////////////////
+
     @Override
-    protected WebMarkupContainer createInlinePromptFormIfRequired() {
-        return super.createInlinePromptFormIfRequired();
+    protected InlinePromptConfig getInlinePromptConfig() {
+        return InlinePromptConfig.supported();
     }
 
     @Override
-    protected IModel<?> obtainPromptInlineLinkModelIfAvailable() {
-        return select2.getModel();
-//        return new TextFieldValueModel<>(this);
+    protected IModel<?> obtainPromptInlineLinkModel() {
+        final IModel<ObjectAdapterMemento> model = select2.getModel();
+        return new IModel<String>() {
+            @Override
+            public String getObject() {
+                final ObjectAdapterMemento oam = model.getObject();
+                if(oam == null) {
+                    return null;
+                }
+                ObjectAdapter objectAdapter = oam
+                        .getObjectAdapter(ConcurrencyChecking.NO_CHECK, getPersistenceSession(),
+                                getSpecificationLoader());
+                return objectAdapter != null ? objectAdapter.titleString(null) : null;
+            }
+
+            @Override
+            public void setObject(final String s) {
+                // gnore
+            }
+
+            @Override
+            public void detach() {
+                // ignore
+            }
+        };
     }
 
+
+
     // //////////////////////////////////////
 
     // called from buildGui

http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/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 0e7bc20..0522d8f 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
@@ -27,7 +27,6 @@ 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;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
@@ -52,6 +51,7 @@ import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending,
         PanelWithChoices {
 
+
     private static final long serialVersionUID = 1L;
 
     private Select2 select2;
@@ -62,6 +62,9 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
         pending = scalarModel.getObjectAdapterMemento();
     }
 
+
+    // ///////////////////////////////////////////////////////////////////
+
     @Override
     protected MarkupContainer createComponentForRegular() {
 
@@ -102,20 +105,14 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
             scalarName.setEscapeModelStrings(namedFacet.escaped());
         }
 
-        // find the links...
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
-
-        addPositioningCssTo(scalarIfRegularFormGroup, entityActions);
-
-        addFeedbackOnlyTo(scalarIfRegularFormGroup, select2.component());
-        addEditPropertyTo(scalarIfRegularFormGroup);
-
-        // ... add entity links to panel (below and to right)
-        addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);
 
         return scalarIfRegularFormGroup;
     }
 
+    protected Component getScalarValueComponent() {
+        return select2.component();
+    }
+
     private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
         final List<ObjectAdapter> choices =
                 scalarModel.getChoices(argumentsIfAvailable, getAuthenticationSession(), getDeploymentCategory());
@@ -150,26 +147,28 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
         return formGroup;
     }
 
+    // ///////////////////////////////////////////////////////////////////
+
     @Override
     protected Component createComponentForCompact() {
         return new Label(ID_SCALAR_IF_COMPACT, getModel().getObjectAsString());
     }
 
+    // ///////////////////////////////////////////////////////////////////
+
     @Override
-    protected WebMarkupContainer createInlinePromptFormIfRequired() {
-        return super.createInlinePromptFormIfRequired();
+    protected InlinePromptConfig getInlinePromptConfig() {
+        return InlinePromptConfig.supportedAndHide(select2.component());
     }
 
     @Override
-    protected IModel<?> obtainPromptInlineLinkModelIfAvailable() {
+    protected IModel<?> obtainPromptInlineLinkModel() {
         return select2.getModel();
-//        return new TextFieldValueModel<>(this);
     }
 
 
-    private ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
-        return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos, wicketViewerSettings);
-    }
+
+    // ///////////////////////////////////////////////////////////////////
 
     @Override
     protected boolean alwaysRebuildGui() {
@@ -254,6 +253,10 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
         }
     }
 
+    private ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
+        return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos, wicketViewerSettings);
+    }
+
     private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos) {
         final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
         if(objectAdapterMemento == null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/2d3232a9/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
index c49e4d4..b2c89fe 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -92,7 +92,7 @@ public class Select2 implements Serializable {
     }
 
     public void setRequired(final boolean required) {
-        // causing a more severe orphaned drop-down when triggered...
+        // REVIEW: causing a more severe orphaned drop-down when triggered...
         // component().setRequired(required);
     }
     public boolean checkRequired() {