package aliview.sequencelist; import java.awt.Canvas; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Window; import java.awt.dnd.Autoscroll; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.SwingUtilities; import javax.swing.Timer; import org.apache.log4j.Logger; public class MyDropTarget extends DropTarget { private static final Logger logger = Logger.getLogger(SequenceJList.class); public MyDropTarget() { super(); logger.info("Create MyDT"); } protected void initializeAutoscrolling(Point p) { logger.info("this.getComponent() instanceof Autoscroll" + (this.getComponent() instanceof Autoscroll)); System.out.println("init Autoscrolling"); //autoScroller = createDropTargetAutoScroller(component, p); super.initializeAutoscrolling(p); /* if (component == null || !(component instanceof Autoscroll)) return; autoScroller = createDropTargetAutoScroller(component, p); */ } protected DropTargetAutoScroller createDropTargetAutoScroller( Component c, Point p) { logger.info("Create MyDT Autoscroll"); return new MyDropTargetAutoScroller(c, p); } protected static class MyDropTargetAutoScroller extends DropTargetAutoScroller { protected MyDropTargetAutoScroller(Component c, Point p) { super(c, p); super.stop(); System.out.println("Created Autoscroller"); component = c; autoScroll = (Autoscroll)component; java.awt.Toolkit t = java.awt.Toolkit.getDefaultToolkit(); Integer initial = new Integer(100); Integer interval = new Integer(100); try { initial = (Integer)t.getDesktopProperty("DnD.Autoscroll.initialDelay"); } catch (Exception e) { // ignore } try { interval = (Integer)t.getDesktopProperty("DnD.Autoscroll.interval"); } catch (Exception e) { // ignore } timer = new Timer(interval.intValue(), this); timer.setCoalesce(true); timer.setInitialDelay(initial.intValue()); locn = p; prev = p; screenLocation = new Point(p); SwingUtilities.convertPointToScreen(screenLocation, c); try { hysteresis = ((Integer)t.getDesktopProperty("DnD.Autoscroll.cursorHysteresis")).intValue(); } catch (Exception e) { // ignore } timer.start(); } /** * update the geometry of the autoscroll region */ private void updateRegion() { Insets i = autoScroll.getAutoscrollInsets(); Dimension size = component.getSize(); if (size.width != outer.width || size.height != outer.height) outer.reshape(0, 0, size.width, size.height); if (inner.x != i.left || inner.y != i.top) inner.setLocation(i.left, i.top); int newWidth = size.width - (i.left + i.right); int newHeight = size.height - (i.top + i.bottom); if (newWidth != inner.width || newHeight != inner.height) inner.setSize(newWidth, newHeight); } /** * cause autoscroll to occur * <P> * @param newLocn the <code>Point</code> */ protected synchronized void updateLocation(Point newLocn) { prev = locn; locn = newLocn; screenLocation = new Point(locn); SwingUtilities.convertPointToScreen(screenLocation, component); if (Math.abs(locn.x - prev.x) > hysteresis || Math.abs(locn.y - prev.y) > hysteresis) { if (timer.isRunning()) { timer.stop(); } } else { if (!timer.isRunning()) { timer.start(); } }; } /** * cause autoscrolling to stop */ protected void stop() { timer.stop(); } /** * cause autoscroll to occur * <P> * @param e the <code>ActionEvent</code> */ public synchronized void actionPerformed(ActionEvent e) { //System.out.println("autoscrolling actionPerformed"); // updateRegion(); Point componentLocation = new Point(screenLocation); SwingUtilities.convertPointFromScreen(componentLocation, component); autoScroll.autoscroll(componentLocation); /* if (outer.contains(componentLocation) && !inner.contains(componentLocation)) { autoScroll.autoscroll(componentLocation); } */ } /* * fields */ private Window window; private Canvas canvas; private Component component; private Autoscroll autoScroll; private Timer timer; private Point locn; private Point prev; private Point screenLocation; private Rectangle outer = new Rectangle(); private Rectangle inner = new Rectangle(); private int hysteresis = 10; } };