001 // Copyright 2006-2007 Daniel Gredler 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package net.sf.beanform; 016 017 import java.util.List; 018 019 import net.sf.beanform.prop.BeanProperty; 020 import net.sf.beanform.validator.CachingValidatorFactory; 021 022 import org.apache.hivemind.ApplicationRuntimeException; 023 import org.apache.tapestry.IComponent; 024 import org.apache.tapestry.form.IPropertySelectionModel; 025 import org.apache.tapestry.form.validator.Validator; 026 027 /** 028 * A low level BeanForm component that renders fields for all the properties. 029 * This component must be wrapped by a {@link BeanFormRows} component. 030 * 031 * @author Daniel Gredler 032 */ 033 public abstract class BeanFormField extends BeanFormRowComponent { 034 035 public final static String PROPERTYSELECTION_FIELD_ID = "propertySelection"; 036 public final static String TEXTFIELD_FIELD_ID = "textField"; 037 public final static String TEXTAREA_FIELD_ID = "textArea"; 038 public final static String CHECKBOX_FIELD_ID = "checkbox"; 039 public final static String DATEPICKER_FIELD_ID = "datePicker"; 040 public final static String UPLOAD_FIELD_ID = "upload"; 041 public final static String INSERT_FIELD_ID = "insert"; 042 043 final static String PROPERTYSELECTION_BLOCK_ID = "propertySelectionBlock"; 044 final static String CUSTOM_BLOCK_ID = "customBlock"; 045 final static String TEXTFIELD_BLOCK_ID = "textFieldBlock"; 046 final static String TEXTAREA_BLOCK_ID = "textAreaBlock"; 047 final static String CHECKBOX_BLOCK_ID = "checkboxBlock"; 048 final static String DATEPICKER_BLOCK_ID = "datePickerBlock"; 049 final static String UPLOAD_BLOCK_ID = "uploadBlock"; 050 final static String INSERT_BLOCK_ID = "insertBlock"; 051 052 public abstract CachingValidatorFactory getValidatorFactory(); 053 054 public IComponent getFieldBlock() { 055 BeanProperty property = this.getProperty(); 056 if( this.hasPropertySelectionModel( property, true ) ) return this.getComponent( PROPERTYSELECTION_BLOCK_ID ); 057 else if( this.hasCustomField( property ) ) return this.getComponent( CUSTOM_BLOCK_ID ); 058 else if( property.usesTextField() ) return this.getComponent( TEXTFIELD_BLOCK_ID ); 059 else if( property.usesTextArea() ) return this.getComponent( TEXTAREA_BLOCK_ID ); 060 else if( property.usesCheckbox() ) return this.getComponent( CHECKBOX_BLOCK_ID ); 061 else if( property.usesDatePicker() ) return this.getComponent( DATEPICKER_BLOCK_ID ); 062 else if( property.usesUpload() ) return this.getComponent( UPLOAD_BLOCK_ID ); 063 else if( property.usesInsert() ) return this.getComponent( INSERT_BLOCK_ID ); 064 else { 065 String msg = BeanFormMessages.cantFindFieldForProperty( property ); 066 throw new ApplicationRuntimeException( msg ); 067 } 068 } 069 070 public String getFieldId() { 071 String id = this.getProperty().getName(); 072 id = id.replace( '.', '_' ); 073 return id; 074 } 075 076 public Object getValue() { 077 BeanProperty property = this.getProperty(); 078 if( property.isReadable() == false ) return null; 079 property.setBean( this.getBean() ); 080 return property.getValue(); 081 } 082 083 public void setValue( Object value ) { 084 BeanProperty property = this.getProperty(); 085 property.setBean( this.getBean() ); 086 property.setValue( value ); 087 } 088 089 public boolean getDisabled() { 090 return ( this.getProperty().isWriteable() == false ); 091 } 092 093 public List<Validator> getValidators() { 094 BeanProperty property = this.getProperty(); 095 CachingValidatorFactory factory = this.getValidatorFactory(); 096 List<Validator> validators = factory.constructValidatorList( this, property ); 097 return validators; 098 } 099 100 public IPropertySelectionModel getPropertySelectionModel() { 101 BeanProperty property = this.getProperty(); 102 return this.getPropertySelectionModel( property, true ); 103 } 104 105 }