public void mouseReleased(MouseEvent e) {
   _mouse_pressed = false;
   _drag_target = null;
   // send target node event first
   Node node = window.findNode(new AminoPoint(e.getPoint().getX(), e.getPoint().getY()));
   // console.log(node);
   MEvent evt = new MEvent();
   evt.node = node;
   evt.x = e.getX();
   evt.y = e.getY();
   if (node != null) {
     Node start = node;
     while (start != null) {
       fireEvent("MOUSE_RELEASE", start, evt);
       if (start.isMouseBlocked()) return;
       start = (Node) start.getParent();
     }
   }
   // send general events next
   fireEvent("MOUSE_RELEASE", null, evt);
 }
    public void mouseDragged(MouseEvent e) {
      if (_mouse_pressed) {
        Node node = window.findNode(new AminoPoint(e.getPoint().getX(), e.getPoint().getY()));
        MEvent evt = new MEvent();

        // redirect events to current drag target, if applicable
        if (_drag_target != null) {
          node = _drag_target;
        }
        evt.node = node;
        evt.x = e.getX();
        evt.y = e.getY();
        if (node != null) {
          Node start = node;
          while (start != null) {
            fireEvent("MOUSE_DRAG", start, evt);
            if (start.isMouseBlocked()) return;
            start = (Node) start.getParent();
          }
        }
        // send general events next
        fireEvent("MOUSE_DRAG", null, evt);
      }
    }