« 2010年3月 | トップページ | 2010年5月 »

2010年4月

2010年4月18日 (日)

傷病名編集機能

病名リストの編集を充実させた。

01

病名部分をダブルクリックすると,病名編集エディタが立ち上がるようにした。(増田内科様のコードを使わせていただきました)

02

分類,転帰部分をダブルクリックすると,それぞれコンボボックスが出る。(以前と同じ動作)

03

開始日,終了日をダブルクリックすると,テキストフィールドが変更可能になる。そこで右クリックするとカレンダーが出る。(以前と同じ動作)

04

右クリックが効くようにした。病名部分を右クリックすると,修飾語メニューがでる。

05

分類,転帰部分を右クリックすると,それぞれのポップアップメニューが出る。複数選択できるようにしたので,複数選択してから,右クリックのポップアップでまとめて設定することもできる。

07

オリジナルでは,削除ボタンを押すと有無を言わせず削除されてしまっていたが,すぐに削除しないようにした。削除ボタンを押すと病名は一旦グレーアウト表示になるが,実際には消去されない。セーブする時に初めて実際に消去される。

06

「取り消し/やり直し」ができるようにした。メモリが許す限り無制限で取り消し可能。カーソルでハイライトされた病名の編集が「取り消し/やり直し」される。全て選択してハイライトすれば,全ての病名の変更を「取り消し/やり直し」できる。

編集・作成した部分

2010年4月13日 (火)

テキストスタンプエディターの作成

Texteditor

テキストスタンプのエディターを作ってみた。

order/LTextStampEditor.java

order/EditorSetPanel.java

public class EditorSetPanel extends JPanel implements IStampEditorDialog, PropertyChangeListener, TreeSelectionListener {
 ・
 ・
//pns^ TextStampEditor は MasterPanel を含んでないので特別扱い
   private LTextStampEditor text;
   private JPanel rootPanel;
   private CardLayout rootCardLayout;

