package prefuse.controls;
import java.awt.geom.Point2D;
import prefuse.Display;
/**
* Abstract base class for zoom controls.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class AbstractZoomControl extends ControlAdapter {
public static final double DEFAULT_MIN_SCALE = 1E-3;
public static final double DEFAULT_MAX_SCALE = 75;
/** Indicates a zoom operation completed successfully. */
protected static final int ZOOM = 0;
/** Indicates the minimum allowed zoom level has been reached. */
protected static final int MIN_ZOOM = 1;
/** Indicates the maximum allowed zoom level has been reached. */
protected static final int MAX_ZOOM = 2;
/** Indicates no zooming can be performed. This is often due to a
* transformation activity in progress. */
protected static final int NO_ZOOM = 3;
protected double m_minScale = DEFAULT_MIN_SCALE;
protected double m_maxScale = DEFAULT_MAX_SCALE;
protected boolean m_zoomOverItem = true;
/**
* Zoom the given display at the given point by the zoom factor,
* in either absolute (item-space) or screen co-ordinates.
* @param display the Display to zoom
* @param p the point to center the zoom upon
* @param zoom the scale factor by which to zoom
* @param abs if true, the point p should be assumed to be in absolute
* coordinates, otherwise it will be treated as scree (pixel) coordinates
* @return a return code indicating the status of the zoom operation.
* One of {@link #ZOOM}, {@link #NO_ZOOM}, {@link #MIN_ZOOM},
* {@link #MAX_ZOOM}.
*/
protected int zoom(Display display, Point2D p, double zoom, boolean abs) {
if ( display.isTranformInProgress() )
return NO_ZOOM;
double scale = display.getScale();
double result = scale * zoom;
int status = ZOOM;
if ( result < m_minScale ) {
zoom = m_minScale/scale;
status = MIN_ZOOM;
} else if ( result > m_maxScale ) {
zoom = m_maxScale/scale;
status = MAX_ZOOM;
}
if ( abs )
display.zoomAbs(p,zoom);
else
display.zoom(p,zoom);
display.repaint();
return status;
}
/**
* Gets the maximum scale value allowed by this zoom control
* @return the maximum scale value
*/
public double getMaxScale() {
return m_maxScale;
}
/**
* Sets the maximum scale value allowed by this zoom control
* @return the maximum scale value
*/
public void setMaxScale(double maxScale) {
this.m_maxScale = maxScale;
}
/**
* Gets the minimum scale value allowed by this zoom control
* @return the minimum scale value
*/
public double getMinScale() {
return m_minScale;
}
/**
* Sets the minimum scale value allowed by this zoom control
* @return the minimum scale value
*/
public void setMinScale(double minScale) {
this.m_minScale = minScale;
}
/**
* Indicates if the zoom control will work while the mouse is
* over a VisualItem.
* @return true if the control still operates over a VisualItem
*/
public boolean isZoomOverItem() {
return m_zoomOverItem;
}
/**
* Determines if the zoom control will work while the mouse is
* over a VisualItem
* @param zoomOverItem true to indicate the control operates
* over VisualItems, false otherwise
*/
public void setZoomOverItem(boolean zoomOverItem) {
this.m_zoomOverItem = zoomOverItem;
}
} // end of class AbstractZoomControl