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/01/20 14:39:45 UTC

[1/5] isis git commit: ISIS-785: fixes value select2 also (was only saving the first selected object, due to the ChoiceProvider implementation assuming there is only ever one choice selected (no longer true now, of course).

Repository: isis
Updated Branches:
  refs/heads/maint-1.13.3 0419e4d7c -> 1dc47eef7


ISIS-785: fixes value select2 also (was only saving the first selected object, due to the ChoiceProvider implementation assuming there is only ever one choice selected (no longer true now, of course).


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

Branch: refs/heads/maint-1.13.3
Commit: bbb9d33539e0cbc9b753809e2c86f7036c911eb4
Parents: 0419e4d
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 10:01:54 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 10:01:54 2017 +0000

----------------------------------------------------------------------
 .../viewer/wicket/model/models/EntityModel.java |  5 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  | 49 ++++++--------------
 2 files changed, 18 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bbb9d335/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index d9692df..a51bed6 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -361,7 +361,10 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
             final ObjectAdapterMemento memento,
             final PersistenceSession persistenceSession,
             final SpecificationLoader specificationLoader) {
-        super.setObject(memento.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader));
+        super.setObject(
+                memento != null
+                        ? memento.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader)
+                        : null);
         adapterMemento = memento;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/bbb9d335/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index 66b682f..c438bdf 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -20,10 +20,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
-import com.google.common.collect.Collections2;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
 import org.apache.wicket.AttributeModifier;
@@ -36,7 +35,6 @@ import org.apache.wicket.model.Model;
 import org.wicketstuff.select2.ChoiceProvider;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -189,23 +187,11 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
                     return ids.contains(id);
                 }
             };
-
-            final Function<String, ObjectAdapterMemento> toOam = new Function<String, ObjectAdapterMemento>() {
-                @Override
-                public ObjectAdapterMemento apply(String input) {
-                    if (NULL_PLACEHOLDER.equals(input)) {
-                        return null;
-                    }
-                    final Collection<ObjectAdapterMemento> filteredCollection = Collections2.filter(mementos, lookupOam);
-                    return filteredCollection.iterator().next();
-                }
-            };
-            return Collections2.transform(ids, toOam);
+            return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
         }
 
         @Override
         protected List<ObjectAdapterMemento> obtainMementos(String term) {
-            // return choicesMementos;  // ISIS-1020: as of Jan 2015
             return obtainMementos(term, choicesMementos);
         }
 
@@ -259,15 +245,16 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     }
 
     /**
-     * sets up the choices, also ensuring that any currently held value
-     * is compatible.
+     * sets up the choices, also ensuring that any currently held value is compatible.
      */
     private void setChoices(ObjectAdapter[] argsIfAvailable) {
         final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
         
         final ChoiceProvider<ObjectAdapterMemento> provider = newChoiceProvider(choicesMementos);
         select2.setProvider(provider);
+
         getModel().clearPending();
+
         final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
         if(objectAdapterMemento == null) {
             select2.getModel().setObject(null);
@@ -275,28 +262,20 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
 
             if(!getModel().isCollection()) {
 
+                // if currently held value is not compatible with choices, then replace with the first choice
                 if(!choicesMementos.contains(objectAdapterMemento)) {
 
-                    final ObjectAdapterMemento newAdapterMemento;
-                    if (!choicesMementos.isEmpty()) {
-                        newAdapterMemento = choicesMementos.get(0);
-                    } else {
-                        newAdapterMemento = null;
-                    }
-
-                    final IModel<ObjectAdapterMemento> model = select2.getModel();
-                    model.setObject(newAdapterMemento);
-                    if (newAdapterMemento != null) {
-                        getModel().setObject(
-                                newAdapterMemento.getObjectAdapter(
-                                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader()));
-                    } else {
-                        getModel().setObject(null);
-                    }
+                    final ObjectAdapterMemento newAdapterMemento =
+                            choicesMementos.isEmpty()
+                                    ? null
+                                    : choicesMementos.get(0);
+
+                    select2.getModel().setObject(newAdapterMemento);
+                    getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
                 }
 
             } else {
-                // TODO
+
             }
         }
     }


[5/5] isis git commit: ISIS-785: fixes

Posted by da...@apache.org.
ISIS-785: fixes


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

Branch: refs/heads/maint-1.13.3
Commit: 1dc47eef783249dab8f2ff85fe2df7ee7095e2e3
Parents: 50a38e9
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 14:14:59 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 14:14:59 2017 +0000

----------------------------------------------------------------------
 .../scalars/reference/ReferencePanel.java       | 81 ++++++++++----------
 1 file changed, 42 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1dc47eef/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 abf32e4..4e5bc79 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
@@ -124,47 +124,10 @@ public class ReferencePanel extends ScalarPanelAbstract {
         
         entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), this);
 
-        // create select2
         entityLink.setRequired(getModel().isRequired());
-
-        if(getModel().isCollection()) {
-            final IModel<ArrayList<ObjectAdapterMemento>> model =
-                    ScalarModelWithMultiPending.Util.createModel(getModel());
-            this.select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
-        } else {
-            final IModel<ObjectAdapterMemento> modelObject =
-                    ScalarModelWithPending.Util.createModel(getModel());
-            this.select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
-        }
-
-        setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
-
-        final Settings settings = select2.getSettings();
-
-        // one of these three case should be true
-        // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
-        if(getModel().hasChoices()) {
-
-            settings.setPlaceholder(getModel().getName());
-
-        } else if(getModel().hasAutoComplete()) {
-
-            final int minLength = getModel().getAutoCompleteMinLength();
-            settings.setMinimumInputLength(minLength);
-            settings.setPlaceholder(getModel().getName());
-
-        } else if(hasObjectAutoComplete()) {
-            final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
-            final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-            final int minLength = autoCompleteFacet.getMinLength();
-            settings.setMinimumInputLength(minLength);
-        }
-
+        this.select2 = createSelect2();
         entityLink.addOrReplace(select2.component());
 
-        // end create select2
-
-
         syncWithInput();
 
         setOutputMarkupId(true);
@@ -189,7 +152,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
 
         // find the links...
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+        final List<LinkAndLabel> entityActions =
+                EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
 
         addPositioningCssTo(labelIfRegular, entityActions);
 
@@ -224,6 +188,45 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return labelIfRegular;
     }
 
