001    package org.springframework.binding.form.support;
002    
003    import org.springframework.binding.form.FieldMetadata;
004    import org.springframework.binding.form.FormModel;
005    import org.springframework.binding.value.support.AbstractPropertyChangePublisher;
006    
007    import java.beans.PropertyChangeEvent;
008    import java.beans.PropertyChangeListener;
009    import java.util.HashMap;
010    import java.util.Map;
011    
012    /**
013     * FieldMetadata implementation for read-only properties
014     */
015    public class ReadOnlyFieldMetadata extends AbstractPropertyChangePublisher implements FieldMetadata {
016    
017            private Class propertyType;
018    
019            private boolean enabled = true;
020    
021            private boolean oldEnabled;
022    
023            private FormModel formModel;
024    
025            private final PropertyChangeListener formChangeHandler = new FormModelChangeHandler();
026    
027        private final Map userMetadata = new HashMap();
028    
029            public ReadOnlyFieldMetadata(FormModel formModel, Class propertyType) {
030                    this(formModel, propertyType, null);
031            }
032    
033            public ReadOnlyFieldMetadata(FormModel formModel, Class propertyType, Map userMetadata) {
034                    this.propertyType = propertyType;
035                    this.formModel = formModel;
036                    this.formModel.addPropertyChangeListener(ENABLED_PROPERTY, formChangeHandler);
037            if(userMetadata != null) {
038                this.userMetadata.putAll(userMetadata);
039            }
040            }
041    
042            public Map getAllUserMetadata() {
043                    return userMetadata;
044            }
045    
046            public Class getPropertyType() {
047                    return propertyType;
048            }
049    
050            public Object getUserMetadata(String key) {
051                    return userMetadata.get(key);
052            }
053    
054            public boolean isDirty() {
055                    return false;
056            }
057    
058        public boolean isEnabled() {
059            return enabled && formModel.isEnabled();
060        }
061    
062            public boolean isReadOnly() {
063                    return true;
064            }
065    
066        public void setEnabled(boolean enabled) {
067            this.enabled = enabled;
068            firePropertyChange(ENABLED_PROPERTY, oldEnabled, isEnabled());
069            oldEnabled = isEnabled();
070        }
071    
072            public void setReadOnly(boolean readOnly) {
073            }
074    
075        /**
076         * Responsible for listening for changes to the enabled
077         * property of the FormModel
078         */
079        private class FormModelChangeHandler implements PropertyChangeListener {
080            public void propertyChange(PropertyChangeEvent evt) {
081                if (FormModel.ENABLED_PROPERTY.equals(evt.getPropertyName())) {
082                    firePropertyChange(ENABLED_PROPERTY, Boolean.valueOf(oldEnabled), Boolean.valueOf(isEnabled()));
083                    oldEnabled = isEnabled();
084                }
085            }
086        }
087    }