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

[26/43] isis git commit: ISIS-1603: removes some of the duplication between ReferencesPanel and ValueChoicesSelect2Panel (introduces new ScalarPanelSelect2Abstract superclass to hold this stuff).

ISIS-1603: removes some of the duplication between ReferencesPanel and ValueChoicesSelect2Panel (introduces new ScalarPanelSelect2Abstract superclass to hold this stuff).


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

Branch: refs/heads/master
Commit: 8f8abeabf772423dcfca3c476cdba29091b26450
Parents: 715e876
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Apr 27 12:24:19 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Apr 27 13:26:40 2017 +0100

----------------------------------------------------------------------
 .../components/scalars/ScalarPanelAbstract.java |  25 ----
 .../scalars/ScalarPanelSelect2Abstract.java     | 121 +++++++++++++++++++
 .../reference/EntityLinkSelect2Panel.java       |   2 +-
 .../scalars/reference/ReferencePanel.java       |  90 +++++---------
 .../valuechoices/ValueChoicesSelect2Panel.java  | 113 ++++-------------
 .../ui/components/widgets/select2/Select2.java  |  29 ++---
 .../ObjectAdapterMementoProviderForChoices.java |  48 ++++++++
 ...apterMementoProviderForReferenceChoices.java |   2 +-
 ...ctAdapterMementoProviderForValueChoices.java |   5 +-
 9 files changed, 239 insertions(+), 196 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index d2e71a1..221e327 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import com.google.common.collect.Lists;
@@ -46,13 +45,10 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 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.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
@@ -65,7 +61,6 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisBlobOr
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BooleanPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2Panel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
@@ -344,28 +339,8 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     }
 
 
-
-
     // //////////////////////////////////////
 
-    /**
-     * For convenience of implementations that use a select2 dropdown ({@link ReferencePanel} and {@link ValueChoicesSelect2Panel}).
-     */
-    protected Select2 createSelect2(final String id) {
-        final Select2 select2;
-        if(getModel().isCollection()) {
-            final IModel<ArrayList<ObjectAdapterMemento>> model = ScalarModelWithMultiPending.Util.createModel(scalarModel);
-            select2 = Select2.newSelect2MultiChoice(id, model, scalarModel);
-        } else {
-            final IModel<ObjectAdapterMemento> model = ScalarModelWithPending.Util.createModel(scalarModel);
-            select2 = Select2.newSelect2Choice(id, model, scalarModel);
-        }
-        return select2;
-    }
-
-
-
-    // //////////////////////////////////////
 
     private final List<ScalarModelSubscriber> subscribers = Lists.newArrayList();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
