/*
* 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;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.drugis.addis.entities.Study;
import com.jgoodies.binding.list.ArrayListModel;
import com.jgoodies.binding.list.ObservableList;
@SuppressWarnings("serial")
public class SelectableStudyCharTableModel extends StudyCharTableModel {
private HashMap<Study, ModifiableHolder<Boolean>> d_selectedStudiesMap = new HashMap<Study, ModifiableHolder<Boolean>>();
private ObservableList<Study> d_selectedStudiesList = new ArrayListModel<Study>();
public SelectableStudyCharTableModel(StudyListPresentation source, PresentationModelFactory pmf) {
super(source, pmf);
updateSelectedStudies();
}
private void updateSelectedStudies() {
for (Study s : getAvailableStudies()) {
if (!d_selectedStudiesMap.containsKey(s)) {
d_selectedStudiesMap.put(s, getBooleanHolder());
}
}
Set<Study> leftStudies = new HashSet<Study>(d_selectedStudiesMap.keySet());
leftStudies.removeAll(getAvailableStudies());
for (Study s : leftStudies) {
d_selectedStudiesMap.remove(s);
}
d_selectedStudiesList.clear();
d_selectedStudiesList.addAll(createSelectedStudies());
}
public ObservableList<Study> getAvailableStudies() {
return d_pm.getIncludedStudies();
}
public ObservableList<Study> getSelectedStudiesModel() {
return d_selectedStudiesList;
}
private ModifiableHolder<Boolean> getBooleanHolder() {
ModifiableHolder<Boolean> holder = new ModifiableHolder<Boolean>();
holder.setValue(true);
holder.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
d_selectedStudiesList.clear();
d_selectedStudiesList.addAll(createSelectedStudies());
}
});
return holder;
}
private List<Study> createSelectedStudies() {
List<Study> selectedStudyList = new ArrayList<Study>();
for (Study s : getAvailableStudies()) {
if (d_selectedStudiesMap.get(s).getValue() ) {
selectedStudyList.add(s);
}
}
return selectedStudyList;
}
/**
*
* @see org.drugis.addis.presentation.SelectableStudyListPresentation#getSelectedStudyBooleanModel(org.drugis.addis.entities.Study)
* @throws IllegalArgumentException if !getIncludedStudies().getValue().contains(s)
*/
public ModifiableHolder<Boolean> getSelectedStudyBooleanModel(Study s) throws IllegalArgumentException{
if (!getAvailableStudies().contains(s)) {
throw new IllegalArgumentException();
}
return d_selectedStudiesMap.get(s);
}
@Override
public int getColumnCount() {
return super.getColumnCount() + 1;
}
@Override
public Class<?> getColumnClass(int c) {
if (getRowCount() < 1) {
return Object.class;
}
Object value = getValueAt(0, c);
return (value == null ? Object.class : value.getClass());
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex < 0 || columnIndex >= getColumnCount()) {
throw new IndexOutOfBoundsException("column index (" + columnIndex + ") out of bounds");
}
if (rowIndex < 0 || rowIndex >= getRowCount()) {
throw new IndexOutOfBoundsException("row index (" + rowIndex + ") out of bounds");
}
if (columnIndex == 0) {
return getSelectedModelByRow(rowIndex).getValue();
}
return super.getValueAt(rowIndex, columnIndex - 1);
}
private ModifiableHolder<Boolean> getSelectedModelByRow(int rowIndex) {
return getSelectedStudyBooleanModel(getAvailableStudies().get(rowIndex));
}
@Override
public String getColumnName(int columnIndex) {
if (columnIndex == 0) {
return "";
}
return super.getColumnName(columnIndex - 1);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 0;
}
@Override
public void setValueAt(Object newValue, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
getSelectedModelByRow(rowIndex).setValue((Boolean) newValue);
}
}
@Override
protected void includedStudiesListChanged() {
updateSelectedStudies();
}
}