Added right-click & drag zoom control contributed by Richard.

This commit is contained in:
kruland2607 2012-11-14 21:11:56 -06:00
parent 14ae26dda8
commit e6fe93c2ac

View File

@ -2,6 +2,7 @@ package net.sf.openrocket.gui.plot;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener; import java.awt.event.MouseWheelListener;
@ -36,9 +37,13 @@ import com.jogamp.newt.event.InputEvent;
public class SimulationChart extends ChartPanel { public class SimulationChart extends ChartPanel {
private Point2D panLast; private Point2D panLast;
private Point startPoint;
private double panW; private double panW;
private double panH; private double panH;
private enum Interaction {ZOOM, PAN};
private Interaction interaction = Interaction.PAN;
private MouseWheelHandler mouseWheelHandler = null; private MouseWheelHandler mouseWheelHandler = null;
public SimulationChart(JFreeChart chart) { public SimulationChart(JFreeChart chart) {
@ -72,7 +77,7 @@ public class SimulationChart extends ChartPanel {
@Override @Override
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
if ( e.getButton() == MouseEvent.BUTTON1 ) { if ( e.getButton() == MouseEvent.BUTTON1 || e.getButton() == MouseEvent.BUTTON3) {
// if no modifiers, use pan // if no modifiers, use pan
Rectangle2D screenDataArea = getScreenDataArea(e.getX(), e.getY()); Rectangle2D screenDataArea = getScreenDataArea(e.getX(), e.getY());
@ -80,10 +85,18 @@ public class SimulationChart extends ChartPanel {
this.panW = screenDataArea.getWidth(); this.panW = screenDataArea.getWidth();
this.panH = screenDataArea.getHeight(); this.panH = screenDataArea.getHeight();
this.panLast = e.getPoint(); this.panLast = e.getPoint();
setCursor( Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR)); this.startPoint = e.getPoint();
} }
} else if ( e.getButton() == MouseEvent.BUTTON2 ) { }
if ( e.getButton() == MouseEvent.BUTTON2 ) {
// middle/scroll button
} else if ( e.getButton() == MouseEvent.BUTTON3 ) { // right button
interaction = Interaction.ZOOM;
setCursor (Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));
} else if ( e.getButton() == MouseEvent.BUTTON1 ) { // left button
interaction = Interaction.PAN;
setCursor( Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR));
} }
} }
@ -102,15 +115,39 @@ public class SimulationChart extends ChartPanel {
double hPercent = dy / this.panH; double hPercent = dy / this.panH;
boolean old = this.getChart().getPlot().isNotify(); boolean old = this.getChart().getPlot().isNotify();
this.getChart().getPlot().setNotify(false); this.getChart().getPlot().setNotify(false);
Pannable p = (Pannable) this.getChart().getPlot();
if ( p.getOrientation() == PlotOrientation.VERTICAL){ switch (interaction) {
p.panDomainAxes( wPercent, this.getChartRenderingInfo().getPlotInfo(),panLast); case PAN:
p.panRangeAxes( hPercent, this.getChartRenderingInfo().getPlotInfo(),panLast); Pannable p = (Pannable) this.getChart().getPlot();
} else { if ( p.getOrientation() == PlotOrientation.VERTICAL){
p.panDomainAxes( hPercent, this.getChartRenderingInfo().getPlotInfo(),panLast); p.panDomainAxes( wPercent, this.getChartRenderingInfo().getPlotInfo(),panLast);
p.panRangeAxes( wPercent, this.getChartRenderingInfo().getPlotInfo(),panLast); p.panRangeAxes( hPercent, this.getChartRenderingInfo().getPlotInfo(),panLast);
} else {
p.panDomainAxes( hPercent, this.getChartRenderingInfo().getPlotInfo(),panLast);
p.panRangeAxes( wPercent, this.getChartRenderingInfo().getPlotInfo(),panLast);
}
break;
case ZOOM:
Zoomable pz = (Zoomable) this.getChart().getPlot();
double zoomx = 1 + 2*wPercent;
double zoomy = 1 + 2*hPercent;
Point2D anchor = SimulationChart.this.translateScreenToJava2D(startPoint);
if ( pz.getOrientation() == PlotOrientation.VERTICAL) {
pz.zoomDomainAxes(zoomx, this.getChartRenderingInfo().getPlotInfo(), anchor, true);
pz.zoomRangeAxes(zoomy, this.getChartRenderingInfo().getPlotInfo(), anchor, true);
} else {
pz.zoomRangeAxes(zoomx, this.getChartRenderingInfo().getPlotInfo(), anchor, true);
pz.zoomDomainAxes(zoomy, this.getChartRenderingInfo().getPlotInfo(), anchor, true);
}
break;
} }
this.panLast = e.getPoint(); this.panLast = e.getPoint();
this.getChart().getPlot().setNotify(old); this.getChart().getPlot().setNotify(old);
} }