new file mode 100644
index 0000000..5597368
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
@@ -0,0 +1,121 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.scalars;
+
+import java.util.List;
+
+import com.google.common.base.Strings;
+
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.FormComponent;
+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.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForChoices;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    protected Select2 select2;
+
+    public ScalarPanelSelect2Abstract(final String id, final ScalarModel scalarModel) {
+        super(id, scalarModel);
+    }
+
+
+    protected Select2 createSelect2(final String id) {
+        final Select2 select2 = Select2.createSelect2(id, scalarModel);
+        setProviderAndCurrAndPending(select2, scalarModel.getActionArgsHint());
+        select2.setRequired(scalarModel.isRequired());
+        return select2;
+    }
+
+    protected Label createScalarName(final String id) {
+        final Label scalarName = new Label(id, getRendering().getLabelCaption(select2.component()));
+        if(getModel().isRequired()) {
+            final String label = scalarName.getDefaultModelObjectAsString();
+            if(!Strings.isNullOrEmpty(label)) {
+                scalarName.add(new CssClassAppender("mandatory"));
+            }
+        }
+        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
+        if (namedFacet != null) {
+            scalarName.setEscapeModelStrings(namedFacet.escaped());
+        }
+        return scalarName;
+    }
+
+    protected FormGroup createFormGroupAndName(
+            final FormComponent<?> component,
+            final String formGroupId, final String nameId) {
+        final FormGroup formGroup = new FormGroup(formGroupId, component);
+        final String describedAs = getModel().getDescribedAs();
+        if(describedAs != null) {
+            formGroup.add(new AttributeModifier("title", Model.of(describedAs)));
+        }
+        formGroup.add(component);
+
+        final Label scalarName = createScalarName(nameId);
+        formGroup.addOrReplace(scalarName);
+        return formGroup;
+    }
+
+    /**
+     * sets up the choices, also ensuring that any currently held value is compatible.
+     *
+     * <p>
+     *     For convenience of subclasses using a select2.
+     * </p>
+     */
+    protected void setProviderAndCurrAndPending(final Select2 select2, ObjectAdapter[] argsIfAvailable) {
+
+        final ChoiceProvider<ObjectAdapterMemento> choiceProvider;
+        choiceProvider = buildChoiceProvider(argsIfAvailable);
+
+        select2.setProvider(choiceProvider);
+        getModel().clearPending();
+
+        if(choiceProvider instanceof ObjectAdapterMementoProviderForChoices) {
+            final ObjectAdapterMementoProviderForChoices providerForChoices = (ObjectAdapterMementoProviderForChoices) choiceProvider;
+            resetIfCurrentNotInChoices(select2, providerForChoices.getChoiceMementos());
+        }
+    }
+
+    /**
+     * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2, ObjectAdapter[])})
+     */
+    protected abstract ChoiceProvider<ObjectAdapterMemento> buildChoiceProvider(final ObjectAdapter[] argsIfAvailable);
+
+    /**
+     * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2, ObjectAdapter[])})
+     */
+    protected abstract void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos);
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/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 6aa26c9..6ebab43 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
@@ -46,7 +46,7 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
      */
     @Override
     public boolean checkRequired() {
-        return owningPanel.select2.checkRequired();
+        return owningPanel.getSelect2().checkRequired();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/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 17be714..bc26781 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.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
@@ -51,7 +50,7 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.scalars.PanelWithChoices;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelect2Abstract;
 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;
@@ -59,13 +58,12 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.Obj
 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.util.Components;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
  * Panel for rendering scalars which of are of reference type (as opposed to
  * value types).
  */
-public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoices {
+public class ReferencePanel extends ScalarPanelSelect2Abstract implements PanelWithChoices {
 
     private static final long serialVersionUID = 1L;
 
@@ -79,8 +77,6 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
     private static final String KEY_DISABLE_DEPENDENT_CHOICE_AUTO_SELECTION = "isis.viewer.wicket.disableDependentChoiceAutoSelection";
 
     private EntityLinkSelect2Panel entityLink;
-    Select2 select2;
-
 
     private EntityLinkSimplePanel entitySimpleLink;
 
@@ -89,6 +85,11 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
         super(id, scalarModel);
     }
 
+
+    Select2 getSelect2() {
+        return select2;
+    }
+
     // //////////////////////////////////////
 
     // First called as a side-effect of {@link #beforeRender()}
@@ -112,9 +113,7 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
     // First called as a side-effect of {@link #beforeRender()}
     @Override
     protected FormGroup createComponentForRegular() {
-        final ScalarModel scalarModel = getModel();
-        final String name = scalarModel.getName();
-        
+
         entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), this);
 
         entityLink.setRequired(getModel().isRequired());
@@ -126,35 +125,19 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
         setOutputMarkupId(true);
         entityLink.setOutputMarkupId(true);
         select2.component().setOutputMarkupId(true);
-        select2.component().setLabel(Model.of(name));
-
-        final FormGroup scalarIfRegularFormGroup = new FormGroup(ID_SCALAR_IF_REGULAR, entityLink);
-        scalarIfRegularFormGroup.add(entityLink);
-
-        final String describedAs = getModel().getDescribedAs();
-        if(describedAs != null) {
-            scalarIfRegularFormGroup.add(new AttributeModifier("title", Model.of(describedAs)));
-        }
-
-        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
-        scalarIfRegularFormGroup.add(scalarName);
-        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            scalarName.setEscapeModelStrings(namedFacet.escaped());
-        }
-        if(getModel().isRequired()) {
-            scalarName.add(new CssClassAppender("mandatory"));
-        }
 
+        final String name = scalarModel.getName();
+        select2.setLabel(Model.of(name));
 
+        final FormGroup formGroup = createFormGroupAndName(this.entityLink, ID_SCALAR_IF_REGULAR, ID_SCALAR_NAME);
 
 
         // add semantics
-        entityLink.setRequired(getModel().isRequired());
-        entityLink.add(new IValidator<ObjectAdapter>() {
-        
+        this.entityLink.setRequired(getModel().isRequired());
+        this.entityLink.add(new IValidator<ObjectAdapter>() {
+
             private static final long serialVersionUID = 1L;
-        
+
             @Override
             public void validate(final IValidatable<ObjectAdapter> validatable) {
                 final ObjectAdapter proposedAdapter = validatable.getValue();
@@ -167,8 +150,7 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
             }
         });
 
-
-        return scalarIfRegularFormGroup;
+        return formGroup;
     }
 
     @Override
@@ -180,7 +162,6 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
 
         final Select2 select2 = createSelect2(ID_AUTO_COMPLETE);
 
-        setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
 
         final Settings settings = select2.getSettings();
 
@@ -206,6 +187,8 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
         return select2;
     }
 
