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 2014/05/08 09:13:47 UTC

[01/10] git commit: ISIS-764: removed EntityLinkSelect2PanelFactory

Repository: isis
Updated Branches:
  refs/heads/ISIS-764 [created] a95a5c7b5


ISIS-764: removed EntityLinkSelect2PanelFactory

... because only ever used by ReferencePanel.  Instead instantiate panel directly.

(On way towards combining these two components).


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

Branch: refs/heads/ISIS-764
Commit: d629617288635abd1bb903c0b671901445cf33a4
Parents: 31acb0f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue May 6 09:53:38 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue May 6 09:53:38 2014 +0100

----------------------------------------------------------------------
 .../ComponentFactoryRegistrarDefault.java       |  3 --
 .../columns/ObjectAdapterTitleColumn.java       |  1 +
 .../scalars/reference/ReferencePanel.java       |  7 +--
 .../entitylink/EntityLinkSelect2Panel.java      |  1 +
 .../EntityLinkSelect2PanelFactory.java          | 54 --------------------
 5 files changed, 4 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d6296172/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 07d53d7..9d01ba9 100644
--- a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -79,7 +79,6 @@ import org.apache.isis.viewer.wicket.ui.components.unknown.UnknownModelPanelFact
 import org.apache.isis.viewer.wicket.ui.components.value.StandaloneValuePanelFactory;
 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.entitylink.EntityLinkSelect2PanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.widgets.valuechoices.ValueChoicesSelect2PanelFactory;
 
@@ -231,8 +230,6 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
     }
 
     protected void addComponentFactoriesForEntityLink(final ComponentFactoryList componentFactories) {
-        // must come before EntityLinkSimplePanelFactory (as is more specific) 
-        componentFactories.add(new EntityLinkSelect2PanelFactory()); 
         componentFactories.add(new EntityLinkSimplePanelFactory());
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d6296172/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterTitleColumn.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterTitleColumn.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterTitleColumn.java
index 44d3e35..f4fb00f 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterTitleColumn.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterTitleColumn.java
@@ -59,6 +59,7 @@ public class ObjectAdapterTitleColumn extends ColumnAbstract<ObjectAdapter> {
         final EntityModel model = new EntityModel(adapter);
         model.setRenderingHint(parentAdapterMementoIfAny != null? RenderingHint.PARENTED_TITLE_COLUMN: RenderingHint.STANDALONE_TITLE_COLUMN);
         model.setContextAdapterIfAny(parentAdapterMementoIfAny);
+        // will use EntityLinkSimplePanelFactory as model is an EntityModel
         final ComponentFactory componentFactory = findComponentFactory(ComponentType.ENTITY_LINK, model);
         return componentFactory.createComponent(id, model);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/d6296172/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index bfc1254..89e0a69 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -75,9 +75,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         super.onBeforeRenderWhenDisabled(disableReason);
         final EntityModel entityLinkModel = (EntityModel) entityLink.getModel();
         entityLinkModel.toViewMode();
-        
         setTitleAttribute(disableReason);
-
         entityLink.syncVisibilityAndUsability();
     }
 
@@ -90,7 +88,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final ScalarModel scalarModel = getModel();
         final String name = scalarModel.getName();
         
-        entityLink = (EntityLinkSelect2Panel) getComponentFactoryRegistry().createComponent(ComponentType.ENTITY_LINK, getModel());
+        entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), getModel());
         
         setOutputMarkupId(true);
         entityLink.setOutputMarkupId(true);
@@ -166,8 +164,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final ScalarModel scalarModel = getModel();
         final String name = scalarModel.getName();
         
-        final Component entityLinkComponent = getComponentFactoryRegistry().createComponent(ComponentType.ENTITY_LINK, getModel());
-        entityLink = (EntityLinkSelect2Panel) entityLinkComponent;
+        entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), getModel());
         
         entityLink.setOutputMarkupId(true);
         entityLink.setLabel(Model.of(name));

http://git-wip-us.apache.org/repos/asf/isis/blob/d6296172/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
index 9388f32..80a2af4 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
@@ -24,6 +24,7 @@ import java.util.List;
 import com.google.common.collect.Lists;
 import com.vaynberg.wicket.select2.ChoiceProvider;
 import com.vaynberg.wicket.select2.Select2Choice;
+import com.vaynberg.wicket.select2.Select2MultiChoice;
 import com.vaynberg.wicket.select2.Settings;
 
 import org.apache.wicket.Component;

http://git-wip-us.apache.org/repos/asf/isis/blob/d6296172/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java
deleted file mode 100644
index 911ca68..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java
+++ /dev/null
@@ -1,54 +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.entitylink;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-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;
-
-public class EntityLinkSelect2PanelFactory extends ComponentFactoryAbstract {
-
-    private static final long serialVersionUID = 1L;
-
-    public EntityLinkSelect2PanelFactory() {
-        super(ComponentType.ENTITY_LINK, EntityLinkSelect2Panel.class);
-    }
-
-    @Override
-    public ApplicationAdvice appliesTo(final IModel<?> model) {
-        if (!(model instanceof ScalarModel)) {
-            return ApplicationAdvice.DOES_NOT_APPLY;
-        }
-        final ScalarModel scalarModel = (ScalarModel) model;
-        final ObjectSpecification specification = scalarModel.getTypeOfSpecification();
-        return appliesIf(specification != null && !specification.containsFacet(ValueFacet.class));
-    }
-
-    @Override
-    public Component createComponent(final String id, final IModel<?> model) {
-        final ScalarModel scalarModel = (ScalarModel) model;
-        return new EntityLinkSelect2Panel(id, scalarModel);
-    }
-}


[09/10] git commit: ISIS-764: select2Field moved from EntityLinkSelect2Panel ...

Posted by da...@apache.org.
ISIS-764: select2Field moved from EntityLinkSelect2Panel ...

... to ReferencePanel.


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

Branch: refs/heads/ISIS-764
Commit: 8a207fac396193e5687d31dc28706eac93af88a2
Parents: 01597e6
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 8 07:12:13 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 8 07:12:13 2014 +0100

----------------------------------------------------------------------
 .../reference/EntityLinkSelect2Panel.java       |  11 +-
 .../scalars/reference/ReferencePanel.java       | 121 ++++++++++---------
 2 files changed, 65 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8a207fac/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
index 0e9670e..95ccfe0 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
@@ -24,7 +24,6 @@ import com.vaynberg.wicket.select2.Select2Choice;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
 
@@ -32,7 +31,6 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
 
     private static final long serialVersionUID = 1L;
 