   private static String TEXT_EDITOR = "textEditor";
   private static String EDITOR_SET_PANEL = "editorSetPanel";
//pns$
 ・
 ・
  public EditorSetPanel() {
 ・
 ・
//pns^  TextStampEditor 切り替え用
    rootPanel = new JPanel();
    rootCardLayout = new CardLayout();
    rootPanel.setLayout(rootCardLayout);
//pns$
    initComponent();
  }
 ・
 ・
  public void show(String entity) {
 ・
 ・
//pns^  Text Editor 対応 : entity が text の時は,root card を切り替える
    if (entity.equals(IInfoModel.ENTITY_TEXT)) {
      rootCardLayout.show(rootPanel, TEXT_EDITOR);
      curEditor = text;
      curEditor.addPropertyChangeListener(StampEditorDialog.VALIDA_DATA_PROP, this);
      curEditor.start();
    } else {
      rootCardLayout.show(rootPanel, EDITOR_SET_PANEL);
//pns$
 ・
 ・
  private void initComponent() {
 ・
 ・
//pns^  MasterPanel の有無で CardLayout で切り替え可能にする
    text = new LTextStampEditor(this);
    rootPanel.add(center, EDITOR_SET_PANEL);
    rootPanel.add(text, TEXT_EDITOR);
    this.setLayout(new BorderLayout(0, 0));
    this.add(rootPanel, BorderLayout.CENTER);
    //this.setLayout(new BorderLayout(0, 0));
    //this.add(center, BorderLayout.CENTER);
//pns$
    this.add(btnPanel, BorderLayout.EAST);
 ・
 ・

client/UserStampBox.java

 ・
 ・
@Override
public boolean isHasEditor(int index) {
//pns   return (index == textIndex || index == pathIndex || index == orcaIndex) ? false : true;
  return (index == pathIndex || index == orcaIndex) ? false : true;
}

@Override
public void setHasNoEditorEnabled(boolean b) {
//pns   this.setEnabledAt(textIndex, b);
  this.setEnabledAt(pathIndex, b);
  this.setEnabledAt(orcaIndex, b);
}

client/StampBoxPlugin.java

class TabChangeListener implements ChangeListener {
 ・
 ・        
  // スタンプメーカ起動中の時
  // 選択されたタブに対応するエディタを表示する
  int index = userBox.getSelectedIndex();
  StampTree tree = userBox.getStampTree(index);
//pns  if (editors != null && (!tree.getEntity().equals(IInfoModel.ENTITY_TEXT)) ) {
  if (editors != null) {
    editors.show(tree.getEntity());
 ・
 ・

2010年4月12日 (月)

病名エディタの左矢印

病名エディターで左矢印が使えるようにした。増田内科様のカスタマイズを利用させていただきました。

02

order/EditorSetPanel.java

public void show(String entity) {
 ・
 ・        
    // このクラスは VALID_DATA_PROP のリスナになっている
    curEditor.addPropertyChangeListener(StampEditorDialog.VALIDA_DATA_PROP, this);
    curEditor.start();
    if (entity.equals("diagnosis")) {
//pns  leftArrow.setEnabled(false); // 病名スタンプも編集可能に
    curEditor.setValue(null);            
  } else {
 ・
 ・
public void valueChanged(TreeSelectionEvent e) {
 ・
 ・        
    StampTree tree = (StampTree) e.getSource();
    StampTreeNode node =(StampTreeNode) tree.getLastSelectedPathComponent();
    boolean enabled = false;
    StampTreeNode selected = null;

    // ノードが葉で傷病名でない時のみ enabled にする
    // またその時以外は選択ノード属性をnullにする
    if (node != null && node.isLeaf()) {
            
    ModuleInfoBean info = (ModuleInfoBean) node.getUserObject();
               
//pns    DIAGNOSIS も左矢印が効くようにする
    //if (info.isSerialized() && (!info.getEntity().equals(IInfoModel.ENTITY_DIAGNOSIS)) ) {
    if (info.isSerialized()) {
      enabled = true;
      selected = node;
 ・
 ・
class EditStampListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {

    // StampInfoからスタンプをロードしエディタにセットする
    StampTreeNode node = getSelectedNode();
  ・
  ・
    @Override
    protected void succeeded(StampModel stampModel) {
      if (sdl.isNoError() && stampModel != null) {
        if (stampModel != null) {
          IInfoModel model = (IInfoModel) BeanUtils.xmlDecode(stampModel.getStampBytes());
          if (model != null) {
//pns^  diagnosis の場合
            if ("diagnosis".equals(stampModel.getEntity())) {
              RegisteredDiagnosisModel[] rd = new RegisteredDiagnosisModel[]{
                (RegisteredDiagnosisModel) model
              };
              curEditor.setValue(rd);
            } else {
//pns$
            ModuleModel stamp = new ModuleModel();
            stamp.setModel(model);
  ・
  ・

order/DiagnosisTablePanel.java

増田内科様の setValue(Object[] o) をそのまま使用した

 

dao/SqlMasterDao.java

増田内科様の getDiseaseEntries(String[] codes) をそのまま使用した

スタンプエディターの右矢印 (2)

スタンプエディターの右矢印機能を少し充実させた。

01

  • 選択されているスタンプ名と同じスタンプ名で右矢印を押すと,上書き確認が出る。「OK」を選択すると上書きされる。
  • スタンプ名を変えてから右矢印を押すと,選択スタンプの下に挿入される。
  • フォルダを選択して右矢印を押すと,フォルダの中の最後に挿入される。

client/StampBoxPlugin.java

class EditorValueListener implements PropertyChangeListener {
  public void propertyChange(PropertyChangeEvent e) {
    Object obj = e.getNewValue();

    if (obj != null && obj instanceof ModuleModel) {
      // 傷病名以外の場合
      ModuleModel stamp = (ModuleModel) obj;
      String entity = stamp.getModuleInfo().getEntity();
      final StampTree tree = userBox.getStampTree(entity);
      // tree.addStamp(stamp, null); // ←オリジナル
//pns^
      StampTreeNode target = tree.getSelectedNode();
      if (target == null) {
        tree.addStamp(stamp, null);
      } else {
        if (target.isLeaf()) {
          // Leaf の場合,上書きするか確認
          String targetName = target.getStampInfo().getStampName();
          String sourceName = stamp.getModuleInfo().getStampName();
          if (targetName.equals(sourceName)) {
            // 名前が同じなら置き換えるかどうか確認
            int confirm = MyJSheet.showConfirmDialog(frame,
              targetName + "を上書きしますか?", "上書き確認",
              JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE );
            if(confirm == JOptionPane.OK_OPTION) {
              ((StampTreeTransferHandler)tree.getTransferHandler()).setPosition (StampTreeTransferHandler.Insert.AFTER);
              tree.replaceStamp(stamp, target);
            }
          } else {
            // 名前が違えば選択された項目の下に入れる
            ((StampTreeTransferHandler)tree.getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.AFTER);
            tree.addStamp(stamp, target);
          }
        } else {
          // Folder ならその中に入れる
          ((StampTreeTransferHandler)tree.getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.INTO_FOLDER);
          tree.addStamp(stamp, target);
        }
      }
      // 終わったら tree にフォーカスを取る
      tree.requestFocusInWindow();
    } else if (obj != null && obj instanceof ArrayList) {
      // 傷病名の場合
      StampTree tree = getStampTree(IInfoModel.ENTITY_DIAGNOSIS);
      tree.addDiagnosis((ArrayList) obj);
    }
  }
//pns$
}

client/StampTree.java

/**
 * KartePaneから drop されたスタンプをツリーに加える。
 * replace 対応 by pns
 */
public boolean addStamp(ModuleModel droppedStamp, StampTreeNode selected) {
  return addStamp(droppedStamp, selected, false);
}

public boolean replaceStamp(ModuleModel droppedStamp, StampTreeNode selected) {
  return addStamp(droppedStamp, selected, true);
}

public boolean addStamp(ModuleModel droppedStamp, final StampTreeNode selected, final boolean isReplace) {
 ・
 ・ 
  @Override
  protected void succeeded(String result) {
    logger.debug("addStamp succeeded");
    if (sdl.isNoError() && result.equals(stampId)) {
//pns    replace 対応
    addInfoToTree(info, selected, isReplace);
  } else {
 ・
 ・
/**
 * StampTree に新しいノードを加える。
 * replace 対応 by pns
 * @param info 追加するノードの情報
 * @param selected カーソルの下にあるノード(Drop 位置のノード)
 */
public void addInfoToTree(ModuleInfoBean info, StampTreeNode selected) {
  addInfoToTree(info, selected, false);
}

public void addInfoToTree(ModuleInfoBean info, StampTreeNode selected, boolean isReplace) {
//pns^ selected = targetNode or null
  StampTreeTransferHandler handler = (StampTreeTransferHandler) this.getTransferHandler();
  StampTreeTransferHandler.Insert insertPosition = handler.getInsertPosition();
//pns$
  //
  // StampInfo から新しい StampTreeNode を生成する
  //
  StampTreeNode node = new StampTreeNode(info);

  // 
  // Drop 位置のノードによって追加する位置を決める
  //
  //pns^
  if (selected != null) {
    StampTreeNode newParent = (StampTreeNode) selected.getParent();
    int index = newParent.getIndex(selected);
    DefaultTreeModel model = (DefaultTreeModel) this.getModel();

    switch(insertPosition) {
      case BEFORE:
        model.insertNodeInto(node, newParent, index);
        break;
      case AFTER:
        model.insertNodeInto(node, newParent, index+1);
        break;
      default: // INTO_FOLDER
        model.insertNodeInto(node, selected, selected.getChildCount());
    }
    // replace
    if (isReplace) deleteNode();

    // 追加したノードを選択する
    TreeNode[] path = model.getPathToRoot(node);
    ((JTree)this).setSelectionPath(new TreePath(path));
//pns$
 ・
 ・
public void addDiagnosis(ArrayList list) {
 ・
 ・
  @Override
  protected void succeeded(List result) {
    logger.debug("addDiagnosis succeeded");
    if (sdl.isNoError()) {
      for(ModuleInfoBean info : infoList) {
        // addInfoToTree(info, null);
//pns^  選択されているとき
        StampTreeNode target = getSelectedNode();
          if (target != null) {
            if (target.isLeaf()) {
              // 葉の時は後ろに挿入する
              ((StampTreeTransferHandler) getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.AFTER);
            } else {
              // フォルダの時は中に挿入する
              ((StampTreeTransferHandler) getTransferHandler()).setPosition(StampTreeTransferHandler.Insert.INTO_FOLDER);
            }
          }
          addInfoToTree(info, getSelectedNode());
//pns$
        }
      } else {

« 2010年3月 | トップページ | 2010年5月 »