/* ZoomMouseWheelListener.java created 2007-11-08
*
*/
package org.signalml.app.view.signal;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Point2D;
import javax.swing.BoundedRangeModel;
import javax.swing.JViewport;
/** ZoomMouseWheelListener
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class ZoomMouseWheelListener implements MouseWheelListener {
private SignalView signalView;
private boolean timeEnabled = true;
public ZoomMouseWheelListener(SignalView signalView) {
this.signalView = signalView;
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int valueTime = 0;
BoundedRangeModel timeModel = null;
Object source = e.getSource();
if (!(source instanceof SignalPlot)) {
return;
}
// prevent from conflicting with tools
if (signalView.isToolEngaged()) {
return;
}
SignalPlot plot = (SignalPlot) source;
int rotation = -e.getWheelRotation();
if (timeEnabled) {
timeModel = plot.getTimeScaleRangeModel();
valueTime = timeModel.getValue();
int maxTime = timeModel.getMaximum();
int minTime = timeModel.getMinimum();
float stepTime = (maxTime - minTime) / 20F;
valueTime = valueTime + (int)(stepTime*rotation);
valueTime = Math.max(minTime, Math.min(maxTime, valueTime));
}
BoundedRangeModel channelModel = plot.getChannelHeightRangeModel();
int valueChannel = channelModel.getValue();
int maxChannel = channelModel.getMaximum();
int minChannel = channelModel.getMinimum();
float stepChannel = (maxChannel - minChannel) / 20F;
valueChannel = valueChannel + (int)(stepChannel*rotation);
valueChannel = Math.max(minChannel, Math.min(maxChannel, valueChannel));
JViewport viewport = plot.getViewport();
Point viewportPoint = viewport.getViewPosition();
Dimension viewportSize = viewport.getExtentSize();
Point p = e.getPoint();
Point2D.Float p2 = plot.toSignalSpace(p);
// suppress centerpoint compensation in order to compensate around mouse pointer
plot.setCompensationEnabled(false);
try {
if (timeEnabled) {
timeModel.setValue(valueTime);
}
channelModel.setValue(valueChannel);
// viewport needs to be validated after change, so that getSize returns a valid value
viewport.validate();
Dimension plotSize = plot.getSize();
Point newP = plot.toPixelSpace(p2);
newP.x = newP.x - (p.x - viewportPoint.x);
newP.y = newP.y - (p.y - viewportPoint.y);
newP.x = Math.max(0, Math.min(plotSize.width - viewportSize.width, newP.x));
newP.y = Math.max(0, Math.min(plotSize.height - viewportSize.height, newP.y));
viewport.setViewPosition(newP);
} finally {
plot.setCompensationEnabled(true);
}
}
public boolean isTimeEnabled() {
return timeEnabled;
}
public void setTimeEnabled(boolean b) {
timeEnabled = b;
}
}