/*
* This file is part of ADDIS (Aggregate Data Drug Information System).
* ADDIS is distributed from http://drugis.org/.
* Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen.
* Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels,
* Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel
* Reid.
* Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin
* Schimbinschi.
* Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter
* Reckman.
* Copyright © 2013 Gert van Valkenhoef, Joël Kuiper.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.drugis.addis.presentation.wizard;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.commons.collections15.Predicate;
import org.drugis.addis.presentation.ModifiableHolder;
import org.drugis.common.beans.ContentAwareListModel;
import org.drugis.common.beans.FilteredObservableList;
import org.drugis.common.beans.ReadOnlyObservableList;
import org.drugis.common.beans.SortedSetModel;
import org.drugis.common.beans.TransformedObservableList;
import org.drugis.common.beans.TransformedObservableList.Transform;
import com.jgoodies.binding.list.ObservableList;
public class SelectableOptionsModel<E extends Comparable<? super E>> {
private SortedSetModel<Option<E>> d_options = new SortedSetModel<Option<E>>();
private ObservableList<E> d_selected;
public SelectableOptionsModel() {
ObservableList<Option<E>> contentAware = new ContentAwareListModel<Option<E>>(d_options);
FilteredObservableList<Option<E>> selectedOptions = new FilteredObservableList<Option<E>>(contentAware, new Predicate<Option<E>>() {
public boolean evaluate(Option<E> obj) {
return obj.toggle.getValue();
}
});
d_selected = new TransformedObservableList<Option<E>, E>(selectedOptions, new Transform<Option<E>, E>() {
public E transform(Option<E> a) {
return a.item;
}
});
}
/**
* Remove all options.
*/
public void clear() {
d_options.clear();
}
/**
* Create a new option.
* @param option The entity that should be selectable through a ValueModel.
* @return The modifiable holder.
*/
public ModifiableHolder<Boolean> addOption(E option, boolean initialValue) {
Option<E> o = new Option<E>(option, initialValue);
d_options.add(o);
return o.toggle;
}
/**
* Create new options.
* @param option The entity that should be selectable through a ValueModel.
* @return The modifiable holder.
*/
public List<ModifiableHolder<Boolean>> addOptions(Collection<? extends E> options, boolean initialValue) {
List<ModifiableHolder<Boolean>> retVal = new ArrayList<ModifiableHolder<Boolean>>();
for (E it : options) {
retVal.add(addOption(it, initialValue));
}
return retVal;
}
public ModifiableHolder<Boolean> getSelectedModel(E option) {
int idx = Collections.binarySearch(d_options, new Option<E>(option, false));
if (idx >= 0) {
return d_options.get(idx).toggle;
}
return null;
}
public ObservableList<Option<E>> getOptions() {
return new ReadOnlyObservableList<Option<E>>(d_options);
}
/**
* Observable list of the options that are selected (set to true).
*/
public ObservableList<E> getSelectedOptions() {
return d_selected;
}
}