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.beans.PropertyChangeEvent;
24 import java.beans.PropertyChangeListener;
25 import java.text.DecimalFormat;
26 import java.text.NumberFormat;
27 import java.text.ParseException;
28 import java.util.Locale;
29 import javax.swing.JFormattedTextField;
30 import javax.swing.JFormattedTextField.AbstractFormatter;
31 import javax.swing.SwingUtilities;
32 import javax.swing.text.AttributeSet;
33 import javax.swing.text.BadLocationException;
34 import javax.swing.text.DocumentFilter;
35 import javax.swing.text.DocumentFilter.FilterBypass;
36 import org.jdtaus.banking.Bankleitzahl;
37 import org.jdtaus.banking.BankleitzahlExpirationException;
38 import org.jdtaus.banking.BankleitzahlInfo;
39 import org.jdtaus.banking.BankleitzahlenVerzeichnis;
40 import org.jdtaus.banking.messages.BankleitzahlExpirationMessage;
41 import org.jdtaus.banking.messages.BankleitzahlReplacementMessage;
42 import org.jdtaus.banking.messages.UnknownBankleitzahlMessage;
43 import org.jdtaus.core.container.ContainerFactory;
44 import org.jdtaus.core.container.PropertyException;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public final class BankleitzahlTextField extends JFormattedTextField
60 {
61
62
63 private static final long serialVersionUID = -5461742987164339047L;
64
65
66
67
68
69 private Integer format;
70
71
72
73
74
75 private Boolean validating;
76
77
78 public BankleitzahlTextField()
79 {
80 super();
81 this.assertValidProperties();
82 this.setColumns( Bankleitzahl.MAX_CHARACTERS );
83 this.setFormatterFactory( new AbstractFormatterFactory()
84 {
85
86 public AbstractFormatter getFormatter( final JFormattedTextField ftf )
87 {
88 return new AbstractFormatter()
89 {
90
91 public Object stringToValue( final String text ) throws ParseException
92 {
93 Object value = null;
94
95 if ( text != null && text.trim().length() > 0 )
96 {
97 value = Bankleitzahl.parse( text );
98 }
99
100 return value;
101 }
102
103 public String valueToString( final Object value ) throws ParseException
104 {
105 String ret = null;
106
107 if ( value instanceof Bankleitzahl )
108 {
109 final Bankleitzahl blz = (Bankleitzahl) value;
110 ret = blz.format( getFormat() );
111 }
112
113 return ret;
114 }
115
116 protected DocumentFilter getDocumentFilter()
117 {
118 return new DocumentFilter()
119 {
120
121 public void insertString( final FilterBypass fb, final int o, String s,
122 final AttributeSet a ) throws BadLocationException
123 {
124 if ( isValidating() )
125 {
126 final StringBuffer b = new StringBuffer( fb.getDocument().getLength() + s.length() );
127 b.append( fb.getDocument().getText( 0, fb.getDocument().getLength() ) );
128 b.insert( o, s );
129
130 try
131 {
132 Bankleitzahl.parse( b.toString() );
133 }
134 catch ( ParseException e )
135 {
136 invalidEdit();
137 return;
138 }
139 }
140
141 super.insertString( fb, o, s, a );
142 }
143
144 public void replace( final FilterBypass fb, final int o, final int l, String s,
145 final AttributeSet a ) throws BadLocationException
146 {
147 if ( isValidating() )
148 {
149 final StringBuffer b = new StringBuffer(
150 fb.getDocument().getText( 0, fb.getDocument().getLength() ) );
151
152 b.delete( o, o + l );
153
154 if ( s != null )
155 {
156 b.insert( o, s );
157 }
158
159 try
160 {
161 Bankleitzahl.parse( b.toString() );
162 }
163 catch ( ParseException e )
164 {
165 invalidEdit();
166 return;
167 }
168 }
169
170 super.replace( fb, o, l, s, a );
171 }
172
173 };
174 }
175
176 };
177 }
178
179 } );
180
181 this.addPropertyChangeListener( "value", new PropertyChangeListener()
182 {
183
184 public void propertyChange( final PropertyChangeEvent evt )
185 {
186 new Thread()
187 {
188
189 public void run()
190 {
191 updateTooltip( (Bankleitzahl) evt.getNewValue() );
192 }
193
194 }.start();
195 }
196
197 } );
198 }
199
200
201
202
203
204
205 public Bankleitzahl getBankleitzahl()
206 {
207 return (Bankleitzahl) this.getValue();
208 }
209
210
211
212
213
214
215
216
217
218 public int getFormat()
219 {
220 if ( this.format == null )
221 {
222 this.format = this.getDefaultFormat();
223 }
224
225 return this.format.intValue();
226 }
227
228
229
230
231
232
233
234
235
236
237
238
239 public void setFormat( final int value )
240 {
241 if ( value != Bankleitzahl.ELECTRONIC_FORMAT && value != Bankleitzahl.LETTER_FORMAT )
242 {
243 throw new IllegalArgumentException( Integer.toString( value ) );
244 }
245
246 this.format = new Integer( value );
247 }
248
249
250
251
252
253
254
255 public boolean isValidating()
256 {
257 if ( this.validating == null )
258 {
259 this.validating = this.isDefaultValidating();
260 }
261
262 return this.validating.booleanValue();
263 }
264
265
266
267
268
269
270 public void setValidating( boolean value )
271 {
272 this.validating = Boolean.valueOf( value );
273 }
274
275
276
277
278
279
280 private void updateTooltip( final Bankleitzahl bankCode )
281 {
282 final StringBuffer tooltip = new StringBuffer( 200 );
283
284 if ( bankCode != null )
285 {
286 tooltip.append( "<html>" );
287
288 try
289 {
290 final BankleitzahlInfo headOffice = this.getBankleitzahlenVerzeichnis().getHeadOffice( bankCode );
291
292 if ( headOffice != null )
293 {
294 tooltip.append( "<b>" ).append( this.getHeadOfficeInfoMessage( this.getLocale() ) ).
295 append( "</b><br>" );
296
297 this.appendBankleitzahlInfo( headOffice, tooltip );
298 }
299 else
300 {
301 tooltip.append( new UnknownBankleitzahlMessage( bankCode ).getText( this.getLocale() ) );
302 }
303 }
304 catch ( final BankleitzahlExpirationException e )
305 {
306 tooltip.append( new BankleitzahlExpirationMessage(
307 e.getExpiredBankleitzahlInfo() ).getText( this.getLocale() ) );
308
309 tooltip.append( "<br>" ).append( new BankleitzahlReplacementMessage(
310 e.getReplacingBankleitzahlInfo() ).getText( this.getLocale() ) );
311
312 tooltip.append( "<br>" );
313 this.appendBankleitzahlInfo( e.getReplacingBankleitzahlInfo(), tooltip );
314 }
315
316 tooltip.append( "</html>" );
317 }
318
319 SwingUtilities.invokeLater( new Runnable()
320 {
321
322 public void run()
323 {
324 setToolTipText( tooltip.length() > 0 ? tooltip.toString() : null );
325 }
326
327 } );
328
329 }
330
331
332
333
334
335
336 private void assertValidProperties()
337 {
338 if ( this.getFormat() != Bankleitzahl.ELECTRONIC_FORMAT && this.getFormat() != Bankleitzahl.LETTER_FORMAT )
339 {
340 throw new PropertyException( "format", Integer.toString( this.getFormat() ) );
341 }
342 }
343
344
345
346
347
348
349
350
351
352
353
354 private StringBuffer appendBankleitzahlInfo( final BankleitzahlInfo bankleitzahlInfo, StringBuffer buf )
355 {
356 if ( bankleitzahlInfo == null )
357 {
358 throw new NullPointerException( "bankleitzahlInfo" );
359 }
360 if ( buf == null )
361 {
362 buf = new StringBuffer();
363 }
364
365 final NumberFormat zipFormat = new DecimalFormat( "#####" );
366 buf.append( "<br>" ).append( bankleitzahlInfo.getName() );
367
368 if ( bankleitzahlInfo.getDescription() != null && bankleitzahlInfo.getDescription().trim().length() > 0
369 && !bankleitzahlInfo.getName().equals( bankleitzahlInfo.getDescription() ) )
370 {
371 buf.append( " (" ).append( bankleitzahlInfo.getDescription() ).append( ")" );
372 }
373
374 buf.append( "<br>" ).append( zipFormat.format( bankleitzahlInfo.getPostalCode() ) ).append( " " ).
375 append( bankleitzahlInfo.getCity() );
376
377 buf.append( "<br>" ).append( this.getBlzInfoMessage(
378 this.getLocale(), bankleitzahlInfo.getBankCode().format( this.getFormat() ) ) );
379
380 if ( bankleitzahlInfo.getBic() != null && bankleitzahlInfo.getBic().trim().length() > 0 )
381 {
382 buf.append( "<br>" ).append( this.getBicInfoMessage( this.getLocale(), bankleitzahlInfo.getBic() ) );
383 }
384
385 if ( bankleitzahlInfo.isMarkedForDeletion() )
386 {
387 buf.append( "<br><br><b>" ).append( this.getBankleitzahlMarkedForDeletionInfoMessage(
388 this.getLocale(), this.getBankleitzahlenVerzeichnis().getDateOfExpiration() ) ).append( "</b>" );
389
390 }
391
392 return buf;
393 }
394
395
396
397
398
399
400
401
402
403
404
405 private BankleitzahlenVerzeichnis getBankleitzahlenVerzeichnis()
406 {
407 return (BankleitzahlenVerzeichnis) ContainerFactory.getContainer().
408 getDependency( this, "BankleitzahlenVerzeichnis" );
409
410 }
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425 private java.lang.Boolean isDefaultValidating()
426 {
427 return (java.lang.Boolean) ContainerFactory.getContainer().
428 getProperty( this, "defaultValidating" );
429
430 }
431
432
433
434
435
436
437 private java.lang.Integer getDefaultFormat()
438 {
439 return (java.lang.Integer) ContainerFactory.getContainer().
440 getProperty( this, "defaultFormat" );
441
442 }
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462 private String getBlzInfoMessage( final Locale locale,
463 final java.lang.String bankCode )
464 {
465 return ContainerFactory.getContainer().
466 getMessage( this, "blzInfo", locale,
467 new Object[]
468 {
469 bankCode
470 });
471
472 }
473
474
475
476
477
478
479
480
481
482
483
484 private String getBicInfoMessage( final Locale locale,
485 final java.lang.String bic )
486 {
487 return ContainerFactory.getContainer().
488 getMessage( this, "bicInfo", locale,
489 new Object[]
490 {
491 bic
492 });
493
494 }
495
496
497
498
499
500
501
502
503
504
505 private String getHeadOfficeInfoMessage( final Locale locale )
506 {
507 return ContainerFactory.getContainer().
508 getMessage( this, "headOfficeInfo", locale, null );
509
510 }
511
512
513
514
515
516
517
518
519
520
521
522 private String getBankleitzahlMarkedForDeletionInfoMessage( final Locale locale,
523 final java.util.Date deletionDate )
524 {
525 return ContainerFactory.getContainer().
526 getMessage( this, "bankleitzahlMarkedForDeletionInfo", locale,
527 new Object[]
528 {
529 deletionDate
530 });
531
532 }
533
534
535
536
537 }