public void mouseDragged(MouseEvent pEvent) {
      //Only One drag can occur at a time
      if(currentDragComponent != pEvent.getComponent() || currentDragComponent==null) return;
      
      //This info is all in the context of the Current Drag Component
      Point _point = pEvent.getPoint();
      Point _newLoc = null;
      if(currentDragOffSet == null) {
        _newLoc = new Point(_point.x - currentDragPoint.x, _point.y - currentDragPoint.y);
      }
      else {
        _newLoc = new Point(_point.x - currentDragPoint.x, _point.y - currentDragPoint.y);
        _newLoc.translate(currentDragOffSet.x, currentDragOffSet.y);
      }
            
      //Update Drag Window Location
      SwingUtilities.convertPointToScreen(_newLoc, currentDragComponent);
      currentDragWindow.setLocation(_newLoc);
      if(dragStarted == false) {
        dragStarted = true;
        currentDragWindow.toFront();
        currentDragWindow.setVisible(true);
      }
      
      //Get Drop Target
      SwingUtilities.convertPointToScreen(_point, currentDragComponent);
      DropTarget _dropTarget = getDropTarget(_point);
      
      //No drop target found just return;
      if(_dropTarget == null) return;
            
      //Convert Point to context of Drop Component
      Component _dropComp = _dropTarget.getComponent();
      //SwingUtilities.convertPointToScreen(_point, currentDragComponent);
      if(_dropComp != null) {
        SwingUtilities.convertPointFromScreen(_point, _dropComp);
      }
      
      //Notify Drop Target and Source
      if((_dropTarget instanceof DCDropTarget) == false) return;
      DropTargetDragEvent _targetDragEvent = null;
      if(currentDropTarget != _dropTarget) {
        //Send Enter to new Drop Target
        currentDropContext = ((DCDropTarget)_dropTarget).createDropTargetContext();
        _targetDragEvent = new DropTargetDragEvent(currentDropContext, _point, DnDConstants.ACTION_MOVE, DnDConstants.ACTION_COPY_OR_MOVE);
        _dropTarget.dragEnter(_targetDragEvent);
                
        //Send Exit to old Drop Target
        if(currentDropTarget != null) {
           currentDropTarget.dragExit(new DropTargetEvent(currentDropContext));
        }
        
        //Update the current target
        currentDropTarget = _dropTarget;
      }
      else {
        _targetDragEvent = new DropTargetDragEvent(currentDropContext, _point, DnDConstants.ACTION_MOVE, DnDConstants.ACTION_COPY_OR_MOVE);
      }
      
      currentDropTarget.dragOver(_targetDragEvent);
    }