package be.selckin.swu;
import com.google.common.collect.ImmutableList;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.feedback.ContainerFeedbackMessageFilter;
import org.apache.wicket.feedback.ErrorLevelFeedbackMessageFilter;
import org.apache.wicket.feedback.ExactLevelFeedbackMessageFilter;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.feedback.IFeedback;
import org.apache.wicket.feedback.IFeedbackMessageFilter;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import java.util.List;
public class SplitFeedbackPanel extends Panel implements IFeedback {
private static final IFeedbackMessageFilter SUCCESS_FILTER = new ExactLevelFeedbackMessageFilter(FeedbackMessage.INFO);
private static final IFeedbackMessageFilter WARNING_FILTER = new ExactLevelFeedbackMessageFilter(FeedbackMessage.WARNING);
private static final IFeedbackMessageFilter ERROR_FILTER = new ErrorLevelFeedbackMessageFilter(FeedbackMessage.ERROR);
public SplitFeedbackPanel(String id) {
this(id, (IFeedbackMessageFilter) null);
}
public SplitFeedbackPanel(String id, IFeedbackMessageFilter filter) {
super(id);
setOutputMarkupId(true);
setOutputMarkupPlaceholderTag(true);
add(create("success", createFilter(SUCCESS_FILTER, filter)));
add(create("warning", createFilter(WARNING_FILTER, filter)));
add(create("error", createFilter(ERROR_FILTER, filter)));
add(new ClassAttributeAppender("feedback"));
}
public SplitFeedbackPanel(String id, MarkupContainer container) {
this(id, new ContainerFeedbackMessageFilter(container));
}
private IFeedbackMessageFilter createFilter(IFeedbackMessageFilter base, IFeedbackMessageFilter extra) {
return extra == null ? base : new CompoundIFeedbackMessageFilter(base, extra);
}
private FeedbackPanel create(String id, final IFeedbackMessageFilter filter) {
FeedbackPanel panel = new FeedbackPanel(id, filter) {
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(anyMessage());
}
};
panel.setOutputMarkupId(true);
panel.setOutputMarkupPlaceholderTag(true);
return panel;
}
private static final class CompoundIFeedbackMessageFilter implements IFeedbackMessageFilter {
private final List<IFeedbackMessageFilter> filters;
private CompoundIFeedbackMessageFilter(IFeedbackMessageFilter... filters) {
this(ImmutableList.copyOf(filters));
}
private CompoundIFeedbackMessageFilter(List<IFeedbackMessageFilter> filters) {
this.filters = filters;
}
@Override
public boolean accept(FeedbackMessage message) {
for (IFeedbackMessageFilter filter : filters) {
if (!filter.accept(message))
return false;
}
return true;
}
}
}