KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > teamkonzept > webman > field > TKDateField


1 package com.teamkonzept.webman.field;
2
3 import com.teamkonzept.lib.TKHashtable;
4 import com.teamkonzept.lib.TKVector;
5 import com.teamkonzept.lib.TKNull;
6 import com.teamkonzept.lib.TKLib;
7 import com.teamkonzept.lib.TKUnregisteredClassException;
8 import com.teamkonzept.web.TKHTMLTemplate;
9 import com.teamkonzept.field.*;
10 import com.teamkonzept.field.db.*;
11 import java.text.DateFormat JavaDoc;
12 import java.util.Calendar JavaDoc;
13 import java.util.TimeZone JavaDoc;
14 import java.util.Date JavaDoc;
15 import java.util.Locale JavaDoc;
16 import com.teamkonzept.international.LanguageManager;
17 import org.w3c.dom.Element JavaDoc;
18 import org.w3c.dom.DOMException JavaDoc;
19 import org.apache.log4j.Category;
20
21 /**
22  * The date field control.
23  *
24  * @author $Author: uli $
25  * @version $Revision: 1.17 $
26  */

27 public class TKDateField
28     extends TKAtomField
29 {
30     private static final Category CATEGORY = Category.getInstance(TKDateField.class);
31
32     final static int THOUSAND = 1000;
33
34     /**
35      * The class identifier.
36      */

37     public static final String JavaDoc CLASS_ID = "DATE";
38     public static final String JavaDoc SET_ON_CREATE_KEY = "SETCREATE";
39     public static final String JavaDoc SET_ON_SAVE_KEY = "SETSAVE";
40     public static final String JavaDoc CHANGEABLE_KEY = "CHANGE";
41     public static final String JavaDoc WITH_TIME_KEY = "WITHTIME";
42
43     public static final String JavaDoc DATE_KEY = "DATE";
44     public static final String JavaDoc DAY_KEY = "DAY";
45     public static final String JavaDoc MONTH_KEY = "MONTH";
46     public static final String JavaDoc YEAR_KEY = "YEAR";
47     public static final String JavaDoc HOUR_KEY = "HOUR";
48     public static final String JavaDoc MINUTE_KEY = "MINUTE";
49
50     public static final String JavaDoc YES_VALUE = "YES";
51     public static final String JavaDoc NO_VALUE = "NO";
52
53     /** change for localization ! */
54     public static final Locale JavaDoc DEFAULT_LOCALE = Locale.GERMAN;
55
56     protected boolean fSetOnCreate;
57     protected boolean fSetOnSave;
58     protected boolean fChangeable;
59     protected boolean fWithTime;
60
61     private DateFormat JavaDoc fDateFormat;
62     private DateFormat JavaDoc shortDateFormat;
63
64     /**
65      * Creates an empty date field control.
66      */

67     public TKDateField ()
68     {
69         super();
70     }
71
72     public TKDateField( String JavaDoc name, String JavaDoc showName )
73     {
74         this( name, showName, true, false, true, true );
75     }
76
77     public TKDateField( String JavaDoc name, String JavaDoc showName, boolean setOnCreation, boolean setOnSave, boolean changeable, boolean withTime )
78     {
79         initDateField( CLASS_ID, name, showName, setOnCreation, setOnSave, changeable, withTime );
80     }
81
82     public final void initDateField( String JavaDoc type, String JavaDoc name, String JavaDoc showName, boolean setOnCreate, boolean setOnSave, boolean changeable, boolean withTime )
83     {
84         initAtomField( type, name, showName );
85         fSetOnCreate = setOnCreate;
86         fSetOnSave = setOnSave;
87         fChangeable = changeable;
88         fWithTime = withTime;
89         initCalendar();
90     }
91
92     protected void initCalendar()
93     {
94         fDateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, DEFAULT_LOCALE);
95         shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, DEFAULT_LOCALE);
96         // fuer Linux, sollte mit Locale auch so funktionieren ...
97
// fDateFormat.setTimeZone( TimeZone.getTimeZone( "ECT" ) );
98
}
99
100     public TKFieldGroup getDefGroup(TKFieldSwitch allSwitch, TKFieldSwitchList allSwitchList)
101     {
102         TKVector options = new TKVector(2);
103         options.addElement( new TKOptionFieldEntry( LanguageManager.getText(LanguageManager.GENERAL, "YES"), YES_VALUE ) );
104         options.addElement( new TKOptionFieldEntry( LanguageManager.getText(LanguageManager.GENERAL, "NO"), NO_VALUE ) );
105
106         TKBaseField [] inputArray = {
107                 new TKInputField( NAME_KEY,
108                                   TKInputField.SMALL_DEFAULT_SIZE,
109                                   TKInputField.SMALL_DEFAULT_LENGTH,
110                                   LanguageManager.getText(LANGUAGE_CONTEXT, "DATE_NAME"),
111                                   TKInputField.CHECK_STRING),
112                 new TKInputField( SHOW_NAME_KEY,
113                                   TKInputField.LARGE_DEFAULT_SIZE,
114                                   TKInputField.LARGE_DEFAULT_LENGTH,
115                                   LanguageManager.getText(LANGUAGE_CONTEXT, "DATE_SHOWNAME"),
116                                   TKInputField.CHECK_STRING),
117                 new TKSelectField( SET_ON_CREATE_KEY, LanguageManager.getText(LANGUAGE_CONTEXT, "DATE_INITIALIZE"), options ),
118                 new TKSelectField( SET_ON_SAVE_KEY, LanguageManager.getText(LANGUAGE_CONTEXT, "DATE_UPDATE"), options ),
119                 new TKSelectField( CHANGEABLE_KEY, LanguageManager.getText(LANGUAGE_CONTEXT, "DATE_MANUAL"), options ),
120                 new TKSelectField( WITH_TIME_KEY, LanguageManager.getText(LANGUAGE_CONTEXT, "DATE_TIME_EDIT"), options )
121         };
122         TKFieldGroup inputGroup =
123                 new TKFieldGroup( CLASS_ID, new TKVector( inputArray ), LanguageManager.getText(LANGUAGE_CONTEXT, CLASS_ID) );
124
125         return inputGroup;
126     }
127
128     public void init( String JavaDoc classId, Object JavaDoc initData )
129             throws
130                     TKUnregisteredClassException,
131                     ClassNotFoundException JavaDoc,
132                     InstantiationException JavaDoc,
133                     IllegalAccessException JavaDoc
134     {
135         super.init( classId, initData );
136         TKHashtable data = (TKHashtable) initData;
137         fSetOnCreate = ((String JavaDoc)data.get(SET_ON_CREATE_KEY)).equals( YES_VALUE );
138         fSetOnSave = ((String JavaDoc)data.get(SET_ON_SAVE_KEY)).equals( YES_VALUE );
139         fChangeable = ((String JavaDoc)data.get(CHANGEABLE_KEY)).equals( YES_VALUE );
140         fWithTime = ((String JavaDoc)data.get(WITH_TIME_KEY)).equals( YES_VALUE );
141         initCalendar();
142     }
143
144     /**
145      * Returns the internal representation of this field.
146      *
147      * @return the internal representation of this field.
148      */

