private void initComponents() { final SimpleDateFormat dateFrmt = new SimpleDateFormat(DEFAULT_DATE_FORMAT); panel = new JPanel(); panel.setLayout(new BorderLayout()); JPanel north = new JPanel(); north.setLayout(new BoxLayout(north, BoxLayout.X_AXIS)); JLabel dateLbl = new JLabel("検査日:"); north.add(dateLbl); dateFld = new JTextField(10); dateFld.setMaximumSize(dateFld.getPreferredSize()); dateFld.setEditable(false); dateFld.setText(dateFrmt.format(new Date())); north.add(dateFld); north.add(Box.createHorizontalGlue()); editCheck = new JCheckBox("項目編集"); north.add(editCheck); panel.add(north, BorderLayout.NORTH); JPanel south = new JPanel(); south.setLayout(new FlowLayout()); deleteBtn = new JButton("削除", deleteIcon); deleteBtn.setEnabled(false); south.add(deleteBtn); closeBtn = new JButton("閉じる", closeIcon); south.add(closeBtn); saveBtn = new JButton("保存", saveIcon); south.add(saveBtn); panel.add(south, BorderLayout.SOUTH); setTable = new JTable(); JScrollPane scroll = new JScrollPane(setTable); centerPanel = new JPanel(); centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS)); centerPanel.add(scroll); panel.add(centerPanel, BorderLayout.CENTER); templateTable = new JTable(); templateTable.setToolTipText("DnDで左の施設内検査項目テーブルに追加してください。"); rtScroll = new JScrollPane(templateTable); Dimension d = new Dimension(200, 200); rtScroll.setPreferredSize(d); d = new Dimension(200, Integer.MAX_VALUE); rtScroll.setMaximumSize(d); dialog = new JDialog(); String title = ClientContext.getFrameTitle("院内検査項目追加"); dialog.setTitle(title); dialog.setModal(true); dialog.setContentPane(panel); ClientContext.setDolphinIcon(dialog); dialog.pack(); dialog.setLocationRelativeTo(chart.getFrame()); }
private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { popup = new JPopupMenu(); CalendarCardPanel cc = new CalendarCardPanel(ClientContext.getEventColorTable()); cc.addPropertyChangeListener(CalendarCardPanel.PICKED_DATE, this); cc.setCalendarRange(new int[] {-12, 0}); popup.insert(cc, 0); popup.show(e.getComponent(), e.getX(), e.getY()); } }
protected void failed(Throwable e) { e.printStackTrace(System.err); StringBuilder why = new StringBuilder(); why.append(ERROR_ACCESS); why.append("\n"); Throwable cause = e.getCause(); if (cause != null) { why.append(cause.getMessage()); } else { why.append(e.getMessage()); } Window parent = SwingUtilities.getWindowAncestor(chart.getFrame()); JOptionPane.showMessageDialog( parent, why.toString(), ClientContext.getFrameTitle(TITLE), JOptionPane.WARNING_MESSAGE); }
/** GUI コンポーネントを初期化する。 */ private void initComponents() { view = new NLabTestImportView(); setUI(view); String[] columnNames = new String[] {"ラボ", "患者ID", "カナ", "カルテ・カナ", "性別", "カルテ・性別", "検体採取日", "項目数", "登録"}; String[] propNames = new String[] { "laboCode", "patientId", "patientName", "karteKanaName", "patientSex", "karteSex", "sampleDate", "numOfTestItems", "result" }; int[] columnWidth = new int[] {50, 120, 120, 120, 50, 70, 120, 50, 80}; tableModel = new ListTableModel<NLaboImportSummary>(columnNames, 30, propNames, null); view.getTable().setModel(tableModel); view.getTable().setRowHeight(ClientContext.getHigherRowHeight()); view.getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); view.getTable().setTransferHandler(new NLaboTestFileTransferHandler(this)); // カラム幅を変更する for (int i = 0; i < columnWidth.length; i++) { view.getTable().getColumnModel().getColumn(i).setPreferredWidth(columnWidth[i]); } // レンダラを設定する view.getTable().setDefaultRenderer(Object.class, new NLaboTestImporter.LabTestRenderer()); // カウント値0を設定する updateCount(); }
public void openKarte() { boolean showReceiptMessage = Project.getBoolean("showReceiptMessage", true); if (showReceiptMessage) { JLabel msg1 = new JLabel("受付リストからオープンしないと診療データをレセコンに"); JLabel msg2 = new JLabel("送信することができません。続けますか?"); final JCheckBox cb = new JCheckBox("今後このメッセージを表示しない"); cb.setFont(new Font("Dialog", Font.PLAIN, 10)); cb.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Project.setBoolean("showReceiptMessage", !cb.isSelected()); } }); JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 3)); p1.add(msg1); JPanel p2 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 3)); p2.add(msg2); JPanel p3 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 3)); p3.add(cb); JPanel box = new JPanel(); box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS)); box.add(p1); box.add(p2); box.add(p3); box.setBorder(BorderFactory.createEmptyBorder(0, 0, 11, 11)); int option = JOptionPane.showConfirmDialog( SwingUtilities.getWindowAncestor(getUI()), new Object[] {box}, ClientContext.getFrameTitle(getName()), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, ClientContext.getImageIcon("about_32.gif")); if (option != JOptionPane.YES_OPTION) { return; } } PatientModel patient = selectedLabo.getPatient(); PatientVisitModel pvt = new PatientVisitModel(); pvt.setNumber(number++); pvt.setPatientModel(patient); // 受け付けを通していないので診療科はユーザ登録してあるものを使用する // 診療科名、診療科コード、医師名、医師コード、JMARI // 2.0 pvt.setDeptName(Project.getUserModel().getDepartmentModel().getDepartmentDesc()); pvt.setDeptCode(Project.getUserModel().getDepartmentModel().getDepartment()); pvt.setDoctorName(Project.getUserModel().getCommonName()); if (Project.getUserModel().getOrcaId() != null) { pvt.setDoctorId(Project.getUserModel().getOrcaId()); } else { pvt.setDoctorId(Project.getUserModel().getUserId()); } pvt.setJmariNumber(Project.getString(Project.JMARI_CODE)); // カルテコンテナを生成する getContext().openKarte(pvt); }
/** * LabTestImporter * * @author Kazushi Minagawa, Digital Globe, Inc. */ public class NLaboTestImporter extends AbstractMainComponent { private static final String NAME = "ラボレシーバ"; private static final String SUCCESS = "成功"; private static final String ERROR = "エラー"; private static final Color ODD_COLOR = ClientContext.getColor("color.odd"); private static final Color EVEN_COLOR = ClientContext.getColor("color.even"); private static final Color UNCONSTRAINED_COLOR = new Color(255, 102, 102); // 選択されている患者情報 private NLaboImportSummary selectedLabo; private int number = 100000; // View private ListTableModel<NLaboImportSummary> tableModel; private NLabTestImportView view; /** Creates new NLaboTestImporter */ public NLaboTestImporter() { setName(NAME); } @Override public void start() { initComponents(); connect(); enter(); } @Override public void enter() { controlMenu(); } @Override public void stop() {} public JProgressBar getProgressBar() { return getContext().getProgressBar(); } public ListTableModel<NLaboImportSummary> getTableModel() { return (ListTableModel<NLaboImportSummary>) view.getTable().getModel(); } public NLaboImportSummary getSelectedLabo() { return selectedLabo; } public void setSelectedLabo(NLaboImportSummary selectedLabo) { this.selectedLabo = selectedLabo; controlMenu(); } public void openKarte() { boolean showReceiptMessage = Project.getBoolean("showReceiptMessage", true); if (showReceiptMessage) { JLabel msg1 = new JLabel("受付リストからオープンしないと診療データをレセコンに"); JLabel msg2 = new JLabel("送信することができません。続けますか?"); final JCheckBox cb = new JCheckBox("今後このメッセージを表示しない"); cb.setFont(new Font("Dialog", Font.PLAIN, 10)); cb.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Project.setBoolean("showReceiptMessage", !cb.isSelected()); } }); JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 3)); p1.add(msg1); JPanel p2 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 3)); p2.add(msg2); JPanel p3 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 3)); p3.add(cb); JPanel box = new JPanel(); box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS)); box.add(p1); box.add(p2); box.add(p3); box.setBorder(BorderFactory.createEmptyBorder(0, 0, 11, 11)); int option = JOptionPane.showConfirmDialog( SwingUtilities.getWindowAncestor(getUI()), new Object[] {box}, ClientContext.getFrameTitle(getName()), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, ClientContext.getImageIcon("about_32.gif")); if (option != JOptionPane.YES_OPTION) { return; } } PatientModel patient = selectedLabo.getPatient(); PatientVisitModel pvt = new PatientVisitModel(); pvt.setNumber(number++); pvt.setPatientModel(patient); // 受け付けを通していないので診療科はユーザ登録してあるものを使用する // 診療科名、診療科コード、医師名、医師コード、JMARI // 2.0 pvt.setDeptName(Project.getUserModel().getDepartmentModel().getDepartmentDesc()); pvt.setDeptCode(Project.getUserModel().getDepartmentModel().getDepartment()); pvt.setDoctorName(Project.getUserModel().getCommonName()); if (Project.getUserModel().getOrcaId() != null) { pvt.setDoctorId(Project.getUserModel().getOrcaId()); } else { pvt.setDoctorId(Project.getUserModel().getUserId()); } pvt.setJmariNumber(Project.getString(Project.JMARI_CODE)); // カルテコンテナを生成する getContext().openKarte(pvt); } /** * 検索結果件数を設定しステータスパネルへ表示する。 * * @param cnt 件数 */ public void updateCount() { int count = getTableModel().getObjectCount(); String text = String.valueOf(count); text += "件"; view.getCountLbl().setText(text); } /** メニューを制御する */ private void controlMenu() { PatientModel pvt = getSelectedLabo() != null ? getSelectedLabo().getPatient() : null; boolean enabled = canOpen(pvt); getContext().enabledAction(GUIConst.ACTION_OPEN_KARTE, enabled); } /** * カルテを開くことが可能かどうかを返す。 * * @return 開くことが可能な時 true */ private boolean canOpen(PatientModel patient) { if (patient == null) { return false; } if (isKarteOpened(patient)) { return false; } return true; } /** * カルテがオープンされているかどうかを返す。 * * @return オープンされている時 true */ private boolean isKarteOpened(PatientModel patient) { if (patient != null) { boolean opened = false; java.util.List<ChartImpl> allCharts = ChartImpl.getAllChart(); for (ChartImpl chart : allCharts) { if (chart.getPatient().getId() == patient.getId()) { opened = true; break; } } return opened; } return false; } /** 検査結果ファイルを選択し、パースする。 */ private void selectAndParseLabFile() { // 検査結果ファイルを選択する JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "Lab Result File", "DAT", "dat", "DAT2", "dat2", "HL7", "hl7", "TXT", "txt"); chooser.setFileFilter(filter); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); int returnVal = chooser.showOpenDialog(getUI()); if (returnVal != JFileChooser.APPROVE_OPTION) { return; } // パースしてテーブルへ表示する // 登録ボタンをアクティブにする final File labFile = new File(chooser.getSelectedFile().getPath()); final javax.swing.SwingWorker worker = new javax.swing.SwingWorker<List<NLaboImportSummary>, Void>() { @Override protected List<NLaboImportSummary> doInBackground() throws Exception { LabResultParser parse = LabParserFactory.getParser(labFile.getName()); List<NLaboImportSummary> dataList = parse.parse(labFile); if (dataList != null && dataList.size() > 0) { List<String> idList = new ArrayList<String>(dataList.size()); for (NLaboImportSummary sm : dataList) { idList.add(sm.getPatientId()); } LaboDelegater laboDelegater = new LaboDelegater(); List<PatientLiteModel> pList = laboDelegater.getConstrainedPatients(idList); // for (int i = 0; i < pList.size(); i++) { for (int i = 0; i < dataList.size(); i++) { NLaboImportSummary sm = dataList.get(i); PatientLiteModel pl = pList.get(i); if (pl != null) { sm.setKarteId(pl.getPatientId()); sm.setKarteBirthday(pl.getBirthday()); sm.setKarteKanaName(pl.getKanaName()); sm.setKarteName(pl.getFullName()); sm.setKarteSex(pl.getGenderDesc()); } } } return dataList; } @Override protected void done() { try { List<NLaboImportSummary> allModules = get(); getTableModel().setDataProvider(allModules); } catch (Throwable e) { e.printStackTrace(System.err); String why = e.getMessage(); Window parent = SwingUtilities.getWindowAncestor(getUI()); StringBuilder sb = new StringBuilder(); sb.append("登録できないファイルがあります。").append("\n"); sb.append("検査結果ファイルに誤りがある可能性があります。").append("\n"); sb.append(why); String message = sb.toString(); String title = "ラボレシーバ"; JOptionPane.showMessageDialog( parent, message, ClientContext.getFrameTitle(title), JOptionPane.WARNING_MESSAGE); } } }; worker.addPropertyChangeListener( new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getNewValue().equals(javax.swing.SwingWorker.StateValue.STARTED)) { getProgressBar().setIndeterminate(true); } else if (evt.getNewValue().equals(javax.swing.SwingWorker.StateValue.DONE)) { getProgressBar().setIndeterminate(false); getProgressBar().setValue(0); worker.removePropertyChangeListener(this); } } }); worker.execute(); } /** パースした検査結果を登録する。 */ private void addLabtest() { final List<NLaboImportSummary> modules = getTableModel().getDataProvider(); final javax.swing.SwingWorker worker = new javax.swing.SwingWorker<Void, Void>() { @Override protected Void doInBackground() throws Exception { LaboDelegater laboDelegater = new LaboDelegater(); for (NLaboImportSummary summary : modules) { PatientModel pm = laboDelegater.putNLaboModule(summary.getModule()); if (pm != null) { summary.setPatient(pm); summary.setResult(SUCCESS); } else { summary.setResult(ERROR); } // Table 更新 Runnable awt = new Runnable() { @Override public void run() { getTableModel().fireTableDataChanged(); } }; EventQueue.invokeLater(awt); } return null; } }; worker.addPropertyChangeListener( new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getNewValue().equals(javax.swing.SwingWorker.StateValue.STARTED)) { getProgressBar().setIndeterminate(true); } else if (evt.getNewValue().equals(javax.swing.SwingWorker.StateValue.DONE)) { getProgressBar().setIndeterminate(false); getProgressBar().setValue(0); worker.removePropertyChangeListener(this); } } }); worker.execute(); } /** コンポーンントにリスナを登録し接続する。 */ private void connect() { // ファイル選択ボタン view.getFileBtn() .addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // ファイル選択 selectAndParseLabFile(); } }); // 登録ボタン view.getAddBtn() .addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 検査結果登録 view.getAddBtn().setEnabled(false); addLabtest(); } }); view.getAddBtn().setEnabled(false); // クリアボタン view.getClearBtn() .addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 検査結果登録 getTableModel().setDataProvider(null); } }); view.getClearBtn().setEnabled(false); // 行選択 view.getTable() .getSelectionModel() .addListSelectionListener( new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { NLaboImportSummary lab = getTableModel().getObject(view.getTable().getSelectedRow()); if (lab != null) { setSelectedLabo(lab); } } } }); // ダブルクリック view.getTable() .addMouseListener( new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { NLaboImportSummary lab = getTableModel().getObject(view.getTable().getSelectedRow()); if (lab != null && lab.getPatient() != null) { openKarte(); } } } }); // コンテキストメニューリスナを設定する view.getTable() .addMouseListener( new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { mabeShowPopup(e); } @Override public void mouseReleased(MouseEvent e) { mabeShowPopup(e); } private void mabeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { final JPopupMenu contextMenu = new JPopupMenu(); JTable table = view.getTable(); int row = table.rowAtPoint(e.getPoint()); Object obj = (Object) getTableModel().getObject(row); int selected = table.getSelectedRow(); if (row == selected && obj != null) { String pop1 = ClientContext.getString("watingList.popup.openKarte"); contextMenu.add( new JMenuItem( new ReflectAction(pop1, NLaboTestImporter.this, "openKarte"))); } contextMenu.show(e.getComponent(), e.getX(), e.getY()); } } }); // data 件数リスナ getTableModel() .addPropertyChangeListener( new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { List<NLaboImportSummary> list = (List<NLaboImportSummary>) evt.getNewValue(); boolean enabled = (list != null && list.size() > 0) ? true : false; boolean clearOk = enabled; if (enabled) { for (NLaboImportSummary sm : list) { if (sm.getKarteId() == null) { enabled = false; break; } } } view.getAddBtn().setEnabled(enabled); view.getClearBtn().setEnabled(clearOk); updateCount(); } }); } /** GUI コンポーネントを初期化する。 */ private void initComponents() { view = new NLabTestImportView(); setUI(view); String[] columnNames = new String[] {"ラボ", "患者ID", "カナ", "カルテ・カナ", "性別", "カルテ・性別", "検体採取日", "項目数", "登録"}; String[] propNames = new String[] { "laboCode", "patientId", "patientName", "karteKanaName", "patientSex", "karteSex", "sampleDate", "numOfTestItems", "result" }; int[] columnWidth = new int[] {50, 120, 120, 120, 50, 70, 120, 50, 80}; tableModel = new ListTableModel<NLaboImportSummary>(columnNames, 30, propNames, null); view.getTable().setModel(tableModel); view.getTable().setRowHeight(ClientContext.getHigherRowHeight()); view.getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); view.getTable().setTransferHandler(new NLaboTestFileTransferHandler(this)); // カラム幅を変更する for (int i = 0; i < columnWidth.length; i++) { view.getTable().getColumnModel().getColumn(i).setPreferredWidth(columnWidth[i]); } // レンダラを設定する view.getTable().setDefaultRenderer(Object.class, new NLaboTestImporter.LabTestRenderer()); // カウント値0を設定する updateCount(); } protected class LabTestRenderer extends DefaultTableCellRenderer { /** Creates new IconRenderer */ public LabTestRenderer() { super(); } @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean isFocused, int row, int col) { NLaboImportSummary summary = (NLaboImportSummary) tableModel.getObject(row); if (isSelected) { this.setBackground(table.getSelectionBackground()); this.setForeground(table.getSelectionForeground()); } else { if (summary != null && summary.getKarteId() == null) { this.setBackground(UNCONSTRAINED_COLOR); } else { if ((row & (1)) == 0) { this.setBackground(EVEN_COLOR); } else { this.setBackground(ODD_COLOR); } } this.setForeground(table.getForeground()); } if (value != null && value instanceof String) { this.setText((String) value); } else { this.setText(value == null ? "" : value.toString()); } return this; } } }
/** GUI コンポーネントを初期化する。 */ private void initComponents() { // View view = new PatientSearchView(); setUI(view); // ColumnSpecHelperにテーブルを設定する columnHelper.setTable(view.getTable()); // ------------------------------------------ // View のテーブルモデルを置き換える // ------------------------------------------ String[] columnNames = columnHelper.getTableModelColumnNames(); String[] methods = columnHelper.getTableModelColumnMethods(); Class[] cls = columnHelper.getTableModelColumnClasses(); tableModel = new ListTableModel<PatientModel>(columnNames, 0, methods, cls) { @Override public Object getValueAt(int row, int col) { Object ret = null; if (col == ageColumn && ageDisplay) { PatientModel p = getObject(row); if (p != null) { int showMonth = Project.getInt("ageToNeedMonth", 6); ret = AgeCalculater.getAgeAndBirthday(p.getBirthday(), showMonth); } } else { ret = super.getValueAt(row, col); } return ret; } }; view.getTable().setModel(tableModel); // masuda^ table sorter 組み込み sorter = new ListTableSorter(tableModel); view.getTable().setModel(sorter); sorter.setTableHeader(view.getTable().getTableHeader()); // masuda$ // カラム幅更新 columnHelper.updateColumnWidth(); // minagawa^ lsctest view.getTable().getColumnModel().getColumn(stateColumn).setIdentifier(COLUMN_IDENTIFIER_STATE); // minagawa$ // masuda^ // レンダラを設定する // view.getTable().setDefaultRenderer(Object.class, new OddEvenRowRenderer()); // 連ドラ、梅ちゃん先生 PatientListTableRenderer renderer = new PatientListTableRenderer(); renderer.setTable(view.getTable()); renderer.setDefaultRenderer(); // masuda$ // ソートアイテム sortItem = Project.getInt("sortItem", 0); // s.oh^ 2014/08/13 コントロールサイズ調整 String nimbus = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"; String laf = UIManager.getLookAndFeel().getClass().getName(); if (!laf.equals(nimbus)) { view.getSortItem().setPreferredSize(new Dimension(90, 20)); } // s.oh$ view.getSortItem().setSelectedIndex(sortItem); // Auto IME Windows の時のみ if (!ClientContext.isMac()) { // デフォルトは true boolean autoIme = Project.getBoolean("autoIme", true); view.getAutoIme().setSelected(autoIme); } else { // MAC は disabled // view.getAutoIme().setEnabled(false); view.getAutoIme().setVisible(false); } // 行高 if (ClientContext.isWin()) { view.getTable().setRowHeight(ClientContext.getMoreHigherRowHeight()); } else { view.getTable().setRowHeight(ClientContext.getHigherRowHeight()); } String method = ageDisplay ? AGE_METHOD[0] : AGE_METHOD[1]; ListTableModel tModel = getTableModel(); tModel.setProperty(method, ageColumn); List<ColumnSpec> columnSpecs = columnHelper.getColumnSpecs(); for (int i = 0; i < columnSpecs.size(); i++) { ColumnSpec cs = columnSpecs.get(i); String test = cs.getMethod(); if (test.toLowerCase().endsWith("birthday")) { cs.setMethod(method); break; } } //// s.oh^ 2014/10/22 Icon表示 // view.getSearchLabel().setIcon(ClientContext.getImageIconArias("icon_search_large")); //// s.oh$ // s.oh^ 2014/04/16 メニュー制御 view.getTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // s.oh$ }
/** * StmapTreeMenuBuilder * * @author Kazushi Minagawa */ public class StmapTreePopupBuilder { // minagawa^ Icon Server // private static final Icon icon = ClientContext.getImageIcon("foldr_16.gif"); private static final Icon icon = ClientContext.getImageIconArias("icon_foldr_small"); // minagawa$ private HashMap<Object, JMenu> parents; private JPopupMenu popup; private DefaultMutableTreeNode rootNode; public StmapTreePopupBuilder() {} public void build( StampTree stampTree, JPopupMenu popup, JComponent cmp, TransferHandler handler) { if (parents == null) { parents = new HashMap<Object, JMenu>(10, 0.75f); } else { parents.clear(); } this.popup = popup; rootNode = (DefaultMutableTreeNode) stampTree.getModel().getRoot(); Enumeration e = rootNode.preorderEnumeration(); e.nextElement(); // consume root while (e.hasMoreElements()) { parseChildren((StampTreeNode) e.nextElement(), cmp, handler); } } private void parseChildren(StampTreeNode node, JComponent comp, TransferHandler handler) { if (!node.isLeaf()) { JMenu subMenu = new JMenu(node.getUserObject().toString()); DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) node.getParent(); if (parentNode == rootNode) { popup.add(subMenu); } else { JMenu parent = parents.get(node.getParent()); parent.add(subMenu); } parents.put(node, subMenu); // 配下の子を全て列挙しJmenuItemにまとめる JMenuItem item = new JMenuItem(node.getUserObject().toString()); item.setIcon(icon); subMenu.add(item); if (comp != null && handler != null) { item.addActionListener( new TransferAction(comp, handler, new LocalStampTreeNodeTransferable(node))); } else { item.setEnabled(false); } } else { ModuleInfoBean info = (ModuleInfoBean) node.getUserObject(); JMenuItem item = new JMenuItem(info.getStampName()); if (comp != null && handler != null) { item.addActionListener( new TransferAction(comp, handler, new LocalStampTreeNodeTransferable(node))); } else { item.setEnabled(false); } DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) node.getParent(); if (parentNode == rootNode) { popup.add(item); } else { JMenu parent = parents.get(node.getParent()); parent.add(item); } } } }
@Override public String create() { try { Document document = new Document( PageSize.A4, getMarginLeft(), getMarginRight(), getMarginTop(), getMarginBottom()); String path = UserDocumentHelper.createPathToDocument( getDocumentDir(), // PDF File を置く場所 "診断書", // 文書名 EXT_PDF, // 拡張子 model.getPatientName(), // 患者氏名 new Date()); // 日付 // minagawa^ jdk7 Path pathObj = Paths.get(path); setPathToPDF(pathObj.toAbsolutePath().toString()); // 呼び出し側で取り出せるように保存する // minagawa$ // Open Document ByteArrayOutputStream byteo = new ByteArrayOutputStream(); PdfWriter.getInstance(document, byteo); document.open(); // Font baseFont = BaseFont.createFont(HEISEI_MIN_W3, UNIJIS_UCS2_HW_H, false); if (Project.getString(Project.SHINDANSYO_FONT_SIZE).equals("small")) { titleFont = new Font(baseFont, getTitleFontSize()); bodyFont = new Font(baseFont, getBodyFontSize()); } else { titleFont = new Font(baseFont, 18); bodyFont = new Font(baseFont, 14); } // ---------------------------------------- // タイトル // ---------------------------------------- Paragraph para = new Paragraph(DOC_TITLE, titleFont); para.setAlignment(Element.ALIGN_CENTER); document.add(para); document.add(new Paragraph(" ")); document.add(new Paragraph(" ")); document.add(new Paragraph(" ")); // ---------------------------------------- // 患者情報テーブル // ---------------------------------------- PdfPTable pTable = new PdfPTable(new float[] {20.0f, 60.0f, 10.0f, 10.0f}); pTable.setWidthPercentage(100.0f); // 患者氏名 PdfPCell cell; pTable.addCell(createNoBorderCell("氏 名")); cell = createNoBorderCell(model.getPatientName()); cell.setColspan(3); pTable.addCell(cell); // 生年月日 性別 pTable.addCell(createNoBorderCell("生年月日")); pTable.addCell(createNoBorderCell(getDateString(model.getPatientBirthday()))); pTable.addCell(createNoBorderCell("性別")); pTable.addCell(createNoBorderCell(model.getPatientGender())); // 住所 pTable.addCell(createNoBorderCell("住 所")); cell = createNoBorderCell(model.getPatientAddress()); cell.setColspan(3); pTable.addCell(cell); // 傷病名 String disease = model.getItemValue(MedicalCertificateImpl.ITEM_DISEASE); pTable.addCell(createNoBorderCell("傷 病 名")); cell = createNoBorderCell(disease); cell.setColspan(3); pTable.addCell(cell); document.add(pTable); document.add(new Paragraph(" ")); // ------------------------------------------ // コンテントテーブル // ------------------------------------------ pTable = new PdfPTable(new float[] {1.0f}); pTable.setWidthPercentage(100.0f); String informed = model.getTextValue(MedicalCertificateImpl.TEXT_INFORMED_CONTENT); cell = createNoBorderCell(informed); if (Project.getString("sindansyo.font.size").equals("small")) { cell.setFixedHeight(250.0f); // Cell 高 } else { cell.setFixedHeight(225.0f); // Cell 高 } cell.setLeading(0f, 1.5f); // x 1.5 font height pTable.addCell(cell); document.add(pTable); document.add(new Paragraph(" ")); // ------------------------------------------ // 署名テーブル // ------------------------------------------ // 日付 pTable = new PdfPTable(new float[] {1.0f}); pTable.setWidthPercentage(100.0f); // 上記の通り診断する pTable.addCell(createNoBorderCell("上記の通り診断する。")); // minagawa^ LSC 1.4 bug fix 文書の印刷日付 2013/06/24 // String dateStr = getDateString(model.getConfirmed()); String dateStr = getDateString(model.getStarted()); // minagawa$ pTable.addCell(createNoBorderCell(dateStr)); // 住所 BaseFont.getWidthPoint String zipCode = model.getConsultantZipCode(); String address = model.getConsultantAddress(); // float zipLen = baseFont.getWidthPoint(zipCode, 12.0f); // float addressLen = baseFont.getWidthPoint(address, 12.0f); // float padlen = addressLen-zipLen; // sb = new StringBuilder(); // while (true) { // sb.append(" "); // if (baseFont.getWidthPoint(sb.toString(), 12.0f)>=padlen) { // break; // } // } // String space = sb.toString(); StringBuilder sb = new StringBuilder(); sb.append(zipCode); cell = createNoBorderCell(sb.toString()); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); pTable.addCell(cell); sb = new StringBuilder(); sb.append(address); cell = createNoBorderCell(sb.toString()); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); pTable.addCell(cell); // 病院名 cell = createNoBorderCell(model.getConsultantHospital()); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); pTable.addCell(cell); // 電話番号 cell = createNoBorderCell(model.getConsultantTelephone()); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); pTable.addCell(cell); // 医師 sb = new StringBuilder(); sb.append("医 師 ").append(model.getConsultantDoctor()).append(" 印"); cell = createNoBorderCell(sb.toString()); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); pTable.addCell(cell); document.add(pTable); document.close(); // // pdf content bytes byte[] pdfbytes = byteo.toByteArray(); // 評価でない場合は Fileへ書き込んでリターン if (!ClientContext.is5mTest()) { // minagawa^ // FileOutputStream fout = new FileOutputStream(pathToPDF); // FileChannel channel = fout.getChannel(); // ByteBuffer bytebuff = ByteBuffer.wrap(pdfbytes); // // while(bytebuff.hasRemaining()) { // channel.write(bytebuff); // } // channel.close(); Files.write(pathObj, pdfbytes); // minagawa$ return getPathToPDF(); } // 評価の場合は water Mark を書く PdfReader pdfReader = new PdfReader(pdfbytes); // minagawa~ // PdfStamper pdfStamper = new PdfStamper(pdfReader,new // FileOutputStream(pathToPDF)); PdfStamper pdfStamper = new PdfStamper(pdfReader, Files.newOutputStream(pathObj)); // minagawa$ Image image = Image.getInstance(ClientContext.getImageResource("water-mark.png")); for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) { PdfContentByte content = pdfStamper.getUnderContent(i); image.scaleAbsolute(PageSize.A4.getWidth(), PageSize.A4.getHeight()); image.setAbsolutePosition(0.0f, 0.0f); content.addImage(image); } pdfStamper.close(); return getPathToPDF(); } catch (IOException ex) { ClientContext.getBootLogger().warn(ex); throw new RuntimeException(ERROR_IO); } catch (DocumentException ex) { ClientContext.getBootLogger().warn(ex); throw new RuntimeException(ERROR_PDF); } }
/** Creates a new instance of SettingPanel */ public AbstractSettingPanel() { ui = new JPanel(); logger = ClientContext.getBootLogger(); }
/** * 院内検査を登録するダイアログ * * @author masuda, Masuda Naika */ public class InFacilityLabo { private static final char FULL_MINUS = (char) 65293; private static final char HALF_MINUS = '-'; private static final char[] MATCHIES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', '.', 'ー', FULL_MINUS }; private static final char[] REPLACES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', '.', HALF_MINUS, HALF_MINUS }; private static final String[] TEMPLATE_COL_NAME = {"検査項目"}; private static final String[] TEMPLATE_COL_METHOD = {"getItemName"}; private static final int[] TEMPLATE_COL_WIDTH = {20}; private static final int START_NUM_ROW = 1; private static final String[] SET_COL_NAME = {"検査項目", "値", "異常", "基準値", "単位"}; private static final String[] SET_COL_METHOD = { "getItemName", "getItemValue", "getAbnormalFlg", "getNormalValue", "getUnit" }; private static final int[] SET_COL_WIDTH = {20, 10, 10, 20, 10}; private static final int VALUE_COL = 1; private static final int NORMAL_COL = 3; private static final int UNIT_COL = 4; private static final ImageIcon closeIcon = ClientContext.getImageIconAlias("icon_cancel_small"); private static final ImageIcon deleteIcon = ClientContext.getImageIconAlias("icon_delete_small"); private static final ImageIcon saveIcon = ClientContext.getImageIconAlias("icon_save_small"); private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm"; private JDialog dialog; private JPanel panel; private JTextField dateFld; private JTable setTable; private JTable templateTable; private JCheckBox editCheck; private JButton deleteBtn; private JButton closeBtn; private JButton saveBtn; private JPanel centerPanel; private JScrollPane rtScroll; private ListTableModel<InFacilityLaboItem> setTableModel; private ListTableModel<InFacilityLaboItem> templateTableModel; private Chart chart; private boolean male; private boolean toUpdate; public void setContext(Chart chart) { this.chart = chart; male = IInfoModel.MALE.equals(chart.getPatient().getGender()); } public boolean start() throws Exception { initComponents(); connect(); setupTables(); dialog.setVisible(true); dialog.dispose(); return toUpdate; } private void setupTables() throws Exception { templateTableModel = new ListTableModel<InFacilityLaboItem>( TEMPLATE_COL_NAME, START_NUM_ROW, TEMPLATE_COL_METHOD, null) { @Override public boolean isCellEditable(int row, int column) { return false; } }; setTableModel = new ListTableModel<InFacilityLaboItem>(SET_COL_NAME, START_NUM_ROW, SET_COL_METHOD, null) { @Override public boolean isCellEditable(int row, int column) { if (column == VALUE_COL || column == NORMAL_COL || column == UNIT_COL) { return true; } return false; } @Override public void setValueAt(Object obj, int row, int column) { if (column != VALUE_COL && column != NORMAL_COL && column != UNIT_COL) { return; } InFacilityLaboItem item = (InFacilityLaboItem) setTableModel.getObject(row); String value = (String) obj; value = toHalfNumber(value).trim(); switch (column) { case VALUE_COL: item.setItemValue(value); break; case NORMAL_COL: item.setNormalValue(value); break; case UNIT_COL: item.setUnit(value); break; } item.setAbnormalFlg(getAbnormalFlg(item)); } }; List<InFacilityLaboItem> defaultList = InFacilityLaboTable.createLaboItemList(); templateTableModel.setDataProvider(defaultList); templateTable.setModel(templateTableModel); StripeTableCellRenderer renderer = new StripeTableCellRenderer(templateTable); renderer.setDefaultRenderer(); templateTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); templateTable.getTableHeader().setReorderingAllowed(false); // 列幅を設定する int len = TEMPLATE_COL_NAME.length; TableColumn column; for (int i = 0; i < len; i++) { column = templateTable.getColumnModel().getColumn(i); column.setPreferredWidth(TEMPLATE_COL_WIDTH[i]); } templateTable.setDragEnabled(true); InFacilityLaboTransferHandler tHandler = new InFacilityLaboTransferHandler(); tHandler.setEditable(false); templateTable.setTransferHandler(tHandler); MasudaDelegater del = MasudaDelegater.getInstance(); List<InFacilityLaboItem> facilityList = del.getInFacilityLaboItemList(); setTableModel.setDataProvider(facilityList); setTable.setModel(setTableModel); renderer = new StripeTableCellRenderer(setTable); renderer.setDefaultRenderer(); setTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); setTable.getTableHeader().setReorderingAllowed(false); // 列幅を設定する len = SET_COL_NAME.length; for (int i = 0; i < len; i++) { column = setTable.getColumnModel().getColumn(i); column.setPreferredWidth(SET_COL_WIDTH[i]); } setTable.setDragEnabled(true); setTable.setDropMode(DropMode.INSERT_ROWS); setTable.setColumnSelectionAllowed(false); setTable.setCellSelectionEnabled(true); InFacilityLaboTransferHandler sHandler = new InFacilityLaboTransferHandler(); sHandler.setEditable(true); setTable.setTransferHandler(sHandler); setTable.addMouseMotionListener(new SetTableMouseMotionListener()); } private void initComponents() { final SimpleDateFormat dateFrmt = new SimpleDateFormat(DEFAULT_DATE_FORMAT); panel = new JPanel(); panel.setLayout(new BorderLayout()); JPanel north = new JPanel(); north.setLayout(new BoxLayout(north, BoxLayout.X_AXIS)); JLabel dateLbl = new JLabel("検査日:"); north.add(dateLbl); dateFld = new JTextField(10); dateFld.setMaximumSize(dateFld.getPreferredSize()); dateFld.setEditable(false); dateFld.setText(dateFrmt.format(new Date())); north.add(dateFld); north.add(Box.createHorizontalGlue()); editCheck = new JCheckBox("項目編集"); north.add(editCheck); panel.add(north, BorderLayout.NORTH); JPanel south = new JPanel(); south.setLayout(new FlowLayout()); deleteBtn = new JButton("削除", deleteIcon); deleteBtn.setEnabled(false); south.add(deleteBtn); closeBtn = new JButton("閉じる", closeIcon); south.add(closeBtn); saveBtn = new JButton("保存", saveIcon); south.add(saveBtn); panel.add(south, BorderLayout.SOUTH); setTable = new JTable(); JScrollPane scroll = new JScrollPane(setTable); centerPanel = new JPanel(); centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS)); centerPanel.add(scroll); panel.add(centerPanel, BorderLayout.CENTER); templateTable = new JTable(); templateTable.setToolTipText("DnDで左の施設内検査項目テーブルに追加してください。"); rtScroll = new JScrollPane(templateTable); Dimension d = new Dimension(200, 200); rtScroll.setPreferredSize(d); d = new Dimension(200, Integer.MAX_VALUE); rtScroll.setMaximumSize(d); dialog = new JDialog(); String title = ClientContext.getFrameTitle("院内検査項目追加"); dialog.setTitle(title); dialog.setModal(true); dialog.setContentPane(panel); ClientContext.setDolphinIcon(dialog); dialog.pack(); dialog.setLocationRelativeTo(chart.getFrame()); } private void connect() { editCheck.addItemListener( new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (editCheck.isSelected()) { deleteBtn.setEnabled(true); centerPanel.add(rtScroll); } else { deleteBtn.setEnabled(false); centerPanel.remove(rtScroll); } dialog.pack(); } }); deleteBtn.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { delete(); } }); closeBtn.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dialog.setVisible(false); } }); saveBtn.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { save(); toUpdate = true; } catch (Exception ex) { } } }); // カレンダによる日付入力を設定する PopupListener pl = new PopupListener(dateFld); } private void delete() { int[] selectedRows = setTable.getSelectedRows(); for (int i = selectedRows.length - 1; i >= 0; --i) { setTableModel.deleteAt(selectedRows[i]); } } private void save() throws Exception { @SuppressWarnings("unchecked") List<InFacilityLaboItem> list = setTableModel.getDataProvider(); // laboCode(facilityId)を設定する String fid = Project.getFacilityId(); for (InFacilityLaboItem item : list) { item.setLaboCode(fid); } // まずは施設内検査項目を登録する。 MasudaDelegater del = MasudaDelegater.getInstance(); del.updateInFacilityLaboItemList(list); // ついでNLaboModuleを登録する。 String pid = chart.getPatient().getPatientId(); String fidPid = fid + ":" + pid; String ptName = chart.getPatient().getFullName(); String sampleDate = dateFld.getText().trim(); // 検査箋(検査モジュール)のキー = patientId.sampleDate.labCode StringBuilder buf = new StringBuilder(); buf.append(pid); buf.append("."); buf.append(sampleDate); buf.append("."); buf.append(fid); String testKey = buf.toString(); // NLaboModuleを作成 NLaboModule nLaboModule = new NLaboModule(); // NLaboItemを作成 List<NLaboItem> nLaboItemList = new ArrayList<>(); for (InFacilityLaboItem item : list) { String itemValue = item.getItemValue(); if (itemValue == null || itemValue.trim().isEmpty()) { continue; } NLaboItem nLaboItem = createNLaboItem(item); nLaboItem.setPatientId(fidPid); nLaboItem.setLaboCode(fid); nLaboItem.setSampleDate(sampleDate); nLaboItem.setLaboModule(nLaboModule); nLaboItemList.add(nLaboItem); } // 空ならリターン if (nLaboItemList.isEmpty()) { return; } // NLaboModuleに情報設定 nLaboModule.setPatientId(pid); // ここはただのPatientID nLaboModule.setPatientName(ptName); nLaboModule.setPatientSex(male ? "M" : "F"); nLaboModule.setSampleDate(sampleDate); nLaboModule.setLaboCenterCode(fid); nLaboModule.setModuleKey(testKey); nLaboModule.setReportFormat("NLab"); // nLaboModule.setNumOfItems(String.valueOf(nLaboItemList.size())); nLaboModule.setItems(nLaboItemList); // NLaboModuleをデータベースに登録する LaboDelegater ldel = LaboDelegater.getInstance(); ldel.postNLaboModule(nLaboModule); } private NLaboItem createNLaboItem(InFacilityLaboItem item) { NLaboItem nLaboItem = new NLaboItem(); nLaboItem.setItemCode(item.getMedisCode()); nLaboItem.setItemName(item.getItemName()); nLaboItem.setMedisCode(item.getMedisCode()); nLaboItem.setParentCode(item.getParentCode()); nLaboItem.setGroupCode(item.getGroupCode()); nLaboItem.setGroupName(item.getGroupName()); nLaboItem.setLaboCode(item.getLaboCode()); nLaboItem.setNormalValue(item.getNormalValue()); nLaboItem.setSpecimenCode(item.getSpecimenCode()); nLaboItem.setSpecimenName(item.getSpecimenName()); nLaboItem.setReportStatus("E"); nLaboItem.setValue(item.getItemValue()); nLaboItem.setAbnormalFlg(item.getAbnormalFlg()); nLaboItem.setUnit(item.getUnit()); return nLaboItem; } private String getAbnormalFlg(InFacilityLaboItem item) { try { float value = Float.valueOf(item.getItemValue()); String[] strs = item.getNormalValue().split("-"); String low = strs[0].trim(); String hi = strs[1].trim(); if (low.isEmpty()) { float hiValue = Float.valueOf(hi); if (value > hiValue) { return "H"; } } else if (hi.isEmpty()) { float lowValue = Float.valueOf(low); if (value < lowValue) { return "L"; } } float hiValue = Float.valueOf(hi); float lowValue = Float.valueOf(low); if (value < lowValue) { return "L"; } else if (value > hiValue) { return "H"; } } catch (Exception e) { } return null; } private String toHalfNumber(String test) { if (test != null) { for (int i = 0; i < MATCHIES.length; i++) { test = test.replace(MATCHIES[i], REPLACES[i]); } } return test; } // MouseMotionListener private class SetTableMouseMotionListener implements MouseMotionListener { @Override public void mouseDragged(MouseEvent e) { int ctrlMask = InputEvent.CTRL_DOWN_MASK; int action = ((e.getModifiersEx() & ctrlMask) == ctrlMask) ? TransferHandler.COPY : TransferHandler.MOVE; JTable setTable = (JTable) e.getSource(); // 非選択状態からいきなりドラッグを開始すると cellEditor が残ってしまう問題の workaround if (setTable.isEditing()) { setTable.getCellEditor().stopCellEditing(); } TransferHandler handler = setTable.getTransferHandler(); handler.exportAsDrag(setTable, e, action); } @Override public void mouseMoved(MouseEvent e) {} } private static class PopupListener extends PopupCalendarListener { public PopupListener(JTextField tf) { super(tf); } @Override public void setValue(SimpleDate sd) { tf.setText(getFormattedDate(sd)); } private String getFormattedDate(SimpleDate sd) { final SimpleDateFormat dateFrmt = new SimpleDateFormat(DEFAULT_DATE_FORMAT); GregorianCalendar gc = new GregorianCalendar(); gc.clear(); gc.set(sd.getYear(), sd.getMonth(), sd.getDay()); return dateFrmt.format(gc.getTime()); } } }