package open.dolphin.letter;
import java.awt.BorderLayout;
import java.awt.Desktop;
import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.print.PageFormat;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Paths;
import java.util.Date;
import java.util.concurrent.ExecutionException;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import open.dolphin.client.*;
import open.dolphin.delegater.LetterDelegater;
import open.dolphin.helper.DBTask;
import open.dolphin.infomodel.*;
import open.dolphin.project.Project;
import open.dolphin.util.AgeCalculater;
/**
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class LetterImpl extends AbstractChartDocument implements Letter {
protected static final String ITEM_DISEASE = "disease";
protected static final String ITEM_PURPOSE = "purpose";
protected static final String TEXT_PAST_FAMILY = "pastFamily";
protected static final String TEXT_CLINICAL_COURSE = "clinicalCourse";
protected static final String TEXT_MEDICATION = "medication";
protected static final String ITEM_REMARKS = "remarks";
protected LetterModule model;
protected LetterView view;
private boolean listenerIsAdded;
protected LetterStateMgr stateMgr;
private boolean modify;
/** Creates a new instance of LetterDocument */
public LetterImpl() {
setTitle(ClientContext.getMyBundle(LetterImpl.class).getString("title.refferalLetter"));
}
public LetterModule getModel() {
return model;
}
public void setModel(LetterModule m) {
this.model = m;
}
public boolean isModify() {
return modify;
}
public void setModify(boolean b) {
modify = b;
}
@Override
public void modelToView(LetterModule m) {
if (view == null) {
view = new LetterView();
}
// 日付
String dateStr = LetterHelper.getDateAsString(m.getStarted());
LetterHelper.setModelValue(view.getConfirmed(), dateStr);
// 紹介先(宛先)医療機関名
LetterHelper.setModelValue(view.getConsultantHospital(), m.getConsultantHospital());
// 紹介先(宛先)診療科
LetterHelper.setModelValue(view.getConsultantDept(), m.getConsultantDept());
// 紹介先(宛先)担当医
LetterHelper.setModelValue(view.getConsultantDoctor(), m.getConsultantDoctor());
// title
StringBuilder sb = new StringBuilder();
sb.append(ClientContext.getMyBundle(LetterImpl.class).getString("doctorTitle"));
String title = Project.getString("letter.atesaki.title");
if (title!=null && (!title.equals("無し"))) {
sb.append(" ").append(title);
}
LetterHelper.setModelValue(view.getAtesakiLbl(), sb.toString());
// 患者氏名
LetterHelper.setModelValue(view.getPatientName(), m.getPatientName());
// 患者生年月日
LetterHelper.setModelValue(view.getPatientBirthday(), m.getPatientBirthday());
// 年齢
LetterHelper.setModelValue(view.getPatientAge(), m.getPatientAge());
// 性別
LetterHelper.setModelValue(view.getPatientGender(), m.getPatientGender());
// 紹介先(差出人)住所
//String val = LetterHelper.getAddressWithZipCode(m.getConsultantAddress(), m.getConsultantZipCode());
//LetterHelper.setModelValue(view.getConsultantAddress(), val);
// 紹介先(差出人)電話
//LetterHelper.setModelValue(view.getConsultantTelephone(), m.getConsultantTelephone());
// 紹介先(差出人)病院名
//LetterHelper.setModelValue(view.getConsultantHospital(), m.getConsultantHospital());
// 紹介(差出人)先医師
//LetterHelper.setModelValue(view.getConsultantDoctor(), m.getConsultantDoctor());
//----------------------------------------------------------------------
// 病名
String value = model.getItemValue(ITEM_DISEASE);
if (value != null) {
LetterHelper.setModelValue(view.getDisease(), value);
}
//s.oh^ 不具合修正
else{
LetterHelper.setModelValue(view.getDisease(), "");
}
//s.oh$
// 紹介目的
value = model.getItemValue(ITEM_PURPOSE);
if (value != null) {
LetterHelper.setModelValue(view.getPurpose(), value);
}
//s.oh^ 不具合修正
else{
LetterHelper.setModelValue(view.getPurpose(), "");
}
//s.oh$
// 既往歴、家族歴
String text = model.getTextValue(TEXT_PAST_FAMILY);
if (text!=null) {
LetterHelper.setModelValue(view.getPastFamily(), text);
}
//s.oh^ 不具合修正
else{
LetterHelper.setModelValue(view.getPastFamily(), "");
}
//s.oh$
// 症状経過
text = model.getTextValue(TEXT_CLINICAL_COURSE);
if (text!=null) {
LetterHelper.setModelValue(view.getClinicalCourse(), text);
}
//s.oh^ 不具合修正
else{
LetterHelper.setModelValue(view.getClinicalCourse(), "");
}
//s.oh$
// 現在の処方
text = model.getTextValue(TEXT_MEDICATION);
if (text!=null) {
LetterHelper.setModelValue(view.getMedication(), text);
}
//s.oh^ 不具合修正
else{
LetterHelper.setModelValue(view.getMedication(), "");
}
//s.oh$
// 備考
value = model.getItemValue(ITEM_REMARKS);
if (value != null) {
LetterHelper.setModelValue(view.getRemarks(), value);
}
//s.oh^ 不具合修正
else{
LetterHelper.setModelValue(view.getRemarks(), "");
}
//s.oh$
}
@Override
// 2013/06/24
//public void viewToModel() {
public void viewToModel(boolean save) {
if (save) {
if (model.getId()==0L) {
// 新規作成で保存 日時を現時刻で再設定する
Date d = new Date();
this.model.setConfirmed(d);
this.model.setRecorded(d);
this.model.setStarted(d);
} else {
// 修正で保存
Date d = new Date();
model.setConfirmed(d); // 確定日
model.setRecorded(d); // 記録日
model.setLinkId(model.getId()); // LinkId
model.setId(0L); // id=0L -> 常に新規保存 persit される、元のモデルは削除される(要変更)
}
}
// 紹介先(宛先)
model.setConsultantHospital(LetterHelper.getFieldValue(view.getConsultantHospital()));
model.setConsultantDept(LetterHelper.getFieldValue(view.getConsultantDept()));
model.setConsultantDoctor(LetterHelper.getFieldValue(view.getConsultantDoctor()));
// 患者情報、差し出し人側はtartでmodelに設定済
// 傷病名
String value = LetterHelper.getFieldValue(view.getDisease());
if (value != null) {
LetterItem item = new LetterItem(ITEM_DISEASE, value);
model.addLetterItem(item);
}
//s.oh^ 2014/09/18 文書修正
else{
model.addLetterItem(new LetterItem(ITEM_DISEASE, ""));
}
//s.oh$
// 紹介目的
value = LetterHelper.getFieldValue(view.getPurpose());
if (value != null) {
LetterItem item = new LetterItem(ITEM_PURPOSE, value);
model.addLetterItem(item);
}
//s.oh^ 2014/09/18 文書修正
else{
model.addLetterItem(new LetterItem(ITEM_PURPOSE, ""));
}
//s.oh$
// 既往歴、家族歴
String text = LetterHelper.getAreaValue(view.getPastFamily());
if (text != null) {
LetterText lt = new LetterText(TEXT_PAST_FAMILY, text);
model.addLetterText(lt);
}
//s.oh^ 2014/09/18 文書修正
else{
model.addLetterText(new LetterText(TEXT_PAST_FAMILY, ""));
}
//s.oh$
// 症状経過
text = LetterHelper.getAreaValue(view.getClinicalCourse());
if (text != null) {
LetterText lt = new LetterText(TEXT_CLINICAL_COURSE, text);
model.addLetterText(lt);
}
//s.oh^ 2014/09/18 文書修正
else{
model.addLetterText(new LetterText(TEXT_CLINICAL_COURSE, ""));
}
//s.oh$
// 現在の処方
text = LetterHelper.getAreaValue(view.getMedication());
if (text != null) {
LetterText lt = new LetterText(TEXT_MEDICATION, text);
model.addLetterText(lt);
}
//s.oh^ 2014/09/18 文書修正
else{
model.addLetterText(new LetterText(TEXT_MEDICATION, ""));
}
//s.oh$
// 備考
value = LetterHelper.getFieldValue(view.getRemarks());
if (value != null) {
LetterItem item = new LetterItem(ITEM_REMARKS, value);
model.addLetterItem(item);
}
//s.oh^ 2014/09/18 文書修正
else{
model.addLetterItem(new LetterItem(ITEM_REMARKS, ""));
}
//s.oh$
// Title
StringBuilder sb = new StringBuilder();
sb.append(ClientContext.getMyBundle(LetterImpl.class).getString("refferalLetter")).append(model.getConsultantHospital());
model.setTitle(sb.toString());
}
@Override
public void start() {
if (this.model==null) {
this.model = new LetterModule();
// Handle Class
this.model.setHandleClass(LetterViewer.class.getName());
this.model.setLetterType(IInfoModel.CLIENT);
// 確定日等
Date d = new Date();
this.model.setConfirmed(d);
this.model.setRecorded(d);
this.model.setStarted(d);
this.model.setStatus(IInfoModel.STATUS_FINAL);
this.model.setKarteBean(getContext().getKarte());
this.model.setUserModel(Project.getUserModel());
// 患者情報
PatientModel patient = getContext().getPatient();
this.model.setPatientId(patient.getPatientId());
this.model.setPatientName(patient.getFullName());
this.model.setPatientKana(patient.getKanaName());
this.model.setPatientGender(patient.getGenderDesc());
this.model.setPatientBirthday(patient.getBirthday());
int showMonth = Project.getInt(Project.KARTE_AGE_TO_NEED_MONTH);
String age = AgeCalculater.getAge(patient.getBirthday(), showMonth);
this.model.setPatientAge(age);
// 患者住所
if (patient.getSimpleAddressModel()!=null) {
this.model.setPatientAddress(patient.getSimpleAddressModel().getAddress());
this.model.setPatientZipCode(patient.getSimpleAddressModel().getZipCode());
}
this.model.setPatientTelephone(patient.getTelephone());
// 紹介元
UserModel user = Project.getUserModel();
this.model.setClientHospital(user.getFacilityModel().getFacilityName());
this.model.setClientDoctor(user.getCommonName());
this.model.setClientDept(user.getDepartmentModel().getDepartmentDesc());
this.model.setClientTelephone(user.getFacilityModel().getTelephone());
this.model.setClientFax(user.getFacilityModel().getFacsimile());
this.model.setClientZipCode(user.getFacilityModel().getZipCode());
this.model.setClientAddress(user.getFacilityModel().getAddress());
}
//s.oh^ 2014/04/03 文書の複製
else if(this.modify && this.model.getId() == 0) {
Date d = new Date();
this.model.setConfirmed(d);
this.model.setRecorded(d);
this.model.setStarted(d);
this.model.setEnded(null);
// 患者情報
PatientModel patient = getContext().getPatient();
this.model.setPatientId(patient.getPatientId());
this.model.setPatientName(patient.getFullName());
this.model.setPatientKana(patient.getKanaName());
this.model.setPatientGender(patient.getGenderDesc());
this.model.setPatientBirthday(patient.getBirthday());
int showMonth = Project.getInt(Project.KARTE_AGE_TO_NEED_MONTH);
String age = AgeCalculater.getAge(patient.getBirthday(), showMonth);
this.model.setPatientAge(age);
// 患者住所
if (patient.getSimpleAddressModel()!=null) {
this.model.setPatientAddress(patient.getSimpleAddressModel().getAddress());
this.model.setPatientZipCode(patient.getSimpleAddressModel().getZipCode());
}
this.model.setPatientTelephone(patient.getTelephone());
// 紹介元
UserModel user = Project.getUserModel();
this.model.setClientHospital(user.getFacilityModel().getFacilityName());
this.model.setClientDoctor(user.getCommonName());
this.model.setClientDept(user.getDepartmentModel().getDepartmentDesc());
this.model.setClientTelephone(user.getFacilityModel().getTelephone());
this.model.setClientFax(user.getFacilityModel().getFacsimile());
this.model.setClientZipCode(user.getFacilityModel().getZipCode());
this.model.setClientAddress(user.getFacilityModel().getAddress());
}
//s.oh$
// view を生成
this.view = new LetterView();
JPanel p = new JPanel(new FlowLayout(FlowLayout.CENTER));
p.add(this.view);
JScrollPane scroller = new JScrollPane(p);
getUI().setLayout(new BorderLayout());
getUI().add(scroller, BorderLayout.CENTER);
modelToView(this.model);
setEditables(true);
setListeners();
stateMgr = new LetterStateMgr(this);
this.enter();
//s.oh^ 文書の必要事項対応
//view.getConsultantHospital().setBackground(Color.YELLOW);
//view.getDisease().setBackground(Color.YELLOW);
//view.getPurpose().setBackground(Color.YELLOW);
//view.getClinicalCourse().setBackground(Color.YELLOW);
//s.oh$
}
@Override
public void stop() {
}
@Override
public void save() {
viewToModel(true);
DBTask task = new DBTask<Boolean, Void>(getContext()) {
@Override
protected Boolean doInBackground() throws Exception {
LetterDelegater ddl = new LetterDelegater();
long result = ddl.saveOrUpdateLetter(model);
model.setId(result);
return true;
}
@Override
protected void succeeded(Boolean result) {
if (boundSupport!=null) {
setChartDocDidSave(true);
return;
}
getContext().getDocumentHistory().getLetterHistory();
stateMgr.processSavedEvent();
}
};
task.execute();
}
@Override
public void enter() {
super.enter();
if (stateMgr != null) {
stateMgr.enter();
}
}
@Override
public void print() {
if (this.model == null) {
return;
}
viewToModel(false);
String msg = ClientContext.getMyBundle(LetterImpl.class).getString("question.createPDFFile");
String optionCreatePDF = ClientContext.getMyBundle(LetterImpl.class).getString("option.createPDF");
String optionPrintForm = ClientContext.getMyBundle(LetterImpl.class).getString("option.printForm");
String title = ClientContext.getMyBundle(LetterImpl.class).getString("title.optionPane");
int option = JOptionPane.showOptionDialog(
getContext().getFrame(),
msg,
ClientContext.getFrameTitle(title),
JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
new String[]{optionCreatePDF, optionPrintForm, GUIFactory.getCancelButtonText()},
optionCreatePDF);
if (option == 0) {
makePDF();
} else if (option == 1) {
PageFormat pageFormat = getContext().getContext().getPageFormat();
String name = getContext().getPatient().getFullName();
Panel2 panel = (Panel2) this.view;
panel.printPanel(pageFormat, 1, false, name, 0, true);
}
}
@Override
public void makePDF() {
if (this.model == null) {
return;
}
SwingWorker w = new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
LetterPDFMaker pdf = new LetterPDFMaker();
pdf.setDocumentDir(Project.getString(Project.LOCATION_PDF));
pdf.setModel(model);
return pdf.create();
}
@Override
protected void done() {
String err = null;
try {
URI uri = Paths.get(get()).toUri();
Desktop.getDesktop().browse(uri);
} catch (IOException ex) {
err = ClientContext.getMyBundle(LetterImpl.class).getString("error.cannotLaunchApplication");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
err = ex.getMessage();
}
if (err!=null) {
Window parent = SwingUtilities.getWindowAncestor(getContext().getFrame());
JOptionPane.showMessageDialog(parent, err, ClientContext.getFrameTitle(ClientContext.getMyBundle(LetterImpl.class).getString("title.optionPane.PDFCreation")), JOptionPane.WARNING_MESSAGE);
}
}
};
w.execute();
}
@Override
public boolean isDirty() {
if (stateMgr != null) {
return stateMgr.isDirtyState();
} else {
return super.isDirty();
}
}
@Override
public void setEditables(boolean b) {
view.getConsultantHospital().setEditable(b);
view.getConsultantDept().setEditable(b);
view.getConsultantDoctor().setEditable(b);
view.getDisease().setEditable(b);
view.getPurpose().setEditable(b);
view.getPastFamily().setEditable(b);
view.getClinicalCourse().setEditable(b);
view.getMedication().setEditable(b);
view.getRemarks().setEditable(b);
}
@Override
public void setListeners() {
if (listenerIsAdded) {
return;
}
DocumentListener dl = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent documentEvent) {
stateMgr.processDirtyEvent();
}
@Override
public void removeUpdate(DocumentEvent documentEvent) {
stateMgr.processDirtyEvent();
}
@Override
public void changedUpdate(DocumentEvent documentEvent) {
stateMgr.processDirtyEvent();
}
};
ChartMediator med = getContext().getChartMediator();
// 紹介先(宛先)病院
view.getConsultantHospital().getDocument().addDocumentListener(dl);
view.getConsultantHospital().addFocusListener(AutoKanjiListener.getInstance());
view.getConsultantHospital().setTransferHandler(new BundleTransferHandler(med, view.getConsultantHospital()));
view.getConsultantHospital().addMouseListener(CutCopyPasteAdapter.getInstance());
// 紹介先(宛先)診療化
view.getConsultantDept().getDocument().addDocumentListener(dl);
view.getConsultantDept().addFocusListener(AutoKanjiListener.getInstance());
view.getConsultantDept().setTransferHandler(new BundleTransferHandler(med, view.getConsultantDept()));
view.getConsultantDept().addMouseListener(CutCopyPasteAdapter.getInstance());
// 紹介先(宛先)医師
view.getConsultantDoctor().getDocument().addDocumentListener(dl);
view.getConsultantDoctor().addFocusListener(AutoKanjiListener.getInstance());
view.getConsultantDoctor().setTransferHandler(new BundleTransferHandler(med, view.getConsultantDoctor()));
view.getConsultantDoctor().addMouseListener(CutCopyPasteAdapter.getInstance());
// 傷病名
view.getDisease().getDocument().addDocumentListener(dl);
view.getDisease().addFocusListener(AutoKanjiListener.getInstance());
view.getDisease().setTransferHandler(new BundleTransferHandler(med, view.getDisease()));
view.getDisease().addMouseListener(CutCopyPasteAdapter.getInstance());
// 紹介目的
view.getPurpose().getDocument().addDocumentListener(dl);
view.getPurpose().addFocusListener(AutoKanjiListener.getInstance());
view.getPurpose().setTransferHandler(new BundleTransferHandler(med, view.getPurpose()));
view.getPurpose().addMouseListener(CutCopyPasteAdapter.getInstance());
// 既往歴、家族歴
view.getPastFamily().getDocument().addDocumentListener(dl);
view.getPastFamily().addFocusListener(AutoKanjiListener.getInstance());
view.getPastFamily().setTransferHandler(new BundleTransferHandler(med, view.getPastFamily()));
view.getPastFamily().addMouseListener(CutCopyPasteAdapter.getInstance());
// 症状経過
view.getClinicalCourse().getDocument().addDocumentListener(dl);
view.getClinicalCourse().addFocusListener(AutoKanjiListener.getInstance());
view.getClinicalCourse().setTransferHandler(new BundleTransferHandler(med, view.getClinicalCourse()));
view.getClinicalCourse().addMouseListener(CutCopyPasteAdapter.getInstance());
// 現在の処方
view.getMedication().getDocument().addDocumentListener(dl);
view.getMedication().addFocusListener(AutoKanjiListener.getInstance());
view.getMedication().setTransferHandler(new BundleTransferHandler(med, view.getMedication()));
view.getMedication().addMouseListener(CutCopyPasteAdapter.getInstance());
// 備考
view.getRemarks().getDocument().addDocumentListener(dl);
view.getRemarks().addFocusListener(AutoKanjiListener.getInstance());
view.getRemarks().setTransferHandler(new BundleTransferHandler(med, view.getRemarks()));
view.getRemarks().addMouseListener(CutCopyPasteAdapter.getInstance());
listenerIsAdded = true;
}
@Override
public boolean letterIsDirty() {
//minagawa^ LSC Test
boolean dirty = (LetterHelper.getFieldValue(view.getConsultantHospital())!=null); // 紹介先
dirty = dirty || (LetterHelper.getFieldValue(view.getDisease())!=null); // 病名
dirty = dirty || (LetterHelper.getFieldValue(view.getPurpose())!=null); // 紹介目的
dirty = dirty || (LetterHelper.getAreaValue(view.getClinicalCourse())!=null); // 症状経過
dirty = dirty || (LetterHelper.getFieldValue(view.getConsultantDept())!=null); // 紹介先診療科
dirty = dirty || (LetterHelper.getFieldValue(view.getConsultantDoctor())!=null); // 紹介先医師
dirty = dirty || (LetterHelper.getAreaValue(view.getPastFamily())!=null); // 家族歴
dirty = dirty || (LetterHelper.getAreaValue(view.getMedication())!=null); // 現在の処方
dirty = dirty || (LetterHelper.getFieldValue(view.getRemarks())!=null); // 備考
return dirty;
//minagawa$
}
}