package org.nocket.component.panel;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.feedback.IFeedbackMessageFilter;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.util.io.IClusterable;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
// TODO: Auto-generated Javadoc
/**
* DMD implementation of a panel that displays
* {@link org.apache.wicket.feedback.FeedbackMessage}s in a list view. It works
* similar to FeedbackPanel, with the difference that the messages are
* surrounded by div container with according CSS-Class, depending on this if
* there are errors or not.
*
* @author blaz02
* @see org.apache.wicket.markup.html.panel.FeedbackPanel
*/
public class DMDFeedbackPanel extends FeedbackPanel {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The error title. */
private boolean errorTitle = true;
/**
* Instantiates a new DMD feedback panel.
*
* @param id the id
*/
public DMDFeedbackPanel(String id) {
super(id);
visitChildren(new FeedbackPanelVisitor());
}
/* (non-Javadoc)
* @see org.apache.wicket.markup.html.panel.FeedbackPanel#getCSSClass(org.apache.wicket.feedback.FeedbackMessage)
*/
@Override
protected String getCSSClass(final FeedbackMessage message) {
return null;
}
/**
* Sets whether error title will be shown in the box.
*
* @param showErrorTitle
* If set to false, there will be no title show in the box with
* the error messages.
*
* @return DMDFeedbackPanel reference
*/
public DMDFeedbackPanel setShowErrorTitle(boolean showErrorTitle) {
errorTitle = showErrorTitle;
return this;
}
/**
* Defines which message levels should be ignored.
*
* @param l the l
* @return DMDFeedbackPanel reference
*/
public DMDFeedbackPanel setIgnoreLevels(Integer... l) {
final List<Integer> levels = Arrays.asList(l);
getFeedbackMessagesModel().setFilter(new IFeedbackMessageFilter() {
private static final long serialVersionUID = 1L;
@Override
public boolean accept(FeedbackMessage message) {
return !levels.contains(message.getLevel());
}
});
return this;
}
/**
* Gets the error css class.
*
* @return Name of the CSS-Class used for the errorbox
*/
protected String getErrorCSSClass() {
return "alert alert-error";
}
/**
* Gets the info css class.
*
* @return Name of the CSS-Class used for the errorbox
*/
protected String getInfoCSSClass() {
return "alert alert-success";
}
/**
* The Class FeedbackPanelVisitor.
*/
class FeedbackPanelVisitor implements IVisitor<Component, Component>, IClusterable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/* (non-Javadoc)
* @see org.apache.wicket.util.visit.IVisitor#component(java.lang.Object, org.apache.wicket.util.visit.IVisit)
*/
@Override
public void component(Component component, IVisit<Component> visit) {
if (component.getId().equals("feedbackul")) {
if (component instanceof MarkupContainer) {
MarkupContainer container = (MarkupContainer) component;
container.add(new AttributeModifier("class",
new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return anyErrorMessage() ? getErrorCSSClass() : getInfoCSSClass();
}
}
));
container.add(
new Label("feedbacktitle", new ResourceModel("feedbacktitle")) {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return errorTitle && anyErrorMessage();
}
}
);
}
visit.stop(component);
}
}
}
}