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.richclient.list;
017    
018    import java.beans.PropertyChangeEvent;
019    import java.beans.PropertyChangeListener;
020    import java.util.Collection;
021    
022    import org.apache.commons.logging.Log;
023    import org.apache.commons.logging.LogFactory;
024    import org.springframework.binding.value.ValueModel;
025    import org.springframework.binding.value.support.ListListModel;
026    
027    /**
028     * A list whose contents are dynamically refreshable.
029     * 
030     * @author Keith Donald
031     */
032    public class DynamicListModel extends ListListModel implements PropertyChangeListener {
033        private static final Log logger = LogFactory.getLog(DynamicListModel.class);
034    
035        private ValueModel listItemsValueModel;
036    
037        public DynamicListModel(ValueModel listItemsValueModel) {
038            super();
039            setListItemsValueModel(listItemsValueModel);
040        }
041    
042        public void setListItemsValueModel(ValueModel valueModel) {
043            if (this.listItemsValueModel == valueModel) {
044                return;
045            }
046            if (this.listItemsValueModel != null) {
047                this.listItemsValueModel.removeValueChangeListener(this);
048            }
049            this.listItemsValueModel = valueModel;
050            if (this.listItemsValueModel != null) {
051                doAdd((Collection)valueModel.getValue());
052                this.listItemsValueModel.addValueChangeListener(this);
053            }
054        }
055    
056        public void propertyChange(PropertyChangeEvent evt) {
057            if (logger.isDebugEnabled()) {
058                logger.debug("Backing collection of items changed; refreshing list model.");
059            }
060            doAdd((Collection)listItemsValueModel.getValue());
061        }
062    
063        private void doAdd(Collection c) {
064            clear();
065            if (c != null) {
066                addAll(c);
067            }
068            sort();
069        }
070    
071    }