sclass ImageSurfaceDragger extends MouseAdapter { sbool debug = true; ImageSurface is; Point start, startScroll; int dx, dy; *(ImageSurface *is) { if (containsInstance(is.tools, ImageSurfaceDragger)) ret; print("Loading ImageSurfaceDragger"); ifclass ImageSurfaceSelector for (ImageSurfaceSelector s : collectInstances(is.tools, ImageSurfaceSelector)) { is.removeMouseListener(s); is.removeMouseMotionListener(this); is.tools.remove(s); } endif is.tools.add(this); is.addMouseListener(this); is.addMouseMotionListener(this); } public void mousePressed(MouseEvent e) { JScrollPane sp = enclosingScrollPane(is); if (sp == null) ret; if (e.getButton() == MouseEvent.BUTTON1) { start = e.getLocationOnScreen(); startScroll = new Point( sp.getHorizontalScrollBar().getValue(), sp.getVerticalScrollBar().getValue()); } } public void mouseDragged(MouseEvent e) { JScrollPane sp = enclosingScrollPane(is); if (sp == null) ret; Point p = e.getLocationOnScreen(); //if (debug) print("ImageSurfaceDragger: drag " + p.x + "/" + p.y); sp.getHorizontalScrollBar().setValue(-(p.x-start.x)+startScroll.x); sp.getVerticalScrollBar().setValue(-(p.y-start.y)+startScroll.y); } public void mouseReleased(MouseEvent e) { mouseDragged(e); } }