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 ; 12 import java.util.Calendar ; 13 import java.util.TimeZone ; 14 import java.util.Date ; 15 import java.util.Locale ; 16 import com.teamkonzept.international.LanguageManager; 17 import org.w3c.dom.Element ; 18 import org.w3c.dom.DOMException ; 19 import org.apache.log4j.Category; 20 21 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 37 public static final String CLASS_ID = "DATE"; 38 public static final String SET_ON_CREATE_KEY = "SETCREATE"; 39 public static final String SET_ON_SAVE_KEY = "SETSAVE"; 40 public static final String CHANGEABLE_KEY = "CHANGE"; 41 public static final String WITH_TIME_KEY = "WITHTIME"; 42 43 public static final String DATE_KEY = "DATE"; 44 public static final String DAY_KEY = "DAY"; 45 public static final String MONTH_KEY = "MONTH"; 46 public static final String YEAR_KEY = "YEAR"; 47 public static final String HOUR_KEY = "HOUR"; 48 public static final String MINUTE_KEY = "MINUTE"; 49 50 public static final String YES_VALUE = "YES"; 51 public static final String NO_VALUE = "NO"; 52 53 54 public static final Locale 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 fDateFormat; 62 private DateFormat shortDateFormat; 63 64 67 public TKDateField () 68 { 69 super(); 70 } 71 72 public TKDateField( String name, String showName ) 73 { 74 this( name, showName, true, false, true, true ); 75 } 76 77 public TKDateField( String name, String 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 type, String name, String 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 } 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 classId, Object initData ) 129 throws 130 TKUnregisteredClassException, 131 ClassNotFoundException , 132 InstantiationException , 133 IllegalAccessException 134 { 135 super.init( classId, initData ); 136 TKHashtable data = (TKHashtable) initData; 137 fSetOnCreate = ((String )data.get(SET_ON_CREATE_KEY)).equals( YES_VALUE ); 138 fSetOnSave = ((String )data.get(SET_ON_SAVE_KEY)).equals( YES_VALUE ); 139 fChangeable = ((String )data.get(CHANGEABLE_KEY)).equals( YES_VALUE ); 140 fWithTime = ((String )data.get(WITH_TIME_KEY)).equals( YES_VALUE ); 141 initCalendar(); 142 } 143 144 149 public Object 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 getDefault() 160 { 161 return fDateFormat.format(fSetOnCreate ? new Date () : new Date (0)); 162 } 163 164 public Object compileData( String prefix, TKHashtable data, TKHashtable context ) 165 { 166 String result = null; 167 if( fChangeable ) 168 { 169 prefix += fieldName+"."; 170 try { 171 int day = Integer.parseInt( (String ) data.get( prefix+DAY_KEY ) ); 172 int month = Integer.parseInt( (String ) data.get( prefix+MONTH_KEY ) )-1; 173 int year = Integer.parseInt( (String ) data.get( prefix+YEAR_KEY ) ); 174 int hour = !fWithTime ? 0 : Integer.parseInt( (String ) data.get( prefix+HOUR_KEY ) ); 175 int minute = !fWithTime ? 0 : Integer.parseInt( (String ) data.get( prefix+MINUTE_KEY ) ); 176 Calendar c = fDateFormat.getCalendar(); 177 c.set( year, month, day, hour, minute ); 178 result = fDateFormat.format( c.getTime() ); 179 } 180 catch( Exception e ) { 181 CATEGORY.error("compileData: " ,e); 182 } 183 } 184 else { 185 result = (String ) data.get( prefix+getName() ); 186 } 187 if( result == null ) return getDefault(); 188 return result; 189 } 190 191 public void fillIntoTemplate( TKHTMLTemplate t, Object value, String 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 ) { 202 203 Date date; 204 try { 205 date = fDateFormat.parse( (String ) value ); 206 } 207 catch( java.text.ParseException e ) { 208 return; 209 } 210 Calendar c = fDateFormat.getCalendar(); 211 c.setTime( date ); 212 t.set( DAY_KEY, new Integer ( c.get( Calendar.DAY_OF_MONTH ) ) ); 213 t.set( MONTH_KEY, new Integer ( c.get( Calendar.MONTH )+1 ) ); 214 int year = c.get(Calendar.YEAR); 215 216 217 t.set( YEAR_KEY, new Integer ( getCorrectedYear(year, (String ) value) ) ); 218 if( fWithTime ) { 219 t.set( HOUR_KEY, new Integer ( c.get( Calendar.HOUR_OF_DAY ) ) ); 220 t.set( MINUTE_KEY, new Integer ( c.get( Calendar.MINUTE ) ) ); 221 } 222 } 223 } 224 225 private int getCorrectedYear(int year, String data) 227 { 228 if (year < THOUSAND) 229 { 230 Date date; 231 try { 232 date = shortDateFormat.parse( (String ) data ); 233 } 234 catch( java.text.ParseException e ) { 235 return 0; 236 } 237 Calendar 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 data, String scope ) 244 { 245 super.fillIntoPresentation( t, data, scope ); 246 if( data instanceof String ) { 247 248 Date date; 249 try { 250 date = fDateFormat.parse( (String ) data ); 251 } 252 catch( java.text.ParseException e ) { 253 return; 254 } 255 Calendar 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 ( getCorrectedYear(c.get( Calendar.YEAR ), (String ) 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 node, Object data) throws DOMException 267 { 268 super.fillAttributesIntoNode(node, data); 269 if( data instanceof String ) 270 { 271 Date date; 272 try { 273 date = fDateFormat.parse( (String ) data ); 274 } 275 catch( java.text.ParseException e ) { 276 return; 277 } 278 Calendar 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 ) 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 classId, TKFormDBData db, TKVector otherFields ) 289 throws 290 TKUnregisteredClassException, 291 ClassNotFoundException , 292 InstantiationException , 293 IllegalAccessException 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 data, int contentId, int leftNr ) 314 { 315 if( fSetOnSave ) { 316 data = fDateFormat.format( new Date () ); 317 } 318 return super.insertDataIntoDB( db, data, contentId, leftNr ); 319 } 320 321 330 public boolean equals (Object 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 350 public int hashCode () 351 { 352 return super.hashCode(); 354 } 355 356 } 357 | Popular Tags |