package fr.openwide.core.wicket.more.markup.html.image; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import fr.openwide.core.wicket.behavior.ClassAttributeAppender; /** * Container affichant une icône selon que le model soit true ou false. * Par défaut un carré coché ou non avec possibilité de personnaliser. */ public class BooleanIcon extends WebMarkupContainer { private static final long serialVersionUID = 6413843086031282399L; private static final String DEFAULT_TRUE_ICON_CLASS = "fa fa-check-square-o fa-fw"; private static final String DEFAULT_FALSE_ICON_CLASS = "fa fa-square-o fa-fw"; private static final String DEFAULT_TRUE_HIDE_IF_NULL_OR_FALSE_ICON_CLASS = "fa fa-check fa-fw"; private static final String BOOLEAN_ICON_BASE_CLASS = "boolean-icon"; private IModel<Boolean> booleanModel; private IModel<String> trueIconClassModel; private IModel<String> falseIconClassModel; private boolean hideIfNullOrFalse = false; public BooleanIcon(String id, IModel<Boolean> booleanModel) { this(id, booleanModel, null, null); } public BooleanIcon(String id, IModel<Boolean> booleanModel, IModel<String> trueIconClassModel, IModel<String> falseIconClassModel) { super(id, booleanModel); this.booleanModel = booleanModel; this.trueIconClassModel = trueIconClassModel; this.falseIconClassModel = falseIconClassModel; add(new ClassAttributeAppender(BOOLEAN_ICON_BASE_CLASS)); add(new ClassAttributeAppender(new LoadableDetachableModel<String>() { private static final long serialVersionUID = 1L; @Override protected String load() { return Boolean.TRUE.equals(getBooleanModelObject()) ? getTrueIconClass() : getFalseIconClass(); } })); } private Boolean getBooleanModelObject() { return booleanModel != null ? booleanModel.getObject() : null; } private String getTrueIconClass() { if (trueIconClassModel == null) { if (hideIfNullOrFalse) { trueIconClassModel = new Model<String>(DEFAULT_TRUE_HIDE_IF_NULL_OR_FALSE_ICON_CLASS); } else { trueIconClassModel = new Model<String>(DEFAULT_TRUE_ICON_CLASS); } } return trueIconClassModel.getObject(); } private String getFalseIconClass() { if (falseIconClassModel == null) { falseIconClassModel = new Model<String>(DEFAULT_FALSE_ICON_CLASS); } return falseIconClassModel.getObject(); } public BooleanIcon hideIfNullOrFalse() { this.hideIfNullOrFalse = true; return this; } @Override protected void onConfigure() { super.onConfigure(); setVisible(Boolean.TRUE.equals(getBooleanModelObject()) || !hideIfNullOrFalse); } @Override protected void onDetach() { super.onDetach(); if (trueIconClassModel != null) { trueIconClassModel.detach(); } if (falseIconClassModel != null) { falseIconClassModel.detach(); } } }