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