package open.dolphin.client; import open.dolphin.stampbox.StampTreeNode; import open.dolphin.stampbox.StampTree; import open.dolphin.stampbox.StampBoxPlugin; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.tree.DefaultMutableTreeNode; import open.dolphin.infomodel.IInfoModel; import open.dolphin.infomodel.ModuleInfoBean; import open.dolphin.project.Project; /** * カルテペインのコードヘルパークラス。 * * @author Kazyshi Minagawa */ public class PCodeHelper extends AbstractCodeHelper { /** * Creates a new instance of CodeHelper * @param pPane * @param mediator */ public PCodeHelper(KartePane pPane, ChartMediator mediator) { super(pPane, mediator); } @Override protected void buildPopup(String text) { String test = text.toLowerCase(); String entity = null; // StampTree のキーワードに一致しているかどうかを判定する if (Project.getString(IInfoModel.ENTITY_TEXT).startsWith(test)) { entity = IInfoModel.ENTITY_TEXT; } else if (Project.getString(IInfoModel.ENTITY_PATH).startsWith(test)) { entity = IInfoModel.ENTITY_PATH; } else if (Project.getString(IInfoModel.ENTITY_GENERAL_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_GENERAL_ORDER; } else if (Project.getString(IInfoModel.ENTITY_OTHER_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_OTHER_ORDER; } else if (Project.getString(IInfoModel.ENTITY_TREATMENT).startsWith(test)) { entity = IInfoModel.ENTITY_TREATMENT; } else if (Project.getString(IInfoModel.ENTITY_SURGERY_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_SURGERY_ORDER; } else if (Project.getString(IInfoModel.ENTITY_RADIOLOGY_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_RADIOLOGY_ORDER; } else if (Project.getString(IInfoModel.ENTITY_LABO_TEST).startsWith(test)) { entity = IInfoModel.ENTITY_LABO_TEST; } else if (Project.getString(IInfoModel.ENTITY_PHYSIOLOGY_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_PHYSIOLOGY_ORDER; } else if (Project.getString(IInfoModel.ENTITY_BACTERIA_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_BACTERIA_ORDER; } else if (Project.getString(IInfoModel.ENTITY_INJECTION_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_INJECTION_ORDER; } else if (Project.getString(IInfoModel.ENTITY_MED_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_MED_ORDER; } else if (Project.getString(IInfoModel.ENTITY_BASE_CHARGE_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_BASE_CHARGE_ORDER; } else if (Project.getString(IInfoModel.ENTITY_INSTRACTION_CHARGE_ORDER).startsWith(test)) { entity = IInfoModel.ENTITY_INSTRACTION_CHARGE_ORDER; } else if (Project.getString(IInfoModel.ENTITY_ORCA).startsWith(test)) { entity = IInfoModel.ENTITY_ORCA; } if (entity != null) { buildEntityPopup(entity); } else { // 全てのスタンプツリーをなめる buildMatchPopup(text); } } protected void buildMatchPopup(String text) { // current StampBoxのP関連 StampTree を取得する StampBoxPlugin stampBox = mediator.getStampBox(); List<StampTree> allTree = stampBox.getAllPTrees(); if (allTree == null || allTree.isEmpty()) { return; } popup = new JPopupMenu(); // メニューのスタックを生成する LinkedList menus = new LinkedList(); menus.addFirst(popup); // 親ノードのスタックを生成する LinkedList parents = new LinkedList(); // Stamp の名前がキーワードで始まり、それが1個以上あるものを補完メニューに加える pattern = Pattern.compile("^" + text + ".*"); for (StampTree tree : allTree) { DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) tree.getModel().getRoot(); Enumeration e = rootNode.preorderEnumeration(); if (e != null) { e.nextElement(); // consume root while (e.hasMoreElements()) { // 調査対象のノードを得る StampTreeNode node = (StampTreeNode) e.nextElement(); // その親を得る StampTreeNode parent = (StampTreeNode) node.getParent(); // 親がリストに含まれているかどうか int index = parents.indexOf(parent); if (index > -1) { // 自分の親がインデックス=0になるまでポップする for (int i = 0; i < index; i++) { parents.removeFirst(); menus.removeFirst(); } if (!node.isLeaf()) { // フォルダの場合 String folderName = node.getUserObject().toString(); JMenu subMenu = new JMenu(folderName); if (menus.getFirst() instanceof JPopupMenu) { ((JPopupMenu) menus.getFirst()).add(subMenu); } else { ((JMenu) menus.getFirst()).add(subMenu); } menus.addFirst(subMenu); parents.addFirst(node); JMenuItem item = new JMenuItem(folderName); item.setIcon(icon); subMenu.add(item); addActionListner(item, node); } else { ModuleInfoBean info = (ModuleInfoBean) node.getUserObject(); String completion = info.getStampName(); JMenuItem item = new JMenuItem(completion); addActionListner(item, node); if (menus.getFirst() instanceof JPopupMenu) { ((JPopupMenu) menus.getFirst()).add(item); } else { ((JMenu) menus.getFirst()).add(item); } } } else { // 含まれていないのでマッチ検査が必要 if (!node.isLeaf()) { // フォルダの場合 String completion = node.getUserObject().toString(); Matcher matcher = pattern.matcher(completion); if (matcher.matches()) { // // マッチした場合はカレントメニューへ加える // 自分がカレントメニューになる // 親リストに自分を加える String folderName = node.getUserObject().toString(); JMenu subMenu = new JMenu(folderName); if (menus.getFirst() instanceof JPopupMenu) { ((JPopupMenu) menus.getFirst()).add(subMenu); } else { ((JMenu) menus.getFirst()).add(subMenu); } menus.addFirst(subMenu); parents.addFirst(node); // フォルダ選択のアイテムを生成しサブメニューの要素にする JMenuItem item = new JMenuItem(folderName); item.setIcon(icon); subMenu.add(item); addActionListner(item, node); } } else { // 葉の場合 ModuleInfoBean info = (ModuleInfoBean) node.getUserObject(); String completion = info.getStampName(); Matcher matcher = pattern.matcher(completion); if (matcher.matches()) { // // 一致した場合 // JMenuItem item = new JMenuItem(completion); addActionListner(item, node); if (menus.getFirst() instanceof JPopupMenu) { ((JPopupMenu) menus.getFirst()).add(item); } else { ((JMenu) menus.getFirst()).add(item); } } } } } } } } }