-    Select2Choice<ObjectAdapterMemento> select2Field;
     ReferencePanel owningPanel;
 
     public EntityLinkSelect2Panel(final String id, final ReferencePanel owningPanel) {
@@ -40,7 +38,6 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
         this.owningPanel = owningPanel;
         
         setType(ObjectAdapter.class);
-        owningPanel.syncWithInput(this);
     }
 
     /**
@@ -49,8 +46,8 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
      */
     @Override
     public boolean checkRequired() {
-        if(select2Field != null) {
-            return select2Field.checkRequired();
+        if(owningPanel.select2Field != null) {
+            return owningPanel.select2Field.checkRequired();
         }
         return super.checkRequired();
     }
@@ -68,12 +65,12 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
 
     @Override
     protected void convertInput() {
-        owningPanel.convertInput(this);
+        owningPanel.convertInput();
     }
 
     @Override
     protected void onBeforeRender() {
-        owningPanel.syncWithInput(this);
+        owningPanel.syncWithInput();
         super.onBeforeRender();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8a207fac/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 1208845..b7dff68 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -72,8 +72,9 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
 
     private EntityLinkSelect2Panel entityLink;
-    private EntityLinkSimplePanel entitySimpleLink;
+    Select2Choice<ObjectAdapterMemento> select2Field;
 
+    private EntityLinkSimplePanel entitySimpleLink;
     private FormComponentLabel labelIfRegular;
 
     public ReferencePanel(final String id, final ScalarModel scalarModel) {
@@ -88,7 +89,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final EntityModel entityLinkModel = (EntityModel) entityLink.getModel();
         entityLinkModel.toViewMode();
         setTitleAttribute(disableReason);
-        syncVisibilityAndUsability(entityLink, entityLink.select2Field);
+        syncVisibilityAndUsability();
     }
 
     private void setTitleAttribute(final String titleAttribute) {
@@ -127,7 +128,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final String name = scalarModel.getName();
         
         entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), this);
-        
+        syncWithInput();
+
         setOutputMarkupId(true);
         entityLink.setOutputMarkupId(true);
         entityLink.setLabel(Model.of(name));
@@ -178,14 +180,14 @@ public class ReferencePanel extends ScalarPanelAbstract {
     protected void onBeforeRenderWhenEnabled() {
         super.onBeforeRenderWhenEnabled();
         entityLink.setEnabled(true);
-        syncVisibilityAndUsability(entityLink, entityLink.select2Field);
+        syncVisibilityAndUsability();
     }
 
     @Override
     protected void onBeforeRenderWhenViewMode() {
         super.onBeforeRenderWhenViewMode();
         entityLink.setEnabled(true);
-        syncVisibilityAndUsability(entityLink, entityLink.select2Field);
+        syncVisibilityAndUsability();
     }
 
     // //////////////////////////////////////
@@ -193,8 +195,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
     // called from buildGui
     @Override
     protected void addFormComponentBehavior(Behavior behavior) {
-        if(entityLink.select2Field != null) {
-            entityLink.select2Field.add(behavior);
+        if(select2Field != null) {
+            select2Field.add(behavior);
         }
     }
 
@@ -329,30 +331,6 @@ public class ReferencePanel extends ScalarPanelAbstract {
         };
     }
 
-    /**
-     * Must be called after {@link #setEnabled(boolean)}, apparently...
-     * originally to ensure that the findUsing button and entityClearLink were
-     * shown/not shown as required, however these have now gone.  Which beckons the question,
-     * is it still important?
-     * 
-     * <p>
-     * REVIEW: there ought to be a better way to do this. I'd hoped to override
-     * {@link #setEnabled(boolean)}, but it is <tt>final</tt>, and there doesn't
-     * seem to be anyway to install a listener. One option might be to move it
-     * to {@link #onBeforeRender()} ?
-     */
-    private void syncVisibilityAndUsability(EntityLinkSelect2Panel linkPanel, Select2Choice<ObjectAdapterMemento> select2Field) {
-        final boolean mutability = linkPanel.isEnableAllowed() && !getModel().isViewMode();
-    
-        if(select2Field != null) {
-            select2Field.setEnabled(mutability);
-        }
-        
-        if(labelIfRegular != null && isEditableWithEitherAutoCompleteOrChoices()) {
-            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
     // //////////////////////////////////////
     
     // called by EntityLinkSelect2Panel
@@ -364,37 +342,39 @@ public class ReferencePanel extends ScalarPanelAbstract {
     // //////////////////////////////////////
 
     // called by EntityLinkSelect2Panel
-    void convertInput(EntityLinkSelect2Panel linkPanel) {
+    void convertInput() {
         if(getModel().isEditMode() && isEditableWithEitherAutoCompleteOrChoices()) {
+
             // flush changes to pending
-            this.onSelected(linkPanel, linkPanel.select2Field.getConvertedInput());
+            ObjectAdapterMemento convertedInput = select2Field.getConvertedInput();
+            
+            getModel().setPending(convertedInput);
+            if(select2Field != null) {
+                select2Field.getModel().setObject(convertedInput);
+            }
+            
+            final ObjectAdapter adapter = convertedInput!=null?convertedInput.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null;
+            getModel().setObject(adapter);
         }
     
         final ObjectAdapter pendingAdapter = getModel().getPendingAdapter();
-        linkPanel.setConvertedInput(pendingAdapter);
+        entityLink.setConvertedInput(pendingAdapter);
     }
 
-    private void onSelected(EntityLinkSelect2Panel linkPanel, final ObjectAdapterMemento selectedAdapterMemento) {
-
-        getModel().setPending(selectedAdapterMemento);
-        getModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
-        if(linkPanel.select2Field != null) {
-            linkPanel.select2Field.getModel().setObject(selectedAdapterMemento);
-        }
-    }
+    
 
     // //////////////////////////////////////
 
     // called by EntityLinkSelect2Panel
-    void syncWithInput(EntityLinkSelect2Panel linkPanel) {
+    void syncWithInput() {
         final ObjectAdapter adapter = getModel().getPendingElseCurrentAdapter();
-        syncLinkWithInput(linkPanel, adapter);
-        syncLinkWithInputIfAutoCompleteOrChoices(linkPanel);
-        syncVisibilityAndUsability(linkPanel, linkPanel.select2Field);
+        syncLinkWithInput(adapter);
+        syncLinkWithInputIfAutoCompleteOrChoices();
+        syncVisibilityAndUsability();
     }
 
     // called by syncWithInput
-    private void syncLinkWithInput(EntityLinkSelect2Panel linkPanel, final ObjectAdapter adapter) {
+    private void syncLinkWithInput(final ObjectAdapter adapter) {
         if(labelIfRegular == null) {
             return;
         }
@@ -412,33 +392,32 @@ public class ReferencePanel extends ScalarPanelAbstract {
             labelIfRegular.addOrReplace(component);
         } else {
             Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
-            
         }
     }
 
     // called by syncWithInput
-    private void syncLinkWithInputIfAutoCompleteOrChoices(EntityLinkSelect2Panel linkPanel) {
+    private void syncLinkWithInputIfAutoCompleteOrChoices() {
         if(!isEditableWithEitherAutoCompleteOrChoices()) {
             // this is horrid; adds a label to the id
             // should instead be a 'temporary hide'
-            Components.permanentlyHide(linkPanel, ReferencePanel.ID_AUTO_COMPLETE);
-            linkPanel.select2Field = null; // this forces recreation next time around
+            Components.permanentlyHide(entityLink, ReferencePanel.ID_AUTO_COMPLETE);
+            select2Field = null; // this forces recreation next time around
             return;
         }
     
         final IModel<ObjectAdapterMemento> model = Util.createModel(getModel().asScalarModelWithPending());       
     
-        if(linkPanel.select2Field == null) {
-            linkPanel.setRequired(getModel().isRequired());
-            linkPanel.select2Field = Select2ChoiceUtil.newSelect2Choice(ReferencePanel.ID_AUTO_COMPLETE, model, getModel());
-            setProviderAndCurrAndPending(linkPanel.select2Field, getModel().getActionArgsHint());
+        if(select2Field == null) {
+            entityLink.setRequired(getModel().isRequired());
+            select2Field = Select2ChoiceUtil.newSelect2Choice(ReferencePanel.ID_AUTO_COMPLETE, model, getModel());
+            setProviderAndCurrAndPending(select2Field, getModel().getActionArgsHint());
             if(!getModel().hasChoices()) {
-                final Settings settings = linkPanel.select2Field.getSettings();
+                final Settings settings = select2Field.getSettings();
                 final int minLength = getModel().getAutoCompleteMinLength();
                 settings.setMinimumInputLength(minLength);
                 settings.setPlaceholder(getModel().getName());
             }
-            linkPanel.addOrReplace(linkPanel.select2Field);
+            entityLink.addOrReplace(select2Field);
         } else {
             //
             // the select2Field already exists, so the widget has been rendered before.  If it is
@@ -456,7 +435,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
             // see: FormComponent#getInputAsArray()
             // see: Select2Choice#renderInitializationScript()
             //
-            linkPanel.select2Field.clearInput();
+            select2Field.clearInput();
         }
     
         if(labelIfRegular != null) {
@@ -468,6 +447,28 @@ public class ReferencePanel extends ScalarPanelAbstract {
     // //////////////////////////////////////
 
     /**
+     * REVIEW: there ought to be a better way to do this. I'd hoped to override
+     * {@link #setEnabled(boolean)}, but it is <tt>final</tt>, and there doesn't
+     * seem to be anyway to install a listener. One option might be to move it
+     * to {@link #onBeforeRender()} ?
+     * 
+     * <p>
+     * called by onBeforeRender*, also from syncWithInput
+     */
+    private void syncVisibilityAndUsability() {
+        if(labelIfRegular != null && isEditableWithEitherAutoCompleteOrChoices()) {
+            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+        }
+
+        if(select2Field != null) {
+            final boolean mutability = entityLink.isEnableAllowed() && !getModel().isViewMode();
+            select2Field.setEnabled(mutability);
+        }
+    }
+
+    // //////////////////////////////////////
+
+    /**
      * Hook method to refresh choices when changing.
      * 
      * <p>
@@ -475,8 +476,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
      */
     @Override
     public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        if(entityLink.select2Field != null) {
-            setProviderAndCurrAndPending(entityLink.select2Field, argsIfAvailable);
+        if(select2Field != null) {
+            setProviderAndCurrAndPending(select2Field, argsIfAvailable);
             return true;
         } else {
             return false;


[07/10] git commit: ISIS-764: more stuff moved over

Posted by da...@apache.org.
ISIS-764: more stuff moved over

from EntityLinkSelect2Panel to ReferencePanel.  Specifically, the entityIconAndTitle link is now parented by ReferencePanel.


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

Branch: refs/heads/ISIS-764
Commit: 5fef65862dac5ceae208220639b53d6b5e05cecc
Parents: 1f714c0
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 8 00:23:25 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 8 00:23:25 2014 +0100

----------------------------------------------------------------------
 .../entity/header/EntityHeaderPanel.java        |  6 ---
 .../reference/EntityLinkSelect2Panel.html       |  1 -
 .../scalars/reference/ReferencePanel.html       |  1 +
 .../scalars/reference/ReferencePanel.java       | 53 ++++++++++----------
 .../dom/src/main/java/dom/todo/ToDoItem.java    | 45 +++++++++++++++++
 5 files changed, 73 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5fef6586/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
index 070048b..fb16b44 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
@@ -27,10 +27,7 @@ import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.Page;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 
-import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
@@ -42,11 +39,9 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.progmodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
 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.ImageResourceCache;
@@ -57,7 +52,6 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuBuilde
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuPanel;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
-import org.apache.isis.viewer.wicket.ui.pages.actionprompt.ActionPromptPage;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
 /**

http://git-wip-us.apache.org/repos/asf/isis/blob/5fef6586/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
index 7610cf1..9f86f3e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
@@ -25,7 +25,6 @@
 	<body>
 		<wicket:panel>
             <input wicket:id="autoComplete" type="hidden" class="autoComplete" />
-            <span wicket:id="entityIconAndTitle">[icon and title]</span>
 		</wicket:panel>
 	</body>
 </html>

http://git-wip-us.apache.org/repos/asf/isis/blob/5fef6586/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
index dd9de09..a1ddb42 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
@@ -34,6 +34,7 @@
                                 <div class="wrapper">
                                     <span class="autoCompletePlaceholder">
                                         <span wicket:id="entityLink">link or drop down</span>
+                                        <span wicket:id="entityIconAndTitle">[icon and title]</span>
                                     </span>
                                     <div class="clear"/>
                                 </div>

http://git-wip-us.apache.org/repos/asf/isis/blob/5fef6586/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 09d8e8a..cba1720 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -28,6 +28,7 @@ import com.vaynberg.wicket.select2.Settings;
 
 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.markup.html.form.FormComponentLabel;
@@ -44,7 +45,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
@@ -69,11 +69,14 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
 
     static final String ID_AUTO_COMPLETE = "autoComplete";
+    
     static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
 
     private EntityLinkSelect2Panel entityLink;
     private EntityLinkSimplePanel entitySimpleLink;
 
+    private FormComponentLabel labelIfRegular;
+
     public ReferencePanel(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
     }
@@ -116,7 +119,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         entityLink.setOutputMarkupId(true);
         entityLink.setLabel(Model.of(name));
         
-        final FormComponentLabel labelIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, entityLink);
+        labelIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, entityLink);
         labelIfRegular.add(entityLink);
         
         final String describedAs = getModel().getDescribedAs();
@@ -344,27 +347,27 @@ public class ReferencePanel extends ScalarPanelAbstract {
     }
 
     void syncLinkWithInput(EntityLinkSelect2Panel linkPanel, final ObjectAdapter adapter) {
+        if(labelIfRegular == null) {
+            return;
+        }
+        
         if (adapter != null) {
-            addOrReplaceIconAndTitle(linkPanel, adapter);
+            final EntityModel entityModelForLink = new EntityModel(adapter);
+            
+            entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
+            entityModelForLink.setRenderingHint(getModel().getRenderingHint());
+            
+            final ComponentFactory componentFactory = 
+                    getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
+            final Component component = componentFactory.createComponent(entityModelForLink);
+            
+            labelIfRegular.addOrReplace(component);
         } else {
-            Components.permanentlyHide(linkPanel, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+            
         }
     }
 
-    void addOrReplaceIconAndTitle(EntityLinkSelect2Panel linkPanel, ObjectAdapter pendingOrCurrentAdapter) {
-
-        final EntityModel entityModelForLink = new EntityModel(pendingOrCurrentAdapter);
-        
-        entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
-        entityModelForLink.setRenderingHint(getModel().getRenderingHint());
-        
-        final ComponentFactory componentFactory = 
-                getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-        final Component component = componentFactory.createComponent(entityModelForLink);
-        
-        linkPanel.addOrReplace(component);
-    }
-
 
     void onSelected(EntityLinkSelect2Panel linkPanel, final ObjectAdapterMemento selectedAdapterMemento) {
 
@@ -394,8 +397,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
             select2Field.setEnabled(mutability);
         }
         
-        if(isEditableWithEitherAutoCompleteOrChoices()) {
-            Components.permanentlyHide(linkPanel, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+        if(labelIfRegular != null && isEditableWithEitherAutoCompleteOrChoices()) {
+            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
         }
     }
 
@@ -457,13 +460,11 @@ public class ReferencePanel extends ScalarPanelAbstract {
             //
             linkPanel.select2Field.clearInput();
         }
-        
-        // no need for link, since can see in drop-down
-        Components.permanentlyHide(linkPanel, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
     
-        // no need for the 'null' title, since if there is no object yet
-        // can represent this fact in the drop-down
-        // permanentlyHide(ID_ENTITY_TITLE_NULL);
+        if(labelIfRegular != null) {
+            // no need for link, since can see in drop-down
+            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+        }
     }
 
     String getInput() {

http://git-wip-us.apache.org/repos/asf/isis/blob/5fef6586/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index c384a9c..e2d5e1e 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -22,13 +22,18 @@ import java.math.BigDecimal;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.*;
+
 import javax.jdo.JDOHelper;
 import javax.jdo.annotations.IdentityType;
+import javax.jdo.annotations.NullValue;
 import javax.jdo.annotations.VersionStrategy;
+
 import com.google.common.base.Objects;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Ordering;
+
 import org.joda.time.LocalDate;
+
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
@@ -901,4 +906,44 @@ public class ToDoItem implements Comparable<ToDoItem> {
 
     //endregion
 
+    
+    // //////////////////////////////////////
+    // foo (property)
+    // //////////////////////////////////////
+
+    private ToDoItem foo;
+
+    @javax.jdo.annotations.Persistent()
+    @javax.jdo.annotations.Column(allowsNull="true")
+    @MemberOrder(sequence = "1")
+    public ToDoItem getFoo() {
+        return foo;
+    }
+
+    public void setFoo(final ToDoItem foo) {
+        this.foo = foo;
+    }
+
+    // //////////////////////////////////////
+    // bar (property)
+    // //////////////////////////////////////
+
+    private ToDoItem bar;
+
+    @javax.jdo.annotations.Persistent()
+    @javax.jdo.annotations.Column(allowsNull="true")
+    @MemberOrder(sequence = "1")
+    public ToDoItem getBar() {
+        return bar;
+    }
+
+    public void setBar(final ToDoItem bar) {
+        this.bar = bar;
+    }
+    
+    public List<ToDoItem> choicesBar() {
+        return toDoItems.allToDos();
+    }
+
+
 }


[04/10] git commit: ISIS-764: moved html from EntityLinkSelect2Panel...

Posted by da...@apache.org.
ISIS-764: moved html from EntityLinkSelect2Panel...

... into ReferencePanel.


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

Branch: refs/heads/ISIS-764
Commit: a8eee7afcfb5289b7104a96675fddfe5505781bd
Parents: 867a26e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed May 7 20:06:31 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed May 7 20:06:31 2014 +0100

----------------------------------------------------------------------
 .../scalars/reference/EntityLinkSelect2Panel.html   | 11 ++---------
 .../scalars/reference/ReferencePanel.html           | 16 +++++++++++++---
 2 files changed, 15 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a8eee7af/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
index 4893d6d..7610cf1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
@@ -24,15 +24,8 @@
       lang="en">
 	<body>
 		<wicket:panel>
-			<div class="entityLinkSelect2Panel entityLinkComponentType">
-				<div class="wrapper">
-                    <span class="autoCompletePlaceholder">
-    					<input wicket:id="autoComplete" type="hidden" class="autoComplete" />
-    					<span wicket:id="entityIconAndTitle">[icon and title]</span>
-                    </span>
-				    <div class="clear"/>
-	  			</div>
-			</div>
+            <input wicket:id="autoComplete" type="hidden" class="autoComplete" />
+            <span wicket:id="entityIconAndTitle">[icon and title]</span>
 		</wicket:panel>
 	</body>
 </html>

http://git-wip-us.apache.org/repos/asf/isis/blob/a8eee7af/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
index 57dad38..6d39871 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
@@ -29,10 +29,20 @@
 				<label for="entityLink" wicket:id="scalarIfRegular" class="scalarIfRegular">
 	      			<span wicket:id="scalarName" class="scalarName">[Label text]</span>
 	      			<span class="scalarValue">
-		      			<span class="entityLink" wicket:id="entityLink">[property or parameter value]</span>
-              			<span wicket:id="feedback"></span>
+                        <span class="entityLink">
+                            <div class="entityLinkSelect2Panel entityLinkComponentType">
+                                <div class="wrapper">
+                                    <span class="autoCompletePlaceholder">
+                                        <span wicket:id="entityLink">
+                                        </span>
+                                    </span>
+                                    <div class="clear"/>
+                                </div>
+                            </div>
+                        </span>
+              			<span wicket:id="feedback"/>
                         <span wicket:id="additionalLinks"/>
-	      			</span>
+                    </span>
 				</label>
 				<label wicket:id="scalarIfCompact" class="scalarIfCompact">
 	      			<span class="scalarValue">


[10/10] git commit: ISIS-764: further clean-up.

Posted by da...@apache.org.
ISIS-764: further clean-up.

Although EntityLinkSelect2Panel has not quite been eliminated, reckon this is in a good-enough state to start on the @BulkParam functionality.


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

Branch: refs/heads/ISIS-764
Commit: a95a5c7b5fdfba71eb79f37f563d8074bbf22a12
Parents: 8a207fa
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 8 07:56:54 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 8 07:56:54 2014 +0100

----------------------------------------------------------------------
 .../reference/EntityLinkSelect2Panel.java       |   6 -
 .../scalars/reference/ReferencePanel.java       | 317 +++++++++----------
 .../ObjectAdapterMementoProviderAbstract.java   |   3 +-
 3 files changed, 155 insertions(+), 171 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a95a5c7b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
index 95ccfe0..aab5d83 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
@@ -69,12 +69,6 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
     }
 
     @Override
-    protected void onBeforeRender() {
-        owningPanel.syncWithInput();
-        super.onBeforeRender();
-    }
-
-    @Override
     public void onCancel() {
         owningPanel.getModel().clearPending();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/a95a5c7b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index b7dff68..2df3e6c 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -66,8 +66,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular";
     private static final String ID_SCALAR_NAME = "scalarName";
 
-    static final String ID_AUTO_COMPLETE = "autoComplete";
-    static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
+    private static final String ID_AUTO_COMPLETE = "autoComplete";
+    private static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
 
     private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
 
@@ -75,30 +75,17 @@ public class ReferencePanel extends ScalarPanelAbstract {
     Select2Choice<ObjectAdapterMemento> select2Field;
 
     private EntityLinkSimplePanel entitySimpleLink;
-    private FormComponentLabel labelIfRegular;
 
     public ReferencePanel(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
     }
 
-    // //////////////////////////////////////
     
-    @Override
-    protected void onBeforeRenderWhenDisabled(final String disableReason) {
-        super.onBeforeRenderWhenDisabled(disableReason);
-        final EntityModel entityLinkModel = (EntityModel) entityLink.getModel();
-        entityLinkModel.toViewMode();
-        setTitleAttribute(disableReason);
-        syncVisibilityAndUsability();
-    }
-
-    private void setTitleAttribute(final String titleAttribute) {
-        entityLink.add(new AttributeModifier("title", Model.of(titleAttribute)));
-    }
+    // //////////////////////////////////////
+    // addComponentFor{Compact/Regular}
+    // //////////////////////////////////////
 
-    /**
-     * First called as a side-effect of {@link #beforeRender()}
-     */
+    // First called as a side-effect of {@link #beforeRender()}
     @Override
     protected Component addComponentForCompact() {
 
@@ -119,9 +106,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
     }
 
 
-    /**
-     * First called as a side-effect of {@link #beforeRender()}
-     */
+    // First called as a side-effect of {@link #beforeRender()}
     @Override
     protected FormComponentLabel addComponentForRegular() {
         final ScalarModel scalarModel = getModel();
@@ -133,8 +118,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
         setOutputMarkupId(true);
         entityLink.setOutputMarkupId(true);
         entityLink.setLabel(Model.of(name));
-        
-        labelIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, entityLink);
+
+        final FormComponentLabel labelIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, entityLink);
         labelIfRegular.add(entityLink);
         
         final String describedAs = getModel().getDescribedAs();
@@ -176,64 +161,137 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
     // //////////////////////////////////////
 
+    // called from buildGui
+    @Override
+    protected void addFormComponentBehavior(Behavior behavior) {
+        if(select2Field != null) {
+            select2Field.add(behavior);
+        }
+    }
+
+    
+    // //////////////////////////////////////
+    // onBeforeRender*
+    // //////////////////////////////////////
+
     @Override
     protected void onBeforeRenderWhenEnabled() {
         super.onBeforeRenderWhenEnabled();
         entityLink.setEnabled(true);
-        syncVisibilityAndUsability();
+        syncWithInput();
     }
 
     @Override
     protected void onBeforeRenderWhenViewMode() {
         super.onBeforeRenderWhenViewMode();
         entityLink.setEnabled(true);
-        syncVisibilityAndUsability();
+        syncWithInput();
     }
 
-    // //////////////////////////////////////
-
-    // called from buildGui
     @Override
-    protected void addFormComponentBehavior(Behavior behavior) {
-        if(select2Field != null) {
-            select2Field.add(behavior);
-        }
+    protected void onBeforeRenderWhenDisabled(final String disableReason) {
+        super.onBeforeRenderWhenDisabled(disableReason);
+        final EntityModel entityLinkModel = (EntityModel) entityLink.getModel();
+        entityLinkModel.toViewMode();
+        entityLink.add(new AttributeModifier("title", Model.of(disableReason)));
+        syncWithInput();
     }
 
+    
+    // //////////////////////////////////////
+    // syncWithInput
     // //////////////////////////////////////
 
-    private boolean isEditableWithEitherAutoCompleteOrChoices() {
-        if(getModel().getRenderingHint().isInTable()) {
-            return false;
-        }
-        // doesn't apply if not editable, either
-        if(getModel().isViewMode()) {
-            return false;
+    // called from onBeforeRender*
+    // (was previous called by EntityLinkSelect2Panel in onBeforeRender, this responsibility now moved)
+    private void syncWithInput() {
+        final ObjectAdapter adapter = getModel().getPendingElseCurrentAdapter();
+
+        // syncLinkWithInput
+        if (adapter != null) {
+            if(getComponentForRegular() != null) {
+                final EntityModel entityModelForLink = new EntityModel(adapter);
+                
+                entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
+                entityModelForLink.setRenderingHint(getModel().getRenderingHint());
+                
+                final ComponentFactory componentFactory = 
+                        getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
+                final Component component = componentFactory.createComponent(entityModelForLink);
+                
+                ((MarkupContainer)getComponentForRegular()).addOrReplace(component);
+            }
+        } else {
+            permanentlyHideEntityIconAndTitleIfInRegularMode();
         }
-        return getModel().hasChoices() || hasParamOrPropertyAutoComplete() || hasObjectAutoComplete();
-    }
 
-    boolean hasParamOrPropertyAutoComplete() {
-        return getModel().hasAutoComplete();
-    }
 
-    boolean hasObjectAutoComplete() {
-        boolean hasAutoComplete = getModel().hasAutoComplete();
-        if(hasAutoComplete) {
-            return true;
+        // syncLinkWithInputIfAutoCompleteOrChoices
+        if(isEditableWithEitherAutoCompleteOrChoices()) {
+            final IModel<ObjectAdapterMemento> model = Util.createModel(getModel().asScalarModelWithPending());       
+            
+            if(select2Field == null) {
+                entityLink.setRequired(getModel().isRequired());
+                select2Field = Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, model, getModel());
+                setProviderAndCurrAndPending(select2Field, getModel().getActionArgsHint());
+                if(!getModel().hasChoices()) {
+                    final Settings settings = select2Field.getSettings();
+                    final int minLength = getModel().getAutoCompleteMinLength();
+                    settings.setMinimumInputLength(minLength);
+                    settings.setPlaceholder(getModel().getName());
+                }
+                entityLink.addOrReplace(select2Field);
+            } else {
+                //
+                // the select2Field already exists, so the widget has been rendered before.  If it is
+                // being re-rendered now, it may be because some other property/parameter was invalid.
+                // when the form was submitted, the selected object (its oid as a string) would have
+                // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
+                // would be correctly converted and processed by the select2Field's choiceProvider.  However,
+                // an invalid property/parameter means that the webpage is re-rendered in another request,
+                // and the rawInput can no longer be interpreted.  The net result is that the field appears
+                // with no input.
+                //
+                // The fix is therefore (I think) simply to clear any rawInput, so that the select2Field
+                // renders its state from its model.
+                //
+                // see: FormComponent#getInputAsArray()
+                // see: Select2Choice#renderInitializationScript()
+                //
+                select2Field.clearInput();
+            }
+        
+            permanentlyHideEntityIconAndTitleIfInRegularMode();
+            
+            // syncUsability
+            if(select2Field != null) {
+                final boolean mutability = entityLink.isEnableAllowed() && !getModel().isViewMode();
+                select2Field.setEnabled(mutability);
+            }
+
+        } else {
+            // this is horrid; adds a label to the id
+            // should instead be a 'temporary hide'
+            Components.permanentlyHide(entityLink, ID_AUTO_COMPLETE);
+            select2Field = null; // this forces recreation next time around
         }
         
-        // else on underlying type
-        final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
-        final AutoCompleteFacet autoCompleteFacet = 
-                (typeOfSpecification != null)? typeOfSpecification.getFacet(AutoCompleteFacet.class):null;
-        return autoCompleteFacet != null;
     }
 
-    
+    // called by syncWithInput
+    private void permanentlyHideEntityIconAndTitleIfInRegularMode() {
+        if(getComponentForRegular() != null) {
+            Components.permanentlyHide((MarkupContainer)getComponentForRegular(), ID_ENTITY_ICON_AND_TITLE);
+        }
+    }
+
+
+    // //////////////////////////////////////
+    // setProviderAndCurrAndPending
     // //////////////////////////////////////
     
-    void setProviderAndCurrAndPending(
+    // called by syncWithInput, updateChoices
+    private void setProviderAndCurrAndPending(
             final Select2Choice<ObjectAdapterMemento> select2Field, 
             final ObjectAdapter[] argsIfAvailable) {
         if (getModel().hasChoices()) {
@@ -270,17 +328,18 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final ObjectAdapterMemento curr = select2Field.getModelObject();
         if(curr == null) {
             select2Field.getModel().setObject(null);
-            this.getModel().setObject(null);
+            getModel().setObject(null);
             return;
         }
+        
         if(!curr.containedIn(choiceMementos)) {
             if(!choiceMementos.isEmpty()) {
                 final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
                 select2Field.getModel().setObject(newAdapterMemento);
-                this.getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
+                getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
             } else {
                 select2Field.getModel().setObject(null);
-                this.getModel().setObject(null);
+                getModel().setObject(null);
             }
         }
     }
@@ -331,6 +390,9 @@ public class ReferencePanel extends ScalarPanelAbstract {
         };
     }
 
+    
+    // //////////////////////////////////////
+    // getInput, convertInput
     // //////////////////////////////////////
     
     // called by EntityLinkSelect2Panel
@@ -343,7 +405,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
     // called by EntityLinkSelect2Panel
     void convertInput() {
-        if(getModel().isEditMode() && isEditableWithEitherAutoCompleteOrChoices()) {
+        if(isEditableWithEitherAutoCompleteOrChoices()) {
 
             // flush changes to pending
             ObjectAdapterMemento convertedInput = select2Field.getConvertedInput();
@@ -361,111 +423,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
         entityLink.setConvertedInput(pendingAdapter);
     }
 
-    
-
     // //////////////////////////////////////
-
-    // called by EntityLinkSelect2Panel
-    void syncWithInput() {
-        final ObjectAdapter adapter = getModel().getPendingElseCurrentAdapter();
-        syncLinkWithInput(adapter);
-        syncLinkWithInputIfAutoCompleteOrChoices();
-        syncVisibilityAndUsability();
-    }
-
-    // called by syncWithInput
-    private void syncLinkWithInput(final ObjectAdapter adapter) {
-        if(labelIfRegular == null) {
-            return;
-        }
-        
-        if (adapter != null) {
-            final EntityModel entityModelForLink = new EntityModel(adapter);
-            
-            entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
-            entityModelForLink.setRenderingHint(getModel().getRenderingHint());
-            
-            final ComponentFactory componentFactory = 
-                    getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-            final Component component = componentFactory.createComponent(entityModelForLink);
-            
-            labelIfRegular.addOrReplace(component);
-        } else {
-            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
-    // called by syncWithInput
-    private void syncLinkWithInputIfAutoCompleteOrChoices() {
-        if(!isEditableWithEitherAutoCompleteOrChoices()) {
-            // this is horrid; adds a label to the id
-            // should instead be a 'temporary hide'
-            Components.permanentlyHide(entityLink, ReferencePanel.ID_AUTO_COMPLETE);
-            select2Field = null; // this forces recreation next time around
-            return;
-        }
-    
-        final IModel<ObjectAdapterMemento> model = Util.createModel(getModel().asScalarModelWithPending());       
-    
-        if(select2Field == null) {
-            entityLink.setRequired(getModel().isRequired());
-            select2Field = Select2ChoiceUtil.newSelect2Choice(ReferencePanel.ID_AUTO_COMPLETE, model, getModel());
-            setProviderAndCurrAndPending(select2Field, getModel().getActionArgsHint());
-            if(!getModel().hasChoices()) {
-                final Settings settings = select2Field.getSettings();
-                final int minLength = getModel().getAutoCompleteMinLength();
-                settings.setMinimumInputLength(minLength);
-                settings.setPlaceholder(getModel().getName());
-            }
-            entityLink.addOrReplace(select2Field);
-        } else {
-            //
-            // the select2Field already exists, so the widget has been rendered before.  If it is
-            // being re-rendered now, it may be because some other property/parameter was invalid.
-            // when the form was submitted, the selected object (its oid as a string) would have
-            // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
-            // would be correctly converted and processed by the select2Field's choiceProvider.  However,
-            // an invalid property/parameter means that the webpage is re-rendered in another request,
-            // and the rawInput can no longer be interpreted.  The net result is that the field appears
-            // with no input.
-            //
-            // The fix is therefore (I think) simply to clear any rawInput, so that the select2Field
-            // renders its state from its model.
-            //
-            // see: FormComponent#getInputAsArray()
-            // see: Select2Choice#renderInitializationScript()
-            //
-            select2Field.clearInput();
-        }
-    
-        if(labelIfRegular != null) {
-            // no need for link, since can see in drop-down
-            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
-    // //////////////////////////////////////
-
-    /**
-     * REVIEW: there ought to be a better way to do this. I'd hoped to override
-     * {@link #setEnabled(boolean)}, but it is <tt>final</tt>, and there doesn't
-     * seem to be anyway to install a listener. One option might be to move it
-     * to {@link #onBeforeRender()} ?
-     * 
-     * <p>
-     * called by onBeforeRender*, also from syncWithInput
-     */
-    private void syncVisibilityAndUsability() {
-        if(labelIfRegular != null && isEditableWithEitherAutoCompleteOrChoices()) {
-            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
-        }
-
-        if(select2Field != null) {
-            final boolean mutability = entityLink.isEnableAllowed() && !getModel().isViewMode();
-            select2Field.setEnabled(mutability);
-        }
-    }
-
+    // updateChoices
     // //////////////////////////////////////
 
     /**
@@ -484,4 +443,34 @@ public class ReferencePanel extends ScalarPanelAbstract {
         }
     }
 
+    
+    // //////////////////////////////////////
+    // helpers querying model state
+    // //////////////////////////////////////
+
+    // called from convertInput, syncWithInput
+    private boolean isEditableWithEitherAutoCompleteOrChoices() {
+        if(getModel().getRenderingHint().isInTable()) {
+            return false;
+        }
+        // doesn't apply if not editable, either
+        if(getModel().isViewMode()) {
+            return false;
+        }
+        return getModel().hasChoices() || hasParamOrPropertyAutoComplete() || hasObjectAutoComplete();
+    }
+
+    // called by isEditableWithEitherAutoCompleteOrChoices, also syncProviderAndCurrAndPending
+    private boolean hasParamOrPropertyAutoComplete() {
+        return getModel().hasAutoComplete();
+    }
+
+    // called by isEditableWithEitherAutoCompleteOrChoices
+    private boolean hasObjectAutoComplete() {
+        final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
+        final AutoCompleteFacet autoCompleteFacet = 
+                (typeOfSpecification != null)? typeOfSpecification.getFacet(AutoCompleteFacet.class):null;
+        return autoCompleteFacet != null;
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a95a5c7b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
index fd4a4d4..2112fc8 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
@@ -40,7 +40,8 @@ public abstract class ObjectAdapterMementoProviderAbstract extends TextChoicePro
     private final ScalarModel scalarModel;
 
     public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel){
-        this.scalarModel = scalarModel;}
+        this.scalarModel = scalarModel;
+    }
     
     @Override
     protected String getDisplayText(ObjectAdapterMemento choice) {


[02/10] git commit: ISIS-764: moved CSS from EntityLinkSelect2Panel to ReferencePanel

Posted by da...@apache.org.
ISIS-764: moved CSS from EntityLinkSelect2Panel to ReferencePanel


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

Branch: refs/heads/ISIS-764
Commit: a785bfda1eba383ea5eb66b3e1b94110f5106b9a
Parents: d629617
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue May 6 10:10:45 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue May 6 10:10:45 2014 +0100

----------------------------------------------------------------------
 .../reference/EntityLinkSelect2Panel.html       |  38 ++
 .../reference/EntityLinkSelect2Panel.java       | 441 +++++++++++++++++++
 .../scalars/reference/ReferencePanel.css        |  37 +-
 .../scalars/reference/ReferencePanel.java       |   1 -
 .../entitylink/EntityLinkSelect2Panel.css       |  53 ---
 .../entitylink/EntityLinkSelect2Panel.html      |  43 --
 .../entitylink/EntityLinkSelect2Panel.java      | 441 -------------------
 7 files changed, 515 insertions(+), 539 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a785bfda/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
new file mode 100644
index 0000000..4893d6d
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.html
@@ -0,0 +1,38 @@
+<?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="entityLinkSelect2Panel entityLinkComponentType">
+				<div class="wrapper">
+                    <span class="autoCompletePlaceholder">
+    					<input wicket:id="autoComplete" type="hidden" class="autoComplete" />
+    					<span wicket:id="entityIconAndTitle">[icon and title]</span>
+                    </span>
+				    <div class="clear"/>
+	  			</div>
+			</div>
+		</wicket:panel>
+	</body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/a785bfda/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
new file mode 100644
index 0000000..33d78b7
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
@@ -0,0 +1,441 @@
+/*
+ *  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.util.List;
+
+import com.google.common.collect.Lists;
+import com.vaynberg.wicket.select2.ChoiceProvider;
+import com.vaynberg.wicket.select2.Select2Choice;
+import com.vaynberg.wicket.select2.Select2MultiChoice;
+import com.vaynberg.wicket.select2.Settings;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.IModel;
+
+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.version.ConcurrencyException;
+import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ActionModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
+import org.apache.isis.viewer.wicket.model.util.MementoFunctions;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.Select2ChoiceUtil;
+import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
+import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
+
+/**
+ * {@link FormComponentPanel} representing a reference to an entity: a link and
+ * (optionally) an autocomplete field.
+ */
+public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired, ActionInvokeHandler  {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_AUTO_COMPLETE = "autoComplete";
+    private static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
+
+    /**
+     * This component may be null if there are no choices or autoComplete, or if in read-only mode.
+     */
+    private Select2Choice<ObjectAdapterMemento> select2Field;
+    private Link<String> entityDetailsLink;
+    private Link<String> entityClearLink;
+
+    public EntityLinkSelect2Panel(final String id, final ScalarModel scalarModel) {
+        super(id, scalarModel);
+        setType(ObjectAdapter.class);
+        buildGui();
+    }
+
+    public ScalarModel getScalarModel() {
+        return (ScalarModel) getModel();
+    }
+
+    /**
+     * Builds the parts of the GUI that are not dynamic.
+     */
+    private void buildGui() {
+        syncWithInput();
+    }
+
+    /**
+     * Necessary because {@link FormComponentPanel} overrides this as <tt>true</tt>, whereas we want to
+     * report on the state of the underlying {@link Select2Choice}.
+     */
+    @Override
+    public boolean checkRequired() {
+        if(select2Field != null) {
+            return select2Field.checkRequired();
+        }
+        return super.checkRequired();
+    }
+
+    @Override
+    public boolean isRequired() {
+        return super.isRequired();
+    }
+
+    
+    /**
+     * Must be called after {@link #setEnabled(boolean)} to ensure that the
+     * <tt>findUsing</tt> button, and the <tt>entityClearLink</tt> are 
+     * shown/not shown as required.
+     * 
+     * <p>
+     * REVIEW: there ought to be a better way to do this. I'd hoped to override
+     * {@link #setEnabled(boolean)}, but it is <tt>final</tt>, and there doesn't
+     * seem to be anyway to install a listener. One option might be to move it
+     * to {@link #onBeforeRender()} ?
+     */
+    public void syncVisibilityAndUsability() {
+        
+        final boolean mutability = isEnableAllowed() && !getScalarModel().isViewMode();
+
+        if(entityClearLink != null) {
+            entityClearLink.setVisible(mutability);
+        }
+
+        if(entityDetailsLink != null) {
+            entityDetailsLink.setVisible(getScalarModel().getRenderingHint() == RenderingHint.REGULAR);
+        }
+        
+        if(select2Field != null) {
+            select2Field.setEnabled(mutability);
+        }
+        
+        if(isEditableWithEitherAutoCompleteOrChoices()) {
+            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
+        }
+    }
+
+    protected void doSyncVisibilityAndUsability(boolean mutability) {
+        if(select2Field != null) {
+            select2Field.setEnabled(mutability);
+        }
+
+        if(isEditableWithEitherAutoCompleteOrChoices()) {
+            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
+        }
+    }
+
+    /**
+     * Since we override {@link #convertInput()}, it is (apparently) enough to
+     * just return a value that is suitable for error reporting.
+     * 
+     * @see DateField#getInput() for reference
+     */
+    @Override
+    public String getInput() {
+        final ObjectAdapter pendingElseCurrentAdapter = getScalarModel().getPendingElseCurrentAdapter();
+        return pendingElseCurrentAdapter != null? pendingElseCurrentAdapter.titleString(null): "(no object)";
+    }
+
+    @Override
+    protected void convertInput() {
+
+        if(getScalarModel().isEditMode() && isEditableWithEitherAutoCompleteOrChoices()) {
+            // flush changes to pending
+            onSelected(select2Field.getConvertedInput());
+        }
+
+        final ObjectAdapter pendingAdapter = getScalarModel().getPendingAdapter();
+        setConvertedInput(pendingAdapter);
+    }
+
+
+    @Override
+    protected void onBeforeRender() {
+        syncWithInput();
+        super.onBeforeRender();
+    }
+
+    private void syncWithInput() {
+        final ObjectAdapter adapter = getPendingElseCurrentAdapter();
+
+        syncLinkWithInput(adapter);
+        doSyncWithInputIfAutoCompleteOrChoices();
+        syncVisibilityAndUsability();
+    }
+
+    private void doSyncWithInputIfAutoCompleteOrChoices() {
+        
+        if(!isEditableWithEitherAutoCompleteOrChoices()) {
+            // this is horrid; adds a label to the id
+            // should instead be a 'temporary hide'
+            permanentlyHide(ID_AUTO_COMPLETE);
+            select2Field = null; // this forces recreation next time around
+            return;
+        }
+
+        final IModel<ObjectAdapterMemento> model = ScalarModelWithPending.Util.createModel(getScalarModel().asScalarModelWithPending());       
+
+        if(select2Field == null) {
+            setRequired(getScalarModel().isRequired());
+            select2Field = Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, model, getScalarModel());
+            setProviderAndCurrAndPending(select2Field, getScalarModel().getActionArgsHint());
+            if(!getScalarModel().hasChoices()) {
+                final Settings settings = select2Field.getSettings();
+                ScalarModel scalarModel = getScalarModel();
+                final int minLength = scalarModel.getAutoCompleteMinLength();
+                settings.setMinimumInputLength(minLength);
+                settings.setPlaceholder(scalarModel.getName());
+            }
+            addOrReplace(select2Field);
+        } else {
+            //
+            // the select2Field already exists, so the widget has been rendered before.  If it is
+            // being re-rendered now, it may be because some other property/parameter was invalid.
+            // when the form was submitted, the selected object (its oid as a string) would have
+            // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
+            // would be correctly converted and processed by the select2Field's choiceProvider.  However,
+            // an invalid property/parameter means that the webpage is re-rendered in another request,
+            // and the rawInput can no longer be interpreted.  The net result is that the field appears
+            // with no input.
+            //
+            // The fix is therefore (I think) simply to clear any rawInput, so that the select2Field
+            // renders its state from its model.
+            //
+            // see: FormComponent#getInputAsArray()
+            // see: Select2Choice#renderInitializationScript()
+            //
+            select2Field.clearInput();
+        }
+        
+        
+        // no need for link, since can see in drop-down
+        permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
+
+        // no need for the 'null' title, since if there is no object yet
+        // can represent this fact in the drop-down
+        // permanentlyHide(ID_ENTITY_TITLE_NULL);
+    }
+
+
+    private ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
+        final EntityModel entityModel = getScalarModel();
+        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected List<ObjectAdapterMemento> obtainMementos(String term) {
+                final ObjectSpecification typeOfSpecification = entityModel.getTypeOfSpecification();
+                final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+                final List<ObjectAdapter> results = autoCompleteFacet.execute(term);
+                return Lists.transform(results, ObjectAdapterMemento.Functions.fromAdapter());
+            }
+
+        };
+    }
+
+    private ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
+        final EntityModel entityModel = getScalarModel();
+        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
+            
+            private static final long serialVersionUID = 1L;
+            
+            @Override
+            protected List<ObjectAdapterMemento> obtainMementos(String term) {
+                final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
+                final ScalarModel scalarModel = (ScalarModel) entityModel;
+                if(scalarModel.hasAutoComplete()) {
+                    autoCompleteChoices.addAll(scalarModel.getAutoComplete(term));
+                }
+                // take a copy otherwise is only lazily evaluated
+                return Lists.newArrayList(Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
+            }
+            
+        };
+    }
+    
+    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
+        
+        final List<ObjectAdapter> choices = Lists.newArrayList();
+        final ScalarModel scalarModel = (ScalarModel) getScalarModel();;
+        if(scalarModel.hasChoices()) {
+            choices.addAll(scalarModel.getChoices(argsIfAvailable));
+        }
+        // take a copy otherwise is only lazily evaluated
+        return Lists.newArrayList(Lists.transform(choices, MementoFunctions.fromAdapter()));
+    }
+
+    private void syncLinkWithInput(final ObjectAdapter adapter) {
+        if (adapter != null) {
+            addOrReplaceIconAndTitle(adapter);
+        } else {
+            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
+        }
+    }
+
+
+    private void addOrReplaceIconAndTitle(ObjectAdapter pendingOrCurrentAdapter) {
+        final EntityModel entityModelForLink = new EntityModel(pendingOrCurrentAdapter);
+        entityModelForLink.setContextAdapterIfAny(getScalarModel().getContextAdapterIfAny());
+        entityModelForLink.setRenderingHint(getScalarModel().getRenderingHint());
+        final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
+        final Component component = componentFactory.createComponent(entityModelForLink);
+        addOrReplace(component);
+    }
+
+
+    @Override
+    public void onClick(final ActionModel actionModel) {
+    }
+
+    public void onSelected(final ObjectAdapterMemento selectedAdapterMemento) {
+        getScalarModel().setPending(selectedAdapterMemento);
+        getScalarModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
+        if(this.select2Field != null) {
+            select2Field.getModel().setObject(selectedAdapterMemento);
+        }
+        // not sure why this was here, at any rate it trips up when performing validation with modal dialogs.
+        // renderSamePage();
+    }
+
+    public void onNoResults() {
+        renderSamePage();
+    }
+
+    @Override
+    public void onCancel() {
+        getScalarModel().clearPending();
+    }
+
+    private ObjectAdapter getPendingElseCurrentAdapter() {
+        return getScalarModel().getPendingElseCurrentAdapter();
+    }
+
+    private void renderSamePage() {
+        setResponsePage(getPage());
+    }
+    
+    private boolean isEditableWithEitherAutoCompleteOrChoices() {
+        // never doesn't apply in compact rendering contexts (ie tables)
+        if(getScalarModel().getRenderingHint().isInTable()) {
+            return false;
+        }
+        // doesn't apply if not editable, either
+        if(getScalarModel().isViewMode()) {
+            return false;
+        }
+        return getScalarModel().hasChoices() || hasParamOrPropertyAutoComplete() || hasObjectAutoComplete();
+    }
+
+    private boolean hasParamOrPropertyAutoComplete() {
+        return getScalarModel().hasAutoComplete();
+    }
+
+    private boolean hasObjectAutoComplete() {
+
+        // on property/param
+        boolean hasAutoComplete = getScalarModel().hasAutoComplete();
+        if(hasAutoComplete) {
+            return true;
+        }
+        
+        // else on underlying type
+        final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
+        final AutoCompleteFacet autoCompleteFacet = 
+                (typeOfSpecification != null)? typeOfSpecification.getFacet(AutoCompleteFacet.class):null;
+        return autoCompleteFacet != null;
+    }
+
+    // //////////////////////////////////////
+
+    public void addFormComponentBehavior(Behavior behavior) {
+        if(select2Field != null) {
+            select2Field.add(behavior);
+        }
+    }
+
+    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
+        if(select2Field != null) {
+            setProviderAndCurrAndPending(select2Field, argsIfAvailable);
+            return true;
+        } else {
+            return false;
+        }
+    }
+    
+    private void setProviderAndCurrAndPending(
+            final Select2Choice<ObjectAdapterMemento> select2Field, 
+            final ObjectAdapter[] argsIfAvailable) {
+        
+        if (getScalarModel().hasChoices()) {
+            final List<ObjectAdapterMemento> choiceMementos = getChoiceMementos(argsIfAvailable);
+            select2Field.setProvider(providerForChoices(choiceMementos));
+            getScalarModel().clearPending();
+            resetIfCurrentNotInChoices(select2Field, choiceMementos);
+        } else if(hasParamOrPropertyAutoComplete()) {
+            select2Field.setProvider(providerForParamOrPropertyAutoComplete());
+            getScalarModel().clearPending();
+        } else {
+            select2Field.setProvider(providerForObjectAutoComplete());
+            getScalarModel().clearPending();
+        }
+    }
+
+    private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
+        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
+            private static final long serialVersionUID = 1L;
+            @Override
+            protected List<ObjectAdapterMemento> obtainMementos(String unused) {
+                return choiceMementos;
+            }
+        };
+    }
+
+    private void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
+        final ObjectAdapterMemento curr = select2Field.getModelObject();
+        if(curr == null) {
+            select2Field.getModel().setObject(null);
+            getModel().setObject(null);
+            return;
+        }
+        if(!curr.containedIn(choiceMementos)) {
+            if(!choiceMementos.isEmpty()) {
+                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
+                select2Field.getModel().setObject(newAdapterMemento);
+                getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
+            } else {
+                select2Field.getModel().setObject(null);
+                getModel().setObject(null);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/a785bfda/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.css
index c106a42..eee89fb 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.css
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.css
@@ -20,4 +20,39 @@
 .referencePanel .scalarIfCompact .scalarValue {
 	float: none;
 }
- 
\ No newline at end of file
+
+.referencePanel div.entityLinkSelect2Panel  {
+    display: inline
+}
+
+.referencePanel div.entityLinkSelect2Panel > div {
+    margin-left: 2px;
+}
+
+.referencePanel .entityLinkSelect2Panel .entityImage {
+    width: 16px;
+    height: 16px;
+}
+
+.referencePanel .entityLinkSelect2Panel a.entityClearLink {
+    display:inline-table;
+    margin-left: 0px;
+    padding-left: 0px;
+    padding-right: 0px;
+    font-size: smaller;
+}
+
+.collectionContentsAsAjaxTablePanel .referencePanel .entityLinkSelect2Panel .autoCompletePlaceholder {
+    padding-top: 0px;
+    height: 0px;
+}
+
+.collectionContentsAsAjaxTablePanel .referencePanel .entityLinkSelect2Panel .wrapper {
+    display:table-cell;
+}
+
+.referencePanel .entityLinkSelect2Panel .autoCompletePlaceholder {
+    display: block;
+    padding-top: 5px;
+    height: 25px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/a785bfda/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 89e0a69..262441f 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -34,7 +34,6 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.entitylink.EntityLinkSelect2Panel;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**

http://git-wip-us.apache.org/repos/asf/isis/blob/a785bfda/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.css
deleted file mode 100644
index 44f60c6..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.css
+++ /dev/null
@@ -1,53 +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.
- */
-div.entityLinkSelect2Panel  {
-	display: inline
-}
-
-div.entityLinkSelect2Panel > div {
-	margin-left: 2px;
-}
-
-.entityLinkSelect2Panel .entityImage {
-	width: 16px;
-	height: 16px;
-}
-
-.entityLinkSelect2Panel a.entityClearLink {
-	display:inline-table;
-	margin-left: 0px;
-	padding-left: 0px;
-	padding-right: 0px;
-	font-size: smaller;
-}
-
-.collectionContentsAsAjaxTablePanel .entityLinkSelect2Panel .autoCompletePlaceholder {
-    padding-top: 0px;
-    height: 0px;
-}
-
-.collectionContentsAsAjaxTablePanel .entityLinkSelect2Panel .wrapper {
-    display:table-cell;
-}
-
-.entityLinkSelect2Panel .autoCompletePlaceholder {
-    display: block;
-    padding-top: 5px;
-    height: 25px;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/a785bfda/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
deleted file mode 100644
index 42f3c3a..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
+++ /dev/null
@@ -1,43 +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">
-	<wicket:head>
-		<wicket:link>
-			<link href="EntityLinkSelect2Panel.css" rel="stylesheet" type="text/css"/>
-		</wicket:link>
-	</wicket:head>
-	<body>
-		<wicket:panel>
-			<div class="entityLinkSelect2Panel entityLinkComponentType">
-				<div class="wrapper">
-                    <span class="autoCompletePlaceholder">
-    					<input wicket:id="autoComplete" type="hidden" class="autoComplete" />
-    					<span wicket:id="entityIconAndTitle">[icon and title]</span>
-                    </span>
-				    <div class="clear"/>
-	  			</div>
-			</div>
-		</wicket:panel>
-	</body>
-</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/a785bfda/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
deleted file mode 100644
index 80a2af4..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ /dev/null
@@ -1,441 +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.entitylink;
-
-import java.util.List;
-
-import com.google.common.collect.Lists;
-import com.vaynberg.wicket.select2.ChoiceProvider;
-import com.vaynberg.wicket.select2.Select2Choice;
-import com.vaynberg.wicket.select2.Select2MultiChoice;
-import com.vaynberg.wicket.select2.Settings;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.form.FormComponentPanel;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.model.IModel;
-
-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.version.ConcurrencyException;
-import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
-import org.apache.isis.viewer.wicket.model.util.MementoFunctions;
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.Select2ChoiceUtil;
-import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
-import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
-
-/**
- * {@link FormComponentPanel} representing a reference to an entity: a link and
- * (optionally) an autocomplete field.
- */
-public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired, ActionInvokeHandler  {
-
-    private static final long serialVersionUID = 1L;
-    private static final String ID_AUTO_COMPLETE = "autoComplete";
-
-    private static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
-
-    /**
-     * This component may be null if there are no choices or autoComplete, or if in read-only mode.
-     */
-    private Select2Choice<ObjectAdapterMemento> select2Field;
-    private Link<String> entityDetailsLink;
-    private Link<String> entityClearLink;
-
-    public EntityLinkSelect2Panel(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
-        setType(ObjectAdapter.class);
-        buildGui();
-    }
-
-    public ScalarModel getScalarModel() {
-        return (ScalarModel) getModel();
-    }
-
-    /**
-     * Builds the parts of the GUI that are not dynamic.
-     */
-    private void buildGui() {
-        syncWithInput();
-    }
-
-    /**
-     * Necessary because {@link FormComponentPanel} overrides this as <tt>true</tt>, whereas we want to
-     * report on the state of the underlying {@link Select2Choice}.
-     */
-    @Override
-    public boolean checkRequired() {
-        if(select2Field != null) {
-            return select2Field.checkRequired();
-        }
-        return super.checkRequired();
-    }
-
-    @Override
-    public boolean isRequired() {
-        return super.isRequired();
-    }
-
-    
-    /**
-     * Must be called after {@link #setEnabled(boolean)} to ensure that the
-     * <tt>findUsing</tt> button, and the <tt>entityClearLink</tt> are 
-     * shown/not shown as required.
-     * 
-     * <p>
-     * REVIEW: there ought to be a better way to do this. I'd hoped to override
-     * {@link #setEnabled(boolean)}, but it is <tt>final</tt>, and there doesn't
-     * seem to be anyway to install a listener. One option might be to move it
-     * to {@link #onBeforeRender()} ?
-     */
-    public void syncVisibilityAndUsability() {
-        
-        final boolean mutability = isEnableAllowed() && !getScalarModel().isViewMode();
-
-        if(entityClearLink != null) {
-            entityClearLink.setVisible(mutability);
-        }
-
-        if(entityDetailsLink != null) {
-            entityDetailsLink.setVisible(getScalarModel().getRenderingHint() == RenderingHint.REGULAR);
-        }
-        
-        if(select2Field != null) {
-            select2Field.setEnabled(mutability);
-        }
-        
-        if(isEditableWithEitherAutoCompleteOrChoices()) {
-            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
-    protected void doSyncVisibilityAndUsability(boolean mutability) {
-        if(select2Field != null) {
-            select2Field.setEnabled(mutability);
-        }
-
-        if(isEditableWithEitherAutoCompleteOrChoices()) {
-            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
-    /**
-     * Since we override {@link #convertInput()}, it is (apparently) enough to
-     * just return a value that is suitable for error reporting.
-     * 
-     * @see DateField#getInput() for reference
-     */
-    @Override
-    public String getInput() {
-        final ObjectAdapter pendingElseCurrentAdapter = getScalarModel().getPendingElseCurrentAdapter();
-        return pendingElseCurrentAdapter != null? pendingElseCurrentAdapter.titleString(null): "(no object)";
-    }
-
-    @Override
-    protected void convertInput() {
-
-        if(getScalarModel().isEditMode() && isEditableWithEitherAutoCompleteOrChoices()) {
-            // flush changes to pending
-            onSelected(select2Field.getConvertedInput());
-        }
-
-        final ObjectAdapter pendingAdapter = getScalarModel().getPendingAdapter();
-        setConvertedInput(pendingAdapter);
-    }
-
-
-    @Override
-    protected void onBeforeRender() {
-        syncWithInput();
-        super.onBeforeRender();
-    }
-
-    private void syncWithInput() {
-        final ObjectAdapter adapter = getPendingElseCurrentAdapter();
-
-        syncLinkWithInput(adapter);
-        doSyncWithInputIfAutoCompleteOrChoices();
-        syncVisibilityAndUsability();
-    }
-
-    private void doSyncWithInputIfAutoCompleteOrChoices() {
-        
-        if(!isEditableWithEitherAutoCompleteOrChoices()) {
-            // this is horrid; adds a label to the id
-            // should instead be a 'temporary hide'
-            permanentlyHide(ID_AUTO_COMPLETE);
-            select2Field = null; // this forces recreation next time around
-            return;
-        }
-
-        final IModel<ObjectAdapterMemento> model = ScalarModelWithPending.Util.createModel(getScalarModel().asScalarModelWithPending());       
-
-        if(select2Field == null) {
-            setRequired(getScalarModel().isRequired());
-            select2Field = Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, model, getScalarModel());
-            setProviderAndCurrAndPending(select2Field, getScalarModel().getActionArgsHint());
-            if(!getScalarModel().hasChoices()) {
-                final Settings settings = select2Field.getSettings();
-                ScalarModel scalarModel = getScalarModel();
-                final int minLength = scalarModel.getAutoCompleteMinLength();
-                settings.setMinimumInputLength(minLength);
-                settings.setPlaceholder(scalarModel.getName());
-            }
-            addOrReplace(select2Field);
-        } else {
-            //
-            // the select2Field already exists, so the widget has been rendered before.  If it is
-            // being re-rendered now, it may be because some other property/parameter was invalid.
-            // when the form was submitted, the selected object (its oid as a string) would have
-            // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
-            // would be correctly converted and processed by the select2Field's choiceProvider.  However,
-            // an invalid property/parameter means that the webpage is re-rendered in another request,
-            // and the rawInput can no longer be interpreted.  The net result is that the field appears
-            // with no input.
-            //
-            // The fix is therefore (I think) simply to clear any rawInput, so that the select2Field
-            // renders its state from its model.
-            //
-            // see: FormComponent#getInputAsArray()
-            // see: Select2Choice#renderInitializationScript()
-            //
-            select2Field.clearInput();
-        }
-        
-        
-        // no need for link, since can see in drop-down
-        permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-
-        // no need for the 'null' title, since if there is no object yet
-        // can represent this fact in the drop-down
-        // permanentlyHide(ID_ENTITY_TITLE_NULL);
-    }
-
-
-    private ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
-        final EntityModel entityModel = getScalarModel();
-        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
-
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final ObjectSpecification typeOfSpecification = entityModel.getTypeOfSpecification();
-                final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-                final List<ObjectAdapter> results = autoCompleteFacet.execute(term);
-                return Lists.transform(results, ObjectAdapterMemento.Functions.fromAdapter());
-            }
-
-        };
-    }
-
-    private ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
-        final EntityModel entityModel = getScalarModel();
-        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
-            
-            private static final long serialVersionUID = 1L;
-            
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
-                final ScalarModel scalarModel = (ScalarModel) entityModel;
-                if(scalarModel.hasAutoComplete()) {
-                    autoCompleteChoices.addAll(scalarModel.getAutoComplete(term));
-                }
-                // take a copy otherwise is only lazily evaluated
-                return Lists.newArrayList(Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
-            }
-            
-        };
-    }
-    
-    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
-        
-        final List<ObjectAdapter> choices = Lists.newArrayList();
-        final ScalarModel scalarModel = (ScalarModel) getScalarModel();;
-        if(scalarModel.hasChoices()) {
-            choices.addAll(scalarModel.getChoices(argsIfAvailable));
-        }
-        // take a copy otherwise is only lazily evaluated
-        return Lists.newArrayList(Lists.transform(choices, MementoFunctions.fromAdapter()));
-    }
-
-    private void syncLinkWithInput(final ObjectAdapter adapter) {
-        if (adapter != null) {
-            addOrReplaceIconAndTitle(adapter);
-        } else {
-            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
-
-    private void addOrReplaceIconAndTitle(ObjectAdapter pendingOrCurrentAdapter) {
-        final EntityModel entityModelForLink = new EntityModel(pendingOrCurrentAdapter);
-        entityModelForLink.setContextAdapterIfAny(getScalarModel().getContextAdapterIfAny());
-        entityModelForLink.setRenderingHint(getScalarModel().getRenderingHint());
-        final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-        final Component component = componentFactory.createComponent(entityModelForLink);
-        addOrReplace(component);
-    }
-
-
-    @Override
-    public void onClick(final ActionModel actionModel) {
-    }
-
-    public void onSelected(final ObjectAdapterMemento selectedAdapterMemento) {
-        getScalarModel().setPending(selectedAdapterMemento);
-        getScalarModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
-        if(this.select2Field != null) {
-            select2Field.getModel().setObject(selectedAdapterMemento);
-        }
-        // not sure why this was here, at any rate it trips up when performing validation with modal dialogs.
-        // renderSamePage();
-    }
-
-    public void onNoResults() {
-        renderSamePage();
-    }
-
-    @Override
-    public void onCancel() {
-        getScalarModel().clearPending();
-    }
-
-    private ObjectAdapter getPendingElseCurrentAdapter() {
-        return getScalarModel().getPendingElseCurrentAdapter();
-    }
-
-    private void renderSamePage() {
-        setResponsePage(getPage());
-    }
-    
-    private boolean isEditableWithEitherAutoCompleteOrChoices() {
-        // never doesn't apply in compact rendering contexts (ie tables)
-        if(getScalarModel().getRenderingHint().isInTable()) {
-            return false;
-        }
-        // doesn't apply if not editable, either
-        if(getScalarModel().isViewMode()) {
-            return false;
-        }
-        return getScalarModel().hasChoices() || hasParamOrPropertyAutoComplete() || hasObjectAutoComplete();
-    }
-
-    private boolean hasParamOrPropertyAutoComplete() {
-        return getScalarModel().hasAutoComplete();
-    }
-
-    private boolean hasObjectAutoComplete() {
-
-        // on property/param
-        boolean hasAutoComplete = getScalarModel().hasAutoComplete();
-        if(hasAutoComplete) {
-            return true;
-        }
-        
-        // else on underlying type
-        final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
-        final AutoCompleteFacet autoCompleteFacet = 
-                (typeOfSpecification != null)? typeOfSpecification.getFacet(AutoCompleteFacet.class):null;
-        return autoCompleteFacet != null;
-    }
-
-    // //////////////////////////////////////
-
-    public void addFormComponentBehavior(Behavior behavior) {
-        if(select2Field != null) {
-            select2Field.add(behavior);
-        }
-    }
-
-    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        if(select2Field != null) {
-            setProviderAndCurrAndPending(select2Field, argsIfAvailable);
-            return true;
-        } else {
-            return false;
-        }
-    }
-    
-    private void setProviderAndCurrAndPending(
-            final Select2Choice<ObjectAdapterMemento> select2Field, 
-            final ObjectAdapter[] argsIfAvailable) {
-        
-        if (getScalarModel().hasChoices()) {
-            final List<ObjectAdapterMemento> choiceMementos = getChoiceMementos(argsIfAvailable);
-            select2Field.setProvider(providerForChoices(choiceMementos));
-            getScalarModel().clearPending();
-            resetIfCurrentNotInChoices(select2Field, choiceMementos);
-        } else if(hasParamOrPropertyAutoComplete()) {
-            select2Field.setProvider(providerForParamOrPropertyAutoComplete());
-            getScalarModel().clearPending();
-        } else {
-            select2Field.setProvider(providerForObjectAutoComplete());
-            getScalarModel().clearPending();
-        }
-    }
-
-    private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
-        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
-            private static final long serialVersionUID = 1L;
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String unused) {
-                return choiceMementos;
-            }
-        };
-    }
-
-    private void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
-        final ObjectAdapterMemento curr = select2Field.getModelObject();
-        if(curr == null) {
-            select2Field.getModel().setObject(null);
-            getModel().setObject(null);
-            return;
-        }
-        if(!curr.containedIn(choiceMementos)) {
-            if(!choiceMementos.isEmpty()) {
-                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
-                select2Field.getModel().setObject(newAdapterMemento);
-                getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
-            } else {
-                select2Field.getModel().setObject(null);
-                getModel().setObject(null);
-            }
-        }
-    }
-
-}


[08/10] git commit: ISIS-764: tidy-up of ReferencePanel.

Posted by da...@apache.org.
ISIS-764: tidy-up of ReferencePanel.


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

Branch: refs/heads/ISIS-764
Commit: 01597e650678062577d9a758d44368f8674f3481
Parents: 5fef658
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 8 06:48:04 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 8 06:48:04 2014 +0100

----------------------------------------------------------------------
 .../scalars/reference/ReferencePanel.java       | 302 ++++++++++---------
 1 file changed, 156 insertions(+), 146 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/01597e65/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index cba1720..1208845 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -66,12 +66,11 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular";
     private static final String ID_SCALAR_NAME = "scalarName";
 
-    private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
-
     static final String ID_AUTO_COMPLETE = "autoComplete";
-    
     static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
 
+    private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
+
     private EntityLinkSelect2Panel entityLink;
     private EntityLinkSimplePanel entitySimpleLink;
 
@@ -81,33 +80,47 @@ public class ReferencePanel extends ScalarPanelAbstract {
         super(id, scalarModel);
     }
 
-    @Override
-    protected void onBeforeRenderWhenEnabled() {
-        super.onBeforeRenderWhenEnabled();
-        entityLink.setEnabled(true);
-        entityLink.owningPanel.syncVisibilityAndUsability(entityLink, entityLink.select2Field);
-    }
-
-    @Override
-    protected void onBeforeRenderWhenViewMode() {
-        super.onBeforeRenderWhenViewMode();
-        entityLink.setEnabled(true);
-        entityLink.owningPanel.syncVisibilityAndUsability(entityLink, entityLink.select2Field);
-    }
-
+    // //////////////////////////////////////
+    
     @Override
     protected void onBeforeRenderWhenDisabled(final String disableReason) {
         super.onBeforeRenderWhenDisabled(disableReason);
         final EntityModel entityLinkModel = (EntityModel) entityLink.getModel();
         entityLinkModel.toViewMode();
         setTitleAttribute(disableReason);
-        entityLink.owningPanel.syncVisibilityAndUsability(entityLink, entityLink.select2Field);
+        syncVisibilityAndUsability(entityLink, entityLink.select2Field);
     }
 
     private void setTitleAttribute(final String titleAttribute) {
         entityLink.add(new AttributeModifier("title", Model.of(titleAttribute)));
     }
 
+    /**
+     * First called as a side-effect of {@link #beforeRender()}
+     */
+    @Override
+    protected Component addComponentForCompact() {
+
+        final ScalarModel scalarModel = getModel();
+        final String name = scalarModel.getName();
+        
+        entitySimpleLink = (EntityLinkSimplePanel) getComponentFactoryRegistry().createComponent(ComponentType.ENTITY_LINK, getModel());
+        
+        entitySimpleLink.setOutputMarkupId(true);
+        entitySimpleLink.setLabel(Model.of(name));
+        
+        final FormComponentLabel labelIfCompact = new FormComponentLabel(ID_SCALAR_IF_COMPACT, entitySimpleLink);
+        labelIfCompact.add(entitySimpleLink);
+        
+        addOrReplace(labelIfCompact);
+        
+        return labelIfCompact;
+    }
+
+
+    /**
+     * First called as a side-effect of {@link #beforeRender()}
+     */
     @Override
     protected FormComponentLabel addComponentForRegular() {
         final ScalarModel scalarModel = getModel();
@@ -135,41 +148,16 @@ public class ReferencePanel extends ScalarPanelAbstract {
         addFeedbackTo(labelIfRegular, entityLink);
         addAdditionalLinksTo(labelIfRegular);
         
-        addStandardSemantics();
-        addSemantics();
-
-        if(getModel().isRequired()) {
-            labelIfRegular.add(new CssClassAppender("mandatory"));
-        }
-        return labelIfRegular;
-    }
-
-    protected void addStandardSemantics() {
-        setRequiredIfSpecified();
-    }
-
-    private void setRequiredIfSpecified() {
-        final ScalarModel scalarModel = getModel();
-        final boolean required = scalarModel.isRequired();
-        entityLink.setRequired(required);
-    }
-
-    protected void addSemantics() {
-
-        addObjectAdapterValidator();
-    }
-
-    private void addObjectAdapterValidator() {
-        final ScalarModel scalarModel = getModel();
-
+        // add semantics
+        entityLink.setRequired(getModel().isRequired());
         entityLink.add(new IValidator<ObjectAdapter>() {
-
+        
             private static final long serialVersionUID = 1L;
-
+        
             @Override
             public void validate(final IValidatable<ObjectAdapter> validatable) {
                 final ObjectAdapter proposedAdapter = validatable.getValue();
-                final String reasonIfAny = scalarModel.validate(proposedAdapter);
+                final String reasonIfAny = getModel().validate(proposedAdapter);
                 if (reasonIfAny != null) {
                     final ValidationError error = new ValidationError();
                     error.setMessage(reasonIfAny);
@@ -177,33 +165,32 @@ public class ReferencePanel extends ScalarPanelAbstract {
                 }
             }
         });
+
+        if(getModel().isRequired()) {
+            labelIfRegular.add(new CssClassAppender("mandatory"));
+        }
+        return labelIfRegular;
     }
 
-    /**
-     * Mandatory hook method to build the component to render the model when in
-     * {@link Rendering#COMPACT compact} format.
-     */
+    // //////////////////////////////////////
+
     @Override
-    protected Component addComponentForCompact() {
+    protected void onBeforeRenderWhenEnabled() {
+        super.onBeforeRenderWhenEnabled();
+        entityLink.setEnabled(true);
+        syncVisibilityAndUsability(entityLink, entityLink.select2Field);
+    }
 
-        final ScalarModel scalarModel = getModel();
-        final String name = scalarModel.getName();
-        
-        entitySimpleLink = (EntityLinkSimplePanel) getComponentFactoryRegistry().createComponent(ComponentType.ENTITY_LINK, getModel());
-        
-        entitySimpleLink.setOutputMarkupId(true);
-        entitySimpleLink.setLabel(Model.of(name));
-        
-        final FormComponentLabel labelIfCompact = new FormComponentLabel(ID_SCALAR_IF_COMPACT, entitySimpleLink);
-        labelIfCompact.add(entitySimpleLink);
-        
-        addOrReplace(labelIfCompact);
-        
-        return labelIfCompact;
+    @Override
+    protected void onBeforeRenderWhenViewMode() {
+        super.onBeforeRenderWhenViewMode();
+        entityLink.setEnabled(true);
+        syncVisibilityAndUsability(entityLink, entityLink.select2Field);
     }
 
     // //////////////////////////////////////
 
+    // called from buildGui
     @Override
     protected void addFormComponentBehavior(Behavior behavior) {
         if(entityLink.select2Field != null) {
@@ -211,20 +198,9 @@ public class ReferencePanel extends ScalarPanelAbstract {
         }
     }
 
-    @Override
-    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        if(entityLink.select2Field != null) {
-            setProviderAndCurrAndPending(entityLink.select2Field, argsIfAvailable);
-            return true;
-        } else {
-            return false;
-        }
-    }
-
     // //////////////////////////////////////
 
-    
-    boolean isEditableWithEitherAutoCompleteOrChoices() {
+    private boolean isEditableWithEitherAutoCompleteOrChoices() {
         if(getModel().getRenderingHint().isInTable()) {
             return false;
         }
@@ -252,12 +228,17 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return autoCompleteFacet != null;
     }
 
-    void setProviderAndCurrAndPending(final Select2Choice<ObjectAdapterMemento> select2Field, final ObjectAdapter[] argsIfAvailable) {
+    
+    // //////////////////////////////////////
+    
+    void setProviderAndCurrAndPending(
+            final Select2Choice<ObjectAdapterMemento> select2Field, 
+            final ObjectAdapter[] argsIfAvailable) {
         if (getModel().hasChoices()) {
             
-            final List<ObjectAdapterMemento> choiceMementos = getChoiceMementos(argsIfAvailable);
+            final List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
             ObjectAdapterMementoProviderAbstract providerForChoices = providerForChoices(choiceMementos);
-            
+
             select2Field.setProvider(providerForChoices);
             getModel().clearPending();
             
@@ -272,7 +253,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
         }
     }
 
-    List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
+    // called by setProviderAndCurrAndPending
+    private List<ObjectAdapterMemento> obtainChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
         final List<ObjectAdapter> choices = Lists.newArrayList();
         if(getModel().hasChoices()) {
             choices.addAll(getModel().getChoices(argsIfAvailable));
@@ -281,8 +263,28 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
     }
 
+    // called by setProviderAndCurrAndPending
+    private void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
+        final ObjectAdapterMemento curr = select2Field.getModelObject();
+        if(curr == null) {
+            select2Field.getModel().setObject(null);
+            this.getModel().setObject(null);
+            return;
+        }
+        if(!curr.containedIn(choiceMementos)) {
+            if(!choiceMementos.isEmpty()) {
+                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
+                select2Field.getModel().setObject(newAdapterMemento);
+                this.getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
+            } else {
+                select2Field.getModel().setObject(null);
+                this.getModel().setObject(null);
+            }
+        }
+    }
 
-    ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
+    // called by setProviderAndCurrAndPending
+    private ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
         return new ObjectAdapterMementoProviderAbstract(getModel()) {
 
             private static final long serialVersionUID = 1L;
@@ -297,8 +299,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
         };
     }
 
-
-    ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
+    // called by setProviderAndCurrAndPending
+    private ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
         return new ObjectAdapterMementoProviderAbstract(getModel()) {
             
             private static final long serialVersionUID = 1L;
@@ -315,28 +317,9 @@ public class ReferencePanel extends ScalarPanelAbstract {
             
         };
     }
-    
-
-    void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
-        final ObjectAdapterMemento curr = select2Field.getModelObject();
-        if(curr == null) {
-            select2Field.getModel().setObject(null);
-            this.getModel().setObject(null);
-            return;
-        }
-        if(!curr.containedIn(choiceMementos)) {
-            if(!choiceMementos.isEmpty()) {
-                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
-                select2Field.getModel().setObject(newAdapterMemento);
-                this.getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
-            } else {
-                select2Field.getModel().setObject(null);
-                this.getModel().setObject(null);
-            }
-        }
-    }
 
-    ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
+    // called by setProviderAndCurrAndPending
+    private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
         return new ObjectAdapterMementoProviderAbstract(getModel()) {
             private static final long serialVersionUID = 1L;
             @Override
@@ -346,38 +329,6 @@ public class ReferencePanel extends ScalarPanelAbstract {
         };
     }
 
-    void syncLinkWithInput(EntityLinkSelect2Panel linkPanel, final ObjectAdapter adapter) {
-        if(labelIfRegular == null) {
-            return;
-        }
-        
-        if (adapter != null) {
-            final EntityModel entityModelForLink = new EntityModel(adapter);
-            
-            entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
-            entityModelForLink.setRenderingHint(getModel().getRenderingHint());
-            
-            final ComponentFactory componentFactory = 
-                    getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-            final Component component = componentFactory.createComponent(entityModelForLink);
-            
-            labelIfRegular.addOrReplace(component);
-        } else {
-            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
-            
-        }
-    }
-
-
-    void onSelected(EntityLinkSelect2Panel linkPanel, final ObjectAdapterMemento selectedAdapterMemento) {
-
-        getModel().setPending(selectedAdapterMemento);
-        getModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
-        if(linkPanel.select2Field != null) {
-            linkPanel.select2Field.getModel().setObject(selectedAdapterMemento);
-        }
-    }
-
     /**
      * Must be called after {@link #setEnabled(boolean)}, apparently...
      * originally to ensure that the findUsing button and entityClearLink were
@@ -390,7 +341,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
      * seem to be anyway to install a listener. One option might be to move it
      * to {@link #onBeforeRender()} ?
      */
-    void syncVisibilityAndUsability(EntityLinkSelect2Panel linkPanel, Select2Choice<ObjectAdapterMemento> select2Field) {
+    private void syncVisibilityAndUsability(EntityLinkSelect2Panel linkPanel, Select2Choice<ObjectAdapterMemento> select2Field) {
         final boolean mutability = linkPanel.isEnableAllowed() && !getModel().isViewMode();
     
         if(select2Field != null) {
@@ -402,6 +353,17 @@ public class ReferencePanel extends ScalarPanelAbstract {
         }
     }
 
+    // //////////////////////////////////////
+    
+    // called by EntityLinkSelect2Panel
+    String getInput() {
+        final ObjectAdapter pendingElseCurrentAdapter = getModel().getPendingElseCurrentAdapter();
+        return pendingElseCurrentAdapter != null? pendingElseCurrentAdapter.titleString(null): "(no object)";
+    }
+
+    // //////////////////////////////////////
+
+    // called by EntityLinkSelect2Panel
     void convertInput(EntityLinkSelect2Panel linkPanel) {
         if(getModel().isEditMode() && isEditableWithEitherAutoCompleteOrChoices()) {
             // flush changes to pending
@@ -412,14 +374,50 @@ public class ReferencePanel extends ScalarPanelAbstract {
         linkPanel.setConvertedInput(pendingAdapter);
     }
 
+    private void onSelected(EntityLinkSelect2Panel linkPanel, final ObjectAdapterMemento selectedAdapterMemento) {
+
+        getModel().setPending(selectedAdapterMemento);
+        getModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
+        if(linkPanel.select2Field != null) {
+            linkPanel.select2Field.getModel().setObject(selectedAdapterMemento);
+        }
+    }
+
+    // //////////////////////////////////////
+
+    // called by EntityLinkSelect2Panel
     void syncWithInput(EntityLinkSelect2Panel linkPanel) {
         final ObjectAdapter adapter = getModel().getPendingElseCurrentAdapter();
         syncLinkWithInput(linkPanel, adapter);
-        doSyncWithInputIfAutoCompleteOrChoices(linkPanel);
+        syncLinkWithInputIfAutoCompleteOrChoices(linkPanel);
         syncVisibilityAndUsability(linkPanel, linkPanel.select2Field);
     }
 
-    void doSyncWithInputIfAutoCompleteOrChoices(EntityLinkSelect2Panel linkPanel) {
+    // called by syncWithInput
+    private void syncLinkWithInput(EntityLinkSelect2Panel linkPanel, final ObjectAdapter adapter) {
+        if(labelIfRegular == null) {
+            return;
+        }
+        
+        if (adapter != null) {
+            final EntityModel entityModelForLink = new EntityModel(adapter);
+            
+            entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
+            entityModelForLink.setRenderingHint(getModel().getRenderingHint());
+            
+            final ComponentFactory componentFactory = 
+                    getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
+            final Component component = componentFactory.createComponent(entityModelForLink);
+            
+            labelIfRegular.addOrReplace(component);
+        } else {
+            Components.permanentlyHide(labelIfRegular, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+            
+        }
+    }
+
+    // called by syncWithInput
+    private void syncLinkWithInputIfAutoCompleteOrChoices(EntityLinkSelect2Panel linkPanel) {
         if(!isEditableWithEitherAutoCompleteOrChoices()) {
             // this is horrid; adds a label to the id
             // should instead be a 'temporary hide'
@@ -467,10 +465,22 @@ public class ReferencePanel extends ScalarPanelAbstract {
         }
     }
 
-    String getInput() {
-        final ObjectAdapter pendingElseCurrentAdapter = getModel().getPendingElseCurrentAdapter();
-        return pendingElseCurrentAdapter != null? pendingElseCurrentAdapter.titleString(null): "(no object)";
-    }
+    // //////////////////////////////////////
 
+    /**
+     * Hook method to refresh choices when changing.
+     * 
+     * <p>
+     * called from onUpdate callback
+     */
+    @Override
+    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
+        if(entityLink.select2Field != null) {
+            setProviderAndCurrAndPending(entityLink.select2Field, argsIfAvailable);
+            return true;
+        } else {
+            return false;
+        }
+    }
 
 }


[03/10] git commit: ISIS-764: reference panel simplification

Posted by da...@apache.org.
ISIS-764: reference panel simplification

... compact component uses EntityLinkSimplePanel rather than EntityLinkSelect2Panel (since simply need to render a link).


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

Branch: refs/heads/ISIS-764
Commit: 867a26eee6f90ffb6bb2abce61f08388981dab3a
Parents: a785bfd
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue May 6 23:24:02 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue May 6 23:24:02 2014 +0100

----------------------------------------------------------------------
 .../ui/components/scalars/reference/ReferencePanel.java | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/867a26ee/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 262441f..8909687 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -34,6 +34,7 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
@@ -50,6 +51,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
 
     private EntityLinkSelect2Panel entityLink;
+    private EntityLinkSimplePanel entitySimpleLink;
 
     public ReferencePanel(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
@@ -163,13 +165,13 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final ScalarModel scalarModel = getModel();
         final String name = scalarModel.getName();
         
-        entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), getModel());
+        entitySimpleLink = (EntityLinkSimplePanel) getComponentFactoryRegistry().createComponent(ComponentType.ENTITY_LINK, getModel());
         
-        entityLink.setOutputMarkupId(true);
-        entityLink.setLabel(Model.of(name));
+        entitySimpleLink.setOutputMarkupId(true);
+        entitySimpleLink.setLabel(Model.of(name));
         
-        final FormComponentLabel labelIfCompact = new FormComponentLabel(ID_SCALAR_IF_COMPACT, entityLink);
-        labelIfCompact.add(entityLink);
+        final FormComponentLabel labelIfCompact = new FormComponentLabel(ID_SCALAR_IF_COMPACT, entitySimpleLink);
+        labelIfCompact.add(entitySimpleLink);
         
         addOrReplace(labelIfCompact);
         


[05/10] git commit: ISIS-764: moving functionality into ReferencePanel

Posted by da...@apache.org.
ISIS-764: moving functionality into ReferencePanel

... from EntityLinkSelect2Panel.


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

Branch: refs/heads/ISIS-764
Commit: bf6b900b3110992dd9acf9c31369f1d02790c0bf
Parents: a8eee7a
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed May 7 23:50:56 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed May 7 23:50:56 2014 +0100

----------------------------------------------------------------------
 .../reference/EntityLinkSelect2Panel.java       | 361 +------------------
 .../scalars/reference/ReferencePanel.html       |   3 +-
 .../scalars/reference/ReferencePanel.java       | 288 ++++++++++++++-
 .../ObjectAdapterMementoProviderAbstract.java   |   4 +
 4 files changed, 299 insertions(+), 357 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bf6b900b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
index 33d78b7..62ed565 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
@@ -19,76 +19,37 @@
 
 package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
-import java.util.List;
-
-import com.google.common.collect.Lists;
-import com.vaynberg.wicket.select2.ChoiceProvider;
 import com.vaynberg.wicket.select2.Select2Choice;
-import com.vaynberg.wicket.select2.Select2MultiChoice;
-import com.vaynberg.wicket.select2.Settings;
 
-import org.apache.wicket.Component;
-import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.model.IModel;
 
 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.version.ConcurrencyException;
-import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
-import org.apache.isis.viewer.wicket.model.util.MementoFunctions;
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.Select2ChoiceUtil;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 
 /**
  * {@link FormComponentPanel} representing a reference to an entity: a link and
  * (optionally) an autocomplete field.
  */
-public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired, ActionInvokeHandler  {
+class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired, ActionInvokeHandler  {
 
     private static final long serialVersionUID = 1L;
 
-    private static final String ID_AUTO_COMPLETE = "autoComplete";
-    private static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
-
     /**
      * This component may be null if there are no choices or autoComplete, or if in read-only mode.
      */
-    private Select2Choice<ObjectAdapterMemento> select2Field;
-    private Link<String> entityDetailsLink;
-    private Link<String> entityClearLink;
+    Select2Choice<ObjectAdapterMemento> select2Field;
 
-    public EntityLinkSelect2Panel(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
-        setType(ObjectAdapter.class);
-        buildGui();
-    }
+    ReferencePanel owningPanel;
 
-    public ScalarModel getScalarModel() {
-        return (ScalarModel) getModel();
-    }
-
-    /**
-     * Builds the parts of the GUI that are not dynamic.
-     */
-    private void buildGui() {
+    public EntityLinkSelect2Panel(final String id, final ReferencePanel owningPanel) {
+        super(id, owningPanel.getModel());
+        this.owningPanel = owningPanel;
+        
+        setType(ObjectAdapter.class);
         syncWithInput();
     }
 
@@ -104,54 +65,6 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
         return super.checkRequired();
     }
 
-    @Override
-    public boolean isRequired() {
-        return super.isRequired();
-    }
-
-    
-    /**
-     * Must be called after {@link #setEnabled(boolean)} to ensure that the
-     * <tt>findUsing</tt> button, and the <tt>entityClearLink</tt> are 
-     * shown/not shown as required.
-     * 
-     * <p>
-     * REVIEW: there ought to be a better way to do this. I'd hoped to override
-     * {@link #setEnabled(boolean)}, but it is <tt>final</tt>, and there doesn't
-     * seem to be anyway to install a listener. One option might be to move it
-     * to {@link #onBeforeRender()} ?
-     */
-    public void syncVisibilityAndUsability() {
-        
-        final boolean mutability = isEnableAllowed() && !getScalarModel().isViewMode();
-
-        if(entityClearLink != null) {
-            entityClearLink.setVisible(mutability);
-        }
-
-        if(entityDetailsLink != null) {
-            entityDetailsLink.setVisible(getScalarModel().getRenderingHint() == RenderingHint.REGULAR);
-        }
-        
-        if(select2Field != null) {
-            select2Field.setEnabled(mutability);
-        }
-        
-        if(isEditableWithEitherAutoCompleteOrChoices()) {
-            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
-    protected void doSyncVisibilityAndUsability(boolean mutability) {
-        if(select2Field != null) {
-            select2Field.setEnabled(mutability);
-        }
-
-        if(isEditableWithEitherAutoCompleteOrChoices()) {
-            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
     /**
      * Since we override {@link #convertInput()}, it is (apparently) enough to
      * just return a value that is suitable for error reporting.
@@ -160,23 +73,15 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
      */
     @Override
     public String getInput() {
-        final ObjectAdapter pendingElseCurrentAdapter = getScalarModel().getPendingElseCurrentAdapter();
+        final ObjectAdapter pendingElseCurrentAdapter = owningPanel.getModel().getPendingElseCurrentAdapter();
         return pendingElseCurrentAdapter != null? pendingElseCurrentAdapter.titleString(null): "(no object)";
     }
 
     @Override
     protected void convertInput() {
-
-        if(getScalarModel().isEditMode() && isEditableWithEitherAutoCompleteOrChoices()) {
-            // flush changes to pending
-            onSelected(select2Field.getConvertedInput());
-        }
-
-        final ObjectAdapter pendingAdapter = getScalarModel().getPendingAdapter();
-        setConvertedInput(pendingAdapter);
+        this.owningPanel.convertInput(this);
     }
 
-
     @Override
     protected void onBeforeRender() {
         syncWithInput();
@@ -184,258 +89,16 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
     }
 
     private void syncWithInput() {
-        final ObjectAdapter adapter = getPendingElseCurrentAdapter();
-
-        syncLinkWithInput(adapter);
-        doSyncWithInputIfAutoCompleteOrChoices();
-        syncVisibilityAndUsability();
-    }
-
-    private void doSyncWithInputIfAutoCompleteOrChoices() {
-        
-        if(!isEditableWithEitherAutoCompleteOrChoices()) {
-            // this is horrid; adds a label to the id
-            // should instead be a 'temporary hide'
-            permanentlyHide(ID_AUTO_COMPLETE);
-            select2Field = null; // this forces recreation next time around
-            return;
-        }
-
-        final IModel<ObjectAdapterMemento> model = ScalarModelWithPending.Util.createModel(getScalarModel().asScalarModelWithPending());       
-
-        if(select2Field == null) {
-            setRequired(getScalarModel().isRequired());
-            select2Field = Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, model, getScalarModel());
-            setProviderAndCurrAndPending(select2Field, getScalarModel().getActionArgsHint());
-            if(!getScalarModel().hasChoices()) {
-                final Settings settings = select2Field.getSettings();
-                ScalarModel scalarModel = getScalarModel();
-                final int minLength = scalarModel.getAutoCompleteMinLength();
-                settings.setMinimumInputLength(minLength);
-                settings.setPlaceholder(scalarModel.getName());
-            }
-            addOrReplace(select2Field);
-        } else {
-            //
-            // the select2Field already exists, so the widget has been rendered before.  If it is
-            // being re-rendered now, it may be because some other property/parameter was invalid.
-            // when the form was submitted, the selected object (its oid as a string) would have
-            // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
-            // would be correctly converted and processed by the select2Field's choiceProvider.  However,
-            // an invalid property/parameter means that the webpage is re-rendered in another request,
-            // and the rawInput can no longer be interpreted.  The net result is that the field appears
-            // with no input.
-            //
-            // The fix is therefore (I think) simply to clear any rawInput, so that the select2Field
-            // renders its state from its model.
-            //
-            // see: FormComponent#getInputAsArray()
-            // see: Select2Choice#renderInitializationScript()
-            //
-            select2Field.clearInput();
-        }
-        
-        
-        // no need for link, since can see in drop-down
-        permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-
-        // no need for the 'null' title, since if there is no object yet
-        // can represent this fact in the drop-down
-        // permanentlyHide(ID_ENTITY_TITLE_NULL);
-    }
-
-
-    private ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
-        final EntityModel entityModel = getScalarModel();
-        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
-
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final ObjectSpecification typeOfSpecification = entityModel.getTypeOfSpecification();
-                final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-                final List<ObjectAdapter> results = autoCompleteFacet.execute(term);
-                return Lists.transform(results, ObjectAdapterMemento.Functions.fromAdapter());
-            }
-
-        };
-    }
-
-    private ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
-        final EntityModel entityModel = getScalarModel();
-        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
-            
-            private static final long serialVersionUID = 1L;
-            
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
-                final ScalarModel scalarModel = (ScalarModel) entityModel;
-                if(scalarModel.hasAutoComplete()) {
-                    autoCompleteChoices.addAll(scalarModel.getAutoComplete(term));
-                }
-                // take a copy otherwise is only lazily evaluated
-                return Lists.newArrayList(Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
-            }
-            
-        };
-    }
-    
-    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
-        
-        final List<ObjectAdapter> choices = Lists.newArrayList();
-        final ScalarModel scalarModel = (ScalarModel) getScalarModel();;
-        if(scalarModel.hasChoices()) {
-            choices.addAll(scalarModel.getChoices(argsIfAvailable));
-        }
-        // take a copy otherwise is only lazily evaluated
-        return Lists.newArrayList(Lists.transform(choices, MementoFunctions.fromAdapter()));
-    }
-
-    private void syncLinkWithInput(final ObjectAdapter adapter) {
-        if (adapter != null) {
-            addOrReplaceIconAndTitle(adapter);
-        } else {
-            permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
-        }
-    }
-
-
-    private void addOrReplaceIconAndTitle(ObjectAdapter pendingOrCurrentAdapter) {
-        final EntityModel entityModelForLink = new EntityModel(pendingOrCurrentAdapter);
-        entityModelForLink.setContextAdapterIfAny(getScalarModel().getContextAdapterIfAny());
-        entityModelForLink.setRenderingHint(getScalarModel().getRenderingHint());
-        final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-        final Component component = componentFactory.createComponent(entityModelForLink);
-        addOrReplace(component);
+        this.owningPanel.syncWithInput(this);
     }
 
-
     @Override
     public void onClick(final ActionModel actionModel) {
     }
 
-    public void onSelected(final ObjectAdapterMemento selectedAdapterMemento) {
-        getScalarModel().setPending(selectedAdapterMemento);
-        getScalarModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
-        if(this.select2Field != null) {
-            select2Field.getModel().setObject(selectedAdapterMemento);
-        }
-        // not sure why this was here, at any rate it trips up when performing validation with modal dialogs.
-        // renderSamePage();
-    }
-
-    public void onNoResults() {
-        renderSamePage();
-    }
-
     @Override
     public void onCancel() {
-        getScalarModel().clearPending();
-    }
-
-    private ObjectAdapter getPendingElseCurrentAdapter() {
-        return getScalarModel().getPendingElseCurrentAdapter();
-    }
-
-    private void renderSamePage() {
-        setResponsePage(getPage());
-    }
-    
-    private boolean isEditableWithEitherAutoCompleteOrChoices() {
-        // never doesn't apply in compact rendering contexts (ie tables)
-        if(getScalarModel().getRenderingHint().isInTable()) {
-            return false;
-        }
-        // doesn't apply if not editable, either
-        if(getScalarModel().isViewMode()) {
-            return false;
-        }
-        return getScalarModel().hasChoices() || hasParamOrPropertyAutoComplete() || hasObjectAutoComplete();
-    }
-
-    private boolean hasParamOrPropertyAutoComplete() {
-        return getScalarModel().hasAutoComplete();
-    }
-
-    private boolean hasObjectAutoComplete() {
-
-        // on property/param
-        boolean hasAutoComplete = getScalarModel().hasAutoComplete();
-        if(hasAutoComplete) {
-            return true;
-        }
-        
-        // else on underlying type
-        final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
-        final AutoCompleteFacet autoCompleteFacet = 
-                (typeOfSpecification != null)? typeOfSpecification.getFacet(AutoCompleteFacet.class):null;
-        return autoCompleteFacet != null;
-    }
-
-    // //////////////////////////////////////
-
-    public void addFormComponentBehavior(Behavior behavior) {
-        if(select2Field != null) {
-            select2Field.add(behavior);
-        }
-    }
-
-    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        if(select2Field != null) {
-            setProviderAndCurrAndPending(select2Field, argsIfAvailable);
-            return true;
-        } else {
-            return false;
-        }
-    }
-    
-    private void setProviderAndCurrAndPending(
-            final Select2Choice<ObjectAdapterMemento> select2Field, 
-            final ObjectAdapter[] argsIfAvailable) {
-        
-        if (getScalarModel().hasChoices()) {
-            final List<ObjectAdapterMemento> choiceMementos = getChoiceMementos(argsIfAvailable);
-            select2Field.setProvider(providerForChoices(choiceMementos));
-            getScalarModel().clearPending();
-            resetIfCurrentNotInChoices(select2Field, choiceMementos);
-        } else if(hasParamOrPropertyAutoComplete()) {
-            select2Field.setProvider(providerForParamOrPropertyAutoComplete());
-            getScalarModel().clearPending();
-        } else {
-            select2Field.setProvider(providerForObjectAutoComplete());
-            getScalarModel().clearPending();
-        }
-    }
-
-    private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
-        return new ObjectAdapterMementoProviderAbstract(getScalarModel()) {
-            private static final long serialVersionUID = 1L;
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String unused) {
-                return choiceMementos;
-            }
-        };
-    }
-
-    private void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
-        final ObjectAdapterMemento curr = select2Field.getModelObject();
-        if(curr == null) {
-            select2Field.getModel().setObject(null);
-            getModel().setObject(null);
-            return;
-        }
-        if(!curr.containedIn(choiceMementos)) {
-            if(!choiceMementos.isEmpty()) {
-                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
-                select2Field.getModel().setObject(newAdapterMemento);
-                getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
-            } else {
-                select2Field.getModel().setObject(null);
-                getModel().setObject(null);
-            }
-        }
+        owningPanel.getModel().clearPending();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/bf6b900b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
index 6d39871..dd9de09 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
@@ -33,8 +33,7 @@
                             <div class="entityLinkSelect2Panel entityLinkComponentType">
                                 <div class="wrapper">
                                     <span class="autoCompletePlaceholder">
-                                        <span wicket:id="entityLink">
-                                        </span>
+                                        <span wicket:id="entityLink">link or drop down</span>
                                     </span>
                                     <div class="clear"/>
                                 </div>

http://git-wip-us.apache.org/repos/asf/isis/blob/bf6b900b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 8909687..df28aea 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -19,22 +19,40 @@
 
 package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import com.vaynberg.wicket.select2.ChoiceProvider;
+import com.vaynberg.wicket.select2.Select2Choice;
+import com.vaynberg.wicket.select2.Settings;
+
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+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.mementos.ObjectAdapterMemento;
 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.ScalarModelWithPending;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
+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.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.Select2ChoiceUtil;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
+import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
@@ -50,6 +68,9 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
     private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
 
+    static final String ID_AUTO_COMPLETE = "autoComplete";
+    static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
+
     private EntityLinkSelect2Panel entityLink;
     private EntityLinkSimplePanel entitySimpleLink;
 
@@ -61,14 +82,14 @@ public class ReferencePanel extends ScalarPanelAbstract {
     protected void onBeforeRenderWhenEnabled() {
         super.onBeforeRenderWhenEnabled();
         entityLink.setEnabled(true);
-        entityLink.syncVisibilityAndUsability();
+        entityLink.owningPanel.syncVisibilityAndUsability(entityLink, entityLink.select2Field);
     }
 
     @Override
     protected void onBeforeRenderWhenViewMode() {
         super.onBeforeRenderWhenViewMode();
         entityLink.setEnabled(true);
-        entityLink.syncVisibilityAndUsability();
+        entityLink.owningPanel.syncVisibilityAndUsability(entityLink, entityLink.select2Field);
     }
 
     @Override
@@ -77,7 +98,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final EntityModel entityLinkModel = (EntityModel) entityLink.getModel();
         entityLinkModel.toViewMode();
         setTitleAttribute(disableReason);
-        entityLink.syncVisibilityAndUsability();
+        entityLink.owningPanel.syncVisibilityAndUsability(entityLink, entityLink.select2Field);
     }
 
     private void setTitleAttribute(final String titleAttribute) {
@@ -89,7 +110,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final ScalarModel scalarModel = getModel();
         final String name = scalarModel.getName();
         
-        entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), getModel());
+        entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), this);
         
         setOutputMarkupId(true);
         entityLink.setOutputMarkupId(true);
@@ -182,12 +203,267 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
     @Override
     protected void addFormComponentBehavior(Behavior behavior) {
-        entityLink.addFormComponentBehavior(behavior);
+        if(entityLink.select2Field != null) {
+            entityLink.select2Field.add(behavior);
+        }
     }
 
     @Override
     public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        return entityLink.updateChoices(argsIfAvailable);
+        if(entityLink.select2Field != null) {
+            setProviderAndCurrAndPending(entityLink.select2Field, argsIfAvailable);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    // //////////////////////////////////////
+
+    
+    boolean isEditableWithEitherAutoCompleteOrChoices() {
+        if(getModel().getRenderingHint().isInTable()) {
+            return false;
+        }
+        // doesn't apply if not editable, either
+        if(getModel().isViewMode()) {
+            return false;
+        }
+        return getModel().hasChoices() || hasParamOrPropertyAutoComplete() || hasObjectAutoComplete();
     }
 
+    boolean hasParamOrPropertyAutoComplete() {
+        return getModel().hasAutoComplete();
+    }
+
+    boolean hasObjectAutoComplete() {
+        boolean hasAutoComplete = getModel().hasAutoComplete();
+        if(hasAutoComplete) {
+            return true;
+        }
+        
+        // else on underlying type
+        final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
+        final AutoCompleteFacet autoCompleteFacet = 
+                (typeOfSpecification != null)? typeOfSpecification.getFacet(AutoCompleteFacet.class):null;
+        return autoCompleteFacet != null;
+    }
+
+    void setProviderAndCurrAndPending(final Select2Choice<ObjectAdapterMemento> select2Field, final ObjectAdapter[] argsIfAvailable) {
+        if (getModel().hasChoices()) {
+            
+            final List<ObjectAdapterMemento> choiceMementos = getChoiceMementos(argsIfAvailable);
+            ObjectAdapterMementoProviderAbstract providerForChoices = providerForChoices(choiceMementos);
+            
+            select2Field.setProvider(providerForChoices);
+            getModel().clearPending();
+            
+            resetIfCurrentNotInChoices(select2Field, choiceMementos);
+            
+        } else if(hasParamOrPropertyAutoComplete()) {
+            select2Field.setProvider(providerForParamOrPropertyAutoComplete());
+            getModel().clearPending();
+        } else {
+            select2Field.setProvider(providerForObjectAutoComplete());
+            getModel().clearPending();
+        }
+    }
+
+    List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
+        final List<ObjectAdapter> choices = Lists.newArrayList();
+        if(getModel().hasChoices()) {
+            choices.addAll(getModel().getChoices(argsIfAvailable));
+        }
+        // take a copy otherwise is only lazily evaluated
+        return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
+    }
+
+
+    ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
+        return new ObjectAdapterMementoProviderAbstract(getModel()) {
+
+            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> results = autoCompleteFacet.execute(term);
+                return Lists.transform(results, ObjectAdapterMemento.Functions.fromAdapter());
+            }
+        };
+    }
+
+
+    ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
+        return new ObjectAdapterMementoProviderAbstract(getModel()) {
+            
+            private static final long serialVersionUID = 1L;
+            
+            @Override
+            protected List<ObjectAdapterMemento> obtainMementos(String term) {
+                final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
+                if(getScalarModel().hasAutoComplete()) {
+                    autoCompleteChoices.addAll(getScalarModel().getAutoComplete(term));
+                }
+                // take a copy otherwise is only lazily evaluated
+                return Lists.newArrayList(Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
+            }
+            
+        };
+    }
+    
+
+    void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
+        final ObjectAdapterMemento curr = select2Field.getModelObject();
+        if(curr == null) {
+            select2Field.getModel().setObject(null);
+            this.getModel().setObject(null);
+            return;
+        }
+        if(!curr.containedIn(choiceMementos)) {
+            if(!choiceMementos.isEmpty()) {
+                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
+                select2Field.getModel().setObject(newAdapterMemento);
+                this.getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
+            } else {
+                select2Field.getModel().setObject(null);
+                this.getModel().setObject(null);
+            }
+        }
+    }
+
+    ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
+        return new ObjectAdapterMementoProviderAbstract(getModel()) {
+            private static final long serialVersionUID = 1L;
+            @Override
+            protected List<ObjectAdapterMemento> obtainMementos(String unused) {
+                return choiceMementos;
+            }
+        };
+    }
+
+    void syncLinkWithInput(EntityLinkSelect2Panel linkPanel, final ObjectAdapter adapter) {
+        if (adapter != null) {
+            addOrReplaceIconAndTitle(linkPanel, adapter);
+        } else {
+            Components.permanentlyHide(linkPanel, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+        }
+    }
+
+    void addOrReplaceIconAndTitle(EntityLinkSelect2Panel linkPanel, ObjectAdapter pendingOrCurrentAdapter) {
+
+        final EntityModel entityModelForLink = new EntityModel(pendingOrCurrentAdapter);
+        
+        entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
+        entityModelForLink.setRenderingHint(getModel().getRenderingHint());
+        
+        final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
+        final Component component = componentFactory.createComponent(entityModelForLink);
+        
+        linkPanel.addOrReplace(component);
+    }
+
+
+    void onSelected(EntityLinkSelect2Panel linkPanel, final ObjectAdapterMemento selectedAdapterMemento) {
+
+        getModel().setPending(selectedAdapterMemento);
+        getModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
+        if(linkPanel.select2Field != null) {
+            linkPanel.select2Field.getModel().setObject(selectedAdapterMemento);
+        }
+    }
+
+    /**
+     * Must be called after {@link #setEnabled(boolean)}, apparently...
+     * originally to ensure that the findUsing button and entityClearLink were
+     * shown/not shown as required, however these have now gone.  Which beckons the question,
+     * is it still important?
+     * 
+     * <p>
+     * REVIEW: there ought to be a better way to do this. I'd hoped to override
+     * {@link #setEnabled(boolean)}, but it is <tt>final</tt>, and there doesn't
+     * seem to be anyway to install a listener. One option might be to move it
+     * to {@link #onBeforeRender()} ?
+     */
+    void syncVisibilityAndUsability(EntityLinkSelect2Panel linkPanel, Select2Choice<ObjectAdapterMemento> select2Field) {
+        final boolean mutability = linkPanel.isEnableAllowed() && !getModel().isViewMode();
+    
+        if(select2Field != null) {
+            select2Field.setEnabled(mutability);
+        }
+        
+        if(isEditableWithEitherAutoCompleteOrChoices()) {
+            Components.permanentlyHide(linkPanel, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+        }
+    }
+
+    void convertInput(EntityLinkSelect2Panel linkPanel) {
+        if(getModel().isEditMode() && isEditableWithEitherAutoCompleteOrChoices()) {
+            // flush changes to pending
+            this.onSelected(linkPanel, linkPanel.select2Field.getConvertedInput());
+        }
+    
+        final ObjectAdapter pendingAdapter = getModel().getPendingAdapter();
+        linkPanel.setConvertedInput(pendingAdapter);
+    }
+
+    void syncWithInput(EntityLinkSelect2Panel linkPanel) {
+        final ObjectAdapter adapter = getModel().getPendingElseCurrentAdapter();
+        syncLinkWithInput(linkPanel, adapter);
+        doSyncWithInputIfAutoCompleteOrChoices(linkPanel);
+        syncVisibilityAndUsability(linkPanel, linkPanel.select2Field);
+    }
+
+    void doSyncWithInputIfAutoCompleteOrChoices(EntityLinkSelect2Panel linkPanel) {
+        if(!isEditableWithEitherAutoCompleteOrChoices()) {
+            // this is horrid; adds a label to the id
+            // should instead be a 'temporary hide'
+            Components.permanentlyHide(linkPanel, ReferencePanel.ID_AUTO_COMPLETE);
+            linkPanel.select2Field = null; // this forces recreation next time around
+            return;
+        }
+    
+        final IModel<ObjectAdapterMemento> model = Util.createModel(getModel().asScalarModelWithPending());       
+    
+        if(linkPanel.select2Field == null) {
+            linkPanel.setRequired(getModel().isRequired());
+            linkPanel.select2Field = Select2ChoiceUtil.newSelect2Choice(ReferencePanel.ID_AUTO_COMPLETE, model, getModel());
+            setProviderAndCurrAndPending(linkPanel.select2Field, getModel().getActionArgsHint());
+            if(!getModel().hasChoices()) {
+                final Settings settings = linkPanel.select2Field.getSettings();
+                final int minLength = getModel().getAutoCompleteMinLength();
+                settings.setMinimumInputLength(minLength);
+                settings.setPlaceholder(getModel().getName());
+            }
+            linkPanel.addOrReplace(linkPanel.select2Field);
+        } else {
+            //
+            // the select2Field already exists, so the widget has been rendered before.  If it is
+            // being re-rendered now, it may be because some other property/parameter was invalid.
+            // when the form was submitted, the selected object (its oid as a string) would have
+            // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
+            // would be correctly converted and processed by the select2Field's choiceProvider.  However,
+            // an invalid property/parameter means that the webpage is re-rendered in another request,
+            // and the rawInput can no longer be interpreted.  The net result is that the field appears
+            // with no input.
+            //
+            // The fix is therefore (I think) simply to clear any rawInput, so that the select2Field
+            // renders its state from its model.
+            //
+            // see: FormComponent#getInputAsArray()
+            // see: Select2Choice#renderInitializationScript()
+            //
+            linkPanel.select2Field.clearInput();
+        }
+        
+        // no need for link, since can see in drop-down
+        Components.permanentlyHide(linkPanel, ReferencePanel.ID_ENTITY_ICON_AND_TITLE);
+    
+        // no need for the 'null' title, since if there is no object yet
+        // can represent this fact in the drop-down
+        // permanentlyHide(ID_ENTITY_TITLE_NULL);
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/bf6b900b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
index a55a20f..fd4a4d4 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
@@ -80,4 +80,8 @@ public abstract class ObjectAdapterMementoProviderAbstract extends TextChoicePro
         };
         return Collections2.transform(ids, function);
     }
+    
+    protected ScalarModel getScalarModel() {
+        return scalarModel;
+    }
 }
\ No newline at end of file


[06/10] git commit: ISIS-764: moving further functionality ...

Posted by da...@apache.org.
ISIS-764: moving further functionality ...

from EntityLinkSelect2Panel into ReferencePanel

In addition, removing org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler since does not seem to be used.


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

Branch: refs/heads/ISIS-764
Commit: 1f714c0832aa694342be0f4fbeb2c07f41c29997
Parents: bf6b900
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed May 7 23:54:15 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed May 7 23:54:15 2014 +0100

----------------------------------------------------------------------
 .../components/actions/ActionInvokeHandler.java | 27 ---------------
 .../entity/header/EntityHeaderPanel.java        |  8 +----
 .../reference/EntityLinkSelect2Panel.java       | 29 +++-------------
 .../scalars/reference/ReferencePanel.java       |  8 ++++-
 .../entitysimplelink/EntityLinkSimplePanel.java | 36 +-------------------
 5 files changed, 14 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1f714c08/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionInvokeHandler.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionInvokeHandler.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionInvokeHandler.java
deleted file mode 100644
index a5ab19a..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionInvokeHandler.java
+++ /dev/null
@@ -1,27 +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.actions;
-
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
-
-public interface ActionInvokeHandler {
-
-    void onClick(ActionModel actionModel);
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/1f714c08/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
index 70d4f57..070048b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
@@ -52,7 +52,6 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
 import org.apache.isis.viewer.wicket.ui.components.entity.EntityActionLinkFactory;
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuBuilder;
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuPanel;
@@ -65,7 +64,7 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
  * {@link PanelAbstract Panel} representing the summary details (title, icon and
  * actions) of an entity, as per the provided {@link EntityModel}.
  */
-public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements ActionInvokeHandler {
+public class EntityHeaderPanel extends PanelAbstract<EntityModel> {
 
     private static final long serialVersionUID = 1L;
 
@@ -173,11 +172,6 @@ public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements Act
         return ObjectAction.Filters.dynamicallyVisible(getAuthenticationSession(), adapter, Where.ANYWHERE);
     }
 
-    @Override
-    public void onClick(final ActionModel actionModel) {
-        setResponsePage(new ActionPromptPage(actionModel));
-    }
-
     
     // ///////////////////////////////////////////////////////////////////
     // Convenience

http://git-wip-us.apache.org/repos/asf/isis/blob/1f714c08/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
index 62ed565..0e9670e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
@@ -25,24 +25,14 @@ import org.apache.wicket.markup.html.form.FormComponentPanel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
 
-/**
- * {@link FormComponentPanel} representing a reference to an entity: a link and
- * (optionally) an autocomplete field.
- */
-class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired, ActionInvokeHandler  {
+class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired  {
 
     private static final long serialVersionUID = 1L;
 
-    /**
-     * This component may be null if there are no choices or autoComplete, or if in read-only mode.
-     */
     Select2Choice<ObjectAdapterMemento> select2Field;
-
     ReferencePanel owningPanel;
 
     public EntityLinkSelect2Panel(final String id, final ReferencePanel owningPanel) {
@@ -50,7 +40,7 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
         this.owningPanel = owningPanel;
         
         setType(ObjectAdapter.class);
-        syncWithInput();
+        owningPanel.syncWithInput(this);
     }
 
     /**
@@ -73,29 +63,20 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
      */
     @Override
     public String getInput() {
-        final ObjectAdapter pendingElseCurrentAdapter = owningPanel.getModel().getPendingElseCurrentAdapter();
-        return pendingElseCurrentAdapter != null? pendingElseCurrentAdapter.titleString(null): "(no object)";
+        return owningPanel.getInput();
     }
 
     @Override
     protected void convertInput() {
-        this.owningPanel.convertInput(this);
+        owningPanel.convertInput(this);
     }
 
     @Override
     protected void onBeforeRender() {
-        syncWithInput();
+        owningPanel.syncWithInput(this);
         super.onBeforeRender();
     }
 
-    private void syncWithInput() {
-        this.owningPanel.syncWithInput(this);
-    }
-
-    @Override
-    public void onClick(final ActionModel actionModel) {
-    }
-
     @Override
     public void onCancel() {
         owningPanel.getModel().clearPending();

http://git-wip-us.apache.org/repos/asf/isis/blob/1f714c08/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index df28aea..09d8e8a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -358,7 +358,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
         entityModelForLink.setContextAdapterIfAny(getModel().getContextAdapterIfAny());
         entityModelForLink.setRenderingHint(getModel().getRenderingHint());
         
-        final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
+        final ComponentFactory componentFactory = 
+                getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
         final Component component = componentFactory.createComponent(entityModelForLink);
         
         linkPanel.addOrReplace(component);
@@ -465,5 +466,10 @@ public class ReferencePanel extends ScalarPanelAbstract {
         // permanentlyHide(ID_ENTITY_TITLE_NULL);
     }
 
+    String getInput() {
+        final ObjectAdapter pendingElseCurrentAdapter = getModel().getPendingElseCurrentAdapter();
+        return pendingElseCurrentAdapter != null? pendingElseCurrentAdapter.titleString(null): "(no object)";
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1f714c08/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
index 439e5f6..1b3d21f 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
@@ -19,44 +19,14 @@
 
 package org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-import com.vaynberg.wicket.select2.ChoiceProvider;
-import com.vaynberg.wicket.select2.Select2Choice;
-import com.vaynberg.wicket.select2.Settings;
-
 import org.apache.wicket.Component;
-import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 
 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.object.autocomplete.AutoCompleteFacet;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.runtime.system.DeploymentType;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
-import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
-import org.apache.isis.viewer.wicket.model.models.ModelAbstract;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.util.MementoFunctions;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
-import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
 
@@ -64,7 +34,7 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormCom
  * {@link FormComponentPanel} representing a reference to an entity: a link and
  * (optionally) an autocomplete field.
  */
-public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired, ActionInvokeHandler  {
+public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdapter> implements CancelHintRequired  {
 
     private static final long serialVersionUID = 1L;
 
@@ -112,10 +82,6 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
     }
 
     @Override
-    public void onClick(final ActionModel actionModel) {
-    }
-
-    @Override
     public void onCancel() {
     }