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; /** * @author Kazushi Minagawa, Digital Globe, Inc. */ public class MedicalCertificateImpl extends AbstractChartDocument implements Letter { protected static final String ITEM_DISEASE = "disease"; protected static final String TEXT_INFORMED_CONTENT = "informedContent"; protected LetterModule model; protected MedicalCertificateView view; private boolean listenerIsAdded; protected LetterStateMgr stateMgr; private boolean modify; /** Creates a new instance of LetterDocument */ public MedicalCertificateImpl() { setTitle(ClientContext.getMyBundle(MedicalCertificateImpl.class).getString("title.medicalCertificate")); } 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 MedicalCertificateView(); } // 患者氏名 LetterHelper.setModelValue(view.getPatientNameFld(), m.getPatientName()); // 患者生年月日 //String val = LetterHelper.getBirdayWithAge(m.getPatientBirthday(), m.getPatientAge()); String val = LetterHelper.getDateString(m.getPatientBirthday()); LetterHelper.setModelValue(view.getPatientBirthday(), val); // 患者性別 LetterHelper.setModelValue(view.getSexFld(), m.getPatientGender()); // 患者住所 LetterHelper.setModelValue(view.getPatientAddress(), m.getPatientAddress()); // 確定日 String dateStr = LetterHelper.getDateAsString(m.getStarted()); LetterHelper.setModelValue(view.getConfirmedFld(), dateStr); // 病院住所 val = LetterHelper.getAddressWithZipCode(m.getConsultantAddress(), m.getConsultantZipCode()); LetterHelper.setModelValue(view.getHospitalAddressFld(), val); // 病院名 LetterHelper.setModelValue(view.getHospitalNameFld(), m.getConsultantHospital()); // 病院電話 LetterHelper.setModelValue(view.getHospitalTelephoneFld(), m.getConsultantTelephone()); // 医師 LetterHelper.setModelValue(view.getDoctorNameFld(), m.getConsultantDoctor()); //---------------------------------------------------------------------- // 病名 String value = model.getItemValue(ITEM_DISEASE); if (value != null) { LetterHelper.setModelValue(view.getDiseaseFld(), value); } // Informed String text = model.getTextValue(TEXT_INFORMED_CONTENT); if (text!=null) { LetterHelper.setModelValue(view.getInformedContent(), text); } } @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 される、元のモデルは削除される(要変更) } } // 患者情報、差し出し人側はtartでmodelに設定済 // 傷病名 String value = LetterHelper.getFieldValue(view.getDiseaseFld()); model.addLetterItem(new LetterItem(ITEM_DISEASE, value)); // Informed String informed = LetterHelper.getAreaValue(view.getInformedContent()); if (informed!=null) { LetterText text = new LetterText(); text.setName(TEXT_INFORMED_CONTENT); text.setTextValue(informed); model.addLetterText(text); } //s.oh^ 2014/09/18 文書修正 else{ model.addLetterText(new LetterText(TEXT_INFORMED_CONTENT, "")); } //s.oh$ // Title StringBuilder sb = new StringBuilder(); sb.append(ClientContext.getMyBundle(MedicalCertificateImpl.class).getString("title.medicalCertificate")).append(":").append(value); model.setTitle(sb.toString()); } @Override public void start() { if (this.model==null) { this.model = new LetterModule(); // Handle Class this.model.setHandleClass(MedicalCertificateViewer.class.getName()); this.model.setLetterType(IInfoModel.MEDICAL_CERTIFICATE); // 確定日等 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()); this.model.setPatientAge(ModelUtils.getAge(patient.getBirthday())); if (patient.getSimpleAddressModel()!=null) { this.model.setPatientAddress(patient.getSimpleAddressModel().getAddress()); } this.model.setPatientTelephone(patient.getTelephone()); // 病院 UserModel user = Project.getUserModel(); this.model.setConsultantHospital(user.getFacilityModel().getFacilityName()); this.model.setConsultantDoctor(user.getCommonName()); this.model.setConsultantDept(user.getDepartmentModel().getDepartmentDesc()); this.model.setConsultantTelephone(user.getFacilityModel().getTelephone()); this.model.setConsultantFax(user.getFacilityModel().getFacsimile()); this.model.setConsultantZipCode(user.getFacilityModel().getZipCode()); this.model.setConsultantAddress(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()); this.model.setPatientAge(ModelUtils.getAge(patient.getBirthday())); if (patient.getSimpleAddressModel()!=null) { this.model.setPatientAddress(patient.getSimpleAddressModel().getAddress()); } this.model.setPatientTelephone(patient.getTelephone()); // 病院 UserModel user = Project.getUserModel(); this.model.setConsultantHospital(user.getFacilityModel().getFacilityName()); this.model.setConsultantDoctor(user.getCommonName()); this.model.setConsultantDept(user.getDepartmentModel().getDepartmentDesc()); this.model.setConsultantTelephone(user.getFacilityModel().getTelephone()); this.model.setConsultantFax(user.getFacilityModel().getFacsimile()); this.model.setConsultantZipCode(user.getFacilityModel().getZipCode()); this.model.setConsultantAddress(user.getFacilityModel().getAddress()); } //s.oh$ // view を生成 this.view = new MedicalCertificateView(); 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.getDiseaseFld().setBackground(Color.YELLOW); //view.getInformedContent().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) { // 2013/04/19 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); java.util.ResourceBundle bundle = ClientContext.getMyBundle(MedicalCertificateImpl.class); String msg = bundle.getString("question.createPDF"); String optionCreatePDF = bundle.getString("option.createPDF"); String optionPrintForm = bundle.getString("option.printForm"); String title = bundle.getString("title.optionPane.printMedicalCertificate"); 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 { MedicalCertificatePDFMaker pdf = new MedicalCertificatePDFMaker(); 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(MedicalCertificateImpl.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(MedicalCertificateImpl.class).getString("title.optionPane.PDFCreation")), JOptionPane.WARNING_MESSAGE); } } }; w.execute(); } @Override public boolean isDirty() { if (stateMgr != null) { return stateMgr.isDirtyState(); } else { return super.isDirty(); } } // public void modifyKarte() { // stateMgr.processModifyKarteEvent(); // } @Override public void setEditables(boolean b) { view.getDiseaseFld().setEditable(b); view.getInformedContent().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.getDiseaseFld().getDocument().addDocumentListener(dl); view.getDiseaseFld().addFocusListener(AutoKanjiListener.getInstance()); view.getDiseaseFld().setTransferHandler(new BundleTransferHandler(med, view.getDiseaseFld())); view.getDiseaseFld().addMouseListener(CutCopyPasteAdapter.getInstance()); // Informed view.getInformedContent().getDocument().addDocumentListener(dl); view.getInformedContent().addFocusListener(AutoKanjiListener.getInstance()); view.getInformedContent().setTransferHandler(new BundleTransferHandler(med, view.getInformedContent())); view.getInformedContent().addMouseListener(CutCopyPasteAdapter.getInstance()); // // 診断日 // PopupCalendarListener pl = new PopupCalendarListener(view.getConfirmedFld()); // view.getConfirmedFld().getDocument().addDocumentListener(dl); listenerIsAdded = true; } @Override public boolean letterIsDirty() { boolean dirty = (LetterHelper.getFieldValue(view.getDiseaseFld()) != null); dirty = dirty || (LetterHelper.getAreaValue(view.getInformedContent()) != null); return dirty; } }