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; } } }