public void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (isTargetNode) {
          DefaultMutableTreeNode destinyNode = (DefaultMutableTreeNode) dropTargetNode;
          DefaultMutableTreeNode dropNode = (DefaultMutableTreeNode) draggedNode;
          DefaultMutableTreeNode selectedNode =
              (DefaultMutableTreeNode) dragAndDropTree.getLastSelectedPathComponent();
          if ((dropNode.getAllowsChildren()
                  && !dropNode.isNodeDescendant(destinyNode)
                  && !destinyNode.isNodeChild(dropNode))
              || (!dropNode.getAllowsChildren()
                  && !destinyNode.getUserObject().equals(selectedNode.getUserObject()))) {
            g.setColor(new Color(0, 29, 255, 100));
            g.fillRect(17, 0, getSize().width - 17, getSize().height - 1);
          }
        } else g.setColor(new Color(0, 29, 255, 0));
      }
 @Override
 public void drop(DropTargetDropEvent dtde) {
   Point dropPoint = dtde.getLocation();
   TreePath path = getPathForLocation(dropPoint.x, dropPoint.y);
   System.out.println("drop path is " + path);
   boolean dropped = false;
   try {
     dtde.acceptDrop(DnDConstants.ACTION_MOVE);
     // Object dropObject = dtde.getTransferable().getTransferData(dataFlavor);
     // if (dropObject instanceof DefaultMutableTreeNode) {
     if (draggedNode instanceof DefaultMutableTreeNode) {
       DefaultMutableTreeNode dropNode = (DefaultMutableTreeNode) draggedNode;
       if (dropNode.getAllowsChildren()) {
         DefaultMutableTreeNode destinyNode =
             (DefaultMutableTreeNode) path.getLastPathComponent();
         if (!dropNode.isNodeDescendant(destinyNode) && !destinyNode.isNodeChild(dropNode)) {
           if (moveDirectory(dropNode, destinyNode)) {
             ((DefaultTreeModel) getModel()).removeNodeFromParent(dropNode);
             ((DefaultTreeModel) getModel())
                 .insertNodeInto(dropNode, destinyNode, destinyNode.getChildCount());
             dropped = true;
           }
         }
       } else {
         DefaultMutableTreeNode destinyNode =
             (DefaultMutableTreeNode) path.getLastPathComponent();
         DefaultMutableTreeNode selectedNode =
             (DefaultMutableTreeNode) this.getLastSelectedPathComponent();
         if (!selectedNode.getUserObject().equals(destinyNode.getUserObject())) {
           if (moveDocument(dropNode, destinyNode)) {
             setSelectionPath(path);
             dropped = true;
             dragDropEnd();
           }
         }
       }
     }
   } catch (Exception e) {
     e.printStackTrace();
   }
   dtde.dropComplete(dropped);
 }
  private void restoreSelection(Pair<ElementNode, List<ElementNode>> pair) {
    List<ElementNode> selectedNodes = pair.second;

    DefaultMutableTreeNode root = getRootNode();

    ArrayList<TreePath> toSelect = new ArrayList<TreePath>();
    for (ElementNode node : selectedNodes) {
      DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node;
      if (root.isNodeDescendant(treeNode)) {
        toSelect.add(new TreePath(treeNode.getPath()));
      }
    }

    if (!toSelect.isEmpty()) {
      myTree.setSelectionPaths(toSelect.toArray(new TreePath[toSelect.size()]));
    }

    ElementNode leadNode = pair.first;
    if (leadNode != null) {
      myTree.setLeadSelectionPath(new TreePath(((DefaultMutableTreeNode) leadNode).getPath()));
    }
  }