1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.jdtaus.banking.util.swing;
22
23 import java.text.ParseException;
24 import javax.swing.JFormattedTextField;
25 import javax.swing.JFormattedTextField.AbstractFormatter;
26 import javax.swing.text.AttributeSet;
27 import javax.swing.text.BadLocationException;
28 import javax.swing.text.DocumentFilter;
29 import javax.swing.text.DocumentFilter.FilterBypass;
30 import org.jdtaus.banking.Kontonummer;
31 import org.jdtaus.core.container.ContainerFactory;
32 import org.jdtaus.core.container.PropertyException;
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public final class KontonummerTextField extends JFormattedTextField
47 {
48
49
50 private static final long serialVersionUID = -959284086262750493L;
51
52
53
54
55
56 private Integer format;
57
58
59
60
61
62 private Boolean validating;
63
64
65 public KontonummerTextField()
66 {
67 super();
68 this.assertValidProperties();
69 this.setColumns( Kontonummer.MAX_CHARACTERS );
70 this.setFormatterFactory( new AbstractFormatterFactory()
71 {
72
73 public AbstractFormatter getFormatter( final JFormattedTextField ftf )
74 {
75 return new AbstractFormatter()
76 {
77
78 public Object stringToValue( final String text ) throws ParseException
79 {
80 Object value = null;
81
82 if ( text != null && text.trim().length() > 0 )
83 {
84 value = Kontonummer.parse( text );
85 }
86
87 return value;
88 }
89
90 public String valueToString( final Object value ) throws ParseException
91 {
92 String ret = null;
93
94 if ( value instanceof Kontonummer )
95 {
96 final Kontonummer kto = (Kontonummer) value;
97 ret = kto.format( getFormat() );
98 }
99
100 return ret;
101 }
102
103 protected DocumentFilter getDocumentFilter()
104 {
105 return new DocumentFilter()
106 {
107
108 public void insertString( final FilterBypass fb, final int o, String s,
109 final AttributeSet a ) throws BadLocationException
110 {
111 if ( isValidating() )
112 {
113 final StringBuffer b = new StringBuffer( fb.getDocument().getLength() + s.length() );
114 b.append( fb.getDocument().getText( 0, fb.getDocument().getLength() ) );
115 b.insert( o, s );
116
117 try
118 {
119 Kontonummer.parse( b.toString() );
120 }
121 catch ( ParseException e )
122 {
123 invalidEdit();
124 return;
125 }
126 }
127
128 super.insertString( fb, o, s, a );
129 }
130
131 public void replace( final FilterBypass fb, final int o, final int l, String s,
132 final AttributeSet a ) throws BadLocationException
133 {
134 if ( isValidating() )
135 {
136 final StringBuffer b = new StringBuffer(
137 fb.getDocument().getText( 0, fb.getDocument().getLength() ) );
138
139 b.delete( o, o + l );
140
141 if ( s != null )
142 {
143 b.insert( o, s );
144 }
145
146 try
147 {
148 Kontonummer.parse( b.toString() );
149 }
150 catch ( ParseException e )
151 {
152 invalidEdit();
153 return;
154 }
155 }
156
157 super.replace( fb, o, l, s, a );
158 }
159
160 };
161 }
162
163 };
164 }
165
166 } );
167 }
168
169
170
171
172
173
174 public Kontonummer getKontonummer()
175 {
176 return (Kontonummer) this.getValue();
177 }
178
179
180
181
182
183
184
185
186
187 public int getFormat()
188 {
189 if ( this.format == null )
190 {
191 this.format = this.getDefaultFormat();
192 }
193
194 return this.format.intValue();
195 }
196
197
198
199
200
201
202
203
204
205
206
207
208 public void setFormat( final int value )
209 {
210 if ( value != Kontonummer.ELECTRONIC_FORMAT && value != Kontonummer.LETTER_FORMAT )
211 {
212 throw new IllegalArgumentException( Integer.toString( value ) );
213 }
214
215 this.format = new Integer( value );
216 }
217
218
219
220
221
222
223
224 public boolean isValidating()
225 {
226 if ( this.validating == null )
227 {
228 this.validating = this.isDefaultValidating();
229 }
230
231 return this.validating.booleanValue();
232 }
233
234
235
236
237
238
239 public void setValidating( boolean value )
240 {
241 this.validating = Boolean.valueOf( value );
242 }
243
244
245
246
247
248
249 private void assertValidProperties()
250 {
251 if ( this.getFormat() != Kontonummer.ELECTRONIC_FORMAT && this.getFormat() != Kontonummer.LETTER_FORMAT )
252 {
253 throw new PropertyException( "format", Integer.toString( this.getFormat() ) );
254 }
255 }
256
257
258
259
260
261
262
263
264
265
266
267 private java.lang.Boolean isDefaultValidating()
268 {
269 return (java.lang.Boolean) ContainerFactory.getContainer().
270 getProperty( this, "defaultValidating" );
271
272 }
273
274
275
276
277
278
279 private java.lang.Integer getDefaultFormat()
280 {
281 return (java.lang.Integer) ContainerFactory.getContainer().
282 getProperty( this, "defaultFormat" );
283
284 }
285
286
287
288
289 }