/*
* 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.builder;
import java.io.IOException;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.drugis.addis.entities.Drug;
import org.drugis.addis.entities.Study;
import org.drugis.addis.gui.AddisWindow;
import org.drugis.addis.gui.CategoryKnowledgeFactory;
import org.drugis.addis.gui.components.StudiesTablePanel;
import org.drugis.addis.presentation.DrugPresentation;
import org.drugis.addis.presentation.StudyListPresentation;
import org.drugis.addis.util.AtcParser;
import org.drugis.addis.util.AtcParser.AtcDescription;
import org.drugis.addis.util.RunnableReadyModel;
import org.drugis.common.gui.BuildViewWhenReadyComponent;
import org.drugis.common.gui.LayoutUtil;
import org.drugis.common.gui.LinkLabel;
import org.drugis.common.gui.ViewBuilder;
import com.jgoodies.binding.adapter.BasicComponentFactory;
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 DrugView implements ViewBuilder {
private static final String SEARCH_DOMAIN = "medicines.org.uk";
private DrugPresentation d_model;
private AddisWindow d_parent;
public DrugView(DrugPresentation model, AddisWindow parent) {
d_model = model;
d_parent = parent;
}
public JComponent buildPanel() {
FormLayout layout = new FormLayout(
"pref:grow:fill",
"p, 3dlu, p, 3dlu, p, 3dlu, p"
);
PanelBuilder builder = new PanelBuilder(layout);
builder.setDefaultDialogBorder();
CellConstraints cc = new CellConstraints();
builder.addSeparator(CategoryKnowledgeFactory.getCategoryKnowledge(Drug.class).getSingularCapitalized(), cc.xy(1, 1));
builder.add(createDrugOverviewPanel(d_model),
cc.xy(1, 3));
builder.addSeparator(CategoryKnowledgeFactory.getCategoryKnowledge(Study.class).getPlural()
+ " measuring this "
+ CategoryKnowledgeFactory.getCategoryKnowledge(Drug.class).getSingular() , cc.xy(1, 5));
builder.add(buildStudyListComponent(d_model.getStudyListPresentation(), d_parent), cc.xy(1, 7));
return builder.getPanel();
}
public static JComponent buildStudyListComponent(StudyListPresentation model, AddisWindow parent) {
JComponent studiesComp = null;
if(model.getIncludedStudies().isEmpty()) {
studiesComp = new JLabel("No studies found.");
} else {
studiesComp = new StudiesTablePanel(model, parent);
}
return studiesComp;
}
public static JPanel createDrugOverviewPanel(DrugPresentation model) {
FormLayout layout = new FormLayout(
"right:pref, 3dlu, left:pref, center:8dlu, left:pref",
"p, 3dlu, p, 3dlu, p"
);
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
builder.addLabel("Name:", cc.xy(1, 1));
AbstractValueModel drugname = model.getModel(Drug.PROPERTY_NAME);
builder.add(new LinkLabel(drugname.getString() + " -", "Search for SmPC at " + SEARCH_DOMAIN, getSearchUrl(drugname)) , cc.xy(3,1));
builder.addLabel("ATC Code:", cc.xy(1, 3));
builder.add(BasicComponentFactory.createLabel(model.getModel(Drug.PROPERTY_ATCCODE)), cc.xy(3, 3));
AtcDetailsRetriever retriever = new AtcDetailsRetriever(model);
AtcDetailsPanelBuilder detailsBuilder = new AtcDetailsPanelBuilder(retriever);
RunnableReadyModel readyModel = new RunnableReadyModel(retriever);
BuildViewWhenReadyComponent c = new BuildViewWhenReadyComponent(detailsBuilder, readyModel, "Loading...");
builder.add(c, cc.xy(3, 5));
new Thread(readyModel).start();
return builder.getPanel();
}
private static class AtcDetailsRetriever implements Runnable {
private IOException d_error;
private List<AtcDescription> d_drugDetails;
private DrugPresentation d_model;
private AbstractValueModel d_atcCode;
public AtcDetailsRetriever(DrugPresentation model) {
d_model = model;
}
public void run() {
try {
d_atcCode = d_model.getModel(Drug.PROPERTY_ATCCODE);
d_drugDetails = new AtcParser().getAtcDetails(d_atcCode.getString());
} catch (IOException e) {
d_error = e;
}
}
public IOException getError() {
return d_error;
}
public List<AtcDescription> getDrugDetails() {
return d_drugDetails;
}
public AbstractValueModel getAtcCode() {
return d_atcCode;
}
}
private static class AtcDetailsPanelBuilder implements ViewBuilder {
private final AtcDetailsRetriever d_details;
public AtcDetailsPanelBuilder(AtcDetailsRetriever details) {
d_details = details;
}
public JComponent buildPanel() {
FormLayout layout = new FormLayout("left:pref", "p");
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
if (d_details.getError() != null) {
builder.addLabel("Error communicating with WHO website: " + d_details.getError().getMessage());
} else {
int pos = 1;
if(d_details.getDrugDetails().isEmpty()) {
builder.addLabel("No details found for this ATC code.");
}
for(AtcDescription desc : d_details.getDrugDetails()) {
if(!desc.getCode().equals(d_details.getAtcCode().getString())){
builder.addLabel(desc.getCode() + ": " + desc.getDescription(), cc.xy(1, pos));
LayoutUtil.addRow(layout);
pos += 2;
}
}
}
return builder.getPanel();
}
}
private static String getSearchUrl(AbstractValueModel drugname) {
return "http://www." + SEARCH_DOMAIN + "/EMC/searchresults.aspx?term=" + drugname.getValue().toString().replace(' ', '+');
}
}