import edu.umd.cs.piccolo.util.PAffineTransform; //导入方法依赖的package包/类
/**
* We do the same thing we did in getViewPosition above to flip the
* document-window position relationship
*
* @param x The new x position
* @param y The new y position
*/
public void setViewPosition(final double x, final double y) {
if (camera == null)
return;
// If a scroll is in progress - we ignore new scrolls - if we
// didn't, since the scrollbars depend on the camera
// location we can end up with an infinite loop
if (scrollInProgress)
return;
scrollInProgress = true;
// Get the union of all the layers' bounds
final PBounds layerBounds = new PBounds();
final java.util.List layers = camera.getLayersReference();
for (final Iterator i = layers.iterator(); i.hasNext();) {
final PLayer layer = (PLayer) i.next();
layerBounds.add(layer.getFullBoundsReference());
}
final PAffineTransform at = camera.getViewTransform();
at.transform(layerBounds, layerBounds);
// Union the camera view bounds
final PBounds viewBounds = camera.getBoundsReference();
layerBounds.add(viewBounds);
// Now find the new view position in view coordinates -
// This is basically the distance from the lower right
// corner of the window to the upper left corner of the
// document. We then measure the offset from the lower right corner
// of the document
final Point2D newPoint = new Point2D.Double(layerBounds.getX() + layerBounds.getWidth()
- (x + viewBounds.getWidth()), layerBounds.getY() + layerBounds.getHeight()
- (y + viewBounds.getHeight()));
// Now transform the new view position into global coords
camera.localToView(newPoint);
// Compute the new matrix values to put the camera at the
// correct location
final double newX = -(at.getScaleX() * newPoint.getX() + at.getShearX() * newPoint.getY());
final double newY = -(at.getShearY() * newPoint.getX() + at.getScaleY() * newPoint.getY());
at.setTransform(at.getScaleX(), at.getShearY(), at.getShearX(), at.getScaleY(), newX, newY);
// Now actually set the camera's transform
camera.setViewTransform(at);
scrollInProgress = false;
}