package fr.openwide.core.basicapp.web.application.history.component;
import static com.google.common.base.Predicates.equalTo;
import static com.google.common.base.Predicates.in;
import static fr.openwide.core.wicket.more.condition.Condition.isTrue;
import static fr.openwide.core.wicket.more.condition.Condition.predicate;
import java.util.EnumSet;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.IModel;
import fr.openwide.core.basicapp.core.business.history.model.HistoryDifference;
import fr.openwide.core.basicapp.core.util.binding.Bindings;
import fr.openwide.core.basicapp.web.application.history.component.factory.IHistoryComponentFactory;
import fr.openwide.core.basicapp.web.application.history.renderer.DefaultHistoryDifferenceValueRenderer;
import fr.openwide.core.jpa.more.business.history.model.atomic.HistoryDifferenceEventType;
import fr.openwide.core.wicket.markup.html.basic.CoreLabel;
import fr.openwide.core.wicket.more.condition.Condition;
import fr.openwide.core.wicket.more.markup.html.basic.EnclosureContainer;
import fr.openwide.core.wicket.more.model.BindingModel;
public class DefaultHistoryDifferencePanel extends GenericPanel<HistoryDifference> {
private static final long serialVersionUID = 1L;
private static final IHistoryComponentFactory FACTORY = new IHistoryComponentFactory() {
private static final long serialVersionUID = 1L;
@Override
public Component create(String wicketId, IModel<HistoryDifference> model) {
return new DefaultHistoryDifferencePanel(wicketId, model);
}
@Override
public void detach() {
// nothing to do
}
private Object readResolve() {
return FACTORY;
}
};
public static IHistoryComponentFactory factory() {
return FACTORY;
}
public DefaultHistoryDifferencePanel(String id, IModel<HistoryDifference> model) {
super(id, model);
Condition isItemCondition = isTrue(BindingModel.of(model, Bindings.historyDifference().path().path().isItem()));
IModel<HistoryDifferenceEventType> eventTypeModel = BindingModel.of(model, Bindings.historyDifference().eventType());
Condition isUpdatedCondition =
predicate(eventTypeModel, equalTo(HistoryDifferenceEventType.UPDATED))
.or(
isItemCondition.negate()
.and(
predicate(eventTypeModel, in(EnumSet.of(HistoryDifferenceEventType.ADDED, HistoryDifferenceEventType.REMOVED)))
)
);
IModel<?> beforeValueModel = DefaultHistoryDifferenceValueRenderer.before().asModel(model);
IModel<?> afterValueModel = DefaultHistoryDifferenceValueRenderer.after().asModel(model);
add(
new EnclosureContainer("updated").condition(isUpdatedCondition)
.add(new CoreLabel("before", beforeValueModel).showPlaceholder())
.add(new CoreLabel("after", afterValueModel).showPlaceholder()),
new EnclosureContainer("untouched").condition(predicate(eventTypeModel, equalTo(HistoryDifferenceEventType.UNTOUCHED)))
.add(new CoreLabel("after", afterValueModel).showPlaceholder()),
new EnclosureContainer("added").condition(isUpdatedCondition.negate().and(predicate(eventTypeModel, equalTo(HistoryDifferenceEventType.ADDED))))
.add(new CoreLabel("after", afterValueModel).showPlaceholder()),
new EnclosureContainer("removed").condition(isUpdatedCondition.negate().and(predicate(eventTypeModel, equalTo(HistoryDifferenceEventType.REMOVED))))
.add(new CoreLabel("before", beforeValueModel).showPlaceholder())
);
}
}