/* * 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.HashMap; import java.util.Map; import javax.swing.table.AbstractTableModel; import org.drugis.addis.entities.Arm; import org.drugis.addis.entities.MeasurementKey; import org.drugis.addis.entities.Study; import org.drugis.addis.entities.StudyOutcomeMeasure; import org.drugis.addis.entities.Variable; import org.drugis.addis.entities.WhenTaken; import org.drugis.addis.gui.CategoryKnowledgeFactory; import org.drugis.addis.presentation.wizard.MissingMeasurementPresentation; @SuppressWarnings("serial") public class StudyMeasurementTableModel extends AbstractTableModel { protected Study d_study; private PresentationModelFactory d_pmf; private Class<? extends Variable> d_type; protected MyMeasurementListener d_measurementListener = new MyMeasurementListener(); private Map<MeasurementKey, MissingMeasurementPresentation> d_mmpMap = new HashMap<MeasurementKey, MissingMeasurementPresentation>(); private final boolean d_hasOverallColumn; public StudyMeasurementTableModel(Study study, PresentationModelFactory pmf, Class<? extends Variable> type, boolean hasOverallColumn) { d_study = study; d_pmf = pmf; d_type = type; d_hasOverallColumn = hasOverallColumn; initTable(); } @Override public Class<?> getColumnClass(int columnIndex) { if(isVariableColumn(columnIndex)) { return String.class; } else if (isMeasurementMomentColumn(columnIndex)) { return WhenTaken.class; } else { return MissingMeasurementPresentation.class; } } private void initTable() { for (Arm a : d_study.getArms()) { initVariables(a); } if(d_hasOverallColumn) { initVariables(null); } } private void initVariables(Arm a) { for (StudyOutcomeMeasure<? extends Variable> v : d_study.getStudyOutcomeMeasures(d_type)) { for (WhenTaken wt : v.getWhenTaken()) { MissingMeasurementPresentation mmp = new MissingMeasurementPresentation(d_study, v, wt, a); d_mmpMap.put(new MeasurementKey(v, a, wt), mmp); mmp.getMeasurement().addPropertyChangeListener(d_measurementListener); mmp.getMissingModel().addValueChangeListener(d_measurementListener); } } } public int getColumnCount() { return d_study.getArms().size() + 2 + (d_hasOverallColumn ? 1 : 0); } public int getRowCount() { int n = 0; for (StudyOutcomeMeasure<? extends Variable> var : d_study.getStudyOutcomeMeasures(d_type)) { n += var.getWhenTaken().size(); } return n; } @Override public boolean isCellEditable(int row, int col) { return false; } @Override public String getColumnName(int col) { if (isVariableColumn(col)) { return CategoryKnowledgeFactory.getCategoryKnowledge(d_type).getSingularCapitalized(); } else if (isMeasurementMomentColumn(col)) { return "Measurement moment"; } else if (isOverallColumn(col)) { return "Overall"; } return d_pmf.getLabeledModel(d_study.getArms().get(col-2)).getLabelModel().getString(); } private boolean isOverallColumn(int col) { return d_hasOverallColumn ? col == getColumnCount() - 1 : false; } private boolean isVariableColumn(int col) { return col == 0; } private boolean isMeasurementMomentColumn(int col) { return col == 1; } public Object getValueAt(int rowIndex, int columnIndex) { Key key = getKeyAt(rowIndex, columnIndex); if (isVariableColumn(columnIndex)) { return key.v.getValue().getName(); } if (isMeasurementMomentColumn(columnIndex)) { return key.wt; } return d_mmpMap.get(key.getMeasurementKey()); } private static class Key { public final StudyOutcomeMeasure<? extends Variable> v; public final WhenTaken wt; public final Arm a; public Key(StudyOutcomeMeasure<? extends Variable> v, WhenTaken wt, Arm a) { this.v = v; this.wt = wt; this.a = a; } public MeasurementKey getMeasurementKey() { return new MeasurementKey(v, a, wt); } } private Key getKeyAt(int rowIndex, int columnIndex) { int index = 0; Arm arm = !isArmColumn(columnIndex) ? null : d_study.getArms().get(columnIndex - 2); for (StudyOutcomeMeasure<? extends Variable> v : d_study.getStudyOutcomeMeasures(d_type)) { for (WhenTaken wt : v.getWhenTaken()) { if (index == rowIndex) { return new Key(v, wt, arm); } else { ++index; } } } throw new IndexOutOfBoundsException("Index out of bounds: " + rowIndex + ", " + columnIndex); } private boolean isArmColumn(int columnIndex) { return !(isOverallColumn(columnIndex) || isMeasurementMomentColumn(columnIndex) || isVariableColumn(columnIndex)); } private class MyMeasurementListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent ev) { fireTableDataChanged(); } } }