package net.vhati.modmanager.ui; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; /** * When applied to a JTextField via setDocument(), you can only enter a limited set of characters. */ public class RegexDocument extends PlainDocument { private boolean dontCheck = false; private Pattern p = null; public RegexDocument( String regex ) { if ( regex == null || regex.length()==0 ) dontCheck = true; try { p = Pattern.compile(regex); } catch (PatternSyntaxException e) {dontCheck = true;} } public RegexDocument() { dontCheck = true; } @Override public void insertString( int offs, String str, AttributeSet a ) throws BadLocationException { if ( str == null ) return; boolean proceed = true; if ( dontCheck == false ) { String tmp = super.getText(0, offs) + str + (super.getLength()>offs ? super.getText(offs,super.getLength()-offs) : ""); Matcher m = p.matcher(tmp); proceed = m.matches(); } if ( proceed == true ) super.insertString( offs, str, a ); } @Override public void remove( int offs, int len ) throws BadLocationException { boolean proceed = true; if ( dontCheck == false ) { try { String tmp = super.getText(0, offs) + (super.getLength()>(offs+len) ? super.getText(offs+len, super.getLength()-(offs+len)) : ""); Matcher m = p.matcher(tmp); proceed = m.matches(); } catch (BadLocationException f) {} } if ( proceed == true ) super.remove( offs, len ); } }