1 /*
2 * jDTAUS Banking Utilities
3 * Copyright (C) 2005 Christian Schulte
4 * <cs@schulte.it>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
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.Referenznummer11;
31 import org.jdtaus.core.container.ContainerFactory;
32 import org.jdtaus.core.container.PropertyException;
33
34 /**
35 * {@code JFormattedTextField} supporting the {@code Referenznummer11} type.
36 * <p>This textfield uses the {@link Referenznummer11} type for parsing and formatting. An empty string value is treated
37 * as {@code null}. Property {@code format} controls formatting and takes one of the format constants defined in class
38 * {@code Referenznummer11}. By default the {@code ELECTRONIC_FORMAT} is used. The {@code validating} flag controls
39 * validation of values entered into the textfield. If {@code true} (default), a {@code DocumentFilter} is registered
40 * with the textfield disallowing invalid values, that is, values which are not {@code null} and not empty strings and
41 * for which the {@link Referenznummer11#parse(String)} method throws a {@code ParseException}.</p>
42 *
43 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
44 * @version $JDTAUS: Referenznummer11TextField.java 8864 2014-01-10 17:13:30Z schulte $
45 */
46 public final class Referenznummer11TextField extends JFormattedTextField
47 {
48
49 /** Serial version UID for backwards compatibility with 1.1.x classes. */
50 private static final long serialVersionUID = 47899058115334464L;
51
52 /**
53 * Format used when formatting Referenznummer11 instances.
54 * @serial
55 */
56 private Integer format;
57
58 /**
59 * Flag indicating if validation is performed.
60 * @serial
61 */
62 private Boolean validating;
63
64 /** Creates a new default {@code Referenznummer11TextField} instance. */
65 public Referenznummer11TextField()
66 {
67 super();
68 this.assertValidProperties();
69 this.setColumns( Referenznummer11.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 = Referenznummer11.parse( text );
85 }
86
87 return value;
88 }
89
90 public String valueToString( final Object value )
91 throws ParseException
92 {
93 String ret = null;
94
95 if ( value instanceof Referenznummer11 )
96 {
97 final Referenznummer11 ref = (Referenznummer11) value;
98 ret = ref.format( getFormat() );
99 }
100
101 return ret;
102 }
103
104 protected DocumentFilter getDocumentFilter()
105 {
106 return new DocumentFilter()
107 {
108
109 public void insertString( final FilterBypass fb, final int o, String s,
110 final AttributeSet a ) throws BadLocationException
111 {
112 if ( isValidating() )
113 {
114 final StringBuffer b = new StringBuffer( fb.getDocument().getLength() + s.length() );
115 b.append( fb.getDocument().getText( 0, fb.getDocument().getLength() ) );
116 b.insert( o, s );
117
118 try
119 {
120 Referenznummer11.parse( b.toString() );
121 }
122 catch ( ParseException e )
123 {
124 invalidEdit();
125 return;
126 }
127 }
128
129 super.insertString( fb, o, s, a );
130 }
131
132 public void replace( final FilterBypass fb, final int o, final int l, String s,
133 final AttributeSet a ) throws BadLocationException
134 {
135 if ( isValidating() )
136 {
137 final StringBuffer b = new StringBuffer(
138 fb.getDocument().getText( 0, fb.getDocument().getLength() ) );
139
140 b.delete( o, o + l );
141
142 if ( s != null )
143 {
144 b.insert( o, s );
145 }
146
147 try
148 {
149 Referenznummer11.parse( b.toString() );
150 }
151 catch ( ParseException e )
152 {
153 invalidEdit();
154 return;
155 }
156 }
157
158 super.replace( fb, o, l, s, a );
159 }
160
161 };
162 }
163
164 };
165 }
166
167 } );
168 }
169
170 /**
171 * Gets the last valid {@code Referenznummer11}.
172 *
173 * @return the last valid {@code Referenznummer11} or {@code null}.
174 */
175 public Referenznummer11 getReferenznummer11()
176 {
177 return (Referenznummer11) this.getValue();
178 }
179
180 /**
181 * Gets the constant of the format used when formatting Referenznummer11 instances.
182 *
183 * @return the constant of the format used when formatting Referenznummer11 instances.
184 *
185 * @see Referenznummer11#ELECTRONIC_FORMAT
186 * @see Referenznummer11#LETTER_FORMAT
187 */
188 public int getFormat()
189 {
190 if ( this.format == null )
191 {
192 this.format = this.getDefaultFormat();
193 }
194
195 return this.format.intValue();
196 }
197
198 /**
199 * Sets the constant of the format to use when formatting Referenznummer11 instances.
200 *
201 * @param value the constant of the format to use when formatting Referenznummer11 instances.
202 *
203 * @throws IllegalArgumentException if {@code format} is neither {@code ELECTRONIC_FORMAT} nor
204 * {@code LETTER_FORMAT}.
205 *
206 * @see Referenznummer11#ELECTRONIC_FORMAT
207 * @see Referenznummer11#LETTER_FORMAT
208 */
209 public void setFormat( final int value )
210 {
211 if ( value != Referenznummer11.ELECTRONIC_FORMAT && value != Referenznummer11.LETTER_FORMAT )
212 {
213 throw new IllegalArgumentException( Integer.toString( value ) );
214 }
215
216 this.format = new Integer( value );
217 }
218
219 /**
220 * Gets the flag indicating if validation is performed.
221 *
222 * @return {@code true} if the field's value is validated; {@code false} if no validation of the field's value is
223 * performed.
224 */
225 public boolean isValidating()
226 {
227 if ( this.validating == null )
228 {
229 this.validating = this.isDefaultValidating();
230 }
231
232 return this.validating.booleanValue();
233 }
234
235 /**
236 * Sets the flag indicating if validation should be performed.
237 *
238 * @param value {@code true} to validate the field's value; {@code false} to not validate the field's value.
239 */
240 public void setValidating( boolean value )
241 {
242 this.validating = Boolean.valueOf( value );
243 }
244
245 /**
246 * Checks configured properties.
247 *
248 * @throws PropertyException for invalid property values.
249 */
250 private void assertValidProperties()
251 {
252 if ( this.getFormat() != Referenznummer11.ELECTRONIC_FORMAT
253 && this.getFormat() != Referenznummer11.LETTER_FORMAT )
254 {
255 throw new PropertyException( "format", Integer.toString( this.getFormat() ) );
256 }
257 }
258
259 //--Properties--------------------------------------------------------------
260
261 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausProperties
262 // This section is managed by jdtaus-container-mojo.
263
264 /**
265 * Gets the value of property <code>defaultValidating</code>.
266 *
267 * @return Default value of the flag indicating if validation should be performed.
268 */
269 private java.lang.Boolean isDefaultValidating()
270 {
271 return (java.lang.Boolean) ContainerFactory.getContainer().
272 getProperty( this, "defaultValidating" );
273
274 }
275
276 /**
277 * Gets the value of property <code>defaultFormat</code>.
278 *
279 * @return Default value of the format to use when formatting Referenznummer11 instances (6001 = electronic format, 6002 letter format).
280 */
281 private java.lang.Integer getDefaultFormat()
282 {
283 return (java.lang.Integer) ContainerFactory.getContainer().
284 getProperty( this, "defaultFormat" );
285
286 }
287
288 // </editor-fold>//GEN-END:jdtausProperties
289
290 //--------------------------------------------------------------Properties--
291 }