+
+
     // //////////////////////////////////////
 
     @Override
@@ -378,32 +361,19 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
     // setProviderAndCurrAndPending
     // //////////////////////////////////////
     
-    // called by syncWithInput, updateChoices
-    private void setProviderAndCurrAndPending(
-            final Select2 select2,
-            final ObjectAdapter[] argsIfAvailable) {
+    @Override
+    protected ChoiceProvider<ObjectAdapterMemento> buildChoiceProvider(final ObjectAdapter[] argsIfAvailable) {
 
-        ChoiceProvider<ObjectAdapterMemento> providerForChoices;
         if (getModel().hasChoices()) {
             List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
-            providerForChoices =
-                    new ObjectAdapterMementoProviderForReferenceChoices(getModel(), wicketViewerSettings, choiceMementos);
-
-        } else if(getModel().hasAutoComplete()) {
-            providerForChoices =
-                    new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(getModel(), wicketViewerSettings);
-        } else {
-            providerForChoices =
-                    new ObjectAdapterMementoProviderForReferenceObjectAutoComplete(getModel(), wicketViewerSettings);
+            return new ObjectAdapterMementoProviderForReferenceChoices(getModel(), wicketViewerSettings, choiceMementos);
         }
 
-        select2.setProvider(providerForChoices);
-        getModel().clearPending();
-
-        if(providerForChoices instanceof ObjectAdapterMementoProviderForReferenceChoices) {
-            final ObjectAdapterMementoProviderForReferenceChoices provider = (ObjectAdapterMementoProviderForReferenceChoices) providerForChoices;
-            resetIfCurrentNotInChoices(select2, provider.getChoiceMementos());
+        if(getModel().hasAutoComplete()) {
+            return new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(getModel(), wicketViewerSettings);
         }
+
+        return new ObjectAdapterMementoProviderForReferenceObjectAutoComplete(getModel(), wicketViewerSettings);
     }
 
     // called by setProviderAndCurrAndPending
@@ -417,7 +387,8 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
     }
 
     // called by setProviderAndCurrAndPending
-    private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choiceMementos) {
+    @Override
+    protected void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choiceMementos) {
         final ObjectAdapterMemento curr = select2.getModelObject();
 
         if(!getModel().isCollection()) {
@@ -499,12 +470,11 @@ public class ReferencePanel extends ScalarPanelAbstract implements PanelWithChoi
      */
     @Override
     public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        if(select2 != null) {
-            setProviderAndCurrAndPending(select2, argsIfAvailable);
-            return true;
-        } else {
+        if (select2 == null) {
             return false;
         }
+        setProviderAndCurrAndPending(select2, argsIfAvailable);
+        return true;
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/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 fe823ec..b64b6cc 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
@@ -18,7 +18,6 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices;
 
 import java.util.List;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 
 import org.apache.wicket.AttributeModifier;
@@ -32,23 +31,21 @@ 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.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.PanelWithChoices;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelect2Abstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
-public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements PanelWithChoices {
+public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract implements PanelWithChoices {
 
 
     private static final long serialVersionUID = 1L;
 
-    private Select2 select2;
 
     public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
@@ -62,45 +59,24 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Pan
 
         // same pattern as in ReferencePanel
         if(select2 == null) {
-            this.select2 = createSelect2AndSemantics();
-
-            final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
-            setProviderAndCurrAndPending(select2, actionArgsHint);
-            addStandardSemantics(select2);
+            this.select2 = createSelect2(ID_SCALAR_VALUE);
         } else {
             select2.clearInput();
         }
 
-        final MarkupContainer scalarIfRegularFormGroup = createScalarIfRegularFormGroup();
-        if(getModel().isRequired()) {
-            scalarIfRegularFormGroup.add(new CssClassAppender("mandatory"));
-        }
+        final String name = getModel().getName();
+        select2.setLabel(Model.of(name));
+
+        final FormGroup formGroup = createFormGroupAndName(select2.component(), ID_SCALAR_IF_REGULAR, ID_SCALAR_NAME);
 
-        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"));
-            }
-        }
-        scalarIfRegularFormGroup.addOrReplace(scalarName);
-        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            scalarName.setEscapeModelStrings(namedFacet.escaped());
+            formGroup.add(new CssClassAppender("mandatory"));
         }
 
 
-        return scalarIfRegularFormGroup;
+        return formGroup;
     }
 
-    private Select2 createSelect2AndSemantics() {
-        final Select2 select2 = createSelect2(ID_SCALAR_VALUE);
-
-        final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
-        setProviderAndCurrAndPending(select2, actionArgsHint);
-        addStandardSemantics(select2);
-        return select2;
-    }
 
     protected Component getScalarValueComponent() {
         return select2.component();
@@ -114,32 +90,6 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Pan
         return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
     }
 
-    protected void addStandardSemantics(final Select2 select2) {
-        setRequiredIfSpecified(select2);
-    }
-
-    private void setRequiredIfSpecified(final Select2 select2) {
-        final ScalarModel scalarModel = getModel();
-        final boolean required = scalarModel.isRequired();
-        select2.setRequired(required);
-    }
-
-    protected MarkupContainer createScalarIfRegularFormGroup() {
-        final String name = getModel().getName();
-        select2.setLabel(Model.of(name));
-
-        final FormGroup formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
-
-        final String describedAs = getModel().getDescribedAs();
-        if(describedAs != null) {
-            formGroup.add(new AttributeModifier("title", Model.of(describedAs)));
-        }
-
-        formGroup.add(select2.component());
-
-        return formGroup;
-    }
-
     // ///////////////////////////////////////////////////////////////////
 
     @Override
@@ -160,7 +110,6 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Pan
     }
 
 
