001 /*
002 * Copyright (c) Holger Pfaff - http://pfaff.ws
003 *
004 * This software maybe used for any purpose provided the
005 * above copyright notice is retained. It is supplied as is.
006 * No warranty expressed or implied - Use at your own risk.
007 */
008
009 import java.awt.TextComponent;
010 import java.awt.event.TextEvent;
011 import java.awt.event.TextListener;
012 import java.util.StringTokenizer;
013
014 /**
015 * (#)TextFilter.java
016 * @author Holger Pfaff
017 * @version 3.2 19-Mar-2004<br><br>
018 *
019 * Textfilter to be used with TextComponents
020 */
021
022 public class TextFilter implements TextListener {
023
024 /**
025 * allowed chars (empty str allows any)
026 */
027 private String alw = "";
028
029 /**
030 * denied char (empty str allows any)
031 */
032 private String dny = "";
033
034 /**
035 * max chars (0 for unlimited)
036 */
037 private int max = 0;
038
039 /**
040 * Construct a textfilter
041 *
042 * @param al chars to allow
043 * @param dy chars to deny
044 * @param mx max. length
045 */
046 public TextFilter(String al, String dy, int mx) {
047 max = mx;
048 alw = al;
049 dny = dy;
050 }
051
052 /**
053 * removes all chars in chr from txt
054 *
055 * @param txt text to remove chars from
056 * @param chr set of chars to remove
057 */
058 private String rem(String txt, String chr) {
059 return Util.enum2String(new StringTokenizer(txt, chr), "");
060 }
061
062 /**
063 * implement textlistener
064 *
065 * @param e TextEvent
066 */
067 public void textValueChanged(TextEvent e) {
068 TextComponent cmp = (TextComponent) e.getSource();
069 String txt = cmp.getText();
070 int pos = cmp.getCaretPosition();
071
072 // leave only allowed chars
073 if(alw.length() > 0) {
074 txt = rem(txt, rem(txt, alw));
075 }
076
077 // remove denied chars
078 if(dny.length() > 0) {
079 txt = rem(txt, dny);
080 }
081
082 int dif = txt.length() - max;
083
084 // text too long? Try to be clever and remove char
085 // at current caret (cursor) pos as this should be the last
086 // one entered
087 if(max > 0 && dif > 0) {
088 if(dif <= pos && pos <= txt.length()) {
089 txt = txt.substring(0, pos - dif) + txt.substring(pos);
090 } else {
091 txt = txt.substring(0, max);
092 }
093 }
094
095 // text changed ?
096 // set it in component and try to leave caret (cursor) where it was
097 if(cmp.getText().equals(txt) == false) {
098 pos = pos + txt.length() - cmp.getText().length();
099 cmp.setText(txt);
100 cmp.setCaretPosition(pos < 0 ? 0 : pos);
101 }
102 }
103 }