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:54 UTC

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

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;
+        }
+    }
 
 }