-
     // ///////////////////////////////////////////////////////////////////
 
     @Override
@@ -206,12 +155,11 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Pan
 
     @Override
     public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        if(select2 != null) {
-            setProviderAndCurrAndPending(select2, argsIfAvailable);
-            return true;
-        } else {
+        if (select2 == null) {
             return false;
         }
+        setProviderAndCurrAndPending(select2, argsIfAvailable);
+        return true;
     }
 
     /**
@@ -224,42 +172,29 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Pan
         target.add(select2.component());
     }
 
-    /**
-     * 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
+    // 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
+    @Override
+    protected ChoiceProvider<ObjectAdapterMemento> buildChoiceProvider(final ObjectAdapter[] argsIfAvailable) {
         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 ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
         return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos, wicketViewerSettings);
     }
 
-    private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos) {
-        final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
-        if(objectAdapterMemento == null) {
+    @Override
+    protected void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos) {
+        final ObjectAdapterMemento curr = getModel().getObjectAdapterMemento();
+
+        if(curr == 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)) {
+                if(!choicesMementos.contains(curr)) {
 
                     final ObjectAdapterMemento newAdapterMemento =
                             choicesMementos.isEmpty()

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
index b2c89fe..5bfa8ee 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -34,6 +34,8 @@ 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.model.models.ScalarModelWithMultiPending;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
 
 /**
  * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
@@ -45,23 +47,16 @@ public class Select2 implements Serializable {
     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)
-        );
+    public static Select2 createSelect2(final String id, final ScalarModel scalarModel) {
+        return scalarModel.isCollection()
+                ? new Select2(
+                        null,
+                        Select2MultiChoiceExt.create(id,
+                                ScalarModelWithMultiPending.Util.createModel(scalarModel), scalarModel))
+                : new Select2(
+                        Select2ChoiceExt.create(id,
+                                ScalarModelWithPending.Util.createModel(scalarModel), scalarModel),
+                        null);
     }
 
     private Select2(

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForChoices.java
new file mode 100644
index 0000000..36213eb
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForChoices.java
@@ -0,0 +1,48 @@
+/*
+ *  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.
+ */
+/*
+ *  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.List;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+public interface ObjectAdapterMementoProviderForChoices {
+
+    List<ObjectAdapterMemento> getChoiceMementos();
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/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
index 3459fdb..361b1ca 100644
--- 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
@@ -48,7 +48,7 @@ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 
 public class ObjectAdapterMementoProviderForReferenceChoices
-        extends ObjectAdapterMementoProviderAbstract {
+        extends ObjectAdapterMementoProviderAbstract implements ObjectAdapterMementoProviderForChoices {
 
     private static final long serialVersionUID = 1L;
     private final List<ObjectAdapterMemento> choiceMementos;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f8abeab/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
index e17a202..2dcd0ae 100644
--- 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
@@ -48,7 +48,7 @@ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 
 public class ObjectAdapterMementoProviderForValueChoices
-        extends ObjectAdapterMementoProviderAbstract {
+        extends ObjectAdapterMementoProviderAbstract implements ObjectAdapterMementoProviderForChoices {
 
     private static final long serialVersionUID = 1L;
     private final List<ObjectAdapterMemento> choicesMementos;
@@ -66,7 +66,7 @@ public class ObjectAdapterMementoProviderForValueChoices
         return obtainMementos(term, choicesMementos);
     }
 
-    public List<ObjectAdapterMemento> getChoicesMementos() {
+    public List<ObjectAdapterMemento> getChoiceMementos() {
         return choicesMementos;
     }
 
@@ -84,5 +84,4 @@ public class ObjectAdapterMementoProviderForValueChoices
         return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
     }
 
-
 }