1 package com.eviware.soapui.support.swing;
2
3 import java.awt.Component;
4 import java.awt.Insets;
5 import java.awt.Point;
6 import java.awt.Rectangle;
7 import java.awt.dnd.Autoscroll;
8
9 import javax.swing.JViewport;
10 import javax.swing.SwingUtilities;
11
12 public class AutoscrollSupport implements Autoscroll{
13 private static final int AUTOSCROLL_MARGIN = 12;
14
15 Component comp;
16 Insets insets;
17 Insets scrollUnits;
18
19 public AutoscrollSupport(Component comp, Insets insets){
20 this(comp, insets, insets);
21 }
22
23 public AutoscrollSupport(Component comp, Insets insets, Insets scrollUnits){
24 this.comp = comp;
25 this.insets = insets;
26 this.scrollUnits = scrollUnits;
27 }
28
29 public AutoscrollSupport( Component comp )
30 {
31 this( comp, new Insets( AUTOSCROLL_MARGIN, AUTOSCROLL_MARGIN, AUTOSCROLL_MARGIN, AUTOSCROLL_MARGIN ));
32 }
33
34 public void autoscroll(Point cursorLoc){
35 JViewport viewport = getViewport();
36 if(viewport==null)
37 return;
38 Point viewPos = viewport.getViewPosition();
39 int viewHeight = viewport.getExtentSize().height;
40 int viewWidth = viewport.getExtentSize().width;
41
42
43 if((cursorLoc.y-viewPos.y)<insets.top){
44 viewport.setViewPosition(
45 new Point(viewPos.x,
46 Math.max(viewPos.y-scrollUnits.top, 0)));
47 } else if((viewPos.y+viewHeight-cursorLoc.y)<insets.bottom){
48 viewport.setViewPosition(
49 new Point(viewPos.x,
50 Math.min(viewPos.y+scrollUnits.bottom,
51 comp.getHeight()-viewHeight)));
52 } else if((cursorLoc.x-viewPos.x)<insets.left){
53 viewport.setViewPosition(
54 new Point(Math.max(viewPos.x-scrollUnits.left, 0),
55 viewPos.y));
56 } else if((viewPos.x+viewWidth-cursorLoc.x)<insets.right){
57 viewport.setViewPosition(
58 new Point(Math.min(viewPos.x+scrollUnits.right, comp.getWidth()-viewWidth),
59 viewPos.y));
60 }
61 }
62
63 public Insets getAutoscrollInsets()
64 {
65 Rectangle raOuter = comp.getBounds();
66 Rectangle raInner = comp.getParent().getBounds();
67 return new Insets(
68 raInner.y - raOuter.y + AUTOSCROLL_MARGIN,
69 raInner.x - raOuter.x + comp.getWidth(),
70 raOuter.height - raInner.height - raInner.y + raOuter.y + AUTOSCROLL_MARGIN,
71 raOuter.width - raInner.width - raInner.x + raOuter.x + AUTOSCROLL_MARGIN);
72 }
73
74
75 JViewport getViewport(){
76 return (JViewport)SwingUtilities.getAncestorOfClass(JViewport.class, comp);
77 }
78 }