package fr.openwide.core.wicket.markup.html.basic; import java.io.Serializable; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.IModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.util.string.Strings; import org.springframework.util.StringUtils; public abstract class AbstractCoreLabel<T extends AbstractCoreLabel<T>> extends Label { private static final long serialVersionUID = 1697388050602143288L; protected boolean showPlaceholder = false; protected IModel<String> placeholderModel; protected boolean hideIfEmpty = false; protected boolean multiline = false; protected transient IModel<?> currentModel; public AbstractCoreLabel(String id, IModel<?> model) { super(id, model); } public AbstractCoreLabel(String id, Serializable label) { super(id, label); } @Override protected void onConfigure() { super.onConfigure(); boolean defaultModelIsEmpty = !StringUtils.hasText(getDefaultModelObjectAsString()); if (!defaultModelIsEmpty) { currentModel = getDefaultModel(); } else if (showPlaceholder) { if (placeholderModel == null) { placeholderModel = new ResourceModel("common.emptyField"); } currentModel = placeholderModel; } else { currentModel = null; } setVisible(!(hideIfEmpty && defaultModelIsEmpty)); } @Override public void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag) { CharSequence body = getDefaultModelObjectAsString(getCurrentModelObject()); if (multiline) { body = Strings.toMultilineMarkup(body); } replaceComponentTagBody(markupStream, openTag, body); } protected Object getCurrentModelObject() { if (currentModel == null) { return null; } return currentModel.getObject(); } /** * @return this as an object of type T */ protected abstract T thisAsT(); public boolean isShowPlaceholder() { return showPlaceholder; } public T showPlaceholder() { this.showPlaceholder = true; return thisAsT(); } public T showPlaceholder(IModel<String> placeholderModel) { return showPlaceholder().placeholderModel(placeholderModel); } public IModel<String> getPlaceholderModel() { return placeholderModel; } public T placeholderModel(IModel<String> placeholderModel) { this.placeholderModel = placeholderModel; return thisAsT(); } public boolean isHideIfEmpty() { return hideIfEmpty; } public T hideIfEmpty() { this.hideIfEmpty = true; return thisAsT(); } public boolean isMultiline() { return multiline; } public T multiline() { this.multiline = true; return thisAsT(); } @Override protected void onDetach() { super.onDetach(); currentModel = null; if (placeholderModel != null) { placeholderModel.detach(); } } }