package org.objectstyle.wolips.componenteditor.inspector;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
public abstract class AbstractAutoscroller<T extends Control> implements IAutoscroller {
private static final int scrollTopLeftMargin = 20;
private static final int scrollBottomRightMargin = 20;
private static final int initialScrollFrequency = 500;
private static final int continuousScrollFrequency = 50;
private boolean _scrollStarted;
private long _lastScrollTime;
private T _control;
private IAutoscroller.Delegate _delegate;
public AbstractAutoscroller(T control) {
_control = control;
_scrollStarted = false;
_lastScrollTime = -1;
}
public void setDelegate(IAutoscroller.Delegate delegate) {
_delegate = delegate;
}
public boolean isScrollStarted() {
return _scrollStarted;
}
public void stopScroll() {
_lastScrollTime = -1;
_scrollStarted = false;
}
public T getControl() {
return _control;
}
public void autoscroll(Point scrollPoint) {
if (_control == null) {
return;
}
Rectangle controlBounds = _control.getBounds();
controlBounds.x = 0;
controlBounds.y = 0;
if (!controlBounds.contains(scrollPoint)) {
stopScroll();
} else {
if (_lastScrollTime <= 0) {
_lastScrollTime = System.currentTimeMillis();
}
int scrollFrequency = (_scrollStarted) ? continuousScrollFrequency : initialScrollFrequency;
long scrollTime = System.currentTimeMillis();
if ((scrollTime - _lastScrollTime) > scrollFrequency) {
int oldVerticalPosition = getVerticalPosition();
int oldHorizontalPosition = getHorizontalPosition();
if (scrollPoint.y < scrollTopLeftMargin) {
scrollUp(scrollPoint.y);
} else if ((controlBounds.height - scrollPoint.y) < scrollBottomRightMargin) {
scrollDown(controlBounds.height - scrollPoint.y);
}
if (scrollPoint.x < scrollTopLeftMargin) {
scrollLeft(scrollPoint.x);
} else if ((controlBounds.width - scrollPoint.x) < scrollBottomRightMargin) {
scrollRight(controlBounds.width - scrollPoint.x);
}
if (getVerticalPosition() != oldVerticalPosition || getHorizontalPosition() != oldHorizontalPosition) {
if (_delegate != null) {
_delegate.autoscrollOccurred(this);
}
_control.redraw();
_lastScrollTime = scrollTime;
_scrollStarted = true;
} else {
_scrollStarted = false;
}
}
}
}
protected abstract void scrollUp(int speed);
protected abstract void scrollDown(int speed);
protected abstract void scrollLeft(int speed);
protected abstract void scrollRight(int speed);
protected abstract int getVerticalPosition();
protected abstract int getHorizontalPosition();
}