Change mouse button handling in simulation plot. Left click drag zooms

area, and ctrl left click drag pans.
This commit is contained in:
kruland2607 2013-02-05 10:04:49 -06:00
parent 06e702839f
commit b16917995d
2 changed files with 155 additions and 156 deletions

View File

@ -1099,7 +1099,7 @@ TCMotorSelPan.noDescription = No description available.
! PlotDialog ! PlotDialog
PlotDialog.CheckBox.Showdatapoints = Show data points PlotDialog.CheckBox.Showdatapoints = Show data points
PlotDialog.lbl.Chart = mouse wheel to zoom. alt-mouse wheel to zoom x axis only. drag to pan. PlotDialog.lbl.Chart = left click drag to zoom area. mouse wheel to zoom. ctrl-mouse wheel to zoom x axis only. ctrl-left click drag to pan. right click drag to zoom dynamically.
! "main" prefix is used for the main application dialog ! "main" prefix is used for the main application dialog

View File

@ -15,7 +15,6 @@ import javax.swing.BorderFactory;
import org.jfree.chart.ChartPanel; import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart; import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.Pannable;
import org.jfree.chart.plot.PiePlot; import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.Plot; import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.PlotOrientation;
@ -41,18 +40,21 @@ public class SimulationChart extends ChartPanel {
private double panW; private double panW;
private double panH; private double panH;
private enum Interaction {ZOOM, PAN}; private enum Interaction {
private Interaction interaction = Interaction.PAN; ZOOM
};
private Interaction interaction = null;
private MouseWheelHandler mouseWheelHandler = null; private MouseWheelHandler mouseWheelHandler = null;
public SimulationChart(JFreeChart chart) { public SimulationChart(JFreeChart chart) {
super(chart, super(chart,
/* properties */false, /* properties */false,
/* save */ true, /* save */true,
/* print */ false, /* print */false,
/* zoom */ true, /* zoom */true,
/* tooltips */ true); /* tooltips */true);
this.setMouseWheelEnabled(true); this.setMouseWheelEnabled(true);
this.setEnforceFileExtensions(true); this.setEnforceFileExtensions(true);
this.setInitialDelay(500); this.setInitialDelay(500);
@ -66,10 +68,10 @@ public class SimulationChart extends ChartPanel {
@Override @Override
public void setMouseWheelEnabled(boolean flag) { public void setMouseWheelEnabled(boolean flag) {
if ( flag && mouseWheelHandler == null ) { if (flag && mouseWheelHandler == null) {
this.mouseWheelHandler = new MouseWheelHandler(); this.mouseWheelHandler = new MouseWheelHandler();
this.addMouseWheelListener(this.mouseWheelHandler); this.addMouseWheelListener(this.mouseWheelHandler);
} else if ( !flag && mouseWheelHandler != null ) { } else if (!flag && mouseWheelHandler != null) {
this.removeMouseWheelListener(this.mouseWheelHandler); this.removeMouseWheelListener(this.mouseWheelHandler);
this.mouseWheelHandler = null; this.mouseWheelHandler = null;
} }
@ -77,39 +79,41 @@ public class SimulationChart extends ChartPanel {
@Override @Override
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
if ( e.getButton() == MouseEvent.BUTTON1 || e.getButton() == MouseEvent.BUTTON3) { if (e.getButton() == MouseEvent.BUTTON3) {
// if no modifiers, use pan
Rectangle2D screenDataArea = getScreenDataArea(e.getX(), e.getY()); Rectangle2D screenDataArea = getScreenDataArea(e.getX(), e.getY());
if ( screenDataArea != null && screenDataArea.contains(e.getPoint())) { if (screenDataArea != null && screenDataArea.contains(e.getPoint())) {
this.panW = screenDataArea.getWidth(); this.panW = screenDataArea.getWidth();
this.panH = screenDataArea.getHeight(); this.panH = screenDataArea.getHeight();
this.panLast = e.getPoint(); this.panLast = e.getPoint();
this.startPoint = e.getPoint(); this.startPoint = e.getPoint();
} }
}
if ( e.getButton() == MouseEvent.BUTTON2 ) {
// middle/scroll button
} else if ( e.getButton() == MouseEvent.BUTTON3 ) { // right button
interaction = Interaction.ZOOM; interaction = Interaction.ZOOM;
setCursor (Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR)); setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));
} else if ( e.getButton() == MouseEvent.BUTTON1 ) { // left button
interaction = Interaction.PAN; }
setCursor( Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR)); else {
interaction = null;
super.mousePressed(e);
} }
} }
@Override @Override
public void mouseDragged(MouseEvent e) { public void mouseDragged(MouseEvent e) {
if ( panLast == null ) { if (interaction == null) {
super.mouseDragged(e);
return;
}
if (panLast == null) {
return; return;
} }
double dx = e.getX() - this.panLast.getX(); double dx = e.getX() - this.panLast.getX();
double dy = e.getY() - this.panLast.getY(); double dy = e.getY() - this.panLast.getY();
if ( dx == 0.0 && dy == 0.0 ) { if (dx == 0.0 && dy == 0.0) {
return ; return;
} }
double wPercent = -dx / this.panW; double wPercent = -dx / this.panW;
double hPercent = dy / this.panH; double hPercent = dy / this.panH;
@ -117,26 +121,15 @@ public class SimulationChart extends ChartPanel {
this.getChart().getPlot().setNotify(false); this.getChart().getPlot().setNotify(false);
switch (interaction) { switch (interaction) {
case PAN:
Pannable p = (Pannable) this.getChart().getPlot();
if ( p.getOrientation() == PlotOrientation.VERTICAL){
p.panDomainAxes( 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: case ZOOM:
Zoomable pz = (Zoomable) this.getChart().getPlot(); Zoomable pz = (Zoomable) this.getChart().getPlot();
double zoomx = 1 + 2*wPercent; double zoomx = 1 + 2 * wPercent;
double zoomy = 1 + 2*hPercent; double zoomy = 1 + 2 * hPercent;
Point2D anchor = SimulationChart.this.translateScreenToJava2D(startPoint); Point2D anchor = SimulationChart.this.translateScreenToJava2D(startPoint);
if ( pz.getOrientation() == PlotOrientation.VERTICAL) { if (pz.getOrientation() == PlotOrientation.VERTICAL) {
pz.zoomDomainAxes(zoomx, this.getChartRenderingInfo().getPlotInfo(), anchor, true); pz.zoomDomainAxes(zoomx, this.getChartRenderingInfo().getPlotInfo(), anchor, true);
pz.zoomRangeAxes(zoomy, this.getChartRenderingInfo().getPlotInfo(), anchor, true); pz.zoomRangeAxes(zoomy, this.getChartRenderingInfo().getPlotInfo(), anchor, true);
} else { } else {
@ -154,10 +147,16 @@ public class SimulationChart extends ChartPanel {
@Override @Override
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
if ( this.panLast != null ) { if (interaction == null) {
super.mouseReleased(e);
return;
}
if (this.panLast != null) {
this.panLast = null; this.panLast = null;
setCursor(Cursor.getDefaultCursor()); setCursor(Cursor.getDefaultCursor());
} }
interaction = null;
} }
@ -257,8 +256,8 @@ public class SimulationChart extends ChartPanel {
if (SimulationChart.this.isDomainZoomable()) { if (SimulationChart.this.isDomainZoomable()) {
zoomable.zoomDomainAxes(zf, pinfo, p, true); zoomable.zoomDomainAxes(zf, pinfo, p, true);
} }
boolean domainOnly = ( e.getModifiers() & InputEvent.ALT_MASK ) != 0; boolean domainOnly = (e.getModifiers() & InputEvent.CTRL_MASK) != 0;
if (SimulationChart.this.isRangeZoomable() && !domainOnly ) { if (SimulationChart.this.isRangeZoomable() && !domainOnly) {
zoomable.zoomRangeAxes(zf, pinfo, p, true); zoomable.zoomRangeAxes(zf, pinfo, p, true);
} }
plot.setNotify(notifyState); // this generates the change event too plot.setNotify(notifyState); // this generates the change event too