package open.dolphin.client; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import open.dolphin.infomodel.SimpleDate; import open.dolphin.project.Project; /** * SaveDialog * (予定カルテ対応) * * @author Kazushi Minagawa, Digital Globe, Inc. * @author modified by masuda, Masuda Naika */ public final class SaveDialogNoSendAtTmp extends AbstractSaveDialog { private final String SAVE; // 設定: 仮保存の時送信しない private final String CHK_TITLE_NO_SEND_AT_TMP; private final String TOOLTIP_NO_SEND; // 保存ボタン private JButton okButton; // MML送信時のアクセス権設定 private JCheckBox patientCheck; private JCheckBox clinicCheck; private boolean claimDateEditable; private Date claimDate; private JTextField dateField; // LabTest 送信 private JCheckBox sendLabtest; public SaveDialogNoSendAtTmp() { super(); java.util.ResourceBundle bundle = ClientContext.getMyBundle(SaveDialogNoSendAtTmp.class); SAVE = bundle.getString("optionText.save"); CHK_TITLE_NO_SEND_AT_TMP = bundle.getString("toolTipText.send"); TOOLTIP_NO_SEND = bundle.getString("toolTipText.noSend"); } @Override public void start() { dialog.setVisible(true); } @Override public SaveParamsM getValue() { return value; } public Date getClaimDate() { return claimDate; } public void setClaimDate(Date gc) { if (gc==null) { claimDate = enterParams.getClaimDate(); } else { claimDate = gc; } String dateFmt = ClientContext.getBundle().getString("DATE_FORMAT_FOR_SCHEDULE"); SimpleDateFormat frmt = new SimpleDateFormat(dateFmt); dateField.setText(frmt.format(claimDate)); } /** * コンポーネントにSaveParamsの値を設定する。 * @param params */ @Override public void setValue(SaveParamsM params) { enterParams = params; JPanel contentPanel = createComponent(); Object[] options = new Object[]{okButton, tmpButton, cancelButton}; JOptionPane jop = new JOptionPane( contentPanel, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, okButton); dialog = jop.createDialog(parent, ClientContext.getFrameTitle(TITLE)); // Titleを表示する //masuda^ 修正元のタイトルもコンボボックスに入れる String[] titles = new String[]{params.getOldTitle(), params.getTitle()}; //masuda$ String progress = titles[0]; for (String str : titles) { if (str != null && (!str.equals("") && (!str.equals(progress)))) { titleCombo.insertItemAt(str, 0); } } titleCombo.setSelectedIndex(0); // 診療科を表示する // 受付情報からの診療科を設定する String val = params.getDepartment(); if (val != null) { String[] depts = val.split("\\s*,\\s*"); if (depts[0] != null) { departmentLabel.setText(depts[0]); } else { departmentLabel.setText(val); } } // 印刷部数選択 int count = params.getPrintCount(); if (count != -1) { printCombo.setSelectedItem(String.valueOf(count)); } else { printCombo.setEnabled(false); } //-------------------------------- // CLAIM 送信をチェックする //-------------------------------- claimDate = params.getClaimDate(); boolean sendEnabled = params.isSendEnabled(); sendClaimAction.setEnabled(sendEnabled); if (sendEnabled && params.isSendClaim()) { sendClaim.doClick(); } //------------------------------- // MML 送信の場合、アクセス権を設定する //------------------------------- if (params.getSendMML()) { // 患者への参照と診療歴のある施設の参照許可を設定する boolean permit = params.isAllowPatientRef(); patientCheck.setSelected(permit); permit = params.isAllowClinicRef(); clinicCheck.setSelected(permit); } else { // MML 送信をしないときdiasbleにする patientCheck.setEnabled(false); clinicCheck.setEnabled(false); } //------------------------------- // 検体検査オーダー送信 //------------------------------- sendLabtest.setSelected(params.isSendLabtest() && params.isHasLabtest()); sendLabtest.setEnabled((sendEnabled && params.isHasLabtest())); checkTitle(); controlButton(); //s.oh^ 2013/05/07 入力不具合修正 setFocus(okButton); //s.oh$ } /** * GUIコンポーネントを初期化する。 */ private JPanel createComponent() { java.util.ResourceBundle bundle = ClientContext.getMyBundle(SaveDialogNoSendAtTmp.class); String labelTextDocTitle = bundle.getString("labelText.docTitle"); String labelTextDeptName = bundle.getString("labelText.deptName"); String labelTextPrintCount = bundle.getString("labelText.printCount"); String chkBoxTextAllowPatient = bundle.getString("chkBoxText.allowPatientRef"); String chkBoxTextAllowHospital = bundle.getString("chkBoxText.allowHospitalRef"); String toolTipTextClaimDate = bundle.getString("toolTipText.claimDate"); String labelTextSendDate = bundle.getString("labelText.sendDate"); String chkBoxTextLabTest = bundle.getString("chkBoxText.labTest"); String chkBoxTextLabTestWithTmpSave = bundle.getString("chkBoxText.labTestWithTempSave"); String toolTipTextOkBtn = bundle.getString("toolTipText.okBtn"); // content JPanel content = new JPanel(); content.setLayout(new GridLayout(0, 1)); // 文書Title JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT)); titleCombo = new JComboBox(TITLE_LIST); titleCombo.setPreferredSize(new Dimension(220, titleCombo.getPreferredSize().height)); titleCombo.setMaximumSize(titleCombo.getPreferredSize()); titleCombo.setEditable(true); p.add(new JLabel(labelTextDocTitle)); p.add(titleCombo); content.add(p); // ComboBox のエディタコンポーネントへリスナを設定する titleField = (JTextField)titleCombo.getEditor().getEditorComponent(); titleField.addFocusListener(AutoKanjiListener.getInstance()); titleField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { checkTitle(); } @Override public void removeUpdate(DocumentEvent e) { checkTitle(); } @Override public void changedUpdate(DocumentEvent e) { checkTitle(); } }); // 診療科、印刷部数を表示するラベルとパネルを生成する JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEFT)); departmentLabel = new JLabel(); p1.add(new JLabel(labelTextDeptName)); p1.add(departmentLabel); p1.add(Box.createRigidArea(new Dimension(11, 0))); // Print printCombo = new JComboBox(PRINT_COUNT); printCombo.setSelectedIndex(1); p1.add(new JLabel(labelTextPrintCount)); p1.add(printCombo); content.add(p1); // AccessRightを設定するボタンとパネルを生成する patientCheck = new JCheckBox(chkBoxTextAllowPatient); clinicCheck = new JCheckBox(chkBoxTextAllowHospital); //--------------------------- // CLAIM 送信ありなし //--------------------------- sendClaimAction = new AbstractAction(CHK_TITLE_NO_SEND_AT_TMP) { @Override public void actionPerformed(ActionEvent e) { if (claimDateEditable) { if (sendClaim.isSelected()) { setClaimDate(getClaimDate()); } else { dateField.setText(""); } } } }; sendClaim = new JCheckBox(); sendClaim.setAction(sendClaimAction); JPanel p5 = new JPanel(new FlowLayout(FlowLayout.LEFT)); p5.add(sendClaim); content.add(p5); //minagawa^ CLAIM送信日 claimDateEditable = enterParams.getEnterOption()!=SaveParamsM.SCHEDULE_SCHEDULE; // 予定画面からは変更できない claimDateEditable = (claimDateEditable && enterParams.isSendEnabled()); // 送信が許可されれいる claimDateEditable = (claimDateEditable && enterParams.getClaimDate()!=null); // パラメータが設定されている if (claimDateEditable) { dateField = new JTextField(12); dateField.setEditable(false); dateField.setToolTipText(toolTipTextClaimDate); // 1ヶ月前まで int[] range = {-1, 0}; // 今日以前でないと駄目 SimpleDate[] acceptRange = new SimpleDate[2]; acceptRange[0] = null; acceptRange[1] = new SimpleDate(new GregorianCalendar()); PopupListener pl = new PopupListener(dateField, range, acceptRange); JPanel p2 = new JPanel(new FlowLayout(FlowLayout.LEFT)); p2.add(new JLabel(labelTextSendDate)); p2.add(dateField); content.add(p2); } //minagawa& //--------------------------- // 検体検査オーダー送信ありなし //--------------------------- //s.oh^ 2014/11/04 仮保存時のオーダー出力 //sendLabtest = new JCheckBox("検体検査オーダー(仮保存の場合はしない)"); sendLabtest = new JCheckBox(Project.getBoolean(Project.SEND_TMPKARTE_LABTEST) ? chkBoxTextLabTest : chkBoxTextLabTestWithTmpSave); //s.oh$ if (Project.getBoolean(Project.SEND_LABTEST)) { JPanel p6 = new JPanel(new FlowLayout(FlowLayout.LEFT)); p6.add(sendLabtest); content.add(p6); } // OK button okButton = new JButton(SAVE); okButton.setToolTipText(toolTipTextOkBtn); okButton.addActionListener((ActionEvent e) -> { // 戻り値のSaveparamsを生成する value = viewToModel(false); if (value != null) { close(); } }); okButton.setEnabled(false); // Cancel Button String buttonText = (String)UIManager.get("OptionPane.cancelButtonText"); cancelButton = new JButton(buttonText); cancelButton.addActionListener((ActionEvent e) -> { value = null; close(); }); // 仮保存 button tmpButton = new JButton(TMP_SAVE); tmpButton.setToolTipText(TOOLTIP_NO_SEND); tmpButton.addActionListener((ActionEvent e) -> { // 戻り値のSaveparamsを生成する value = viewToModel(true); if (value != null) { close(); } }); tmpButton.setEnabled(false); return content; } private void close() { dialog.setVisible(false); dialog.dispose(); } private void controlButton() { okButton.setEnabled((enterParams.getEnterOption()!=SaveParamsM.SCHEDULE_SCHEDULE)); tmpButton.setEnabled(true); //s.oh^ 2013/05/07 入力不具合修正 //setFocus(okButton); //s.oh$ } private void setFocus(final JComponent c) { SwingUtilities.invokeLater(() -> { c.requestFocusInWindow(); }); } /** * タイトルフィールドの有効性をチェックする。 */ private void checkTitle() { boolean hasTitle = !titleField.getText().trim().isEmpty(); if (hasTitle) { controlButton(); } else { okButton.setEnabled(false); tmpButton.setEnabled(false); } } private SaveParamsM viewToModel(boolean temp) { // 戻り値のSaveparamsを生成する SaveParamsM model = new SaveParamsM(); model.setSendMML(enterParams.getSendMML()); // 戻り値の整理 // 確定ボタンが押された時 0 // 仮ボタンが押された時 1 int returnOption; if (!temp) { returnOption = SaveParamsM.SAVE_AS_FINAL; } else { returnOption = SaveParamsM.SAVE_AS_TMP; } // 開始時と終了時のオプションでKarteEditorで制御する model.setEnterOption(enterParams.getEnterOption()); model.setReturnOption(returnOption); // Title候補 String titleCand = ""; java.util.ResourceBundle bundle = ClientContext.getMyBundle(SaveDialogNoSendAtTmp.class); switch (returnOption) { case SaveParamsM.SAVE_AS_FINAL: // 確定ボタンが押された時 model.setTmpSave(false); model.setClaimDate(getClaimDate()); // Property model.setSendClaim(sendClaim.isSelected()); // CLAIM送信->CheckBox model.setSendLabtest(sendLabtest.isSelected()); // Lab.Test送信->CheckBox model.setAllowPatientRef(patientCheck.isSelected()); // MML->CheckBox model.setAllowClinicRef(clinicCheck.isSelected()); // MML->CheckBox titleCand = bundle.getString("title.candidate.progressCourse"); break; case SaveParamsM.SAVE_AS_TMP: // 仮ボタンが押された時 model.setTmpSave(true); // 仮保存である model.setSendClaim(false); // CLAIM送信はしない設定である model.setClaimDate(getClaimDate()); // Property //s.oh^ 2014/11/04 仮保存時のオーダー出力 //model.setSendLabtest(false); // Lab.Test送信->false 互換性を確保.. model.setSendLabtest(Project.getBoolean(Project.SEND_TMPKARTE_LABTEST) ? sendLabtest.isSelected() : false); //s.oh$ model.setAllowPatientRef(false); // MML->送信しない model.setAllowClinicRef(false); // MML->送信しない model.setSendMML(false); titleCand = bundle.getString("title.candidate.temporalSave"); break; } // 文書タイトルを取得する String val = (String)titleCombo.getSelectedItem(); val = (val.isEmpty()) ? titleCand : val; model.setTitle(val); // Department val = departmentLabel.getText(); model.setDepartment(val); // 印刷部数を取得する int count = Integer.parseInt((String)printCombo.getSelectedItem()); model.setPrintCount(count); return model; } private class PopupListener extends PopupCalendarListener { private PopupListener(JTextField tf, int[] range, SimpleDate[] disabled) { super(tf, range,disabled); } @Override public void setValue(SimpleDate sd) { if (!sendClaim.isSelected()) { return; } GregorianCalendar gc = new GregorianCalendar(); gc.clear(); gc.set(GregorianCalendar.YEAR, sd.getYear()); gc.set(GregorianCalendar.MONTH, sd.getMonth()); gc.set(GregorianCalendar.DATE, sd.getDay()); setClaimDate(gc.getTime()); } } }