/*
* 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.wizard;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParseException;
import java.text.ParsePosition;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.DefaultFormatter;
import org.drugis.addis.entities.treatment.ChoiceNode;
import org.drugis.addis.entities.treatment.RangeEdge;
import org.drugis.addis.presentation.ModifiableHolder;
import org.drugis.addis.presentation.RangeValidator;
import org.drugis.addis.presentation.ValueHolder;
import org.drugis.addis.presentation.wizard.TreatmentCategorizationWizardPresentation;
import org.drugis.common.gui.GUIHelper;
import org.drugis.common.gui.LayoutUtil;
import org.drugis.common.gui.OkCancelDialog;
import com.jgoodies.binding.adapter.BasicComponentFactory;
import com.jgoodies.binding.adapter.Bindings;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
final class DoseRangeCutOffDialog extends OkCancelDialog {
private final class FormatRange extends Format {
private static final long serialVersionUID = -8624949198891358088L;
private final String d_variableName;
private final boolean d_isUpperBoundOpen;
private FormatRange(final String variableName, final boolean isUpperBoundOpen) {
d_variableName = variableName;
d_isUpperBoundOpen = isUpperBoundOpen;
}
@Override
public StringBuffer format(final Object toFormat, final StringBuffer toAppendTo, final FieldPosition pos) {
final double cutOff = (Double) toFormat;
toAppendTo.append(RangeEdge.format(d_variableName,
d_rangeToSplit.getLowerBound(), d_rangeToSplit.isLowerBoundOpen(),
cutOff, d_isUpperBoundOpen));
return toAppendTo;
}
@Override
public Object parseObject(final String arg0, final ParsePosition arg1) {
return null;
}
}
private final TreatmentCategorizationWizardPresentation d_pm;
private static final long serialVersionUID = -7519390341921875264L;
private final ValueHolder<Double> d_cutOff = new ModifiableHolder<Double>(0.0d);
private final ValueHolder<Boolean> d_lowerOpen = new ModifiableHolder<Boolean>(false);
private final RangeValidator d_validator;
private final RangeEdge d_rangeToSplit;
private final ChoiceNode d_choice;
public DoseRangeCutOffDialog(
final JDialog parent,
final TreatmentCategorizationWizardPresentation model,
final ChoiceNode choice,
final RangeEdge rangeToSplit) {
super(parent, "Split range", true);
setLocationByPlatform(true);
d_pm = model;
d_choice = choice;
d_rangeToSplit = rangeToSplit;
d_validator =
new RangeValidator(d_cutOff, d_rangeToSplit.getLowerBound(), d_rangeToSplit.getUpperBound());
getUserPanel().add(buildPanel());
pack();
}
protected JPanel buildPanel() {
Bindings.bind(d_okButton, "enabled", d_validator);
final FormLayout layout = new FormLayout(
"pref, 3dlu, pref, 3dlu, fill:pref:grow",
"p"
);
final PanelBuilder builder = new PanelBuilder(layout);
builder.setDefaultDialogBorder();
final CellConstraints cc = new CellConstraints();
final int colSpan = builder.getColumnCount();
int row = 1;
final String variableName = GUIHelper.humanize(d_choice.getPropertyName());
builder.addSeparator("Original range: " + RangeEdge.format(variableName, d_rangeToSplit), cc.xyw(1, row, colSpan));
row = LayoutUtil.addRow(layout, row);
builder.addLabel("Split range at:", cc.xy(1, row));
final JFormattedTextField cutOffField = BasicComponentFactory.createFormattedTextField(d_cutOff, new DefaultFormatter());
cutOffField.setColumns(5);
cutOffField.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(final CaretEvent e) {
try {
cutOffField.commitEdit();
pack();
} catch (final ParseException exp) {
return; // we don't care
}
}
});
builder.add(cutOffField, cc.xy(3, row));
final String unitText = d_pm.getDoseUnitPresentation().getBean().toString();
builder.addLabel(unitText, cc.xy(5, row));
row = LayoutUtil.addRow(layout, row);
builder.addLabel("Bound is inclusive/exclusive for lower range:", cc.xyw(1, row, colSpan));
row = LayoutUtil.addRow(layout, row);
builder.add(BasicComponentFactory.createRadioButton(d_lowerOpen, false, ""), cc.xy(1, row));
builder.add(BasicComponentFactory.createLabel(d_cutOff, new FormatRange(variableName, false)), cc.xy(3, row));
row = LayoutUtil.addRow(layout, row);
builder.add(BasicComponentFactory.createRadioButton(d_lowerOpen, true, ""), cc.xy(1, row));
builder.add(BasicComponentFactory.createLabel(d_cutOff, new FormatRange(variableName, true)), cc.xy(3, row));
return builder.getPanel();
}
@Override
protected void commit() {
d_pm.splitRange(d_rangeToSplit, d_cutOff.getValue(), d_lowerOpen.getValue());
dispose();
}
@Override
protected void cancel() {
dispose();
}
}