/*
* 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.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import org.drugis.addis.entities.Drug;
import org.drugis.addis.entities.DrugTreatment;
import org.drugis.addis.entities.OtherActivity;
import org.drugis.addis.entities.TreatmentActivity;
import org.drugis.addis.gui.AddisWindow;
import org.drugis.addis.gui.AuxComponentFactory;
import org.drugis.addis.gui.CategoryKnowledgeFactory;
import org.drugis.addis.gui.GUIFactory;
import org.drugis.addis.gui.builder.DoseView;
import org.drugis.addis.presentation.DrugTreatmentPresentation;
import org.drugis.addis.presentation.wizard.StudyActivityPresentation;
import org.drugis.common.gui.LayoutUtil;
import org.drugis.common.gui.OkCancelDialog;
import com.jgoodies.binding.adapter.BasicComponentFactory;
import com.jgoodies.binding.beans.PropertyConnector;
import com.jgoodies.binding.value.AbstractValueModel;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class AddStudyActivityDialog extends OkCancelDialog {
private static final long serialVersionUID = 325928004747685827L;
private final StudyActivityPresentation d_pm;
private AddisWindow d_mainWindow;
public AddStudyActivityDialog(JDialog parent, AddisWindow mainWindow, StudyActivityPresentation pm) {
super(parent, "Activity", false);
d_mainWindow = mainWindow;
d_pm = pm;
this.setMinimumSize(new Dimension(550, 280));
this.setResizable(false);
if(d_pm.isEditing()) {
setTitle("Edit Activity");
} else {
setTitle("New Activity");
}
d_pm.getActivityModel().addValueChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
rebuild();
}
});
rebuild();
}
@Override
protected void cancel() {
disposeOfDialog();
}
private void disposeOfDialog() {
dispose();
}
@Override
protected void commit() {
d_pm.commit();
disposeOfDialog();
}
public void rebuild() {
getUserPanel().setVisible(false);
getUserPanel().removeAll(); // remove previous components (if any)
getUserPanel().add(buildPanel());
getUserPanel().setVisible(true);
pack();
}
private JScrollPane buildPanel() {
FormLayout layout = new FormLayout(
"left:pref, 7dlu, pref:grow:fill, 3dlu, left:pref",
"p"
);
final PanelBuilder builder = new PanelBuilder(layout);
builder.setDefaultDialogBorder();
final CellConstraints cc = new CellConstraints();
int row = 1;
// add type
builder.addLabel("Type: ", cc.xy(1, row));
final JComboBox treatmentSelect = AuxComponentFactory.createBoundComboBox(d_pm.getActivityOptions().toArray(), d_pm.getActivityModel());
final ListCellRenderer renderer = treatmentSelect.getRenderer();
treatmentSelect.setRenderer(new ListCellRenderer() {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof TreatmentActivity) {
return renderer.getListCellRendererComponent(list, "Treatment", index, isSelected, cellHasFocus);
} else if (value instanceof OtherActivity) {
return renderer.getListCellRendererComponent(list, "Other", index, isSelected, cellHasFocus);
}
return renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
});
builder.add(treatmentSelect, cc.xy(3, row));
// show or hide drug
if (d_pm.getActivityModel().getValue() instanceof TreatmentActivity) {
row = showDrugPanel(builder, row);
} else if (d_pm.getActivityModel().getValue() instanceof OtherActivity) {
row = showOtherActivityPanel(builder, row);
}
row = LayoutUtil.addRow(layout, row);
builder.addSeparator("", cc.xyw(1, row, 5));
// add name
row = LayoutUtil.addRow(layout, row);
builder.addLabel("Name: ", cc.xy(1, row));
builder.add(BasicComponentFactory.createTextField(d_pm.getNameModel(), false), cc.xy(3, row));
// NOOOOTES
row = LayoutUtil.addRow(layout, row);
builder.add(AddStudyWizard.buildNotesEditor(d_pm.getNotesModel()), cc.xyw(1, row, 5));
PropertyConnector.connectAndUpdate(d_pm.getValidModel(), d_okButton, "enabled");
JScrollPane scrollPane = new JScrollPane(builder.getPanel());
scrollPane.setViewportBorder(BorderFactory.createEmptyBorder());
return scrollPane;
}
private int showOtherActivityPanel(PanelBuilder builder, int row) {
CellConstraints cc = new CellConstraints();
FormLayout layout = builder.getLayout();
row = LayoutUtil.addRow(layout, row);
builder.addSeparator("", cc.xyw(1, row, 5));
row = LayoutUtil.addRow(layout, row);
builder.addLabel("Description: ", cc.xy(1, row));
builder.add(BasicComponentFactory.createTextField(d_pm.getOtherActivityModel().getModel(OtherActivity.PROPERTY_DESCRIPTION), false), cc.xy(3, row));
return row;
}
private int showDrugPanel(final PanelBuilder builder, int row) {
final TreatmentActivity ct = (TreatmentActivity) d_pm.getActivityModel().getValue();
CellConstraints cc = new CellConstraints();
FormLayout layout = builder.getLayout();
for(DrugTreatment ta : ct.getTreatments()) {
row = LayoutUtil.addRow(layout, row);
row = showDrug(builder, row, d_pm.getTreatmentModel().getTreatmentModel(ta));
}
JButton addDrugBtn = new JButton("Add drug to treatment");
addDrugBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ct.addTreatment(null, null);
rebuild();
}
});
row = LayoutUtil.addRow(layout, row);
builder.add(addDrugBtn, cc.xyw(1, row, 5));
return row;
}
private int showDrug(PanelBuilder builder, int row, final DrugTreatmentPresentation dtp) {
CellConstraints cc = new CellConstraints();
// add drug
builder.addSeparator("", cc.xyw(1, row, 5));
FormLayout layout = builder.getLayout();
row = LayoutUtil.addRow(layout, row);
builder.addLabel("Drug: ", cc.xy(1, row));
final AbstractValueModel drugModel = dtp.getModel(DrugTreatment.PROPERTY_DRUG);
JComboBox drugSelect = AuxComponentFactory.createBoundComboBox(d_pm.getDrugOptions(), drugModel, true);
builder.add(drugSelect, cc.xy(3, row));
JButton btn = GUIFactory.createPlusButton("Create drug");
builder.add(btn, cc.xy(5, row));
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
d_mainWindow.showAddDialog(CategoryKnowledgeFactory.getCategoryKnowledge(Drug.class), drugModel);
}
});
// add dose
row = buildDoseView(builder, row, layout, dtp);
return row;
}
private int buildDoseView(PanelBuilder builder, int row, FormLayout layout, DrugTreatmentPresentation dtp) {
row = LayoutUtil.addRow(layout, row);
CellConstraints cc = new CellConstraints();
builder.addLabel("Dose: ", cc .xy(1, row));
DoseView doseView = new DoseView(dtp.getDoseModel(), d_mainWindow.getDomain().getUnits());
builder.add(doseView.buildPanel(), cc.xy(3, row));
return row;
}
}