/*
* 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.gui;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFormattedTextField;
import javax.swing.JTextField;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.text.DefaultFormatterFactory;
import org.drugis.addis.entities.BasicContinuousMeasurement;
import org.drugis.addis.entities.BasicMeasurement;
import org.drugis.addis.entities.BasicRateMeasurement;
import org.drugis.addis.entities.ContinuousMeasurement;
import org.drugis.addis.entities.FrequencyMeasurement;
import org.drugis.addis.entities.Measurement;
import org.drugis.addis.entities.OutcomeMeasure;
import org.drugis.addis.entities.RateMeasurement;
import org.drugis.addis.presentation.FrequencyMeasurementPresentation;
import org.drugis.addis.presentation.wizard.MissingMeasurementPresentation;
import org.drugis.addis.util.MissingValueFormat;
import com.jgoodies.binding.PresentationModel;
import com.jgoodies.binding.beans.PropertyConnector;
import com.jgoodies.binding.value.ConverterFactory;
import com.jgoodies.binding.value.ValueModel;
public class MeasurementInputHelper {
public static int numComponents(Measurement m) {
return getHeaders(m).length;
}
public static int numComponents(OutcomeMeasure e) {
return getHeaders(e).length;
}
public static String[] getHeaders(OutcomeMeasure e) {
return getHeaders(e.buildMeasurement(0));
}
public static String[] getHeaders(Measurement m) {
if (m instanceof ContinuousMeasurement) {
return new String[] {"Mean", "StdDev", "Subjects"};
} else if (m instanceof RateMeasurement) {
return new String[] {"Occurence", "Subjects"};
} else if (m instanceof FrequencyMeasurement) {
return ((FrequencyMeasurement)m).getCategories();
}
throw new IllegalStateException("Unhandled measurement type");
}
public static JTextField[] getComponents(MissingMeasurementPresentation mmp) {
DoubleFormatter doubleFormatter = new DoubleFormatter();
IntegerFormatter intFormatter = new IntegerFormatter();
BasicMeasurement m = mmp.getMeasurement();
if (m instanceof BasicContinuousMeasurement) {
PresentationModel<BasicContinuousMeasurement> model =
new PresentationModel<BasicContinuousMeasurement>((BasicContinuousMeasurement)m);
return new JTextField[] {
MeasurementInputHelper.buildFormatted(model.getModel(BasicContinuousMeasurement.PROPERTY_MEAN), mmp.getMissingModel(), doubleFormatter),
MeasurementInputHelper.buildFormatted(model.getModel(BasicContinuousMeasurement.PROPERTY_STDDEV), mmp.getMissingModel(),doubleFormatter),
MeasurementInputHelper.buildFormatted(model.getModel(BasicContinuousMeasurement.PROPERTY_SAMPLESIZE), mmp.getMissingModel(), intFormatter)
};
} else if (m instanceof BasicRateMeasurement) {
PresentationModel<BasicRateMeasurement> model =
new PresentationModel<BasicRateMeasurement>((BasicRateMeasurement)m);
return new JTextField[] {
MeasurementInputHelper.buildFormatted(model.getModel(BasicRateMeasurement.PROPERTY_RATE), mmp.getMissingModel(), intFormatter),
MeasurementInputHelper.buildFormatted(model.getModel(BasicRateMeasurement.PROPERTY_SAMPLESIZE), mmp.getMissingModel(), intFormatter)
};
} else if (m instanceof FrequencyMeasurement) {
List<JTextField> comps = new ArrayList<JTextField>();
FrequencyMeasurement fm = (FrequencyMeasurement) m;
FrequencyMeasurementPresentation model = new FrequencyMeasurementPresentation(fm);
for (String cat : fm.getCategories()) {
comps.add(MeasurementInputHelper.buildFormatted(model.getFrequencyModel(cat), mmp.getMissingModel(), intFormatter));
}
return comps.toArray(new JTextField[]{});
}
throw new IllegalStateException("Unhandled Measurement sub-type");
}
private static class IntegerFormatter extends AbstractFormatter {
private static final long serialVersionUID = -3955737227956551845L;
private final MissingValueFormat d_format;
public IntegerFormatter(){
d_format = new MissingValueFormat(NumberFormat.getIntegerInstance());
}
@Override
public Object stringToValue(String text) throws ParseException {
Object value = d_format.parseObject(text);
return value == null ? null : ((Number)value).intValue();
}
@Override
public String valueToString(Object value) throws ParseException {
return d_format.format(value);
}
}
private static class DoubleFormatter extends AbstractFormatter {
private static final long serialVersionUID = -3955737227956551845L;
private final MissingValueFormat d_format;
public DoubleFormatter(){
d_format = new MissingValueFormat(NumberFormat.getNumberInstance());
}
@Override
public Object stringToValue(String text) throws ParseException {
Object value = d_format.parseObject(text);
return value == null ? null : ((Number)value).doubleValue();
}
@Override
public String valueToString(Object value) throws ParseException {
return d_format.format(value);
}
}
public static JFormattedTextField buildFormatted(ValueModel model, ValueModel disabledModel, AbstractFormatter formatter) {
final JFormattedTextField field = new JFormattedTextField(new DefaultFormatterFactory(formatter, formatter, formatter, formatter));
PropertyConnector.connectAndUpdate(model, field, "value");
PropertyConnector.connectAndUpdate(ConverterFactory.createBooleanNegator(disabledModel), field, "enabled");
field.setColumns(5);
return field;
}
}