« カルテ編集画面のスクロール | トップページ | 疑い病名の入力インターフェース »

2009年2月 2日 (月)

スタンプ箱順番入替のインターフェース

スタンプ箱の項目を入れ替えるとき,フォルダの上にドロップするとフォルダの中に入ってしまい,どうしてもフォルダの前後に項目を移動することができない。そこで,フォルダの上にドロップしたときは,フォルダの中ではなく,そのフォルダの前に置くようにする。フォルダの中に入れたいときは,ALT キーを押すか,フォルダを展開して,その中の希望の場所にドロップすることにする。

 

client/StampTreeTransferHandler.java の編集

public class StampTreeTransferHandler extends TransferHandler {
 ・
 ・
  // KartePaneからDropされるテキストFlavor

  private DataFlavor stringFlavor = DataFlavor.stringFlavor;
     
////↓ ALT キーの状態を保存
  public boolean altPressed;
  public void setAltState(boolean a) {
    altPressed = a;
  }
////↑
 ・
 ・
@Override
public boolean importData(JComponent c, Transferable tr) {

  if (canImport(c, tr.getTransferDataFlavors())) {
 ・
 ・
    // newChild is ancestor のケース
    if (newParent != dropNode) {

      // Drag元のStampTreeとDropされるTreeが同じかどうかを判定する
      // shouldRemove = (sourceTree == target) ? true : false;
      // Tree内のDnDはLocalTransferable(参照)の故、挿入時点で元のスタンプを
      // 常に削除する。DnD後の削除は行わない。
      // shouldRemove = false;

////↓drop 位置が Leaf か, ALT が押されていなかったら前に挿入する
      // if (selected.isLeaf()) {
      if (selected.isLeaf() | !altPressed) {
////↑
        //
        // Drop位置のノードが葉の場合、その前に挿入する
 ・
 ・

 

client/StampTree.java の編集

public StampTree(TreeModel model) {
 ・
 ・
  this.putClientProperty("JTree.lineStyle", "Angled"); // 水平及び垂直線を使用する
  this.setEditable(false); // ノード名を編集不可にする
  this.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); // Single Selection// にする
  
  this.setRootVisible(true);
  //this.addMouseMotionListener(new MouseDragDetecter()); // オリジナルの listener はコメントアウト
////↓ 選択状態じゃなくてもドラッグ開始するための drag listener
  this.addMouseMotionListener(new MouseMotionAdapter() {
    @Override
    public void mouseDragged (MouseEvent e) {
      getTransferHandler().exportAsDrag((JComponent) e.getSource(), e, TransferHandler.COPY);
    }
  });
  // JTree のデフォルトの DropTarget をオーバーライドする
    DropTarget dt = new DropTarget(this, new DropTargetAdapter() {
      StampTree st;
      StampTreeTransferHandler sttf;
      TreePath initRow;

      @Override
      public void dragEnter(DropTargetDragEvent dtde) {
        // drag 開始時の path を記録しておく
        st = (StampTree) dtde.getDropTargetContext().getComponent();
        sttf = (StampTreeTransferHandler) st.getTransferHandler();
        initRow = st.getSelectionPath();
      }
      @Override
      public void dragExit(DropTargetEvent dte) {
        // drop 領域から出たら,開始時の path に戻しておく
        st.setSelectionPath(initRow);
      }
      @Override
       public void dragOver(DropTargetDragEvent dtde) {
        // drop しようとしている部分を選択状態にする
        st.setSelectionPath(st.getClosestPathForLocation(dtde.getLocation().x, dtde.getLocation().y));
      }
      public void drop(DropTargetDropEvent dtde) {
        // action= (ALT 押した場合が COPY) (押してないと MOVE)
        boolean alt = (dtde.getDropAction() == DnDConstants.ACTION_COPY)? true: false;
        sttf.setAltState(alt); // ALT の状態をセットしてから importData を呼ぶ
        st.getTransferHandler().importData(st, dtde.getTransferable());
        dtde.dropComplete(true); // これをしないとドラッグしてきたアイコンが逃げる
      }
    });
    dt.setActive(true);
////↑
 ・
 ・

« カルテ編集画面のスクロール | トップページ | 疑い病名の入力インターフェース »

OpenDolphin」カテゴリの記事