« テーブルの文字欠け | トップページ | GUI コンポーネント初期値 »

2008年6月13日 (金)

病名入力

Diagnosis Diagnosis2 皮膚科では,病名に部位をつけなくてはならないので,部位付きの病名で分類してスタンプ箱に入れてある。しかし,右・左等の接頭語・接尾語まで入れると,リストが膨大になってしまうので,接頭語・接尾語は後から追加できるようにした。また,スタンプボックスから疑い病名をドロップした時,「主病名」で表示されてしまうので,主病名ではなく,「疑い病名」で表示するようにした。
Suffix

 

client/DiagnosisDocument.java の編集

  1. 必要な import
    ////
    import javax.swing.JMenuItem;
    import java.awt.event.ActionEvent;
    

     

  2. 接頭語・接尾語のリストを変数に登録
    // 傷病名件数
    private int diagnosisCount;
    
    ////↓ 病名修飾語リスト
    private static String[] DIAGNOSIS_PREP = {"右","左","両"};
    private static String[] DIAGNOSIS_PREP_CODE = {"2056","2049","2057"};
    private static String[] DIAGNOSIS_POST = {"の急性増悪","の二次感染","の再発","の術後","の治療後"};
    private static String[] DIAGNOSIS_POST_CODE = {"8061","8069","8065","8048","8075"};
    ////↑    
    

     

  3. 病名カラムも編集可能にする
     // ORCA に登録されている病名の場合
     if (entry.getStatus() != null && entry.getStatus().equals(ORCA_RECORD)) {
         return false;
     }
    
    // それ以外はカラムに依存する
    //// 診断名でポップアップが効くようにする
    ////  return ((col == CATEGORY_COL || col == OUTCOME_COL || col == START_DATE_COL || col == END_DATE_COL))
    ////      ? true
    ////       : false;
    return true;
    

     

  4. 病名をダブルクリックした後,右クリックでポップアップが出るようにする
    TableColumn column = diagTable.getColumnModel().getColumn(CATEGORY_COL);
    
    ////↓ JComboBox を細かくコントロ-ルするために MyCellEditor を作った(一番最後参照)
    ////    column.setCellEditor(new DefaultCellEditor(categoryCombo));
    column.setCellEditor(new MyCellEditor(categoryCombo));
    ////↑        
    
    // Outcome comboBox 入力を設定する
    String[] ovalues = ClientContext.getStringArray("diagnosis.outcome");
    String[] odescs = ClientContext.getStringArray("diagnosis.outcomeDesc");
    String ocodeSys = ClientContext.getString("diagnosis.outcomeCodeSys");
    DiagnosisOutcomeModel[] outcomeList = new DiagnosisOutcomeModel[ovalues.length + 1];
    DiagnosisOutcomeModel dom = new DiagnosisOutcomeModel();
    dom.setOutcome("");
    dom.setOutcomeDesc("");
    dom.setOutcomeCodeSys("");
    //outcomeList[0] = dom;
    
    ////↓ 転帰を消せるようにする
    outcomeList[0] = dom;
    //
    // 主病名は使用しないらいしい
    //
    ////        outcomeList[0] = null;
    ////↑
    for (int i = 0; i < ovalues.length; i++) {
        dom = new DiagnosisOutcomeModel();
        dom.setOutcome(ovalues[i]);
        dom.setOutcomeDesc(odescs[i]);
        dom.setOutcomeCodeSys(ocodeSys);
        outcomeList[i + 1] = dom;
    }
    JComboBox outcomeCombo = new JComboBox(outcomeList);
    column = diagTable.getColumnModel().getColumn(OUTCOME_COL);
    
    ////↓   JComboBox の細かいコントロールのため MyCellEditor を使う
    //// column.setCellEditor(new DefaultCellEditor(outcomeCombo));
    column.setCellEditor(new MyCellEditor(outcomeCombo));
    ////↑
    
    ////↓    diagnosis でポップアップが効くようにする
    column = diagTable.getColumnModel().getColumn(DIAGNOSIS_COL);
    JTextField t = new JTextField();
    t.setEditable(false);
    t.addFocusListener(AutoRomanListener.getInstance());
    new PopupListener2(t);
    column.setCellEditor(new DefaultCellEditor(t));
    ////↑
    

     

  5. 病名をドラッグ&ドロップしたときに,デフォルトの転帰がセットされるようにする
    private void insertStamp(StampModel sm, int row) {
    
        if (sm != null) {
            RegisteredDiagnosisModel module = (RegisteredDiagnosisModel) BeanUtils.xmlDecode(sm.getStampBytes());
    
            // 今日の日付を疾患開始日として設定する
            GregorianCalendar gc = new GregorianCalendar();
            String today = MMLDate.getDate(gc);
            module.setStartDate(today);
    ////↓       デフォルトのカテゴリーをセットする
            module.setCategory(open.dolphin.infomodel.IInfoModel.DEFAULT_DIAGNOSIS_CATEGORY);
            module.setCategoryDesc(open.dolphin.infomodel.IInfoModel.DEFAULT_DIAGNOSIS_CATEGORY_DESC);
            module.setCategoryCodeSys(open.dolphin.infomodel.IInfoModel.DEFAULT_DIAGNOSIS_CATEGORY_CODESYS);
            // diagnosis に「疑い」が入っていたら,疑いにセットする
            String diag = module.getDiagnosis();
            if (diag.endsWith("の疑い")) {
                String diagCode = module.getDiagnosisCode();
                module.setDiagnosis(diag.replace("の疑い", ""));
                module.setDiagnosisCode(diagCode.replace(".8002", ""));
                module.setCategory("suspectedDiagnosis");
                module.setCategoryDesc("疑い病名");
                module.setCategoryCodeSys("MML0015");
            }
    ////↑
            row = tableModel.getObjectCount() == 0 ? 0 : row;
    

     

  6. 接頭語・接尾語をポップアップで加えられるようにする
    ////↓ 病名修飾語をポップアップで加えられるようにする
    class PopupListener2 extends MouseAdapter {
    
        private JPopupMenu popup;
        private JTextField textField;
        private JMenuItem item;
        private int i;
        private String[] prevDiagDesc = new String[10];
        private String[] prevDiagCode = new String[10];
        private int undoCounter = 0;
        
        public PopupListener2(JTextField tf) {
            textField = tf;
            tf.addMouseListener(this);
            
            popup = new JPopupMenu();
            for (i=0;i<DIAGNOSIS_PREP.length;i++) {
                //前置詞のメニュー項目作成
                item = new JMenuItem (DIAGNOSIS_PREP[i]);
                item.addActionListener(new ActionListener() {
                    int itemNo = i;
                    JTextField tf = textField;
                    public void actionPerformed(ActionEvent e) {
                        int r = diagTable.getSelectedRow();
                        RegisteredDiagnosisModel rd = (RegisteredDiagnosisModel) tableModel.getObject(r);
                        //undo 用に保存
                        prevDiagDesc[undoCounter] = rd.getDiagnosis();
                        prevDiagCode[undoCounter] = rd.getDiagnosisCode();
                        String newDiagDesc = DIAGNOSIS_PREP[itemNo] + prevDiagDesc[undoCounter]; 
                        //新しく作った診断を設定
                        rd.setDiagnosisCode(DIAGNOSIS_PREP_CODE[itemNo] + "." + prevDiagCode[undoCounter]);
                        rd.setDiagnosis(newDiagDesc);
                        tf.setText(newDiagDesc);
                        addUpdatedList(rd);
                        // undo 処理 10個まで履歴を保存
                        if (undoCounter == 9) {
                            for (int j=1; j<10; j++) {
                                prevDiagDesc[j-1] = prevDiagDesc[j];
                            }
                        } else undoCounter++;
                    }
                });
                popup.add(item);
            }
            popup.addSeparator();
            for (i=0;i<DIAGNOSIS_POST.length;i++) {
                item = new JMenuItem (DIAGNOSIS_POST[i]);
                item.addActionListener(new ActionListener() {
                    int itemNo = i;
                    JTextField tf = textField;
                    public void actionPerformed(ActionEvent e) {
                        int r = diagTable.getSelectedRow();
                        RegisteredDiagnosisModel rd = (RegisteredDiagnosisModel) tableModel.getObject(r);
                        prevDiagDesc[undoCounter] = rd.getDiagnosis();
                        prevDiagCode[undoCounter] = rd.getDiagnosisCode();
                        String newDiagDesc = prevDiagDesc[undoCounter] + DIAGNOSIS_POST[itemNo]; 
    
                        rd.setDiagnosisCode(prevDiagCode[undoCounter] + "." + DIAGNOSIS_POST_CODE[itemNo]);
                        rd.setDiagnosis(newDiagDesc);
                        tf.setText(newDiagDesc);
                        addUpdatedList(rd);
                        if (undoCounter == 9) {
                            for (int j=1; j<10; j++) {
                                prevDiagDesc[j-1] = prevDiagDesc[j];
                            }
                        } else undoCounter++;
                    }
                });
                popup.add(item);
            }
            //取り消し
            popup.addSeparator();
            item = new JMenuItem("取り消し");
            item.addActionListener(new ActionListener() {
                JTextField tf = textField;
                public void actionPerformed(ActionEvent e) {
                    int r = diagTable.getSelectedRow();
                    RegisteredDiagnosisModel rd = (RegisteredDiagnosisModel) tableModel.getObject(r);
    
                    if (undoCounter > 0) {
                        undoCounter--;
                        rd.setDiagnosisCode(prevDiagCode[undoCounter]);
                        rd.setDiagnosis(prevDiagDesc[undoCounter]);
                        tf.setText(prevDiagDesc[undoCounter]);
                        addUpdatedList(rd);
                    }
                }
            });
            popup.add(item);
        }
        @Override
        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }
    
        @Override
        public void mouseReleased(MouseEvent e) {
            maybeShowPopup(e);
        }
    
        private void maybeShowPopup(MouseEvent e) {
    
            if (e.isPopupTrigger()) {
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        }
    }
    ////↑
    

     

  7. JComboBox を細かくコントロールするために,MyCellEditor を作った
    //// JComboBox を細かくコントロールするため MyCellEditor を作る
    //// テーブルの項目がコンボボックスで選ばれた状態で立ち上がるようにする
    class MyCellEditor extends DefaultCellEditor {
    
        JComboBox jcb = new JComboBox();
        String str;
        
        public MyCellEditor(JComboBox c) {
            super(c);
            this.jcb = c;
        }
        
        public Component getTableCellEditorComponent(JTable table, Object value,
                               boolean isSelected, int row, int col){
            switch(col) {
                case CATEGORY_COL:
                    str = (String) diagTable.getValueAt(row, col);
                    String[] cat = ClientContext.getStringArray("diagnosis.categoryDesc");
                    // null なら0,主病名なら1,疑いなら2を選択するようにする
                    if (str == null || str.equals("")) jcb.setSelectedIndex(0);
                    else {
                        for (int i=0; i<cat.length; i++) {
                            if (str.equals(cat[i])) {
                                jcb.setSelectedIndex(i+1);
                                break;
                            }
                        }
                    }
                    break;
                    
                case OUTCOME_COL:
                    str = (String) diagTable.getValueAt(row, col);
                    String[] outcome = ClientContext.getStringArray("diagnosis.outcomeDesc");
                    if (str == null || str.equals("")) jcb.setSelectedIndex(0);
                    else {
                        for (int i=0; i<outcome.length; i++) {
                            if (str.equals(outcome[i])) {
                                jcb.setSelectedIndex(i+1);
                                break;
                            }
                        }
                    }
                    break;
            }
            return jcb;
        }
    }
    

« テーブルの文字欠け | トップページ | GUI コンポーネント初期値 »

OpenDolphin」カテゴリの記事