+    private Select2 createSelect2() {
+
+        final Select2 select2;
+        if(getModel().isCollection()) {
+            final IModel<ArrayList<ObjectAdapterMemento>> model =
+                    ScalarModelWithMultiPending.Util.createModel(getModel());
+            select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
+        } else {
+            final IModel<ObjectAdapterMemento> modelObject =
+                    ScalarModelWithPending.Util.createModel(getModel());
+            select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
+        }
+
+        setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
+
+        final Settings settings = select2.getSettings();
+
+        // one of these three case should be true
+        // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
+        if(getModel().hasChoices()) {
+
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(getModel().hasAutoComplete()) {
+
+            final int minLength = getModel().getAutoCompleteMinLength();
+            settings.setMinimumInputLength(minLength);
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(hasObjectAutoComplete()) {
+            final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
+            final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+            final int minLength = autoCompleteFacet.getMinLength();
+            settings.setMinimumInputLength(minLength);
+        }
+
+        return select2;
+    }
+
     // //////////////////////////////////////
 
     // called from buildGui


[2/5] isis git commit: ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
deleted file mode 100644
index c438bdf..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/**
- *  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.widgets.valuechoices;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
-
-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.basic.Label;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.wicketstuff.select2.ChoiceProvider;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-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.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.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.reference.Select2;
-import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
-
-    private static final long serialVersionUID = 1L;
-
-    private Select2 select2;
-    private ObjectAdapterMemento pending;
-
-    public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
-        pending = scalarModel.getObjectAdapterMemento();
-    }
-
-    @Override
-    protected MarkupContainer addComponentForRegular() {
-
-
-        // same pattern as in ReferencePanel
-        if(select2 == null) {
-            if(getModel().isCollection()) {
-                final IModel<ArrayList<ObjectAdapterMemento>> modelObject = ScalarModelWithMultiPending.Util.createModel(this);
-                select2 = Select2.newSelect2MultiChoice(ID_SCALAR_VALUE, modelObject, scalarModel);
-            } else {
-                final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
-                select2 = Select2.newSelect2Choice(ID_SCALAR_VALUE, modelObject, scalarModel);
-            }
-
-            final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
-            setChoices(actionArgsHint);
-            addStandardSemantics();
-        } else {
-            select2.clearInput();
-        }
-
-
-        final MarkupContainer labelIfRegular = createFormComponentLabel();
-        if(getModel().isRequired()) {
-            labelIfRegular.add(new CssClassAppender("mandatory"));
-        }
-        
-        addOrReplace(labelIfRegular);
-
-        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
-        if(getModel().isRequired()) {
-            final String label = scalarName.getDefaultModelObjectAsString();
-            if(!Strings.isNullOrEmpty(label)) {
-                scalarName.add(new CssClassAppender("mandatory"));
-            }
-        }
-        labelIfRegular.addOrReplace(scalarName);
-        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            scalarName.setEscapeModelStrings(namedFacet.escaped());
-        }
-
-        // find the links...
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
-
-        addPositioningCssTo(labelIfRegular, entityActions);
-
-        addFeedbackOnlyTo(labelIfRegular, select2.component());
-        addEditPropertyTo(labelIfRegular);
-
-        // ... add entity links to panel (below and to right)
-        addEntityActionLinksBelowAndRight(labelIfRegular, entityActions);
-
-        return labelIfRegular;
-    }
-
-    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
-        final List<ObjectAdapter> choices =
-                scalarModel.getChoices(argumentsIfAvailable, getAuthenticationSession(), getDeploymentCategory());
-        
-        // take a copy otherwise is only lazily evaluated
-        return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
-    }
-
-    protected void addStandardSemantics() {
-        setRequiredIfSpecified();
-    }
-
-    private void setRequiredIfSpecified() {
-        final ScalarModel scalarModel = getModel();
-        final boolean required = scalarModel.isRequired();
-        select2.setRequired(required);
-    }
-
-    protected MarkupContainer createFormComponentLabel() {
-        final String name = getModel().getName();
-        select2.setLabel(Model.of(name));
-
-        final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
-
-        final String describedAs = getModel().getDescribedAs();
-        if(describedAs != null) {
-            labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
-        }
-
-        labelIfRegular.add(select2.component());
-
-        return labelIfRegular;
-    }
-
-    @Override
-    protected Component addComponentForCompact() {
-        final Label labelIfCompact = new Label(ID_SCALAR_IF_COMPACT, getModel().getObjectAsString());
-        addOrReplace(labelIfCompact);
-        return labelIfCompact;
-    }
-
-    
-    protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
-        return new FixedObjectAdapterMementoProvider(scalarModel, choicesMementos, wicketViewerSettings);
-    }
-
-    static class FixedObjectAdapterMementoProvider extends ObjectAdapterMementoProviderAbstract {
-
-        private static final long serialVersionUID = 1L;
-        private final List<ObjectAdapterMemento> choicesMementos;
-
-        public FixedObjectAdapterMementoProvider(
-                final ScalarModel scalarModel,
-                final List<ObjectAdapterMemento> choicesMementos,
-                final WicketViewerSettings wicketViewerSettings) {
-            super(scalarModel, wicketViewerSettings);
-            this.choicesMementos = choicesMementos;
-        }
-
-        @Override
-        public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
-            final List<ObjectAdapterMemento> mementos = obtainMementos(null);
-
-            final Predicate<ObjectAdapterMemento> lookupOam = new Predicate<ObjectAdapterMemento>() {
-                @Override
-                public boolean apply(ObjectAdapterMemento input) {
-                    final String id = (String) getId(input);
-                    return ids.contains(id);
-                }
-            };
-            return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
-        }
-
-        @Override
-        protected List<ObjectAdapterMemento> obtainMementos(String term) {
-            return obtainMementos(term, choicesMementos);
-        }
-
-    }
-
-    @Override
-    protected boolean alwaysRebuildGui() {
-        return true;
-    }
-
-    @Override
-    protected void onBeforeRenderWhenViewMode() { 
-        // View: Read only
-        select2.setEnabled(false);
-    }
-
-    @Override
-    protected void onBeforeRenderWhenEnabled() { 
-        // Edit: read/write
-        select2.setEnabled(true);
-
-        // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
-    }
-
-    @Override
-    protected void onBeforeRenderWhenDisabled(final String disableReason) {
-        super.onBeforeRenderWhenDisabled(disableReason);
-        setTitleAttribute(disableReason);
-        select2.setEnabled(false);
-    }
-
-    private void setTitleAttribute(final String titleAttribute) {
-        getComponentForRegular().add(new AttributeModifier("title", Model.of(titleAttribute)));
-    }
-
-    
-    @Override
-    protected void addFormComponentBehavior(Behavior behavior) {
-        for (Behavior b : select2.getBehaviors(ScalarUpdatingBehavior.class)) {
-            select2.remove(b);
-        }
-        select2.add(behavior);
-    }
-
-    // //////////////////////////////////////
-
-    @Override
-    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        setChoices(argsIfAvailable);
-        return true;
-    }
-
-    /**
-     * sets up the choices, also ensuring that any currently held value is compatible.
-     */
-    private void setChoices(ObjectAdapter[] argsIfAvailable) {
-        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
-        
-        final ChoiceProvider<ObjectAdapterMemento> provider = newChoiceProvider(choicesMementos);
-        select2.setProvider(provider);
-
-        getModel().clearPending();
-
-        final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
-        if(objectAdapterMemento == null) {
-            select2.getModel().setObject(null);
-        } else {
-
-            if(!getModel().isCollection()) {
-
-                // if currently held value is not compatible with choices, then replace with the first choice
-                if(!choicesMementos.contains(objectAdapterMemento)) {
-
-                    final ObjectAdapterMemento newAdapterMemento =
-                            choicesMementos.isEmpty()
-                                    ? null
-                                    : choicesMementos.get(0);
-
-                    select2.getModel().setObject(newAdapterMemento);
-                    getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
-                }
-
-            } else {
-
-            }
-        }
-    }
-
-    
-    // //////////////////////////////////////
-
-    @Override
-    public ObjectAdapterMemento getPending() {
-        return pending;
-    }
-
-    public void setPending(ObjectAdapterMemento pending) {
-        this.pending = pending;
-    }
-
-    @Override
-    public ArrayList<ObjectAdapterMemento> getMultiPending() {
-        return pending != null ? pending.getList() : null;
-    }
-
-    @Override
-    public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
-        this.pending = ObjectAdapterMemento.createForList(pending, scalarModel.getTypeOfSpecification().getSpecId());
-    }
-
-    public ScalarModel getScalarModel() {
-        return scalarModel;
-    }
-
-    // //////////////////////////////////////
-
-    @com.google.inject.Inject
-    private WicketViewerSettings wicketViewerSettings;
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
deleted file mode 100644
index 4615cfa..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  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.widgets.valuechoices;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanel;
-
-public class ValueChoicesSelect2PanelFactory extends ComponentFactoryAbstract {
-
-    private static final long serialVersionUID = 1L;
-
-    public ValueChoicesSelect2PanelFactory() {
-        super(ComponentType.SCALAR_NAME_AND_VALUE, ValueChoicesSelect2Panel.class);
-    }
-
-    @Override
-    public ApplicationAdvice appliesTo(final IModel<?> model) {
-        if (!(model instanceof ScalarModel)) {
-            return ApplicationAdvice.DOES_NOT_APPLY;
-        }
-        final ScalarModel scalarModel = (ScalarModel) model;
-        final boolean hasChoices = scalarModel.hasChoices();
-        return appliesIf(hasChoices);
-    }
-
-    @Override
-    public final Component createComponent(final String id, final IModel<?> model) {
-        final ScalarModel scalarModel = (ScalarModel) model;
-        if(scalarModel.isViewMode()) {
-            return new StringPanel(id, scalarModel);
-        } else {
-            return new ValueChoicesSelect2Panel(id, scalarModel);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
deleted file mode 100644
index c151c44..0000000
--- a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  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.widgets.valuechoices;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import com.google.common.collect.Lists;
-import org.jmock.Expectations;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-
-public class FixedObjectAdapterMementoProviderTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    private List<ObjectAdapterMemento> mementos;
-
-    private ObjectAdapterMemento mockMemento1;
-    private ObjectAdapterMemento mockMemento2;
-    private ValueChoicesSelect2Panel.FixedObjectAdapterMementoProvider provider;
-
-    @Before
-    public void setUp() throws Exception {
-        mockMemento1 = mock("mockMemento1");
-        mockMemento2 = mock("mockMemento2");
-
-        mementos = Lists.newArrayList(
-                mockMemento1, mockMemento2
-        );
-
-        WicketViewerSettings wicketViewerSettings = context.mock(WicketViewerSettings.class);
-        provider = new ValueChoicesSelect2Panel.FixedObjectAdapterMementoProvider(null, mementos, wicketViewerSettings);
-    }
-
-    @Test
-    public void whenInList() throws Exception {
-        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("mockMemento1"));
-        Assert.assertThat(mementos.size(), is(1));
-        Assert.assertThat(mementos.iterator().next(), is(mockMemento1));
-    }
-
-    @Test
-    public void whenNullPlaceholder() throws Exception {
-        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("$$_isis_null_$$"));
-        Assert.assertThat(mementos.size(), is(1));
-        Assert.assertThat(mementos.iterator().next(), is(nullValue()));
-    }
-
-    private ObjectAdapterMemento mock(final String id) {
-        final ObjectAdapterMemento mock = context.mock(ObjectAdapterMemento.class, id);
-        context.checking(new Expectations() {{
-            allowing(mock).asString();
-            will(returnValue(id));
-        }});
-        return mock;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
new file mode 100644
index 0000000..55e3025
--- /dev/null
+++ b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
@@ -0,0 +1,88 @@
+/*
+ *  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.widgets.valuechoices;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.jmock.Expectations;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+
+public class ObjectAdapterMementoProviderForValueChoicesTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
+
+    private List<ObjectAdapterMemento> mementos;
+
+    private ObjectAdapterMemento mockMemento1;
+    private ObjectAdapterMemento mockMemento2;
+    private ObjectAdapterMementoProviderForValueChoices provider;
+
+    @Before
+    public void setUp() throws Exception {
+        mockMemento1 = mock("mockMemento1");
+        mockMemento2 = mock("mockMemento2");
+
+        mementos = Lists.newArrayList(
+                mockMemento1, mockMemento2
+        );
+
+        WicketViewerSettings wicketViewerSettings = context.mock(WicketViewerSettings.class);
+        provider = new ObjectAdapterMementoProviderForValueChoices(null, mementos, wicketViewerSettings);
+    }
+
+    @Test
+    public void whenInList() throws Exception {
+        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("mockMemento1"));
+        Assert.assertThat(mementos.size(), is(1));
+        Assert.assertThat(mementos.iterator().next(), is(mockMemento1));
+    }
+
+    @Test
+    public void whenNullPlaceholder() throws Exception {
+        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("$$_isis_null_$$"));
+        Assert.assertThat(mementos.size(), is(1));
+        Assert.assertThat(mementos.iterator().next(), is(nullValue()));
+    }
+
+    private ObjectAdapterMemento mock(final String id) {
+        final ObjectAdapterMemento mock = context.mock(ObjectAdapterMemento.class, id);
+        context.checking(new Expectations() {{
+            allowing(mock).asString();
+            will(returnValue(id));
+        }});
+        return mock;
+    }
+
+}


[3/5] isis git commit: ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.

Posted by da...@apache.org.
ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.


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

Branch: refs/heads/maint-1.13.3
Commit: d987650409fd33094ca6154a4e2cc86417bba556
Parents: bbb9d33
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 11:38:00 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 11:38:00 2017 +0000

----------------------------------------------------------------------
 .../ComponentFactoryRegistrarDefault.java       |   2 +-
 .../scalars/ComponentFactoryScalarAbstract.java |   6 +-
 .../scalars/reference/ReferencePanel.java       |  94 ++----
 .../components/scalars/reference/Select2.java   | 181 -----------
 .../scalars/value/ValuePanelFactory.java        |   5 +-
 .../valuechoices/ValueChoicesSelect2Panel.html  |  49 +++
 .../valuechoices/ValueChoicesSelect2Panel.java  | 292 +++++++++++++++++
 .../ValueChoicesSelect2PanelFactory.java        |  65 ++++
 .../ObjectAdapterMementoProviderAbstract.java   | 164 ----------
 .../widgets/select2/EmptyChoiceProvider.java    |  44 ---
 .../ui/components/widgets/select2/Select2.java  | 178 +++++++++++
 .../widgets/select2/Select2ChoiceExt.java       |   1 +
 .../widgets/select2/Select2MultiChoiceExt.java  |   1 +
 .../select2/providers/EmptyChoiceProvider.java  |  44 +++
 .../ObjectAdapterMementoProviderAbstract.java   | 157 ++++++++++
 ...apterMementoProviderForReferenceChoices.java |  54 ++++
 ...oProviderForReferenceObjectAutoComplete.java |  60 ++++
 ...ForReferenceParamOrPropertyAutoComplete.java |  56 ++++
 ...ctAdapterMementoProviderForValueChoices.java |  52 +++
 .../valuechoices/ValueChoicesSelect2Panel.html  |  49 ---
 .../valuechoices/ValueChoicesSelect2Panel.java  | 313 -------------------
 .../ValueChoicesSelect2PanelFactory.java        |  58 ----
 .../FixedObjectAdapterMementoProviderTest.java  |  84 -----
 ...apterMementoProviderForValueChoicesTest.java |  88 ++++++
 24 files changed, 1128 insertions(+), 969 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 469d275..38b63b3 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -64,7 +64,7 @@ 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.apache.isis.viewer.wicket.ui.components.widgets.valuechoices.ValueChoicesSelect2PanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2PanelFactory;
 
 import java.util.ServiceLoader;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
index ed0d8a4..1b7fea4 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
@@ -48,8 +48,10 @@ public abstract class ComponentFactoryScalarAbstract extends ComponentFactoryAbs
         if(!scalarModel.isScalarTypeAnyOf(scalarTypes)) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
-        final boolean hasNoChoices = !scalarModel.hasChoices();
-        return appliesIf(hasNoChoices);
+        final boolean hasChoices = scalarModel.hasChoices();
+        // autoComplete not supported on values, only references
+        // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+        return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/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 abcc7ef..4331225 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
@@ -41,7 +41,6 @@ import org.wicketstuff.select2.Settings;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 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;
@@ -56,9 +55,12 @@ 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.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceChoices;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceObjectAutoComplete;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
@@ -349,22 +351,27 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private void setProviderAndCurrAndPending(
             final Select2 select2,
             final ObjectAdapter[] argsIfAvailable) {
+
+        ChoiceProvider<ObjectAdapterMemento> providerForChoices;
         if (getModel().hasChoices()) {
-            
-            final List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
-            ObjectAdapterMementoProviderAbstract providerForChoices = providerForChoices(choiceMementos);
+            List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
+            providerForChoices =
+                    new ObjectAdapterMementoProviderForReferenceChoices(getModel(), wicketViewerSettings, choiceMementos);
 
-            select2.setProvider(providerForChoices);
-            getModel().clearPending();
-            
-            resetIfCurrentNotInChoices(select2, choiceMementos);
-            
         } else if(getModel().hasAutoComplete()) {
-            select2.setProvider(providerForParamOrPropertyAutoComplete());
-            getModel().clearPending();
+            providerForChoices =
+                    new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(getModel(), wicketViewerSettings);
         } else {
-            select2.setProvider(providerForObjectAutoComplete());
-            getModel().clearPending();
+            providerForChoices =
+                    new ObjectAdapterMementoProviderForReferenceObjectAutoComplete(getModel(), wicketViewerSettings);
+        }
+
+        select2.setProvider(providerForChoices);
+        getModel().clearPending();
+
+        if(providerForChoices instanceof ObjectAdapterMementoProviderForReferenceChoices) {
+            final ObjectAdapterMementoProviderForReferenceChoices provider = (ObjectAdapterMementoProviderForReferenceChoices) providerForChoices;
+            resetIfCurrentNotInChoices(select2, provider.getChoiceMementos());
         }
     }
 
@@ -374,7 +381,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         if(getModel().hasChoices()) {
             choices.addAll(getModel().getChoices(argsIfAvailable, getAuthenticationSession(), getDeploymentCategory()));
         }
-        // take a copy otherwise is only lazily evaluated
+        // take a copy (otherwise is only lazily evaluated)
         return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
     }
 
@@ -415,60 +422,6 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return autoSelect;
     }
 
-    // called by setProviderAndCurrAndPending
-    private ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
-        return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
-                final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-                final List<ObjectAdapter> autoCompleteAdapters =
-                        autoCompleteFacet.execute(term,
-                                InteractionInitiatedBy.USER);
-                // take a copy otherwise so is eagerly evaluated and memento objects correctly built
-                return Lists.newArrayList(
-                        Lists.transform(autoCompleteAdapters, ObjectAdapterMemento.Functions.fromAdapter()));
-            }
-        };
-    }
-
-    // called by setProviderAndCurrAndPending
-    private ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
-        return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-            
-            private static final long serialVersionUID = 1L;
-            
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
-                if(getScalarModel().hasAutoComplete()) {
-                    final List<ObjectAdapter> autoCompleteAdapters =
-                            getScalarModel().getAutoComplete(term, getAuthenticationSession(), getDeploymentCategory());
-                    autoCompleteChoices.addAll(autoCompleteAdapters);
-                }
-                // take a copy otherwise so is eagerly evaluated and memento objects correctly built
-                return Lists.newArrayList(
-                        Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
-            }
-            
-        };
-    }
-
-    // called by setProviderAndCurrAndPending
-    private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
-        return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-            private static final long serialVersionUID = 1L;
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                return obtainMementos(term, choiceMementos);
-            }
-        };
-    }
-
-    
     // //////////////////////////////////////
     // getInput, convertInput
     // //////////////////////////////////////
@@ -555,7 +508,4 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return getIsisSessionFactory().getConfiguration();
     }
 
-
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
deleted file mode 100644
index 7d47b74..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *  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.reference;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.form.HiddenField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Select2Choice;
-import org.wicketstuff.select2.Select2MultiChoice;
-import org.wicketstuff.select2.Settings;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2MultiChoiceExt;
-
-/**
- * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
- */
-public class Select2 implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    final Select2ChoiceExt select2Choice;
-    final Select2MultiChoiceExt select2MultiChoice;
-
-    public static Select2 newSelect2Choice(
-            final String id,
-            final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
-        return new Select2(
-                Select2ChoiceExt.create(id, singleModel, parentModel),
-                null
-        );
-    }
-
-    public static Select2 newSelect2MultiChoice(
-            final String id,
-            final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
-            final ScalarModel parentModel) {
-        return new Select2(
-                null,
-                Select2MultiChoiceExt.create(id, multiModel, parentModel)
-        );
-    }
-
-    private Select2(
-            final Select2ChoiceExt select2Choice,
-            final Select2MultiChoiceExt select2MultiChoice) {
-        this.select2Choice = select2Choice;
-        this.select2MultiChoice = select2MultiChoice;
-    }
-
-    public HiddenField<?> component() {
-        return select2Choice != null
-                ? select2Choice
-                : select2MultiChoice;
-    }
-
-    public ChoiceExt choiceExt() {
-        return select2Choice != null
-                ? select2Choice
-                : select2MultiChoice;
-    }
-
-    public void clearInput() {
-        component().clearInput();
-    }
-
-    public void setEnabled(final boolean mutability) {
-        component().setEnabled(mutability);
-    }
-
-    public void setRequired(final boolean required) {
-        component().setRequired(required);
-    }
-    public boolean checkRequired() {
-        return component().checkRequired();
-    }
-
-    public Settings getSettings() {
-        return choiceExt().getSettings();
-    }
-
-    public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
-        choiceExt().setProvider(providerForChoices);
-    }
-
-    public ObjectAdapterMemento getModelObject() {
-        if (select2Choice != null) {
-            return select2Choice.getModelObject();
-        } else {
-            final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
-
-            return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
-        }
-    }
-
-    public IModel<ObjectAdapterMemento> getModel() {
-        if (select2Choice != null) {
-            return select2Choice.getModel();
-        } else {
-            final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
-            final Collection<ObjectAdapterMemento> modelObject = model.getObject();
-
-            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
-            return new IModel<ObjectAdapterMemento>() {
-                @Override
-                public ObjectAdapterMemento getObject() {
-                    return memento;
-                }
-
-                @Override
-                public void setObject(final ObjectAdapterMemento memento) {
-
-                    if(memento == null) {
-                        model.setObject(null);
-                        return;
-                    }
-
-                    final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
-                    model.setObject(mementos);
-                }
-
-                @Override
-                public void detach() {
-                }
-            };
-        }
-    }
-
-    public ObjectAdapterMemento getConvertedInput() {
-        if (select2Choice != null) {
-            return select2Choice.getConvertedInput();
-        } else {
-            final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
-            return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
-        }
-    }
-
-    public void setLabel(final Model<String> model) {
-        component().setLabel(model);
-    }
-
-    public void add(final Behavior behavior) {
-        component().add(behavior);
-    }
-
-    public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
-        return component().getBehaviors(behaviorClass);
-    }
-
-    public void remove(final Behavior behavior) {
-        component().remove(behavior);
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
index 85ba70f..c1a3732 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
@@ -48,7 +48,10 @@ public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
         if(valueFacet == null) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
-        return appliesIf(!scalarModel.hasChoices());
+        final boolean hasChoices = scalarModel.hasChoices();
+        // autoComplete not supported on values, only references
+        // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+        return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
new file mode 100644
index 0000000..0874436
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
@@ -0,0 +1,49 @@
+<?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 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
+      xml:lang="en"  
+      lang="en">
+    <body>
+        <wicket:panel>
+            <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
+                <div class="form-group" wicket:id="scalarIfRegular">
+                    <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
+                    <span class="scalarValueWrapper">
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
+                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                </span>
+                            </span>
+                            <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+                        </div>
+                        <span wicket:id="feedback" class="help-block"></span>
+                        <span wicket:id="associatedActionLinksBelow"></span>
+                    </span>
+                    <div class="clearfix"/>
+                </div>
+                <span wicket:id="scalarIfCompact"></span>
+            </div>
+        </wicket:panel>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/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
new file mode 100644
index 0000000..fcbca2f
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -0,0 +1,292 @@
+/**
+ *  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.valuechoices;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
+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.basic.Label;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+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.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.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.providers.ObjectAdapterMementoProviderForValueChoices;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
+
+    private static final long serialVersionUID = 1L;
+
+    private Select2 select2;
+    private ObjectAdapterMemento pending;
+
+    public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
+        super(id, scalarModel);
+        pending = scalarModel.getObjectAdapterMemento();
+    }
+
+    @Override
+    protected MarkupContainer addComponentForRegular() {
+
+
+        // same pattern as in ReferencePanel
+        if(select2 == null) {
+            if(getModel().isCollection()) {
+                final IModel<ArrayList<ObjectAdapterMemento>> modelObject = ScalarModelWithMultiPending.Util.createModel(this);
+                select2 = Select2.newSelect2MultiChoice(ID_SCALAR_VALUE, modelObject, scalarModel);
+            } else {
+                final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
+                select2 = Select2.newSelect2Choice(ID_SCALAR_VALUE, modelObject, scalarModel);
+            }
+
+            final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
+            setProviderAndCurrAndPending(select2, actionArgsHint);
+            addStandardSemantics();
+        } else {
+            select2.clearInput();
+        }
+
+
+        final MarkupContainer labelIfRegular = createFormComponentLabel();
+        if(getModel().isRequired()) {
+            labelIfRegular.add(new CssClassAppender("mandatory"));
+        }
+        
+        addOrReplace(labelIfRegular);
+
+        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
+        if(getModel().isRequired()) {
+            final String label = scalarName.getDefaultModelObjectAsString();
+            if(!Strings.isNullOrEmpty(label)) {
+                scalarName.add(new CssClassAppender("mandatory"));
+            }
+        }
+        labelIfRegular.addOrReplace(scalarName);
+        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
+        if (namedFacet != null) {
+            scalarName.setEscapeModelStrings(namedFacet.escaped());
+        }
+
+        // find the links...
+        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+
+        addPositioningCssTo(labelIfRegular, entityActions);
+
+        addFeedbackOnlyTo(labelIfRegular, select2.component());
+        addEditPropertyTo(labelIfRegular);
+
+        // ... add entity links to panel (below and to right)
+        addEntityActionLinksBelowAndRight(labelIfRegular, entityActions);
+
+        return labelIfRegular;
+    }
+
+    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
+        final List<ObjectAdapter> choices =
+                scalarModel.getChoices(argumentsIfAvailable, getAuthenticationSession(), getDeploymentCategory());
+        
+        // take a copy otherwise is only lazily evaluated
+        return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
+    }
+
+    protected void addStandardSemantics() {
+        setRequiredIfSpecified();
+    }
+
+    private void setRequiredIfSpecified() {
+        final ScalarModel scalarModel = getModel();
+        final boolean required = scalarModel.isRequired();
+        select2.setRequired(required);
+    }
+
+    protected MarkupContainer createFormComponentLabel() {
+        final String name = getModel().getName();
+        select2.setLabel(Model.of(name));
+
+        final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
+
+        final String describedAs = getModel().getDescribedAs();
+        if(describedAs != null) {
+            labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
+        }
+
+        labelIfRegular.add(select2.component());
+
+        return labelIfRegular;
+    }
+
+    @Override
+    protected Component addComponentForCompact() {
+        final Label labelIfCompact = new Label(ID_SCALAR_IF_COMPACT, getModel().getObjectAsString());
+        addOrReplace(labelIfCompact);
+        return labelIfCompact;
+    }
+
+    
+    protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
+        return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos, wicketViewerSettings);
+    }
+
+    @Override
+    protected boolean alwaysRebuildGui() {
+        return true;
+    }
+
+    @Override
+    protected void onBeforeRenderWhenViewMode() { 
+        // View: Read only
+        select2.setEnabled(false);
+    }
+
+    @Override
+    protected void onBeforeRenderWhenEnabled() { 
+        // Edit: read/write
+        select2.setEnabled(true);
+
+        // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
+    }
+
+    @Override
+    protected void onBeforeRenderWhenDisabled(final String disableReason) {
+        super.onBeforeRenderWhenDisabled(disableReason);
+        setTitleAttribute(disableReason);
+        select2.setEnabled(false);
+    }
+
+    private void setTitleAttribute(final String titleAttribute) {
+        getComponentForRegular().add(new AttributeModifier("title", Model.of(titleAttribute)));
+    }
+
+    
+    @Override
+    protected void addFormComponentBehavior(Behavior behavior) {
+        for (Behavior b : select2.getBehaviors(ScalarUpdatingBehavior.class)) {
+            select2.remove(b);
+        }
+        select2.add(behavior);
+    }
+
+    // //////////////////////////////////////
+
+    @Override
+    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
+        if(select2 != null) {
+            setProviderAndCurrAndPending(select2, argsIfAvailable);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * sets up the choices, also ensuring that any currently held value is compatible.
+     */
+    private void setProviderAndCurrAndPending(final Select2 select2, ObjectAdapter[] argsIfAvailable) {
+
+        final ChoiceProvider<ObjectAdapterMemento> provider;
+
+        // in corresponding code in ReferencePanelFactory, these is a branch for different types of providers
+        // (choice vs autoComplete).  Here though - because values don't currently support autoComplete - no branch is required
+        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
+        provider = newChoiceProvider(choicesMementos);
+
+        select2.setProvider(provider);
+        getModel().clearPending();
+
+        if(provider instanceof ObjectAdapterMementoProviderForValueChoices) {
+            final ObjectAdapterMementoProviderForValueChoices providerFixed = (ObjectAdapterMementoProviderForValueChoices) provider;
+            final List<ObjectAdapterMemento> choicesMementos1 = providerFixed.getChoicesMementos();
+            resetIfCurrentNotInChoices(select2, choicesMementos1);
+        }
+    }
+
+    private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos) {
+        final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
+        if(objectAdapterMemento == null) {
+            select2.getModel().setObject(null);
+        } else {
+
+            if(!getModel().isCollection()) {
+
+                // if currently held value is not compatible with choices, then replace with the first choice
+                if(!choicesMementos.contains(objectAdapterMemento)) {
+
+                    final ObjectAdapterMemento newAdapterMemento =
+                            choicesMementos.isEmpty()
+                                    ? null
+                                    : choicesMementos.get(0);
+
+                    select2.getModel().setObject(newAdapterMemento);
+                    getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
+                }
+
+            } else {
+
+                // nothing to do
+            }
+        }
+    }
+
+    // //////////////////////////////////////
+
+    @Override
+    public ObjectAdapterMemento getPending() {
+        return pending;
+    }
+
+    public void setPending(ObjectAdapterMemento pending) {
+        this.pending = pending;
+    }
+
+    @Override
+    public ArrayList<ObjectAdapterMemento> getMultiPending() {
+        return pending != null ? pending.getList() : null;
+    }
+
+    @Override
+    public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
+        this.pending = ObjectAdapterMemento.createForList(pending, scalarModel.getTypeOfSpecification().getSpecId());
+    }
+
+    public ScalarModel getScalarModel() {
+        return scalarModel;
+    }
+
+    // //////////////////////////////////////
+
+    @com.google.inject.Inject
+    private WicketViewerSettings wicketViewerSettings;
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
new file mode 100644
index 0000000..78fe659
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
@@ -0,0 +1,65 @@
+/*
+ *  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.valuechoices;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanel;
+
+public class ValueChoicesSelect2PanelFactory extends ComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public ValueChoicesSelect2PanelFactory() {
+        super(ComponentType.SCALAR_NAME_AND_VALUE, ValueChoicesSelect2Panel.class);
+    }
+
+    @Override
+    public ApplicationAdvice appliesTo(final IModel<?> model) {
+        if (!(model instanceof ScalarModel)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        final ScalarModel scalarModel = (ScalarModel) model;
+        final boolean hasChoices = scalarModel.hasChoices();
+
+        // autoComplete not supported on values, only references
+        // this is because there is no easy way in the ChoiceProvider to convert the list of Ids (strings)
+        // into corresponding ObjectAdapterMemento's.
+        // see subclasses of ObjectAdapterMementoProviderAbstract
+
+        // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+        return appliesIf(hasChoices /* || hasAutoComplete */);
+    }
+
+    @Override
+    public final Component createComponent(final String id, final IModel<?> model) {
+        final ScalarModel scalarModel = (ScalarModel) model;
+        if(scalarModel.isViewMode()) {
+            return new StringPanel(id, scalarModel);
+        } else {
+            return new ValueChoicesSelect2Panel(id, scalarModel);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
deleted file mode 100644
index cdc2250..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- *  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.widgets;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-
-import org.apache.wicket.Session;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.string.Strings;
-import org.wicketstuff.select2.TextChoiceProvider;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
-
-public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
-
-    private static final long serialVersionUID = 1L;
-    
-    protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
-    private static final String NULL_DISPLAY_TEXT = "";
-
-    private final ScalarModel scalarModel;
-    private final WicketViewerSettings wicketViewerSettings;
-
-    public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
-        this.scalarModel = scalarModel;
-        this.wicketViewerSettings = wicketViewerSettings;
-    }
-    
-    @Override
-    protected String getDisplayText(final ObjectAdapterMemento choice) {
-        if (choice == null) {
-            return NULL_DISPLAY_TEXT;
-        }
-
-        final ObjectAdapter objectAdapter =
-                choice.getObjectAdapter(
-                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
-        final IConverter<Object> converter = findConverter(objectAdapter);
-        return converter != null
-                ? converter.convertToString(objectAdapter.getObject(), getLocale())
-                : objectAdapter.titleString(null);
-    }
-
-    protected Locale getLocale() {
-        return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
-    }
-
-    protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
-        return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
-    }
-
-    @Override
-    protected Object getId(final ObjectAdapterMemento choice) {
-        return choice != null? choice.asString(): NULL_PLACEHOLDER;
-    }
-
-    @Override
-    public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
-        
-        final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
-        // if not mandatory, and the list doesn't contain null already, then add it in.
-        if(!scalarModel.isRequired() && !mementos.contains(null)) {
-            mementos.add(0, null);
-        }
-        response.addAll(mementos);
-    }
-
-    protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
-
-    /**
-     * Filters all choices against a term by using their
-     * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
-     *
-     * @param term The term entered by the user
-     * @param choicesMementos The collections of choices to filter
-     * @return A list of all matching choices
-     */
-    protected List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
-        List<ObjectAdapterMemento> matches = Lists.newArrayList();
-        if (Strings.isEmpty(term)) {
-            matches.addAll(choicesMementos);
-        } else {
-            for (ObjectAdapterMemento candidate : choicesMementos) {
-                ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
-                        getPersistenceSession(), getSpecificationLoader());
-                String title = objectAdapter.titleString(objectAdapter);
-                if (title.toLowerCase().contains(term.toLowerCase())) {
-                    matches.add(candidate);
-                }
-            }
-        }
-
-        return matches;
-    }
-
-    @Override
-    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
-        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
-
-            @Override
-            public ObjectAdapterMemento apply(final String input) {
-                if(NULL_PLACEHOLDER.equals(input)) {
-                    return null;
-                }
-                final RootOid oid = RootOid.deString(input);
-                return ObjectAdapterMemento.createPersistent(oid);
-            }
-        };
-        return Collections2.transform(ids, function);
-    }
-    
-    protected ScalarModel getScalarModel() {
-        return scalarModel;
-    }
-
-
-    ///////////////////////////////////////////////////////
-    // Dependencies (from context)
-    ///////////////////////////////////////////////////////
-
-
-    protected SpecificationLoader getSpecificationLoader() {
-        return getIsisSessionFactory().getSpecificationLoader();
-    }
-
-    PersistenceSession getPersistenceSession() {
-        return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
-    }
-
-    private IsisSessionFactory getIsisSessionFactory() {
-        return IsisContext.getSessionFactory();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
deleted file mode 100644
index 0cb647b..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- *  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.widgets.select2;
-
-import java.util.Collection;
-
-import org.apache.wicket.ajax.json.JSONException;
-import org.apache.wicket.ajax.json.JSONWriter;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Response;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
-
-    static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
-
-    @Override
-    public void query(String term, int page, Response<ObjectAdapterMemento> response) {
-    }
-
-    @Override
-    public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
-    }
-
-    @Override
-    public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/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
new file mode 100644
index 0000000..041af1e
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -0,0 +1,178 @@
+/*
+ *  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.widgets.select2;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Select2Choice;
+import org.wicketstuff.select2.Select2MultiChoice;
+import org.wicketstuff.select2.Settings;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+/**
+ * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
+ */
+public class Select2 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    final Select2ChoiceExt select2Choice;
+    final Select2MultiChoiceExt select2MultiChoice;
+
+    public static Select2 newSelect2Choice(
+            final String id,
+            final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
+        return new Select2(
+                Select2ChoiceExt.create(id, singleModel, parentModel),
+                null
+        );
+    }
+
+    public static Select2 newSelect2MultiChoice(
+            final String id,
+            final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
+            final ScalarModel parentModel) {
+        return new Select2(
+                null,
+                Select2MultiChoiceExt.create(id, multiModel, parentModel)
+        );
+    }
+
+    private Select2(
+            final Select2ChoiceExt select2Choice,
+            final Select2MultiChoiceExt select2MultiChoice) {
+        this.select2Choice = select2Choice;
+        this.select2MultiChoice = select2MultiChoice;
+    }
+
+    public HiddenField<?> component() {
+        return select2Choice != null
+                ? select2Choice
+                : select2MultiChoice;
+    }
+
+    public ChoiceExt choiceExt() {
+        return select2Choice != null
+                ? select2Choice
+                : select2MultiChoice;
+    }
+
+    public void clearInput() {
+        component().clearInput();
+    }
+
+    public void setEnabled(final boolean mutability) {
+        component().setEnabled(mutability);
+    }
+
+    public void setRequired(final boolean required) {
+        component().setRequired(required);
+    }
+    public boolean checkRequired() {
+        return component().checkRequired();
+    }
+
+    public Settings getSettings() {
+        return choiceExt().getSettings();
+    }
+
+    public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
+        choiceExt().setProvider(providerForChoices);
+    }
+
+    public ObjectAdapterMemento getModelObject() {
+        if (select2Choice != null) {
+            return select2Choice.getModelObject();
+        } else {
+            final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
+
+            return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+        }
+    }
+
+    public IModel<ObjectAdapterMemento> getModel() {
+        if (select2Choice != null) {
+            return select2Choice.getModel();
+        } else {
+            final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
+            final Collection<ObjectAdapterMemento> modelObject = model.getObject();
+
+            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+            return new IModel<ObjectAdapterMemento>() {
+                @Override
+                public ObjectAdapterMemento getObject() {
+                    return memento;
+                }
+
+                @Override
+                public void setObject(final ObjectAdapterMemento memento) {
+
+                    if(memento == null) {
+                        model.setObject(null);
+                        return;
+                    }
+
+                    final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
+                    model.setObject(mementos);
+                }
+
+                @Override
+                public void detach() {
+                }
+            };
+        }
+    }
+
+    public ObjectAdapterMemento getConvertedInput() {
+        if (select2Choice != null) {
+            return select2Choice.getConvertedInput();
+        } else {
+            final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
+            return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
+        }
+    }
+
+    public void setLabel(final Model<String> model) {
+        component().setLabel(model);
+    }
+
+    public void add(final Behavior behavior) {
+        component().add(behavior);
+    }
+
+    public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
+        return component().getBehaviors(behaviorClass);
+    }
+
+    public void remove(final Behavior behavior) {
+        component().remove(behavior);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
index 3e0f25b..e01c7b1 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
@@ -22,6 +22,7 @@ import org.wicketstuff.select2.Select2Choice;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.EmptyChoiceProvider;
 
 public class Select2ChoiceExt extends Select2Choice<ObjectAdapterMemento> implements ChoiceExt {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
index 7796061..5f11e58 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
@@ -25,6 +25,7 @@ import org.wicketstuff.select2.Select2MultiChoice;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.EmptyChoiceProvider;
 
 public class Select2MultiChoiceExt
         extends Select2MultiChoice<ObjectAdapterMemento>

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
new file mode 100644
index 0000000..dbc0e85
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
@@ -0,0 +1,44 @@
+/**
+ *  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.widgets.select2.providers;
+
+import java.util.Collection;
+
+import org.apache.wicket.ajax.json.JSONException;
+import org.apache.wicket.ajax.json.JSONWriter;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Response;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+public class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
+
+    public static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
+
+    @Override
+    public void query(String term, int page, Response<ObjectAdapterMemento> response) {
+    }
+
+    @Override
+    public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
new file mode 100644
index 0000000..0143749
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -0,0 +1,157 @@
+/**
+ *  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.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.Session;
+import org.apache.wicket.util.convert.IConverter;
+import org.apache.wicket.util.string.Strings;
+import org.wicketstuff.select2.TextChoiceProvider;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
+
+public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
+
+    private static final long serialVersionUID = 1L;
+    
+    protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
+    private static final String NULL_DISPLAY_TEXT = "";
+
+    private final ScalarModel scalarModel;
+    private final WicketViewerSettings wicketViewerSettings;
+
+    public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
+        this.scalarModel = scalarModel;
+        this.wicketViewerSettings = wicketViewerSettings;
+    }
+    
+    @Override
+    protected String getDisplayText(final ObjectAdapterMemento choice) {
+        if (choice == null) {
+            return NULL_DISPLAY_TEXT;
+        }
+
+        final ObjectAdapter objectAdapter =
+                choice.getObjectAdapter(
+                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
+        final IConverter<Object> converter = findConverter(objectAdapter);
+        return converter != null
+                ? converter.convertToString(objectAdapter.getObject(), getLocale())
+                : objectAdapter.titleString(null);
+    }
+
+    protected Locale getLocale() {
+        return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
+    }
+
+    protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
+        return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
+    }
+
+    @Override
+    protected Object getId(final ObjectAdapterMemento choice) {
+        return choice != null? choice.asString(): NULL_PLACEHOLDER;
+    }
+
+    @Override
+    public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
+        
+        final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
+        // if not mandatory, and the list doesn't contain null already, then add it in.
+        if(!scalarModel.isRequired() && !mementos.contains(null)) {
+            mementos.add(0, null);
+        }
+        response.addAll(mementos);
+    }
+
+    protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
+
+    /**
+     * Filters all choices against a term by using their
+     * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
+     *
+     * @param term The term entered by the user
+     * @param choicesMementos The collections of choices to filter
+     * @return A list of all matching choices
+     */
+    protected final List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
+        List<ObjectAdapterMemento> matches = Lists.newArrayList();
+        if (Strings.isEmpty(term)) {
+            matches.addAll(choicesMementos);
+        } else {
+            for (ObjectAdapterMemento candidate : choicesMementos) {
+                ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
+                        getPersistenceSession(), getSpecificationLoader());
+                String title = objectAdapter.titleString(objectAdapter);
+                if (title.toLowerCase().contains(term.toLowerCase())) {
+                    matches.add(candidate);
+                }
+            }
+        }
+
+        return matches;
+    }
+
+
+    protected ScalarModel getScalarModel() {
+        return scalarModel;
+    }
+
+
+    ///////////////////////////////////////////////////////
+    // Dependencies (from context)
+    ///////////////////////////////////////////////////////
+
+
+    protected SpecificationLoader getSpecificationLoader() {
+        return getIsisSessionFactory().getSpecificationLoader();
+    }
+
+    PersistenceSession getPersistenceSession() {
+        return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
+    }
+
+    protected IsisSessionFactory getIsisSessionFactory() {
+        return IsisContext.getSessionFactory();
+    }
+
+    public AuthenticationSession getAuthenticationSession() {
+        return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+    }
+
+    public DeploymentCategory getDeploymentCategory() {
+        return getIsisSessionFactory().getDeploymentCategory();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
new file mode 100644
index 0000000..de3f7f4
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
@@ -0,0 +1,54 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceChoices
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+    private final List<ObjectAdapterMemento> choiceMementos;
+
+    public ObjectAdapterMementoProviderForReferenceChoices(
+            final ScalarModel model,
+            final WicketViewerSettings wicketViewerSettings,
+            final List<ObjectAdapterMemento> choiceMementos) {
+        super(model, wicketViewerSettings);
+        this.choiceMementos = choiceMementos;
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        return obtainMementos(term, choiceMementos);
+    }
+
+    public List<ObjectAdapterMemento> getChoiceMementos() {
+        return choiceMementos;
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+            @Override
+            public ObjectAdapterMemento apply(final String input) {
+                if(NULL_PLACEHOLDER.equals(input)) {
+                    return null;
+                }
+                final RootOid oid = RootOid.deString(input);
+                return ObjectAdapterMemento.createPersistent(oid);
+            }
+        };
+        return Collections2.transform(ids, function);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
new file mode 100644
index 0000000..d55fd58
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
@@ -0,0 +1,60 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+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.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceObjectAutoComplete
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public ObjectAdapterMementoProviderForReferenceObjectAutoComplete(
+            final ScalarModel model,
+            final WicketViewerSettings wicketViewerSettings) {
+        super(model, wicketViewerSettings);
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
+        final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+        final List<ObjectAdapter> autoCompleteAdapters =
+                autoCompleteFacet.execute(term,
+                        InteractionInitiatedBy.USER);
+        // take a copy otherwise so is eagerly evaluated and memento objects correctly built
+        return Lists.newArrayList(
+                Lists.transform(autoCompleteAdapters, ObjectAdapterMemento.Functions.fromAdapter()));
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+            @Override
+            public ObjectAdapterMemento apply(final String input) {
+                if(NULL_PLACEHOLDER.equals(input)) {
+                    return null;
+                }
+                final RootOid oid = RootOid.deString(input);
+                final ObjectAdapterMemento oam = ObjectAdapterMemento.createPersistent(oid);
+                return oam;
+            }
+        };
+
+        return Collections2.transform(ids, function);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
new file mode 100644
index 0000000..6ce9783
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
@@ -0,0 +1,56 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(
+            final ScalarModel model, final WicketViewerSettings wicketViewerSettings) {
+        super(model, wicketViewerSettings);
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
+        if (getScalarModel().hasAutoComplete()) {
+            final List<ObjectAdapter> autoCompleteAdapters =
+                    getScalarModel().getAutoComplete(term, getAuthenticationSession(), getDeploymentCategory());
+            autoCompleteChoices.addAll(autoCompleteAdapters);
+        }
+        // take a copy otherwise so is eagerly evaluated and memento objects correctly built
+        return Lists.newArrayList(
+                Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+            @Override
+            public ObjectAdapterMemento apply(final String input) {
+                if(NULL_PLACEHOLDER.equals(input)) {
+                    return null;
+                }
+                final RootOid oid = RootOid.deString(input);
+                return ObjectAdapterMemento.createPersistent(oid);
+            }
+        };
+        return Collections2.transform(ids, function);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
new file mode 100644
index 0000000..cf52db6
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
@@ -0,0 +1,52 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForValueChoices
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+    private final List<ObjectAdapterMemento> choicesMementos;
+
+    public ObjectAdapterMementoProviderForValueChoices(
+            final ScalarModel scalarModel,
+            final List<ObjectAdapterMemento> choicesMementos,
+            final WicketViewerSettings wicketViewerSettings) {
+        super(scalarModel, wicketViewerSettings);
+        this.choicesMementos = choicesMementos;
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        return obtainMementos(term, choicesMementos);
+    }
+
+    public List<ObjectAdapterMemento> getChoicesMementos() {
+        return choicesMementos;
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final List<ObjectAdapterMemento> mementos = obtainMementos(null);
+
+        final Predicate<ObjectAdapterMemento> lookupOam = new Predicate<ObjectAdapterMemento>() {
+            @Override
+            public boolean apply(ObjectAdapterMemento input) {
+                final String id = (String) getId(input);
+                return ids.contains(id);
+            }
+        };
+        return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
deleted file mode 100644
index 0874436..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
+++ /dev/null
@@ -1,49 +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 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
-      xml:lang="en"  
-      lang="en">
-    <body>
-        <wicket:panel>
-            <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
-                <div class="form-group" wicket:id="scalarIfRegular">
-                    <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
-                    <span class="scalarValueWrapper">
-                        <div class="scalarPlaceholder">
-                            <span class="scalarValueInput">
-                                <span class="editing">
-                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
-                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
-                                </span>
-                            </span>
-                            <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
-                        </div>
-                        <span wicket:id="feedback" class="help-block"></span>
-                        <span wicket:id="associatedActionLinksBelow"></span>
-                    </span>
-                    <div class="clearfix"/>
-                </div>
-                <span wicket:id="scalarIfCompact"></span>
-            </div>
-        </wicket:panel>
-    </body>
-</html>


[4/5] isis git commit: ISIS-785: feedback panel (indicating mandatory parameter etc) now shows for ReferencePanel.

Posted by da...@apache.org.
ISIS-785: feedback panel (indicating mandatory parameter etc) now shows for ReferencePanel.

Along the way, the ReferencePanel#select2 field is not created eagerly (similar to ValueSelect2ChoicePanel) and never removed.  There's a chance, at least, this might fix the floating drop-down problem.


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

Branch: refs/heads/maint-1.13.3
Commit: 50a38e9f9d43cc86a766341e96de781fd49cadf0
Parents: d987650
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 13:18:07 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 13:18:07 2017 +0000

----------------------------------------------------------------------
 .../reference/EntityLinkSelect2Panel.java       |  9 +-
 .../scalars/reference/ReferencePanel.java       | 97 +++++++++++---------
 .../valuechoices/ValueChoicesSelect2Panel.java  |  1 -
 3 files changed, 57 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/50a38e9f/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
index a4035ac..34f50a3 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
@@ -20,6 +20,7 @@
 package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
 import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.wicketstuff.select2.Select2MultiChoice;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
@@ -40,14 +41,12 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
 
     /**
      * Necessary because {@link FormComponentPanel} overrides this as <tt>true</tt>, whereas we want to
-     * report on the state of the underlying {@link org.wicketstuff.select2.Select2Choice}.
+     * report on the state of the underlying {@link org.wicketstuff.select2.Select2Choice} or
+     * {@link Select2MultiChoice}.
      */
     @Override
     public boolean checkRequired() {
-        if(owningPanel.select2 != null) {
-            return owningPanel.select2.checkRequired();
-        }
-        return super.checkRequired();
+        return owningPanel.select2.checkRequired();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/50a38e9f/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 4331225..abf32e4 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
@@ -57,10 +57,10 @@ import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.Enti
 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;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceChoices;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceObjectAutoComplete;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
@@ -84,6 +84,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
     Select2 select2;
 
+
     private EntityLinkSimplePanel entitySimpleLink;
 
     public ReferencePanel(final String id, final ScalarModel scalarModel) {
@@ -115,7 +116,6 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return labelIfCompact;
     }
 
-
     // First called as a side-effect of {@link #beforeRender()}
     @Override
     protected FormGroup addComponentForRegular() {
@@ -123,34 +123,78 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final String name = scalarModel.getName();
         
         entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), this);
+
+        // create select2
+        entityLink.setRequired(getModel().isRequired());
+
+        if(getModel().isCollection()) {
+            final IModel<ArrayList<ObjectAdapterMemento>> model =
+                    ScalarModelWithMultiPending.Util.createModel(getModel());
+            this.select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
+        } else {
+            final IModel<ObjectAdapterMemento> modelObject =
+                    ScalarModelWithPending.Util.createModel(getModel());
+            this.select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
+        }
+
+        setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
+
+        final Settings settings = select2.getSettings();
+
+        // one of these three case should be true
+        // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
+        if(getModel().hasChoices()) {
+
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(getModel().hasAutoComplete()) {
+
+            final int minLength = getModel().getAutoCompleteMinLength();
+            settings.setMinimumInputLength(minLength);
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(hasObjectAutoComplete()) {
+            final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
+            final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+            final int minLength = autoCompleteFacet.getMinLength();
+            settings.setMinimumInputLength(minLength);
+        }
+
+        entityLink.addOrReplace(select2.component());
+
+        // end create select2
+
+
         syncWithInput();
 
         setOutputMarkupId(true);
         entityLink.setOutputMarkupId(true);
-        entityLink.setLabel(Model.of(name));
+        select2.component().setOutputMarkupId(true);
+        select2.component().setLabel(Model.of(name));
 
         final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, entityLink);
         labelIfRegular.add(entityLink);
-        
+
         final String describedAs = getModel().getDescribedAs();
         if(describedAs != null) {
             labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
         }
-        
-        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(entityLink));
+
+        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
         labelIfRegular.add(scalarName);
         NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
         if (namedFacet != null) {
             scalarName.setEscapeModelStrings(namedFacet.escaped());
         }
 
+
         // find the links...
         final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
 
         addPositioningCssTo(labelIfRegular, entityActions);
 
         addOrReplace(labelIfRegular);
-        addFeedbackOnlyTo(labelIfRegular, entityLink);
+        addFeedbackOnlyTo(labelIfRegular, select2.component()); // this is a placeholder; when select2.component() is available, we use that instead
         addEditPropertyTo(labelIfRegular);
 
         // ... add entity links to panel (below and to right)
@@ -264,42 +308,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         if(isEditableWithEitherAutoCompleteOrChoices()) {
 
             if(select2 == null) {
-                entityLink.setRequired(getModel().isRequired());
-
-                if(getModel().isCollection()) {
-                    final IModel<ArrayList<ObjectAdapterMemento>> model =
-                            ScalarModelWithMultiPending.Util.createModel(getModel());
-                    select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
-                } else {
-                    final IModel<ObjectAdapterMemento> modelObject =
-                            ScalarModelWithPending.Util.createModel(getModel());
-                    select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
-                }
-                setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
-
-                final Settings settings = select2.getSettings();
-
-                // one of these three case should be true
-                // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
-                if(getModel().hasChoices()) {
-
-                    settings.setPlaceholder(getModel().getName());
-
-                } else if(getModel().hasAutoComplete()) {
-
-                    final int minLength = getModel().getAutoCompleteMinLength();
-                    settings.setMinimumInputLength(minLength);
-                    settings.setPlaceholder(getModel().getName());
-
-                } else if(hasObjectAutoComplete()) {
-                    final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
-                    final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-                    final int minLength = autoCompleteFacet.getMinLength();
-                    settings.setMinimumInputLength(minLength);
-                }
-
-                entityLink.addOrReplace(select2.component());
-
+                throw new IllegalStateException("select2 should be created already");
             } else {
                 //
                 // the select2Choice already exists, so the widget has been rendered before.  If it is
@@ -338,7 +347,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
             // this is horrid; adds a label to the id
             // should instead be a 'temporary hide'
             Components.permanentlyHide(entityLink, ID_AUTO_COMPLETE);
-            select2 = null; // this forces recreation next time around
+            // setSelect2(null); // this forces recreation next time around
         }
         
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/50a38e9f/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 fcbca2f..28a315e 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
@@ -61,7 +61,6 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     @Override
     protected MarkupContainer addComponentForRegular() {
 
-
         // same pattern as in ReferencePanel
         if(select2 == null) {
             if(getModel().isCollection()) {