/* * (C) Copyright IBM Corp. 2009 * * LICENSE: Eclipse Public License v1.0 * http://www.eclipse.org/legal/epl-v10.html */ package com.ibm.gaiandb.apps.dashboard; import java.util.ArrayList; import java.util.List; import java.awt.Component; import java.awt.Graphics; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; public class Field { // Use PROPRIETARY notice if class contains a main() method, otherwise use COPYRIGHT notice. public static final String COPYRIGHT_NOTICE = "(c) Copyright IBM Corp. 2009"; public JLabel label; public JTextField inputField; public JLabel warningIconLabel; public List<Warning> warnings = new ArrayList<Warning>(); public Field(String title, JTextField field, Icon warningIcon, String inputRegex, Warning... warnings) { label = new JLabel(title + ":"); inputField = field; inputField.setDocument(new ValidationDocument(new RegexValidator(inputRegex))); inputField.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) {} public void focusLost(FocusEvent e) { checkForWarnings(); } }); warningIconLabel = new JLabel(warningIcon); warningIconLabel.setDisabledIcon(new Icon() { public void paintIcon(Component c, Graphics g, int x, int y) {} public int getIconWidth() { return warningIconLabel.getIcon().getIconWidth(); } public int getIconHeight() { return warningIconLabel.getIcon().getIconHeight(); } }); warningIconLabel.setEnabled(false); for (Warning warning : warnings) { addWarning(warning); } } public void addWarning(Warning warning) { warnings.add(warning); } public boolean checkForWarnings() { String text = inputField.getText(); for (Warning warning : warnings) { if (!warning.validator.validate(text)) { warningIconLabel.setEnabled(true); warningIconLabel.setToolTipText(warning.message); return false; } } warningIconLabel.setEnabled(false); warningIconLabel.setToolTipText(""); return true; } public static Document getValidatedDocument( String regex ) { return new ValidationDocument( new RegexValidator(regex) ); } public static interface Validator { public boolean validate(String text); } public static class RegexValidator implements Validator { private String regex; public RegexValidator(String regex) { this.regex = regex; } public boolean validate(String text) { return text.matches(regex); } } private static class ValidationDocument extends PlainDocument { private static final long serialVersionUID = -4871624484682802518L; private final Validator validator; public ValidationDocument(Validator validator) { super(); this.validator = validator; } public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if (null == str) { return; } String newStr = getText(0, offs) + str + getText(offs, getLength() - offs); if (validator.validate(newStr)) { super.insertString(offs, str, a); } } } public static class Warning { public Validator validator; public String message; public Warning(Validator validator, String message) { init(validator, message); } public Warning(String regex, String message) { init(new RegexValidator(regex), message); } private void init(Validator validator, String message) { this.validator = validator; this.message = message; } } }