/*
 * Copyright 2002-2004 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.springframework.richclient.list;

import java.util.Collection;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.binding.value.ValueChangeListener;
import org.springframework.binding.value.ValueModel;

/**
 * A list whose contents are dynamically refreshable.
 * 
 * @author Keith Donald
 */
public class DynamicListModel extends ListListModel implements ValueChangeListener {
    private static final Log logger = LogFactory.getLog(DynamicListModel.class);

    private ValueModel listItemsValueModel;

    public DynamicListModel(ValueModel listItemsValueModel) {
        super();
        setListItemsValueModel(listItemsValueModel);
    }

    public void setListItemsValueModel(ValueModel valueModel) {
        if (this.listItemsValueModel == valueModel) {
            return;
        }
        if (this.listItemsValueModel != null) {
            valueModel.removeValueChangeListener(this);
        }
        this.listItemsValueModel = valueModel;
        if (this.listItemsValueModel != null) {
            doAdd((Collection)valueModel.getValue());
            this.listItemsValueModel.addValueChangeListener(this);
        }
    }

    public void valueChanged() {
        if (logger.isDebugEnabled()) {
            logger.debug("Backing collection of items changed; refreshing list model.");
        }
        doAdd((Collection)listItemsValueModel.getValue());
    }

    private void doAdd(Collection c) {
        clear();
        if (c != null) {
            addAll(c);
        }
        sort();
    }

}
/*
 * Copyright 2002-2004 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.springframework.richclient.list;

import java.util.Collection;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.binding.value.ValueChangeListener;
import org.springframework.binding.value.ValueModel;

/**
 * A list whose contents are dynamically refreshable.
 * 
 * @author Keith Donald
 */
public class DynamicListModel extends ListListModel implements ValueChangeListener {
    private static final Log logger = LogFactory.getLog(DynamicListModel.class);

    private ValueModel listItemsValueModel;

    public DynamicListModel(ValueModel listItemsValueModel) {
        super();
        setListItemsValueModel(listItemsValueModel);
    }

    public void setListItemsValueModel(ValueModel valueModel) {
        if (this.listItemsValueModel == valueModel) {
            return;
        }
        if (this.listItemsValueModel != null) {
            this.listItemsValueModel.removeValueChangeListener(this);
        }
        this.listItemsValueModel = valueModel;
        if (this.listItemsValueModel != null) {
            doAdd((Collection)valueModel.getValue());
            this.listItemsValueModel.addValueChangeListener(this);
        }
    }

    public void valueChanged() {
        if (logger.isDebugEnabled()) {
            logger.debug("Backing collection of items changed; refreshing list model.");
        }
        doAdd((Collection)listItemsValueModel.getValue());
    }

    private void doAdd(Collection c) {
        clear();
        if (c != null) {
            addAll(c);
        }
        sort();
    }

}
fix for RCP-85 (DynamicListModel tries to remove valueChangelistener from wrong ValueModel)