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.Iterator; 018 import java.util.Map; 019 020 import net.sf.beanform.prop.BeanProperty; 021 022 import org.apache.hivemind.ApplicationRuntimeException; 023 import org.apache.tapestry.IComponent; 024 import org.apache.tapestry.form.IFormComponent; 025 026 /** 027 * A low level BeanForm component that renders labels for all the properties. 028 * This component must be wrapped by a {@link BeanFormRows} component. 029 * 030 * @author Daniel Gredler 031 */ 032 public abstract class BeanFormLabel extends BeanFormRowComponent { 033 034 final static String PROPERTYSELECTION_BLOCK_ID = "propertySelectionBlock"; 035 final static String CUSTOM_BLOCK_ID = "customBlock"; 036 final static String TEXTFIELD_BLOCK_ID = "textFieldBlock"; 037 final static String TEXTAREA_BLOCK_ID = "textAreaBlock"; 038 final static String CHECKBOX_BLOCK_ID = "checkboxBlock"; 039 final static String DATEPICKER_BLOCK_ID = "datePickerBlock"; 040 final static String UPLOAD_BLOCK_ID = "uploadBlock"; 041 final static String INSERT_BLOCK_ID = "insertBlock"; 042 043 public IComponent getLabelBlock() { 044 BeanProperty property = this.getProperty(); 045 if( this.hasPropertySelectionModel( property, true ) ) return this.getComponent( PROPERTYSELECTION_BLOCK_ID ); 046 else if( this.hasCustomField( property ) ) return this.getComponent( CUSTOM_BLOCK_ID ); 047 else if( property.usesTextField() ) return this.getComponent( TEXTFIELD_BLOCK_ID ); 048 else if( property.usesTextArea() ) return this.getComponent( TEXTAREA_BLOCK_ID ); 049 else if( property.usesCheckbox() ) return this.getComponent( CHECKBOX_BLOCK_ID ); 050 else if( property.usesDatePicker() ) return this.getComponent( DATEPICKER_BLOCK_ID ); 051 else if( property.usesUpload() ) return this.getComponent( UPLOAD_BLOCK_ID ); 052 else if( property.usesInsert() ) return this.getComponent( INSERT_BLOCK_ID ); 053 else { 054 String msg = BeanFormMessages.cantFindFieldForProperty( property ); 055 throw new ApplicationRuntimeException( msg ); 056 } 057 } 058 059 public IFormComponent getPropertySelection() { 060 return this.getField( BeanFormField.PROPERTYSELECTION_FIELD_ID ); 061 } 062 063 public IFormComponent getTextField() { 064 return this.getField( BeanFormField.TEXTFIELD_FIELD_ID ); 065 } 066 067 public IFormComponent getTextArea() { 068 return this.getField( BeanFormField.TEXTAREA_FIELD_ID ); 069 } 070 071 public IFormComponent getCheckbox() { 072 return this.getField( BeanFormField.CHECKBOX_FIELD_ID ); 073 } 074 075 public IFormComponent getDatePicker() { 076 return this.getField( BeanFormField.DATEPICKER_FIELD_ID ); 077 } 078 079 public IFormComponent getUpload() { 080 return this.getField( BeanFormField.UPLOAD_FIELD_ID ); 081 } 082 083 /** 084 * Called whenever a label needs its field. This method expects the label's "prerender" 085 * attribute to be set to <tt>true</tt> (the default), as it adds any extra user-specified 086 * informal bindings to the field before returning it, in anticipation of a prerender. 087 */ 088 private IFormComponent getField( String id ) { 089 IFormComponent field = null; 090 Map siblings = this.getContainer().getComponents(); 091 for( Iterator i = siblings.values().iterator(); i.hasNext(); ) { 092 IComponent sibling = (IComponent) i.next(); 093 if( sibling instanceof BeanFormField ) { 094 field = (IFormComponent) sibling.getComponent( id ); 095 this.addExtraBindings( field ); 096 break; 097 } 098 } 099 return field; 100 } 101 102 }