/**
*
*/
package org.javabuilders.swing.handler;
import java.awt.Component;
import javax.accessibility.AccessibleContext;
import javax.swing.JOptionPane;
import org.javabuilders.BuildResult;
import org.javabuilders.Builder;
import org.javabuilders.handler.validation.IValidationMessageHandler;
import org.javabuilders.handler.validation.ValidationMessage;
import org.javabuilders.handler.validation.ValidationMessageList;
import org.javabuilders.swing.SwingJavaBuilderUtils;
/**
* Swing validation message handler
* @author Jacek Furmankiewicz
*
*/
public class SwingValidationMessageHandler implements IValidationMessageHandler {
private static final SwingValidationMessageHandler singleton = new SwingValidationMessageHandler();
/**
* @return Singleton
*/
public static SwingValidationMessageHandler getInstance() {return singleton;}
private SwingValidationMessageHandler() {}
/* (non-Javadoc)
* @see org.javabuilders.handler.validation.IValidationMessageHandler#handleValidationMessages(org.javabuilders.handler.validation.ValidationMessageList, org.javabuilders.BuildResult)
*/
public void handleValidationMessages(ValidationMessageList list,
BuildResult result) {
if (list.size() > 0) {
Component firstObject = null;
StringBuilder builder = new StringBuilder();
for(ValidationMessage msg : list) {
if (builder.length() > 0) {
builder.append("\n");
}
builder.append(msg.getMessage());
if (firstObject == null && msg.getProperty() != null) {
Object focusable = result.get(msg.getProperty().getName());
if (focusable instanceof Component) {
firstObject = (Component)focusable;
}
}
}
Component parent = null;
if (result.getRoot() instanceof Component) {
parent = SwingJavaBuilderUtils.getTopLevelParent(result.getRoot());
}
String title = (list.size() == 1) ? DEFAULT_VALIDATION_ERROR_TITLE : DEFAULT_VALIDATION_ERRORS_TITLE;
JOptionPane.showMessageDialog(parent,builder.toString(),
result.getResource(title), JOptionPane.ERROR_MESSAGE);
//set the focus back to the first field in error
if (firstObject != null) {
firstObject.requestFocus();
}
}
}
/* (non-Javadoc)
* @see org.javabuilders.handler.validation.IValidationMessageHandler#getNamedObjectLabel(java.lang.Object)
*/
public String getNamedObjectLabel(Object namedObject) {
//attempt to find the label from the accessibility info
String label = null;
if (namedObject instanceof Component) {
Component c = (Component)namedObject;
AccessibleContext ac = c.getAccessibleContext();
if (ac != null) {
label = ac.getAccessibleDescription();
//remove the ":" that labels often have
if (label != null && label.endsWith(":")) {
label = label.substring(0,label.length() - 1);
}
}
}
return label;
}
}