package fr.openwide.core.wicket.more.markup.repeater.table.column;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import com.google.common.collect.Lists;
import fr.openwide.core.jpa.more.business.sort.ISort;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.markup.html.basic.CoreLabel;
import fr.openwide.core.wicket.markup.html.panel.InvisiblePanel;
import fr.openwide.core.wicket.more.link.descriptor.AbstractDynamicBookmarkableLink;
import fr.openwide.core.wicket.more.link.descriptor.generator.ILinkGenerator;
import fr.openwide.core.wicket.more.link.descriptor.mapper.ILinkDescriptorMapper;
import fr.openwide.core.wicket.more.rendering.Renderer;
public abstract class CoreLabelColumn<T, S extends ISort<?>> extends AbstractCoreColumn<T, S> {
private static final long serialVersionUID = -8588236421923900497L;
private boolean multiline = false;
private boolean showPlaceholder = false;
private IModel<String> placeholderModel = null;
private Renderer<? super T> tooltipRenderer;
private ILinkDescriptorMapper<? extends ILinkGenerator, ? super IModel<T>> linkGeneratorMapper;
private ILinkDescriptorMapper<? extends ILinkGenerator, ? super IModel<T>> sideLinkGeneratorMapper;
private boolean hideIfInvalid = false;
private List<Behavior> linkBehaviors = Lists.newArrayList();
public CoreLabelColumn(IModel<String> displayModel) {
super(displayModel);
}
@Override
public void detach() {
super.detach();
if (placeholderModel != null) {
placeholderModel.detach();
}
if (linkGeneratorMapper != null) {
linkGeneratorMapper.detach();
}
if (sideLinkGeneratorMapper != null) {
sideLinkGeneratorMapper.detach();
}
}
@Override
public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) {
cellItem.add(
new CoreLabelLinkColumnPanel<T, S>(componentId, rowModel) {
private static final long serialVersionUID = 1L;
@Override
public CoreLabel getLabel(String wicketId, IModel<T> rowModel) {
return decorate(newLabel(wicketId, rowModel), rowModel);
}
@Override
public MarkupContainer getLink(String wicketId, IModel<T> rowModel) {
if (linkGeneratorMapper != null) {
return decorate(linkGeneratorMapper.map(rowModel).link(wicketId));
}
return new InvisiblePanel(wicketId);
}
@Override
public MarkupContainer getSideLink(String wicketId, IModel<T> rowModel) {
if (sideLinkGeneratorMapper != null) {
return decorate(sideLinkGeneratorMapper.map(rowModel).link(wicketId))
.add(new WebMarkupContainer("sideLinkIcon").add(new ClassAttributeAppender("fa fa-share-square-o")));
}
return new InvisiblePanel(wicketId);
}
}.setRenderBodyOnly(true) // Delete useless <div> under <td>. If it could be usefull, give the ability to configure it
);
}
protected abstract CoreLabel newLabel(String componentId, IModel<T> rowModel);
private CoreLabel decorate(CoreLabel label, IModel<T> rowModel) {
if (multiline) {
label.multiline();
}
if (showPlaceholder) {
if (placeholderModel != null) {
label.showPlaceholder(placeholderModel);
} else {
label.showPlaceholder();
}
}
if (tooltipRenderer != null) {
label.add(new AttributeModifier("title", tooltipRenderer.asModel(rowModel)));
}
return label;
}
private AbstractDynamicBookmarkableLink decorate(AbstractDynamicBookmarkableLink link) {
if (hideIfInvalid) {
link.hideIfInvalid();
}
for (Behavior linkBehavior : linkBehaviors) {
link.add(linkBehavior);
}
return link;
}
public CoreLabelColumn<T, S> multiline() {
this.multiline = true;
return this;
}
public CoreLabelColumn<T, S> showPlaceholder() {
this.showPlaceholder = true;
return this;
}
public IModel<String> getPlaceholderModel() {
return placeholderModel;
}
public CoreLabelColumn<T, S> showPlaceholder(IModel<String> placeholderModel) {
this.showPlaceholder = true;
this.placeholderModel = placeholderModel;
return this;
}
public Renderer<? super T> getTooltipRenderer() {
return tooltipRenderer;
}
public void setTooltipRenderer(Renderer<? super T> tooltipRenderer) {
this.tooltipRenderer = tooltipRenderer;
}
public ILinkDescriptorMapper<? extends ILinkGenerator, ? super IModel<T>> getLinkGeneratorMapper() {
return linkGeneratorMapper;
}
public CoreLabelColumn<T, S> setLinkGeneratorMapper(ILinkDescriptorMapper<? extends ILinkGenerator, ? super IModel<T>> linkGeneratorFactory) {
if (sideLinkGeneratorMapper != null) {
throw new IllegalStateException("link and side link cannot be both set.");
}
this.linkGeneratorMapper = linkGeneratorFactory;
return this;
}
public ILinkDescriptorMapper<? extends ILinkGenerator, ? super IModel<T>> getSideLinkGeneratorMapper() {
return sideLinkGeneratorMapper;
}
public CoreLabelColumn<T, S> setSideLinkGeneratorMapper(ILinkDescriptorMapper<? extends ILinkGenerator, ? super IModel<T>> sideLinkGeneratorFactory) {
if (linkGeneratorMapper != null) {
throw new IllegalStateException("link and side link cannot be both set.");
}
this.sideLinkGeneratorMapper = sideLinkGeneratorFactory;
return this;
}
public CoreLabelColumn<T, S> hideIfInvalid() {
this.hideIfInvalid = true;
return this;
}
public void addLinkBehavior(Behavior behavior) {
linkBehaviors.add(behavior);
}
}