/*
* 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.syncope.client.console.wicket.markup.html.form;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.PopoverBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.PopoverConfig;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
import java.io.Serializable;
import java.util.List;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
public abstract class FieldPanel<T extends Serializable> extends AbstractFieldPanel<T> implements Cloneable {
private static final long serialVersionUID = -198988924922541273L;
protected FormComponent<T> field;
protected String title;
private final Model<Integer> index = Model.of(0);
public FieldPanel(final String id, final IModel<T> model) {
this(id, id, model);
}
public FieldPanel(final String id, final String name, final IModel<T> model) {
super(id, name, model);
}
public FormComponent<T> getField() {
return field;
}
public FieldPanel<T> setPlaceholder(final String id) {
field.add(new AttributeModifier("placeholder", new ResourceModel(id, id)));
return this;
}
public FieldPanel<T> setTitle(final String title) {
return setTitle(title, false);
}
public FieldPanel<T> setTitle(final String title, final boolean html) {
this.title = title;
field.add(new PopoverBehavior(
Model.<String>of(),
title == null ? Model.<String>of() : Model.of(title),
new PopoverConfig().withHtml(html).withHoverTrigger().withPlacement(
index.getObject() != null && index.getObject() == 0
? TooltipConfig.Placement.bottom
: this instanceof AjaxCheckBoxPanel
? TooltipConfig.Placement.right
: TooltipConfig.Placement.top)));
return this;
}
public FieldPanel<T> setStyleSheet(final String... classes) {
return setStyleSheet(true, classes);
}
public FieldPanel<T> setStyleSheet(final boolean replace, final String... classes) {
if (replace) {
field.add(AttributeModifier.replace("class", StringUtils.join(classes, ' ')));
} else {
field.add(AttributeModifier.append("class", StringUtils.join(classes, ' ')));
}
return this;
}
@Override
public FieldPanel<T> setRequired(final boolean required) {
field.setRequired(required);
return this;
}
public FieldPanel<T> setReadOnly(final boolean readOnly) {
field.setEnabled(!readOnly);
return this;
}
@Override
public boolean isRequired() {
return field.isRequired();
}
public boolean isReadOnly() {
return !field.isEnabled();
}
@Override
public FieldPanel<T> setModelObject(final T object) {
field.setModelObject(object);
return this;
}
public T getModelObject() {
return this.field.getModelObject();
}
public FieldPanel<T> setNewModel(final IModel<T> model) {
field.setModel(model == null ? new Model<T>() : model);
return this;
}
/**
* Used by MultiFieldPanel to attach items (usually strings).
* This method has to be overridden in case of type conversion is required.
*
* @param item item to attach.
* @return updated FieldPanel object.
* @see MultiFieldPanel
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public FieldPanel<T> setNewModel(final ListItem item) {
return setNewModel(new IModel() {
private static final long serialVersionUID = 6799404673615637845L;
@Override
public Object getObject() {
return item.getModelObject();
}
@Override
public void setObject(final Object object) {
item.setModelObject(object);
}
@Override
public void detach() {
// no detach
}
});
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public FieldPanel<T> setNewModel(final List<Serializable> list) {
return setNewModel(new Model() {
private static final long serialVersionUID = 1088212074765051906L;
@Override
public Serializable getObject() {
return list == null || list.isEmpty() ? null : list.get(0);
}
@Override
public void setObject(final Serializable object) {
list.clear();
if (object != null) {
list.add(object);
}
}
});
}
public FieldPanel<T> setIndex(final int index) {
this.index.setObject(index);
return this;
}
public int getIndex() {
return index.getObject();
}
/**
* Override to add settings depending components.
* It has to be used by default to add components depending by index model.
*
* @return the current field panel.
*/
public FieldPanel<T> settingsDependingComponents() {
return this;
}
@Override
@SuppressWarnings("unchecked")
public FieldPanel<T> clone() {
final FieldPanel<T> panel = SerializationUtils.clone(this);
panel.setModelObject(null);
panel.addLabel();
return panel;
}
}