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 }