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/11 14:22:28 UTC

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

ISIS-778: 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/dfdd1290
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/dfdd1290
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/dfdd1290

Branch: refs/heads/master
Commit: dfdd1290a69814a9dcf44659167949f2dd915745
Parents: adf3339
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun May 11 13:11:17 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun May 11 13:11:17 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/dfdd1290/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/dfdd1290/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/dfdd1290/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) {