149     public Object JavaDoc toData ()
150     {
151         TKHashtable result = (TKHashtable) super.toData();
152         result.put( SET_ON_CREATE_KEY, ( fSetOnCreate ? YES_VALUE : NO_VALUE ) );
153         result.put( SET_ON_SAVE_KEY, ( fSetOnSave ? YES_VALUE : NO_VALUE ) );
154         result.put( CHANGEABLE_KEY, ( fChangeable ? YES_VALUE : NO_VALUE ) );
155         result.put( WITH_TIME_KEY, ( fWithTime ? YES_VALUE : NO_VALUE ) );
156         return result;
157     }
158
159     public Object JavaDoc getDefault()
160     {
161         return fDateFormat.format(fSetOnCreate ? new Date JavaDoc() : new Date JavaDoc(0));
162     }
163
164     public Object JavaDoc compileData( String JavaDoc prefix, TKHashtable data, TKHashtable context )
165     {
166         String JavaDoc result = null;
167         if( fChangeable )
168         {
169             prefix += fieldName+".";
170             try {
171                     int day = Integer.parseInt( (String JavaDoc) data.get( prefix+DAY_KEY ) );
172                     int month = Integer.parseInt( (String JavaDoc) data.get( prefix+MONTH_KEY ) )-1;
173                     int year = Integer.parseInt( (String JavaDoc) data.get( prefix+YEAR_KEY ) );
174                     int hour = !fWithTime ? 0 : Integer.parseInt( (String JavaDoc) data.get( prefix+HOUR_KEY ) );
175                     int minute = !fWithTime ? 0 : Integer.parseInt( (String JavaDoc) data.get( prefix+MINUTE_KEY ) );
176                     Calendar JavaDoc c = fDateFormat.getCalendar();
177                     c.set( year, month, day, hour, minute );
178                     result = fDateFormat.format( c.getTime() );
179             }
180             catch( Exception JavaDoc e ) {
181                 CATEGORY.error("compileData: " ,e);
182             }
183         }
184         else {
185                 result = (String JavaDoc) data.get( prefix+getName() );
186         }
187         if( result == null ) return getDefault();
188         return result;
189     }
190
191     public void fillIntoTemplate( TKHTMLTemplate t, Object JavaDoc value, String JavaDoc prefix )
192     {
193         super.fillIntoTemplate( t, value, prefix );
194
195         if( fWithTime ) t.set( WITH_TIME_KEY, Boolean.TRUE );
196
197         if( !fChangeable ) return;
198
199         t.set( CHANGEABLE_KEY, Boolean.TRUE );
200
201         if( value instanceof String JavaDoc ) {
202
203                 Date JavaDoc date;
204                 try {
205                         date = fDateFormat.parse( (String JavaDoc) value );
206                 }
207                 catch( java.text.ParseException JavaDoc e ) {
208                         return;
209                 }
210                 Calendar JavaDoc c = fDateFormat.getCalendar();
211                 c.setTime( date );
212                 t.set( DAY_KEY, new Integer JavaDoc( c.get( Calendar.DAY_OF_MONTH ) ) );
213                 t.set( MONTH_KEY, new Integer JavaDoc( c.get( Calendar.MONTH )+1 ) );
214                 int year = c.get(Calendar.YEAR);
215
216
217                 t.set( YEAR_KEY, new Integer JavaDoc( getCorrectedYear(year, (String JavaDoc) value) ) );
218                 if( fWithTime ) {
219                         t.set( HOUR_KEY, new Integer JavaDoc( c.get( Calendar.HOUR_OF_DAY ) ) );
220                         t.set( MINUTE_KEY, new Integer JavaDoc( c.get( Calendar.MINUTE ) ) );
221                 }
222         }
223     }
224
225     // fuer Legacy konvertiert alte Datumsangaben !
226
private int getCorrectedYear(int year, String JavaDoc data)
227     {
228         if (year < THOUSAND)
229         {
230             Date JavaDoc date;
231             try {
232                     date = shortDateFormat.parse( (String JavaDoc) data );
233             }
234             catch( java.text.ParseException JavaDoc e ) {
235                     return 0;
236             }
237             Calendar JavaDoc c = shortDateFormat.getCalendar();
238             c.setTime(date);
239             return c.get(Calendar.YEAR);
240         }
241         return year;
242     }
243     public void fillIntoPresentation( TKHTMLTemplate t, Object JavaDoc data, String JavaDoc scope )
244     {
245         super.fillIntoPresentation( t, data, scope );
246         if( data instanceof String JavaDoc ) {
247
248                 Date JavaDoc date;
249                 try {
250                         date = fDateFormat.parse( (String JavaDoc) data );
251                 }
252                 catch( java.text.ParseException JavaDoc e ) {
253                         return;
254                 }
255                 Calendar JavaDoc c = fDateFormat.getCalendar();
256                 c.setTime( date );
257                 scope += "."+getName()+".";
258                 t.set( scope+DAY_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.DAY_OF_MONTH ) ), 2) );
259                 t.set( scope+MONTH_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.MONTH )+1 ), 2) );
260                 t.set( scope+YEAR_KEY, new Integer JavaDoc( getCorrectedYear(c.get( Calendar.YEAR ), (String JavaDoc) data )) );
261                 t.set( scope+HOUR_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.HOUR_OF_DAY ) ), 2) );
262                 t.set( scope+MINUTE_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.MINUTE ) ), 2) );
263         }
264     }
265
266     public void fillAttributesIntoNode(Element JavaDoc node, Object JavaDoc data) throws DOMException JavaDoc
267     {
268         super.fillAttributesIntoNode(node, data);
269         if( data instanceof String JavaDoc )
270         {
271             Date JavaDoc date;
272             try {
273                     date = fDateFormat.parse( (String JavaDoc) data );
274             }
275             catch( java.text.ParseException JavaDoc e ) {
276                     return;
277             }
278             Calendar JavaDoc c = fDateFormat.getCalendar();
279             c.setTime( date );
280             node.setAttribute (DAY_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.DAY_OF_MONTH ) ), 2));
281             node.setAttribute (MONTH_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.MONTH )+1 ), 2));
282             node.setAttribute (YEAR_KEY, String.valueOf(getCorrectedYear( c.get( Calendar.YEAR ), (String JavaDoc) data) ));
283             node.setAttribute (HOUR_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.HOUR_OF_DAY ) ), 2));
284             node.setAttribute (MINUTE_KEY, TKLib.fillInt( String.valueOf( c.get( Calendar.MINUTE ) ), 2));
285         }
286     }
287
288     public void initFromDB( String JavaDoc classId, TKFormDBData db, TKVector otherFields )
289             throws
290                     TKUnregisteredClassException,
291                     ClassNotFoundException JavaDoc,
292                     InstantiationException JavaDoc,
293                     IllegalAccessException JavaDoc
294     {
295         super.initFromDB( classId, db, otherFields );
296         fSetOnCreate = Boolean.valueOf(getFieldAttribute( db, SET_ON_CREATE_KEY, 0)).booleanValue();
297         fSetOnSave = Boolean.valueOf(getFieldAttribute( db, SET_ON_SAVE_KEY, 0)).booleanValue();
298         fChangeable = Boolean.valueOf(getFieldAttribute( db, CHANGEABLE_KEY, 0)).booleanValue();
299         fWithTime = Boolean.valueOf(getFieldAttribute( db, WITH_TIME_KEY, 0)).booleanValue();
300         initCalendar();
301     }
302
303     public int realInsertIntoDB( TKFormDBData db, int formId )
304     {
305         if( super.realInsertIntoDB( db, formId ) == -1 ) return -1;
306         insertNewFieldAttribute( db, formId, SET_ON_CREATE_KEY, 0, String.valueOf( fSetOnCreate ) );
307         insertNewFieldAttribute( db, formId, SET_ON_SAVE_KEY, 0, String.valueOf( fSetOnSave ) );
308         insertNewFieldAttribute( db, formId, CHANGEABLE_KEY, 0, String.valueOf( fChangeable ) );
309         insertNewFieldAttribute( db, formId, WITH_TIME_KEY, 0, String.valueOf( fWithTime ) );
310         return fieldId;
311     }
312
313     public int insertDataIntoDB( TKContentDBData db, Object JavaDoc data, int contentId, int leftNr )
314     {
315         if( fSetOnSave ) {
316                 data = fDateFormat.format( new Date JavaDoc() );
317         }
318         return super.insertDataIntoDB( db, data, contentId, leftNr );
319     }
320
321     /**
322      * Checks wether this object and the specified object
323      * may be treated as equal.
324      *
325      * @param object the object to checked for equality.
326      * @return <CODE>true</CODE> if this object and the
327      * specified object may be treated as equal, otherwise
328      * <CODE>false</CODE>.
329      */

330     public boolean equals (Object JavaDoc object)
331     {
332         if (! super.equals(object))
333         {
334             return false;
335         }
336
337         TKDateField field = (TKDateField) object;
338
339         return (this.fSetOnCreate == field.fSetOnCreate) &&
340                (this.fSetOnSave == field.fSetOnSave) &&
341                (this.fChangeable == field.fChangeable) &&
342                (this.fWithTime == field.fWithTime);
343     }
344
345     /**
346      * Returns the hash code for this object.
347      *
348      * @return the hash code for this object.
349      */

350     public int hashCode ()
351     {
352         // Implementation for JTest only ;-(
353
return super.hashCode();
354     }
355
356 }
357
Popular Tags