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() {
}