srecord noeq ComponentDragger extends MouseAdapter { Component component; MouseEvent mouseDownEvent; Component clickedOn; Pt rel; settable bool debug; // bring component to front when clicked? settable bool bringToFront; *(Component *component, MouseEvent *mouseDownEvent) {} void start { if (mouseDownEvent == null) ret; clickedOn = mouseDownEvent.getComponent(); if (bringToFront) { print("Bringing to front: " + component); componentToFront(component); } rel = pt( mouseDownEvent.getXOnScreen()-component.getX(), mouseDownEvent.getYOnScreen()-component.getY()); addMouseAndMotionListener(clickedOn, this); } public void mouseDragged(MouseEvent e) { updatePosition(e); } public void mouseReleased(MouseEvent e) { if (e.getButton() != mouseDownEvent.getButton()) ret; updatePosition(e); removeMouseAdapter(clickedOn, this); if (debug) printVars("ComponentDragger done"); dragDone(); } void updatePosition(MouseEvent e) { int x = e.getXOnScreen()-rel.x, y = e.getYOnScreen()-rel.y; if (debug) printVars("ComponentDragger", +rel, +x, +y); component.setLocation(x, y); } void dragDone {} }