« 2008年5月 | トップページ | 2008年7月 »

2008年6月

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;
        }
    }
    

2008年6月11日 (水)

テーブルの文字欠け

JTable のデフォルト RowHeight は 16 で,mac の場合,文字が欠ける。18 だと大丈夫だが,デフォルトの変更方法が分からなかったので,ここで設定してみた。18ではまずいところで副作用が出る可能性がある。 【変更】いつの間にか欠けなくなっていたので,ここの変更はやめた。
  • table/OddEvenRowRenderer.java の変更点
    public Component getTableCellRendererComponent(
    
  • 追加前
    } else {
        setText("");
    }
    
  • 追加後
    } else {
        setText("");
    }
    
    //if (table.getRowHeight() == 16) table.setRowHeight(18);
    

2008年6月 9日 (月)

病名エディタ

  1. 病名コード付きの病名は,間違ってちょっとクリックしただけで病名コードが消えてしまう(0000999になってしまう)。それをなんとかする。
    order/DiagnosisTablePanel.java の以下の部分を変更する。
    @Override
    public boolean isCellEditable(int row, int col) {
        
        boolean ret = false;
        
        RegisteredDiagnosisModel model = (RegisteredDiagnosisModel) getObject(row);
        
        if (col == NAME_COL) {
            if (model == null) {
                ret = true;
    ////↓ HAND_CODE 以外,編集不可とする
            } else if (model.getDiagnosisCode().equals(HAND_CODE)) {
                ret = true;
    ////                    } else if (!model.getDiagnosisCode().startsWith(MODIFIER_CODE)) {
    ////↑                        ret = true;
            }
            
        } else if (col == ALIAS_COL) {
            if (model != null && (!model.getDiagnosisCode().startsWith(MODIFIER_CODE))) {
                ret = true;
            }
        }
        
        return ret;
    }
    
  2. ついでに,デフォルトのカテゴリーをセットするようにする
    public void propertyChange(PropertyChangeEvent e) {
        
        String prop = e.getPropertyName();
        
        if (prop.equals(SELECTED_ITEM_PROP)) {
            
            // 通知された MasterItem から RegisteredDiagnosisModel 
            // を生成し、編集テーブルへ加える。
            MasterItem item = (MasterItem) e.getNewValue();
            
            if (item != null) {
                
                RegisteredDiagnosisModel model = new RegisteredDiagnosisModel();
                model.setDiagnosis(item.getName());
                model.setDiagnosisCode(item.getCode());
                model.setDiagnosisCodeSystem(item.getMasterTableId());
    ////↓  デフォルトのカテゴリーをセット(主病名)
                model.setCategory(open.dolphin.infomodel.IInfoModel.DEFAULT_DIAGNOSIS_CATEGORY);
                model.setCategoryDesc(open.dolphin.infomodel.IInfoModel.DEFAULT_DIAGNOSIS_CATEGORY_DESC);
                model.setCategoryCodeSys(open.dolphin.infomodel.IInfoModel.DEFAULT_DIAGNOSIS_CATEGORY_CODESYS);
    ////↑
                tableModel.addRow(model);
                
                reconstractDiagnosis();
    
                // 状態マシンへイベントを送信する
                curState.processEvent(DiagnosisStateMgr.Event.ADDED);
            }
        }
    }
     

2008年6月 6日 (金)

連続マスター検索

マスター検索で,前の検索結果をスクロールして,その途中で引き続いて次の検索をすると,スクロール位置がそのままになって,新規検索結果が先頭から表示されない。先頭から表示されるようにするための変更。
  • order/MasterPanel.java の以下のメソッドを変更
    protected void processResult(boolean noErr, Object result, String message) {
    
  • 変更前
    if (noErr) {
        tableModel.setObjectList((List) result);
        setItemCount(tableModel.getObjectCount());
    
  • 変更後(1行加える)
    if (noErr) {
        table.scrollRectToVisible(table.getCellRect(0,0,false);
        tableModel.setObjectList((List) result);
        setItemCount(tableModel.getObjectCount());
    
ついでに,検索結果が20件以下でも,必ず表が20行になってしまうのを修正
  • 変更前
    protected START_NUM_ROWS    = 20;
    
  • 変更後
    protected START_NUM_ROWS    = 1;
    

2008年6月 4日 (水)

公開帳票A00000C114

ORCA公開帳票の,年齢別外来患者数集計表の年齢を変更するには,ソースを2カ所修正する。下は,厚生労働省の患者調査の年齢区分を参考に変更したもの。
*    年齢名称設定
MOVE    "0歳"            TO    SUM-AGENAME(1)
MOVE    "1歳〜4歳"      TO    SUM-AGENAME(2)
MOVE    "5歳〜9歳"      TO    SUM-AGENAME(3)
MOVE    "10歳〜14歳"  TO    SUM-AGENAME(4)
MOVE    "15歳〜19歳"  TO    SUM-AGENAME(5)
MOVE    "20歳〜39歳"  TO    SUM-AGENAME(6)
MOVE    "40歳〜59歳"  TO    SUM-AGENAME(7)
MOVE    "60歳〜69歳"  TO    SUM-AGENAME(8)
MOVE    "70歳〜74歳"  TO    SUM-AGENAME(9)
MOVE    "75歳以上"      TO    SUM-AGENAME(10)
MOVE    "全患者合計"      TO    SUM-AGENAME(11)
MOVE    11                TO    SUM-AGEMAX
*    年齢計算
MOVE  JYURRK-SRYYMD(1:6)      TO  WRK-NENREI-TBL1
MOVE  PTINF-BIRTHDAY(1:6)     TO  WRK-NENREI-TBL2
COMPUTE  WRK-AGE  =  WRK-NENREIY1 -    WRK-NENREIY2
IF       WRK-NENREIM1            <     WRK-NENREIM2
  COMPUTE  WRK-AGE  =  WRK-AGE   -     1
END-IF
EVALUATE  WRK-AGE
WHEN    0 THRU 0
  MOVE    1      TO       IDX1
WHEN    1 THRU 4
  MOVE    2      TO       IDX1
WHEN    5 THRU 9
  MOVE    3      TO       IDX1
WHEN   10 THRU 14
  MOVE    4      TO       IDX1
WHEN   15 THRU 19
  MOVE    5      TO       IDX1
WHEN   20 THRU 39
  MOVE    6      TO       IDX1
WHEN   40 THRU 59
  MOVE    7      TO       IDX1
WHEN   60 THRU 69
  MOVE    8      TO       IDX1
WHEN   70 THRU 74
  MOVE    9      TO       IDX1
WHEN   OTHER
  MOVE   10      TO       IDX1
END-EVALUATE

« 2008年5月 | トップページ | 2008年7月 »