}
}
@Override
public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) {
final Scene scene = widget.getScene();
int amount = event.getWheelRotation();
JScrollPane scrollPane = findScrollPane(scene.getView());
Point viewPosition = null;
Point mouseLocation = scene.convertSceneToView(event.getPoint());
int xOffset = 0;
int yOffset = 0;
Point oldViewPosition = null;
Rectangle bounds = new Rectangle(scene.getBounds());
Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
if (scrollPane != null) {
viewPosition = new Point(scrollPane.getViewport().getViewPosition());
oldViewPosition = new Point(viewPosition);
xOffset = (mouseLocation.x - viewPosition.x);
yOffset = (mouseLocation.y - viewPosition.y);
viewPosition.x += xOffset;
viewPosition.y += yOffset;
}
if (useAnimator) {
SceneAnimator sceneAnimator = scene.getSceneAnimator();
synchronized (sceneAnimator) {
double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor();
while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
zoom /= zoomMultiplier;
if (viewPosition != null) {
viewPosition.x /= zoomMultiplier;
viewPosition.y /= zoomMultiplier;
bounds.width /= zoomMultiplier;
bounds.height /= zoomMultiplier;
componentSize.width /= zoomMultiplier;
componentSize.height /= zoomMultiplier;
}
amount--;
}
while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
zoom *= zoomMultiplier;
if (viewPosition != null) {
viewPosition.x *= zoomMultiplier;
viewPosition.y *= zoomMultiplier;
bounds.width *= zoomMultiplier;
bounds.height *= zoomMultiplier;
componentSize.width *= zoomMultiplier;
componentSize.height *= zoomMultiplier;
}
amount++;
}
sceneAnimator.animateZoomFactor(zoom);
}
} else {
double zoom = scene.getZoomFactor();
while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
zoom /= zoomMultiplier;
if (viewPosition != null) {
viewPosition.x /= zoomMultiplier;
viewPosition.y /= zoomMultiplier;
bounds.width /= zoomMultiplier;
bounds.height /= zoomMultiplier;
componentSize.width /= zoomMultiplier;
componentSize.height /= zoomMultiplier;
}
amount--;
}
while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
zoom *= zoomMultiplier;
if (viewPosition != null) {
viewPosition.x *= zoomMultiplier;
viewPosition.y *= zoomMultiplier;
bounds.width *= zoomMultiplier;
bounds.height *= zoomMultiplier;
componentSize.width *= zoomMultiplier;
componentSize.height *= zoomMultiplier;
}
amount++;
}
scene.setZoomFactor(zoom);
}
if (scrollPane != null) {
scene.validate(); // Call validate to update size of scene
Dimension size = scrollPane.getViewport().getExtentSize();
viewPosition.x -= xOffset;
viewPosition.y -= yOffset;
scene.resolveBounds(scene.getLocation(), bounds);
scene.getView().setPreferredSize(componentSize);
scene.getView().revalidate();
scene.getView().addNotify();
scrollPane.getViewport().setViewPosition(viewPosition);
}
return WidgetAction.State.CONSUMED;
}