package org.trianacode.gui.panels;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
/**
* @author Andrew Harrison
* @version 1.0.0 Oct 28, 2010
*/
public class NormalizedField extends JTextField {
private int maxLength = 100;
private char[] allowed = new char[0];
private boolean toLower = true;
public NormalizedField() {
this(25, 500, new char[0], true);
}
public NormalizedField(int size) {
this(size, 500, new char[0], true);
}
public NormalizedField(boolean toLower) {
this(25, 500, new char[0], toLower);
}
public NormalizedField(int size, boolean toLower) {
this(25, 500, new char[0], toLower);
}
public NormalizedField(int size, char[] allowed) {
this(size, 500, allowed, true);
}
public NormalizedField(int size, int maxLength, char[] allowed) {
this(size, maxLength, allowed, true);
}
public NormalizedField(int size, int maxLength, char[] allowed, boolean toLower) {
super(size);
this.maxLength = maxLength;
this.allowed = allowed;
this.toLower = toLower;
}
// override this method to return an instance
// of NormDocument (see below).
public Document createDefaultModel() {
return new NormDocument();
}
class NormDocument extends PlainDocument {
// override this method to catch bad input before it gets to the
// textarea.
public void insertString(int offset, String s, AttributeSet as)
throws BadLocationException {
if (s == null) {
return;
}
if (toLower) {
s = s.toLowerCase();
}
final char[] chars = s.toCharArray();
for (int x = 0; x < chars.length; x++) {
final char c = chars[x];
if ((c >= 'a') && (c <= 'z')) continue; // lowercase
if (!toLower) {
if ((c >= 'A') && (c <= 'Z')) continue; // uppercase
}
if ((c >= '0') && (c <= '9')) continue; // numeric
boolean match = false;
for (char aChar : allowed) {
if (c == aChar) {
match = true;
break;
}
}
if (!match) {
return;
}
}
String newContent = getText(0, offset) + s +
getText(offset, (getLength() - offset));
if (newContent.length() > maxLength)
return;
super.insertString(offset, s, as);
}
}
}