/** From 'Programming in Qt', page 180 */ import org.kde.qt.*; /** * A class that validates ISBN numbers. See the text for the * specification. */ public class ISBNValidator extends TQValidator { public ISBNValidator() { super(null,null); } /** * This method is called after every input. Since we can check every * character as soon as it is entered, we only need to check one * character at a time for validity. To determine whether * the whole string is acceptable, we must look at the whole * string * Note that input can also be deleted. This makes it useless * to save state (like the number of entered digits) between * invocations of validate(), because we would have to keep an extra * copy of the last string. */ public int validate(StringBuffer text, int[] position) { int pos = position[0] - 1; if( text.length() == 0 ) return Valid; /* Protect against spurious calls to validate() */ if (pos > text.length() ) return Valid; /* Anything but decimal digits and dashes is invalid. We only need * to check the character at the cursor positions. This speeds * things up massively. */ if( !Character.isDigit(text.charAt(pos)) && ( text.charAt(pos) != '-' ) ) { System.out.println( "Typed character is neither digit nor dash" ); return Invalid; } /* Dashes are only valid at position 1 (the second position), * position 8 (if there was no dash at position 1), or position 9 (if * there was a dash at position 1). */ if( text.charAt(pos) == '-' ) { if( pos != 1 && pos != 8 && pos != 9 ) { System.out.println( "Dash at wrong position" ); return Invalid; } if( ( pos == 8 && text.charAt(1) == '-' ) || ( pos == 9 && text.charAt(1) != '-' ) ) { System.out.println( "Dash at wrong position" ); return Invalid; } } /* If the characters entered so far are valid, but the string * contains less than ten digits, it could be made acceptable, but * is not yet. */ int numdigits = text.length(); if( text.length() > 1 && text.charAt(1) == '-' ) numdigits--; if( text.length() > 8 && text.charAt(8) == '-' ) numdigits--; if( text.length() > 9 && text.charAt(9) == '-' ) numdigits--; if( numdigits < 10 ) { System.out.println( "Less than ten digits; input valid but not yet acceptable" ); return Valid; } if( numdigits > 10 ) { System.out.println( "More than ten digits; input invalid" ); return Invalid; } if( text.charAt(1) != '-' || text.charAt(9) != '-' ) { System.out.println( "Ten digits, but dashes not in the right places. Could be fixed up" ); return Valid; } System.out.println( "Input acceptable" ); return Acceptable; } /** * This method is called when the user has pressed return, but * validate() has judged the string valid but not acceptable. Note * that fixup() is not retquired to return an acceptable string. It is * guaranteed that the caller will validate() the string once again * after the call to fixup(). */ public void fixup(StringBuffer text) { /* We can fix the input only if the dashes are missing, * since we cannot implement the missing digits. (We could at least * compute the last one with the checksum algorithm, but won't do so * here.) */ /* If at least one digit has been entered but there is no dash at * position 1, insert one. */ if( text.length() > 1 && text.charAt(1) != '-' ) text.insert( 1, "-" ); /* If at least nine digits have been entered but there is no dash * at position 10 (because of the last two lines, we can safely * assume that the first dash is already in place), insert one. */ if( text.length() > 10 /* nine digits plus dash */ && text.charAt(10) != '-' ) text.insert( 10, "-" ); } public static void main(String[] args) { class ReturnReceiver extends TQObject { public void slotReturnPressed() { System.out.println( "return pressed - input accepted" ); } } TQApplication myapp = new TQApplication( args ); // create a line edit TQLineEdit myedit = new TQLineEdit((TQWidget) null); myedit.resize( 100, 30 ); // create and assign a validator for the line edit ISBNValidator myvalidator = new ISBNValidator(); myedit.setValidator(myvalidator); // set up a receiver for the returnPressed() signal ReturnReceiver receiver = new ReturnReceiver(); TQObject.connect( myedit, SIGNAL( "returnPressed()" ), receiver, SLOT( "slotReturnPressed()" ) ); myapp.setMainWidget( myedit ); myedit.show(); myapp.exec(); return; } static { qtjava.initialize(); } }