View Javadoc
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 }