/*
* 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.model.IModel;
import org.apache.wicket.model.Model;
import org.wicketstuff.select2.AbstractSelect2Choice;
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.model.models.ScalarModelWithMultiPending;
import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
/**
* 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 createSelect2(final String id, final ScalarModel scalarModel) {
return scalarModel.isCollection()
? new Select2(
null,
Select2MultiChoiceExt.create(id,
ScalarModelWithMultiPending.Util.createModel(scalarModel), scalarModel))
: new Select2(
Select2ChoiceExt.create(id,
ScalarModelWithPending.Util.createModel(scalarModel), scalarModel),
null);
}
private Select2(
final Select2ChoiceExt select2Choice,
final Select2MultiChoiceExt select2MultiChoice) {
this.select2Choice = select2Choice;
this.select2MultiChoice = select2MultiChoice;
}
public AbstractSelect2Choice 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) {
// REVIEW: causing a more severe orphaned drop-down when triggered...
// 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);
}
}