001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.binding.value.support;
017
018 import java.beans.PropertyChangeEvent;
019 import java.beans.PropertyChangeListener;
020
021 import org.apache.commons.logging.Log;
022 import org.apache.commons.logging.LogFactory;
023 import org.springframework.binding.value.ValueModel;
024
025 /**
026 * Abstract base class for objects that adapt a value model to some other
027 * model. e.g. a GUI component.
028 *
029 * @author Oliver Hutchison
030 */
031 public abstract class AbstractValueModelAdapter {
032 protected static final Log logger = LogFactory.getLog(AbstractValueModelAdapter.class);
033
034 private final ValueModelChangeHandler valueModelChangeHandler = new ValueModelChangeHandler();
035
036 private ValueModel valueModel;
037
038 public AbstractValueModelAdapter(ValueModel valueModel) {
039 this.valueModel = valueModel;
040 this.valueModel.addValueChangeListener(valueModelChangeHandler);
041 }
042
043 /**
044 * Must be called to initialize the adapted value. Usually the
045 * last call in the constructor.
046 */
047 protected void initalizeAdaptedValue() {
048 valueModelValueChanged(valueModel.getValue());
049 }
050
051 protected ValueModel getValueModel() {
052 return valueModel;
053 }
054
055 /**
056 * Subclasses must called this when the value being adapted has changed.
057 *
058 * @param newValue the new adapted value
059 */
060 protected void adaptedValueChanged(Object newValue) {
061 if (valueModel != null) {
062 valueModel.setValueSilently(newValue, valueModelChangeHandler);
063 }
064 }
065
066 /**
067 * Called when the value held by the value model has changes
068 *
069 * @param newValue the new value held by the value model
070 */
071 protected abstract void valueModelValueChanged(Object newValue);
072
073 private class ValueModelChangeHandler implements PropertyChangeListener {
074 public void propertyChange(PropertyChangeEvent evt) {
075 valueModelValueChanged(valueModel.getValue());
076 }
077 }
078 }