[fixes #696] Fixes occassional zitter when auto-zooming at some sizes
Ultimate cause is some very odd behavior from JViewPort. This code is in effect, a workaround for that odd behavior. It IS therefore 2/3 ugly hack :( Also, refined some of the zoom calculations to be more exact.
This commit is contained in:
parent
6b609809e0
commit
0f3f5fe944
@ -109,7 +109,6 @@ public abstract class AbstractScaleFigure extends JPanel {
|
||||
* @param visibleBounds the visible bounds upon the Figure
|
||||
*/
|
||||
public void scaleTo(final double newScaleRequest, final Dimension visibleBounds) {
|
||||
// System.err.println(String.format(" ::scaleTo: %6.4f ==>> %6.4f, %d x %d", userScale, newScaleRequest, visibleBounds.width, visibleBounds.height));
|
||||
if (MathUtil.equals(this.userScale, newScaleRequest, 0.01) &&
|
||||
(visibleBounds_px.width == visibleBounds.width) &&
|
||||
(visibleBounds_px.height == visibleBounds.height) )
|
||||
@ -117,7 +116,6 @@ public abstract class AbstractScaleFigure extends JPanel {
|
||||
return;}
|
||||
if (Double.isInfinite(newScaleRequest) || Double.isNaN(newScaleRequest) || 0 > newScaleRequest) {
|
||||
return;}
|
||||
// System.err.println(String.format(" => continue"));
|
||||
|
||||
this.userScale = MathUtil.clamp( newScaleRequest, MINIMUM_ZOOM, MAXIMUM_ZOOM);
|
||||
this.scale = baseScale * userScale;
|
||||
@ -133,7 +131,6 @@ public abstract class AbstractScaleFigure extends JPanel {
|
||||
* @param visibleBounds the visible bounds to scale this figure to.
|
||||
*/
|
||||
public void scaleTo(Dimension visibleBounds) {
|
||||
// System.err.println(String.format(" ::scaleTo: %d x %d", visibleBounds.width, visibleBounds.height));
|
||||
if( 0 >= visibleBounds.getWidth() || 0 >= visibleBounds.getHeight())
|
||||
return;
|
||||
|
||||
@ -141,8 +138,8 @@ public abstract class AbstractScaleFigure extends JPanel {
|
||||
updateCanvasSize();
|
||||
updateCanvasOrigin();
|
||||
|
||||
final double width_scale = (visibleBounds.width) / ((subjectBounds_m.getWidth() * baseScale) + 2 * borderThickness_px.width);
|
||||
final double height_scale = (visibleBounds.height) / ((subjectBounds_m.getHeight() * baseScale) + 2 * borderThickness_px.height);
|
||||
final double width_scale = (visibleBounds.width - 2 * borderThickness_px.width) / (subjectBounds_m.getWidth() * baseScale);
|
||||
final double height_scale = (visibleBounds.height - 2 * borderThickness_px.height) / (subjectBounds_m.getHeight() * baseScale);
|
||||
final double newScale = Math.min(height_scale, width_scale);
|
||||
|
||||
scaleTo(newScale, visibleBounds);
|
||||
@ -168,10 +165,12 @@ public abstract class AbstractScaleFigure extends JPanel {
|
||||
(int)(contentBounds_m.getHeight()*scale) + 2*borderThickness_px.height);
|
||||
|
||||
Dimension preferredFigureSize_px = new Dimension(desiredWidth, desiredHeight);
|
||||
|
||||
setPreferredSize(preferredFigureSize_px);
|
||||
setMinimumSize(preferredFigureSize_px);
|
||||
}
|
||||
|
||||
if( (getWidth() != preferredFigureSize_px.width) || (getHeight() != preferredFigureSize_px.height)) {
|
||||
setPreferredSize(preferredFigureSize_px);
|
||||
setMinimumSize(preferredFigureSize_px);
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateTransform(){
|
||||
// Calculate and store the transformation used
|
||||
|
@ -62,7 +62,11 @@ public class ScaleScrollPane extends JScrollPane
|
||||
private DoubleModel rulerUnit;
|
||||
private Ruler horizontalRuler;
|
||||
private Ruler verticalRuler;
|
||||
|
||||
|
||||
// magic number. I don't know why this number works, but this nudges the figures to zoom correctly.
|
||||
// n.b. the ruler widths == 20 px
|
||||
private static final int viewportMarginPx = 22;
|
||||
|
||||
// is the subject *currently* being fitting
|
||||
private boolean fit = false;
|
||||
|
||||
@ -110,27 +114,26 @@ public class ScaleScrollPane extends JScrollPane
|
||||
viewport.addMouseListener(this);
|
||||
viewport.addMouseMotionListener(this);
|
||||
|
||||
figure.addChangeListener(new StateChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(EventObject e) {
|
||||
horizontalRuler.updateSize();
|
||||
verticalRuler.updateSize();
|
||||
if(fit) {
|
||||
figure.scaleTo(viewport.getExtentSize());
|
||||
}
|
||||
figure.addChangeListener( e -> {
|
||||
horizontalRuler.updateSize();
|
||||
verticalRuler.updateSize();
|
||||
if(fit) {
|
||||
final java.awt.Dimension calculatedViewSize = new java.awt.Dimension(getWidth() - viewportMarginPx, getHeight() - viewportMarginPx);
|
||||
figure.scaleTo(calculatedViewSize);
|
||||
}
|
||||
});
|
||||
|
||||
viewport.addComponentListener(new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentResized(ComponentEvent e) {
|
||||
if(fit) {
|
||||
figure.scaleTo(viewport.getExtentSize());
|
||||
}
|
||||
figure.updateFigure();
|
||||
|
||||
horizontalRuler.updateSize();
|
||||
verticalRuler.updateSize();
|
||||
if(fit) {
|
||||
final Dimension calculatedViewSize = new Dimension(getWidth() - viewportMarginPx, getHeight() - viewportMarginPx);
|
||||
figure.scaleTo(calculatedViewSize);
|
||||
}
|
||||
figure.updateFigure();
|
||||
|
||||
horizontalRuler.updateSize();
|
||||
verticalRuler.updateSize();
|
||||
}
|
||||
});
|
||||
|
||||
@ -160,10 +163,8 @@ public class ScaleScrollPane extends JScrollPane
|
||||
|
||||
final Point zoomPoint = figure.getAutoZoomPoint();
|
||||
final Rectangle zoomRectangle = new Rectangle(zoomPoint.x, zoomPoint.y, (int)(view.getWidth()), (int)(view.getHeight()));
|
||||
// System.err.println(String.format("::zoom: @ %d, %d [ %d x %d ]", zoomRectangle.x, zoomRectangle.y, zoomRectangle.width, zoomRectangle.height));
|
||||
figure.scrollRectToVisible(zoomRectangle);
|
||||
|
||||
figure.invalidate();
|
||||
revalidate();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user