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 2017/01/20 14:39:47 UTC
[3/5] isis git commit: ISIS-785: tidies up code,
removes differences in method names,
factors out the ChoiceProviders out of ReferencePanel and
ValueChoicesSelect2Panel.
ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/d9876504
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/d9876504
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/d9876504
Branch: refs/heads/maint-1.13.3
Commit: d987650409fd33094ca6154a4e2cc86417bba556
Parents: bbb9d33
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 11:38:00 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 11:38:00 2017 +0000
----------------------------------------------------------------------
.../ComponentFactoryRegistrarDefault.java | 2 +-
.../scalars/ComponentFactoryScalarAbstract.java | 6 +-
.../scalars/reference/ReferencePanel.java | 94 ++----
.../components/scalars/reference/Select2.java | 181 -----------
.../scalars/value/ValuePanelFactory.java | 5 +-
.../valuechoices/ValueChoicesSelect2Panel.html | 49 +++
.../valuechoices/ValueChoicesSelect2Panel.java | 292 +++++++++++++++++
.../ValueChoicesSelect2PanelFactory.java | 65 ++++
.../ObjectAdapterMementoProviderAbstract.java | 164 ----------
.../widgets/select2/EmptyChoiceProvider.java | 44 ---
.../ui/components/widgets/select2/Select2.java | 178 +++++++++++
.../widgets/select2/Select2ChoiceExt.java | 1 +
.../widgets/select2/Select2MultiChoiceExt.java | 1 +
.../select2/providers/EmptyChoiceProvider.java | 44 +++
.../ObjectAdapterMementoProviderAbstract.java | 157 ++++++++++
...apterMementoProviderForReferenceChoices.java | 54 ++++
...oProviderForReferenceObjectAutoComplete.java | 60 ++++
...ForReferenceParamOrPropertyAutoComplete.java | 56 ++++
...ctAdapterMementoProviderForValueChoices.java | 52 +++
.../valuechoices/ValueChoicesSelect2Panel.html | 49 ---
.../valuechoices/ValueChoicesSelect2Panel.java | 313 -------------------
.../ValueChoicesSelect2PanelFactory.java | 58 ----
.../FixedObjectAdapterMementoProviderTest.java | 84 -----
...apterMementoProviderForValueChoicesTest.java | 88 ++++++
24 files changed, 1128 insertions(+), 969 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 469d275..38b63b3 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -64,7 +64,7 @@ import org.apache.isis.viewer.wicket.ui.components.value.StandaloneValuePanelFac
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.entitysimplelink.EntityLinkSimplePanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.widgets.valuechoices.ValueChoicesSelect2PanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2PanelFactory;
import java.util.ServiceLoader;
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
index ed0d8a4..1b7fea4 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
@@ -48,8 +48,10 @@ public abstract class ComponentFactoryScalarAbstract extends ComponentFactoryAbs
if(!scalarModel.isScalarTypeAnyOf(scalarTypes)) {
return ApplicationAdvice.DOES_NOT_APPLY;
}
- final boolean hasNoChoices = !scalarModel.hasChoices();
- return appliesIf(hasNoChoices);
+ final boolean hasChoices = scalarModel.hasChoices();
+ // autoComplete not supported on values, only references
+ // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+ return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
}
@Override
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index abcc7ef..4331225 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -41,7 +41,6 @@ import org.wicketstuff.select2.Settings;
import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -56,9 +55,12 @@ import org.apache.isis.viewer.wicket.ui.ComponentFactory;
import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
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.bootstrap.FormGroup;
import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceChoices;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceObjectAutoComplete;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
import org.apache.isis.viewer.wicket.ui.util.Components;
import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
@@ -349,22 +351,27 @@ public class ReferencePanel extends ScalarPanelAbstract {
private void setProviderAndCurrAndPending(
final Select2 select2,
final ObjectAdapter[] argsIfAvailable) {
+
+ ChoiceProvider<ObjectAdapterMemento> providerForChoices;
if (getModel().hasChoices()) {
-
- final List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
- ObjectAdapterMementoProviderAbstract providerForChoices = providerForChoices(choiceMementos);
+ List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
+ providerForChoices =
+ new ObjectAdapterMementoProviderForReferenceChoices(getModel(), wicketViewerSettings, choiceMementos);
- select2.setProvider(providerForChoices);
- getModel().clearPending();
-
- resetIfCurrentNotInChoices(select2, choiceMementos);
-
} else if(getModel().hasAutoComplete()) {
- select2.setProvider(providerForParamOrPropertyAutoComplete());
- getModel().clearPending();
+ providerForChoices =
+ new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(getModel(), wicketViewerSettings);
} else {
- select2.setProvider(providerForObjectAutoComplete());
- getModel().clearPending();
+ providerForChoices =
+ new ObjectAdapterMementoProviderForReferenceObjectAutoComplete(getModel(), wicketViewerSettings);
+ }
+
+ select2.setProvider(providerForChoices);
+ getModel().clearPending();
+
+ if(providerForChoices instanceof ObjectAdapterMementoProviderForReferenceChoices) {
+ final ObjectAdapterMementoProviderForReferenceChoices provider = (ObjectAdapterMementoProviderForReferenceChoices) providerForChoices;
+ resetIfCurrentNotInChoices(select2, provider.getChoiceMementos());
}
}
@@ -374,7 +381,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
if(getModel().hasChoices()) {
choices.addAll(getModel().getChoices(argsIfAvailable, getAuthenticationSession(), getDeploymentCategory()));
}
- // take a copy otherwise is only lazily evaluated
+ // take a copy (otherwise is only lazily evaluated)
return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
}
@@ -415,60 +422,6 @@ public class ReferencePanel extends ScalarPanelAbstract {
return autoSelect;
}
- // called by setProviderAndCurrAndPending
- private ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
- return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-
- 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> autoCompleteAdapters =
- autoCompleteFacet.execute(term,
- InteractionInitiatedBy.USER);
- // take a copy otherwise so is eagerly evaluated and memento objects correctly built
- return Lists.newArrayList(
- Lists.transform(autoCompleteAdapters, ObjectAdapterMemento.Functions.fromAdapter()));
- }
- };
- }
-
- // called by setProviderAndCurrAndPending
- private ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
- return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- protected List<ObjectAdapterMemento> obtainMementos(String term) {
- final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
- if(getScalarModel().hasAutoComplete()) {
- final List<ObjectAdapter> autoCompleteAdapters =
- getScalarModel().getAutoComplete(term, getAuthenticationSession(), getDeploymentCategory());
- autoCompleteChoices.addAll(autoCompleteAdapters);
- }
- // take a copy otherwise so is eagerly evaluated and memento objects correctly built
- return Lists.newArrayList(
- Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
- }
-
- };
- }
-
- // called by setProviderAndCurrAndPending
- private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
- return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
- private static final long serialVersionUID = 1L;
- @Override
- protected List<ObjectAdapterMemento> obtainMementos(String term) {
- return obtainMementos(term, choiceMementos);
- }
- };
- }
-
-
// //////////////////////////////////////
// getInput, convertInput
// //////////////////////////////////////
@@ -555,7 +508,4 @@ public class ReferencePanel extends ScalarPanelAbstract {
return getIsisSessionFactory().getConfiguration();
}
-
-
-
}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
deleted file mode 100644
index 7d47b74..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
+++ /dev/null
@@ -1,181 +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.scalars.reference;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.form.HiddenField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Select2Choice;
-import org.wicketstuff.select2.Select2MultiChoice;
-import org.wicketstuff.select2.Settings;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2MultiChoiceExt;
-
-/**
- * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
- */
-public class Select2 implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- final Select2ChoiceExt select2Choice;
- final Select2MultiChoiceExt select2MultiChoice;
-
- public static Select2 newSelect2Choice(
- final String id,
- final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
- return new Select2(
- Select2ChoiceExt.create(id, singleModel, parentModel),
- null
- );
- }
-
- public static Select2 newSelect2MultiChoice(
- final String id,
- final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
- final ScalarModel parentModel) {
- return new Select2(
- null,
- Select2MultiChoiceExt.create(id, multiModel, parentModel)
- );
- }
-
- private Select2(
- final Select2ChoiceExt select2Choice,
- final Select2MultiChoiceExt select2MultiChoice) {
- this.select2Choice = select2Choice;
- this.select2MultiChoice = select2MultiChoice;
- }
-
- public HiddenField<?> component() {
- return select2Choice != null
- ? select2Choice
- : select2MultiChoice;
- }
-
- public ChoiceExt choiceExt() {
- return select2Choice != null
- ? select2Choice
- : select2MultiChoice;
- }
-
- public void clearInput() {
- component().clearInput();
- }
-
- public void setEnabled(final boolean mutability) {
- component().setEnabled(mutability);
- }
-
- public void setRequired(final boolean required) {
- component().setRequired(required);
- }
- public boolean checkRequired() {
- return component().checkRequired();
- }
-
- public Settings getSettings() {
- return choiceExt().getSettings();
- }
-
- public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
- choiceExt().setProvider(providerForChoices);
- }
-
- public ObjectAdapterMemento getModelObject() {
- if (select2Choice != null) {
- return select2Choice.getModelObject();
- } else {
- final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
-
- return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
- }
- }
-
- public IModel<ObjectAdapterMemento> getModel() {
- if (select2Choice != null) {
- return select2Choice.getModel();
- } else {
- final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
- final Collection<ObjectAdapterMemento> modelObject = model.getObject();
-
- final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
- return new IModel<ObjectAdapterMemento>() {
- @Override
- public ObjectAdapterMemento getObject() {
- return memento;
- }
-
- @Override
- public void setObject(final ObjectAdapterMemento memento) {
-
- if(memento == null) {
- model.setObject(null);
- return;
- }
-
- final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
- model.setObject(mementos);
- }
-
- @Override
- public void detach() {
- }
- };
- }
- }
-
- public ObjectAdapterMemento getConvertedInput() {
- if (select2Choice != null) {
- return select2Choice.getConvertedInput();
- } else {
- final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
- return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
- }
- }
-
- public void setLabel(final Model<String> model) {
- component().setLabel(model);
- }
-
- public void add(final Behavior behavior) {
- component().add(behavior);
- }
-
- public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
- return component().getBehaviors(behaviorClass);
- }
-
- public void remove(final Behavior behavior) {
- component().remove(behavior);
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
index 85ba70f..c1a3732 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
@@ -48,7 +48,10 @@ public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
if(valueFacet == null) {
return ApplicationAdvice.DOES_NOT_APPLY;
}
- return appliesIf(!scalarModel.hasChoices());
+ final boolean hasChoices = scalarModel.hasChoices();
+ // autoComplete not supported on values, only references
+ // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+ return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
}
@Override
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
new file mode 100644
index 0000000..0874436
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
@@ -0,0 +1,49 @@
+<?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="valueChoicesSelect2Panel scalarNameAndValueComponentType">
+ <div class="form-group" wicket:id="scalarIfRegular">
+ <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
+ <span class="scalarValueWrapper">
+ <div class="scalarPlaceholder">
+ <span class="scalarValueInput">
+ <span class="editing">
+ <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
+ <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+ </span>
+ </span>
+ <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+ </div>
+ <span wicket:id="feedback" class="help-block"></span>
+ <span wicket:id="associatedActionLinksBelow"></span>
+ </span>
+ <div class="clearfix"/>
+ </div>
+ <span wicket:id="scalarIfCompact"></span>
+ </div>
+ </wicket:panel>
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
new file mode 100644
index 0000000..fcbca2f
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -0,0 +1,292 @@
+/**
+ * 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.valuechoices;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
+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.model.IModel;
+import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithMultiPending;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
+import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
+
+ private static final long serialVersionUID = 1L;
+
+ private Select2 select2;
+ private ObjectAdapterMemento pending;
+
+ public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
+ super(id, scalarModel);
+ pending = scalarModel.getObjectAdapterMemento();
+ }
+
+ @Override
+ protected MarkupContainer addComponentForRegular() {
+
+
+ // same pattern as in ReferencePanel
+ if(select2 == null) {
+ if(getModel().isCollection()) {
+ final IModel<ArrayList<ObjectAdapterMemento>> modelObject = ScalarModelWithMultiPending.Util.createModel(this);
+ select2 = Select2.newSelect2MultiChoice(ID_SCALAR_VALUE, modelObject, scalarModel);
+ } else {
+ final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
+ select2 = Select2.newSelect2Choice(ID_SCALAR_VALUE, modelObject, scalarModel);
+ }
+
+ final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
+ setProviderAndCurrAndPending(select2, actionArgsHint);
+ addStandardSemantics();
+ } else {
+ select2.clearInput();
+ }
+
+
+ final MarkupContainer labelIfRegular = createFormComponentLabel();
+ if(getModel().isRequired()) {
+ labelIfRegular.add(new CssClassAppender("mandatory"));
+ }
+
+ addOrReplace(labelIfRegular);
+
+ final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
+ if(getModel().isRequired()) {
+ final String label = scalarName.getDefaultModelObjectAsString();
+ if(!Strings.isNullOrEmpty(label)) {
+ scalarName.add(new CssClassAppender("mandatory"));
+ }
+ }
+ labelIfRegular.addOrReplace(scalarName);
+ NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
+ if (namedFacet != null) {
+ scalarName.setEscapeModelStrings(namedFacet.escaped());
+ }
+
+ // find the links...
+ final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+
+ addPositioningCssTo(labelIfRegular, entityActions);
+
+ addFeedbackOnlyTo(labelIfRegular, select2.component());
+ addEditPropertyTo(labelIfRegular);
+
+ // ... add entity links to panel (below and to right)
+ addEntityActionLinksBelowAndRight(labelIfRegular, entityActions);
+
+ return labelIfRegular;
+ }
+
+ private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
+ final List<ObjectAdapter> choices =
+ scalarModel.getChoices(argumentsIfAvailable, getAuthenticationSession(), getDeploymentCategory());
+
+ // take a copy otherwise is only lazily evaluated
+ return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
+ }
+
+ protected void addStandardSemantics() {
+ setRequiredIfSpecified();
+ }
+
+ private void setRequiredIfSpecified() {
+ final ScalarModel scalarModel = getModel();
+ final boolean required = scalarModel.isRequired();
+ select2.setRequired(required);
+ }
+
+ protected MarkupContainer createFormComponentLabel() {
+ final String name = getModel().getName();
+ select2.setLabel(Model.of(name));
+
+ final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
+
+ final String describedAs = getModel().getDescribedAs();
+ if(describedAs != null) {
+ labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
+ }
+
+ labelIfRegular.add(select2.component());
+
+ return labelIfRegular;
+ }
+
+ @Override
+ protected Component addComponentForCompact() {
+ final Label labelIfCompact = new Label(ID_SCALAR_IF_COMPACT, getModel().getObjectAsString());
+ addOrReplace(labelIfCompact);
+ return labelIfCompact;
+ }
+
+
+ protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
+ return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos, wicketViewerSettings);
+ }
+
+ @Override
+ protected boolean alwaysRebuildGui() {
+ return true;
+ }
+
+ @Override
+ protected void onBeforeRenderWhenViewMode() {
+ // View: Read only
+ select2.setEnabled(false);
+ }
+
+ @Override
+ protected void onBeforeRenderWhenEnabled() {
+ // Edit: read/write
+ select2.setEnabled(true);
+
+ // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
+ }
+
+ @Override
+ protected void onBeforeRenderWhenDisabled(final String disableReason) {
+ super.onBeforeRenderWhenDisabled(disableReason);
+ setTitleAttribute(disableReason);
+ select2.setEnabled(false);
+ }
+
+ private void setTitleAttribute(final String titleAttribute) {
+ getComponentForRegular().add(new AttributeModifier("title", Model.of(titleAttribute)));
+ }
+
+
+ @Override
+ protected void addFormComponentBehavior(Behavior behavior) {
+ for (Behavior b : select2.getBehaviors(ScalarUpdatingBehavior.class)) {
+ select2.remove(b);
+ }
+ select2.add(behavior);
+ }
+
+ // //////////////////////////////////////
+
+ @Override
+ public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
+ if(select2 != null) {
+ setProviderAndCurrAndPending(select2, argsIfAvailable);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * sets up the choices, also ensuring that any currently held value is compatible.
+ */
+ private void setProviderAndCurrAndPending(final Select2 select2, ObjectAdapter[] argsIfAvailable) {
+
+ final ChoiceProvider<ObjectAdapterMemento> provider;
+
+ // in corresponding code in ReferencePanelFactory, these is a branch for different types of providers
+ // (choice vs autoComplete). Here though - because values don't currently support autoComplete - no branch is required
+ final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
+ provider = newChoiceProvider(choicesMementos);
+
+ select2.setProvider(provider);
+ getModel().clearPending();
+
+ if(provider instanceof ObjectAdapterMementoProviderForValueChoices) {
+ final ObjectAdapterMementoProviderForValueChoices providerFixed = (ObjectAdapterMementoProviderForValueChoices) provider;
+ final List<ObjectAdapterMemento> choicesMementos1 = providerFixed.getChoicesMementos();
+ resetIfCurrentNotInChoices(select2, choicesMementos1);
+ }
+ }
+
+ private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos) {
+ final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
+ if(objectAdapterMemento == null) {
+ select2.getModel().setObject(null);
+ } else {
+
+ if(!getModel().isCollection()) {
+
+ // if currently held value is not compatible with choices, then replace with the first choice
+ if(!choicesMementos.contains(objectAdapterMemento)) {
+
+ final ObjectAdapterMemento newAdapterMemento =
+ choicesMementos.isEmpty()
+ ? null
+ : choicesMementos.get(0);
+
+ select2.getModel().setObject(newAdapterMemento);
+ getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
+ }
+
+ } else {
+
+ // nothing to do
+ }
+ }
+ }
+
+ // //////////////////////////////////////
+
+ @Override
+ public ObjectAdapterMemento getPending() {
+ return pending;
+ }
+
+ public void setPending(ObjectAdapterMemento pending) {
+ this.pending = pending;
+ }
+
+ @Override
+ public ArrayList<ObjectAdapterMemento> getMultiPending() {
+ return pending != null ? pending.getList() : null;
+ }
+
+ @Override
+ public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
+ this.pending = ObjectAdapterMemento.createForList(pending, scalarModel.getTypeOfSpecification().getSpecId());
+ }
+
+ public ScalarModel getScalarModel() {
+ return scalarModel;
+ }
+
+ // //////////////////////////////////////
+
+ @com.google.inject.Inject
+ private WicketViewerSettings wicketViewerSettings;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
new file mode 100644
index 0000000..78fe659
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
@@ -0,0 +1,65 @@
+/*
+ * 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.valuechoices;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+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;
+import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanel;
+
+public class ValueChoicesSelect2PanelFactory extends ComponentFactoryAbstract {
+
+ private static final long serialVersionUID = 1L;
+
+ public ValueChoicesSelect2PanelFactory() {
+ super(ComponentType.SCALAR_NAME_AND_VALUE, ValueChoicesSelect2Panel.class);
+ }
+
+ @Override
+ public ApplicationAdvice appliesTo(final IModel<?> model) {
+ if (!(model instanceof ScalarModel)) {
+ return ApplicationAdvice.DOES_NOT_APPLY;
+ }
+ final ScalarModel scalarModel = (ScalarModel) model;
+ final boolean hasChoices = scalarModel.hasChoices();
+
+ // autoComplete not supported on values, only references
+ // this is because there is no easy way in the ChoiceProvider to convert the list of Ids (strings)
+ // into corresponding ObjectAdapterMemento's.
+ // see subclasses of ObjectAdapterMementoProviderAbstract
+
+ // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+ return appliesIf(hasChoices /* || hasAutoComplete */);
+ }
+
+ @Override
+ public final Component createComponent(final String id, final IModel<?> model) {
+ final ScalarModel scalarModel = (ScalarModel) model;
+ if(scalarModel.isViewMode()) {
+ return new StringPanel(id, scalarModel);
+ } else {
+ return new ValueChoicesSelect2Panel(id, scalarModel);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
deleted file mode 100644
index cdc2250..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
+++ /dev/null
@@ -1,164 +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;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-
-import org.apache.wicket.Session;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.string.Strings;
-import org.wicketstuff.select2.TextChoiceProvider;
-
-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.oid.RootOid;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
-
-public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
-
- private static final long serialVersionUID = 1L;
-
- protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
- private static final String NULL_DISPLAY_TEXT = "";
-
- private final ScalarModel scalarModel;
- private final WicketViewerSettings wicketViewerSettings;
-
- public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
- this.scalarModel = scalarModel;
- this.wicketViewerSettings = wicketViewerSettings;
- }
-
- @Override
- protected String getDisplayText(final ObjectAdapterMemento choice) {
- if (choice == null) {
- return NULL_DISPLAY_TEXT;
- }
-
- final ObjectAdapter objectAdapter =
- choice.getObjectAdapter(
- ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
- final IConverter<Object> converter = findConverter(objectAdapter);
- return converter != null
- ? converter.convertToString(objectAdapter.getObject(), getLocale())
- : objectAdapter.titleString(null);
- }
-
- protected Locale getLocale() {
- return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
- }
-
- protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
- return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
- }
-
- @Override
- protected Object getId(final ObjectAdapterMemento choice) {
- return choice != null? choice.asString(): NULL_PLACEHOLDER;
- }
-
- @Override
- public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
-
- final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
- // if not mandatory, and the list doesn't contain null already, then add it in.
- if(!scalarModel.isRequired() && !mementos.contains(null)) {
- mementos.add(0, null);
- }
- response.addAll(mementos);
- }
-
- protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
-
- /**
- * Filters all choices against a term by using their
- * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
- *
- * @param term The term entered by the user
- * @param choicesMementos The collections of choices to filter
- * @return A list of all matching choices
- */
- protected List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
- List<ObjectAdapterMemento> matches = Lists.newArrayList();
- if (Strings.isEmpty(term)) {
- matches.addAll(choicesMementos);
- } else {
- for (ObjectAdapterMemento candidate : choicesMementos) {
- ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
- getPersistenceSession(), getSpecificationLoader());
- String title = objectAdapter.titleString(objectAdapter);
- if (title.toLowerCase().contains(term.toLowerCase())) {
- matches.add(candidate);
- }
- }
- }
-
- return matches;
- }
-
- @Override
- public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
- final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
-
- @Override
- public ObjectAdapterMemento apply(final String input) {
- if(NULL_PLACEHOLDER.equals(input)) {
- return null;
- }
- final RootOid oid = RootOid.deString(input);
- return ObjectAdapterMemento.createPersistent(oid);
- }
- };
- return Collections2.transform(ids, function);
- }
-
- protected ScalarModel getScalarModel() {
- return scalarModel;
- }
-
-
- ///////////////////////////////////////////////////////
- // Dependencies (from context)
- ///////////////////////////////////////////////////////
-
-
- protected SpecificationLoader getSpecificationLoader() {
- return getIsisSessionFactory().getSpecificationLoader();
- }
-
- PersistenceSession getPersistenceSession() {
- return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
- }
-
- private IsisSessionFactory getIsisSessionFactory() {
- return IsisContext.getSessionFactory();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
deleted file mode 100644
index 0cb647b..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
+++ /dev/null
@@ -1,44 +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.select2;
-
-import java.util.Collection;
-
-import org.apache.wicket.ajax.json.JSONException;
-import org.apache.wicket.ajax.json.JSONWriter;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Response;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
-
- static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
-
- @Override
- public void query(String term, int page, Response<ObjectAdapterMemento> response) {
- }
-
- @Override
- public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
- }
-
- @Override
- public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
new file mode 100644
index 0000000..041af1e
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -0,0 +1,178 @@
+/*
+ * 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.select2;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Select2Choice;
+import org.wicketstuff.select2.Select2MultiChoice;
+import org.wicketstuff.select2.Settings;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+/**
+ * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
+ */
+public class Select2 implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ final Select2ChoiceExt select2Choice;
+ final Select2MultiChoiceExt select2MultiChoice;
+
+ public static Select2 newSelect2Choice(
+ final String id,
+ final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
+ return new Select2(
+ Select2ChoiceExt.create(id, singleModel, parentModel),
+ null
+ );
+ }
+
+ public static Select2 newSelect2MultiChoice(
+ final String id,
+ final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
+ final ScalarModel parentModel) {
+ return new Select2(
+ null,
+ Select2MultiChoiceExt.create(id, multiModel, parentModel)
+ );
+ }
+
+ private Select2(
+ final Select2ChoiceExt select2Choice,
+ final Select2MultiChoiceExt select2MultiChoice) {
+ this.select2Choice = select2Choice;
+ this.select2MultiChoice = select2MultiChoice;
+ }
+
+ public HiddenField<?> component() {
+ return select2Choice != null
+ ? select2Choice
+ : select2MultiChoice;
+ }
+
+ public ChoiceExt choiceExt() {
+ return select2Choice != null
+ ? select2Choice
+ : select2MultiChoice;
+ }
+
+ public void clearInput() {
+ component().clearInput();
+ }
+
+ public void setEnabled(final boolean mutability) {
+ component().setEnabled(mutability);
+ }
+
+ public void setRequired(final boolean required) {
+ component().setRequired(required);
+ }
+ public boolean checkRequired() {
+ return component().checkRequired();
+ }
+
+ public Settings getSettings() {
+ return choiceExt().getSettings();
+ }
+
+ public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
+ choiceExt().setProvider(providerForChoices);
+ }
+
+ public ObjectAdapterMemento getModelObject() {
+ if (select2Choice != null) {
+ return select2Choice.getModelObject();
+ } else {
+ final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
+
+ return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+ }
+ }
+
+ public IModel<ObjectAdapterMemento> getModel() {
+ if (select2Choice != null) {
+ return select2Choice.getModel();
+ } else {
+ final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
+ final Collection<ObjectAdapterMemento> modelObject = model.getObject();
+
+ final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+ return new IModel<ObjectAdapterMemento>() {
+ @Override
+ public ObjectAdapterMemento getObject() {
+ return memento;
+ }
+
+ @Override
+ public void setObject(final ObjectAdapterMemento memento) {
+
+ if(memento == null) {
+ model.setObject(null);
+ return;
+ }
+
+ final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
+ model.setObject(mementos);
+ }
+
+ @Override
+ public void detach() {
+ }
+ };
+ }
+ }
+
+ public ObjectAdapterMemento getConvertedInput() {
+ if (select2Choice != null) {
+ return select2Choice.getConvertedInput();
+ } else {
+ final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
+ return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
+ }
+ }
+
+ public void setLabel(final Model<String> model) {
+ component().setLabel(model);
+ }
+
+ public void add(final Behavior behavior) {
+ component().add(behavior);
+ }
+
+ public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
+ return component().getBehaviors(behaviorClass);
+ }
+
+ public void remove(final Behavior behavior) {
+ component().remove(behavior);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
index 3e0f25b..e01c7b1 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
@@ -22,6 +22,7 @@ import org.wicketstuff.select2.Select2Choice;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.EmptyChoiceProvider;
public class Select2ChoiceExt extends Select2Choice<ObjectAdapterMemento> implements ChoiceExt {
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
index 7796061..5f11e58 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
@@ -25,6 +25,7 @@ import org.wicketstuff.select2.Select2MultiChoice;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.EmptyChoiceProvider;
public class Select2MultiChoiceExt
extends Select2MultiChoice<ObjectAdapterMemento>
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
new file mode 100644
index 0000000..dbc0e85
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
@@ -0,0 +1,44 @@
+/**
+ * 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.select2.providers;
+
+import java.util.Collection;
+
+import org.apache.wicket.ajax.json.JSONException;
+import org.apache.wicket.ajax.json.JSONWriter;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Response;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+public class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
+
+ public static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
+
+ @Override
+ public void query(String term, int page, Response<ObjectAdapterMemento> response) {
+ }
+
+ @Override
+ public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
+ }
+
+ @Override
+ public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
new file mode 100644
index 0000000..0143749
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -0,0 +1,157 @@
+/**
+ * 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.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.Session;
+import org.apache.wicket.util.convert.IConverter;
+import org.apache.wicket.util.string.Strings;
+import org.wicketstuff.select2.TextChoiceProvider;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
+
+public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
+
+ private static final long serialVersionUID = 1L;
+
+ protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
+ private static final String NULL_DISPLAY_TEXT = "";
+
+ private final ScalarModel scalarModel;
+ private final WicketViewerSettings wicketViewerSettings;
+
+ public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
+ this.scalarModel = scalarModel;
+ this.wicketViewerSettings = wicketViewerSettings;
+ }
+
+ @Override
+ protected String getDisplayText(final ObjectAdapterMemento choice) {
+ if (choice == null) {
+ return NULL_DISPLAY_TEXT;
+ }
+
+ final ObjectAdapter objectAdapter =
+ choice.getObjectAdapter(
+ ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
+ final IConverter<Object> converter = findConverter(objectAdapter);
+ return converter != null
+ ? converter.convertToString(objectAdapter.getObject(), getLocale())
+ : objectAdapter.titleString(null);
+ }
+
+ protected Locale getLocale() {
+ return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
+ }
+
+ protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
+ return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
+ }
+
+ @Override
+ protected Object getId(final ObjectAdapterMemento choice) {
+ return choice != null? choice.asString(): NULL_PLACEHOLDER;
+ }
+
+ @Override
+ public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
+
+ final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
+ // if not mandatory, and the list doesn't contain null already, then add it in.
+ if(!scalarModel.isRequired() && !mementos.contains(null)) {
+ mementos.add(0, null);
+ }
+ response.addAll(mementos);
+ }
+
+ protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
+
+ /**
+ * Filters all choices against a term by using their
+ * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
+ *
+ * @param term The term entered by the user
+ * @param choicesMementos The collections of choices to filter
+ * @return A list of all matching choices
+ */
+ protected final List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
+ List<ObjectAdapterMemento> matches = Lists.newArrayList();
+ if (Strings.isEmpty(term)) {
+ matches.addAll(choicesMementos);
+ } else {
+ for (ObjectAdapterMemento candidate : choicesMementos) {
+ ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
+ getPersistenceSession(), getSpecificationLoader());
+ String title = objectAdapter.titleString(objectAdapter);
+ if (title.toLowerCase().contains(term.toLowerCase())) {
+ matches.add(candidate);
+ }
+ }
+ }
+
+ return matches;
+ }
+
+
+ protected ScalarModel getScalarModel() {
+ return scalarModel;
+ }
+
+
+ ///////////////////////////////////////////////////////
+ // Dependencies (from context)
+ ///////////////////////////////////////////////////////
+
+
+ protected SpecificationLoader getSpecificationLoader() {
+ return getIsisSessionFactory().getSpecificationLoader();
+ }
+
+ PersistenceSession getPersistenceSession() {
+ return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
+ }
+
+ protected IsisSessionFactory getIsisSessionFactory() {
+ return IsisContext.getSessionFactory();
+ }
+
+ public AuthenticationSession getAuthenticationSession() {
+ return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+ }
+
+ public DeploymentCategory getDeploymentCategory() {
+ return getIsisSessionFactory().getDeploymentCategory();
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
new file mode 100644
index 0000000..de3f7f4
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
@@ -0,0 +1,54 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceChoices
+ extends ObjectAdapterMementoProviderAbstract {
+
+ private static final long serialVersionUID = 1L;
+ private final List<ObjectAdapterMemento> choiceMementos;
+
+ public ObjectAdapterMementoProviderForReferenceChoices(
+ final ScalarModel model,
+ final WicketViewerSettings wicketViewerSettings,
+ final List<ObjectAdapterMemento> choiceMementos) {
+ super(model, wicketViewerSettings);
+ this.choiceMementos = choiceMementos;
+ }
+
+ @Override
+ protected List<ObjectAdapterMemento> obtainMementos(String term) {
+ return obtainMementos(term, choiceMementos);
+ }
+
+ public List<ObjectAdapterMemento> getChoiceMementos() {
+ return choiceMementos;
+ }
+
+ @Override
+ public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+ final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+ @Override
+ public ObjectAdapterMemento apply(final String input) {
+ if(NULL_PLACEHOLDER.equals(input)) {
+ return null;
+ }
+ final RootOid oid = RootOid.deString(input);
+ return ObjectAdapterMemento.createPersistent(oid);
+ }
+ };
+ return Collections2.transform(ids, function);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
new file mode 100644
index 0000000..d55fd58
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
@@ -0,0 +1,60 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+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.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceObjectAutoComplete
+ extends ObjectAdapterMementoProviderAbstract {
+
+ private static final long serialVersionUID = 1L;
+
+ public ObjectAdapterMementoProviderForReferenceObjectAutoComplete(
+ final ScalarModel model,
+ final WicketViewerSettings wicketViewerSettings) {
+ super(model, wicketViewerSettings);
+ }
+
+ @Override
+ protected List<ObjectAdapterMemento> obtainMementos(String term) {
+ final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
+ final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+ final List<ObjectAdapter> autoCompleteAdapters =
+ autoCompleteFacet.execute(term,
+ InteractionInitiatedBy.USER);
+ // take a copy otherwise so is eagerly evaluated and memento objects correctly built
+ return Lists.newArrayList(
+ Lists.transform(autoCompleteAdapters, ObjectAdapterMemento.Functions.fromAdapter()));
+ }
+
+ @Override
+ public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+ final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+ @Override
+ public ObjectAdapterMemento apply(final String input) {
+ if(NULL_PLACEHOLDER.equals(input)) {
+ return null;
+ }
+ final RootOid oid = RootOid.deString(input);
+ final ObjectAdapterMemento oam = ObjectAdapterMemento.createPersistent(oid);
+ return oam;
+ }
+ };
+
+ return Collections2.transform(ids, function);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
new file mode 100644
index 0000000..6ce9783
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
@@ -0,0 +1,56 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete
+ extends ObjectAdapterMementoProviderAbstract {
+
+ private static final long serialVersionUID = 1L;
+
+ public ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(
+ final ScalarModel model, final WicketViewerSettings wicketViewerSettings) {
+ super(model, wicketViewerSettings);
+ }
+
+ @Override
+ protected List<ObjectAdapterMemento> obtainMementos(String term) {
+ final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
+ if (getScalarModel().hasAutoComplete()) {
+ final List<ObjectAdapter> autoCompleteAdapters =
+ getScalarModel().getAutoComplete(term, getAuthenticationSession(), getDeploymentCategory());
+ autoCompleteChoices.addAll(autoCompleteAdapters);
+ }
+ // take a copy otherwise so is eagerly evaluated and memento objects correctly built
+ return Lists.newArrayList(
+ Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
+ }
+
+ @Override
+ public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+ final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+ @Override
+ public ObjectAdapterMemento apply(final String input) {
+ if(NULL_PLACEHOLDER.equals(input)) {
+ return null;
+ }
+ final RootOid oid = RootOid.deString(input);
+ return ObjectAdapterMemento.createPersistent(oid);
+ }
+ };
+ return Collections2.transform(ids, function);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
new file mode 100644
index 0000000..cf52db6
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
@@ -0,0 +1,52 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForValueChoices
+ extends ObjectAdapterMementoProviderAbstract {
+
+ private static final long serialVersionUID = 1L;
+ private final List<ObjectAdapterMemento> choicesMementos;
+
+ public ObjectAdapterMementoProviderForValueChoices(
+ final ScalarModel scalarModel,
+ final List<ObjectAdapterMemento> choicesMementos,
+ final WicketViewerSettings wicketViewerSettings) {
+ super(scalarModel, wicketViewerSettings);
+ this.choicesMementos = choicesMementos;
+ }
+
+ @Override
+ protected List<ObjectAdapterMemento> obtainMementos(String term) {
+ return obtainMementos(term, choicesMementos);
+ }
+
+ public List<ObjectAdapterMemento> getChoicesMementos() {
+ return choicesMementos;
+ }
+
+ @Override
+ public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+ final List<ObjectAdapterMemento> mementos = obtainMementos(null);
+
+ final Predicate<ObjectAdapterMemento> lookupOam = new Predicate<ObjectAdapterMemento>() {
+ @Override
+ public boolean apply(ObjectAdapterMemento input) {
+ final String id = (String) getId(input);
+ return ids.contains(id);
+ }
+ };
+ return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
deleted file mode 100644
index 0874436..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
+++ /dev/null
@@ -1,49 +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">
- <body>
- <wicket:panel>
- <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
- <div class="form-group" wicket:id="scalarIfRegular">
- <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
- <span class="scalarValueWrapper">
- <div class="scalarPlaceholder">
- <span class="scalarValueInput">
- <span class="editing">
- <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
- <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
- </span>
- </span>
- <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
- </div>
- <span wicket:id="feedback" class="help-block"></span>
- <span wicket:id="associatedActionLinksBelow"></span>
- </span>
- <div class="clearfix"/>
- </div>
- <span wicket:id="scalarIfCompact"></span>
- </div>
- </wicket:panel>
- </body>
-</html>