From b16917995da9664c3261730fa49bac18b04bd401 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Tue, 5 Feb 2013 10:04:49 -0600 Subject: [PATCH] Change mouse button handling in simulation plot. Left click drag zooms area, and ctrl left click drag pans. --- core/resources/l10n/messages.properties | 2 +- .../openrocket/gui/plot/SimulationChart.java | 309 +++++++++--------- 2 files changed, 155 insertions(+), 156 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 4d49265b3..6826a2b15 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -1099,7 +1099,7 @@ TCMotorSelPan.noDescription = No description available. ! PlotDialog 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 diff --git a/core/src/net/sf/openrocket/gui/plot/SimulationChart.java b/core/src/net/sf/openrocket/gui/plot/SimulationChart.java index 42c960e69..fa3932d5a 100644 --- a/core/src/net/sf/openrocket/gui/plot/SimulationChart.java +++ b/core/src/net/sf/openrocket/gui/plot/SimulationChart.java @@ -15,7 +15,6 @@ import javax.swing.BorderFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.JFreeChart; -import org.jfree.chart.plot.Pannable; import org.jfree.chart.plot.PiePlot; import org.jfree.chart.plot.Plot; import org.jfree.chart.plot.PlotOrientation; @@ -35,81 +34,86 @@ import com.jogamp.newt.event.InputEvent; * */ public class SimulationChart extends ChartPanel { - + private Point2D panLast; private Point startPoint; private double panW; private double panH; - private enum Interaction {ZOOM, PAN}; - private Interaction interaction = Interaction.PAN; + private enum Interaction { + ZOOM + }; + + private Interaction interaction = null; private MouseWheelHandler mouseWheelHandler = null; - + public SimulationChart(JFreeChart chart) { super(chart, /* properties */false, - /* save */ true, - /* print */ false, - /* zoom */ true, - /* tooltips */ true); + /* save */true, + /* print */false, + /* zoom */true, + /* tooltips */true); this.setMouseWheelEnabled(true); this.setEnforceFileExtensions(true); this.setInitialDelay(500); this.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1)); } - + @Override public boolean isMouseWheelEnabled() { return mouseWheelHandler != null; } - + @Override public void setMouseWheelEnabled(boolean flag) { - if ( flag && mouseWheelHandler == null ) { + if (flag && mouseWheelHandler == null) { this.mouseWheelHandler = new MouseWheelHandler(); this.addMouseWheelListener(this.mouseWheelHandler); - } else if ( !flag && mouseWheelHandler != null ) { + } else if (!flag && mouseWheelHandler != null) { this.removeMouseWheelListener(this.mouseWheelHandler); this.mouseWheelHandler = null; } } - + @Override public void mousePressed(MouseEvent e) { - if ( e.getButton() == MouseEvent.BUTTON1 || e.getButton() == MouseEvent.BUTTON3) { - // if no modifiers, use pan + if (e.getButton() == MouseEvent.BUTTON3) { + Rectangle2D screenDataArea = getScreenDataArea(e.getX(), e.getY()); - if ( screenDataArea != null && screenDataArea.contains(e.getPoint())) { - this.panW = screenDataArea.getWidth(); + if (screenDataArea != null && screenDataArea.contains(e.getPoint())) { + this.panW = screenDataArea.getWidth(); this.panH = screenDataArea.getHeight(); this.panLast = 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; - setCursor (Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR)); - } else if ( e.getButton() == MouseEvent.BUTTON1 ) { // left button - interaction = Interaction.PAN; - setCursor( Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR)); + setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR)); + + } + else { + interaction = null; + super.mousePressed(e); } } - + @Override public void mouseDragged(MouseEvent e) { - if ( panLast == null ) { + if (interaction == null) { + super.mouseDragged(e); return; } - + + if (panLast == null) { + return; + } + double dx = e.getX() - this.panLast.getX(); double dy = e.getY() - this.panLast.getY(); - if ( dx == 0.0 && dy == 0.0 ) { - return ; + if (dx == 0.0 && dy == 0.0) { + return; } double wPercent = -dx / this.panW; double hPercent = dy / this.panH; @@ -117,49 +121,44 @@ public class SimulationChart extends ChartPanel { this.getChart().getPlot().setNotify(false); 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: - 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; + 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.getChart().getPlot().setNotify(old); } - + @Override public void mouseReleased(MouseEvent e) { - if ( this.panLast != null ) { + if (interaction == null) { + super.mouseReleased(e); + return; + } + + if (this.panLast != null) { this.panLast = null; setCursor(Cursor.getDefaultCursor()); } + interaction = null; } - + /** * @@ -173,97 +172,97 @@ public class SimulationChart extends ChartPanel { * @since 1.0.13 */ class MouseWheelHandler implements MouseWheelListener, Serializable { - - /** The zoom factor. */ - double zoomFactor; - - /** - * Creates a new instance for the specified chart panel. - * - * @param chartPanel the chart panel (null not permitted). - */ - public MouseWheelHandler() { - this.zoomFactor = 0.10; - } - - /** - * Returns the current zoom factor. The default value is 0.10 (ten - * percent). - * - * @return The zoom factor. - * - * @see #setZoomFactor(double) - */ - public double getZoomFactor() { - return this.zoomFactor; - } - - /** - * Sets the zoom factor. - * - * @param zoomFactor the zoom factor. - * - * @see #getZoomFactor() - */ - public void setZoomFactor(double zoomFactor) { - this.zoomFactor = zoomFactor; - } - - /** - * Handles a mouse wheel event from the underlying chart panel. - * - * @param e the event. - */ - public void mouseWheelMoved(MouseWheelEvent e) { - JFreeChart chart = SimulationChart.this.getChart(); - if (chart == null) { - return; - } - Plot plot = chart.getPlot(); - if (plot instanceof Zoomable) { - Zoomable zoomable = (Zoomable) plot; - handleZoomable(zoomable, e); - } - else if (plot instanceof PiePlot) { - PiePlot pp = (PiePlot) plot; - pp.handleMouseWheelRotation(e.getWheelRotation()); - } - } - - /** - * Handle the case where a plot implements the {@link Zoomable} interface. - * - * @param zoomable the zoomable plot. - * @param e the mouse wheel event. - */ - private void handleZoomable(Zoomable zoomable, MouseWheelEvent e) { - // don't zoom unless the mouse pointer is in the plot's data area - ChartRenderingInfo info = SimulationChart.this.getChartRenderingInfo(); - PlotRenderingInfo pinfo = info.getPlotInfo(); - Point2D p = SimulationChart.this.translateScreenToJava2D(e.getPoint()); - if (!pinfo.getDataArea().contains(p)) { - return; - } - - Plot plot = (Plot) zoomable; - // do not notify while zooming each axis - boolean notifyState = plot.isNotify(); - plot.setNotify(false); - int clicks = e.getWheelRotation(); - double zf = 1.0 + this.zoomFactor; - if (clicks < 0) { - zf = 1.0 / zf; - } - if (SimulationChart.this.isDomainZoomable()) { - zoomable.zoomDomainAxes(zf, pinfo, p, true); - } - boolean domainOnly = ( e.getModifiers() & InputEvent.ALT_MASK ) != 0; - if (SimulationChart.this.isRangeZoomable() && !domainOnly ) { - zoomable.zoomRangeAxes(zf, pinfo, p, true); - } - plot.setNotify(notifyState); // this generates the change event too - } - + + /** The zoom factor. */ + double zoomFactor; + + /** + * Creates a new instance for the specified chart panel. + * + * @param chartPanel the chart panel (null not permitted). + */ + public MouseWheelHandler() { + this.zoomFactor = 0.10; + } + + /** + * Returns the current zoom factor. The default value is 0.10 (ten + * percent). + * + * @return The zoom factor. + * + * @see #setZoomFactor(double) + */ + public double getZoomFactor() { + return this.zoomFactor; + } + + /** + * Sets the zoom factor. + * + * @param zoomFactor the zoom factor. + * + * @see #getZoomFactor() + */ + public void setZoomFactor(double zoomFactor) { + this.zoomFactor = zoomFactor; + } + + /** + * Handles a mouse wheel event from the underlying chart panel. + * + * @param e the event. + */ + public void mouseWheelMoved(MouseWheelEvent e) { + JFreeChart chart = SimulationChart.this.getChart(); + if (chart == null) { + return; + } + Plot plot = chart.getPlot(); + if (plot instanceof Zoomable) { + Zoomable zoomable = (Zoomable) plot; + handleZoomable(zoomable, e); + } + else if (plot instanceof PiePlot) { + PiePlot pp = (PiePlot) plot; + pp.handleMouseWheelRotation(e.getWheelRotation()); + } + } + + /** + * Handle the case where a plot implements the {@link Zoomable} interface. + * + * @param zoomable the zoomable plot. + * @param e the mouse wheel event. + */ + private void handleZoomable(Zoomable zoomable, MouseWheelEvent e) { + // don't zoom unless the mouse pointer is in the plot's data area + ChartRenderingInfo info = SimulationChart.this.getChartRenderingInfo(); + PlotRenderingInfo pinfo = info.getPlotInfo(); + Point2D p = SimulationChart.this.translateScreenToJava2D(e.getPoint()); + if (!pinfo.getDataArea().contains(p)) { + return; + } + + Plot plot = (Plot) zoomable; + // do not notify while zooming each axis + boolean notifyState = plot.isNotify(); + plot.setNotify(false); + int clicks = e.getWheelRotation(); + double zf = 1.0 + this.zoomFactor; + if (clicks < 0) { + zf = 1.0 / zf; + } + if (SimulationChart.this.isDomainZoomable()) { + zoomable.zoomDomainAxes(zf, pinfo, p, true); + } + boolean domainOnly = (e.getModifiers() & InputEvent.CTRL_MASK) != 0; + if (SimulationChart.this.isRangeZoomable() && !domainOnly) { + zoomable.zoomRangeAxes(zf, pinfo, p, true); + } + plot.setNotify(notifyState); // this generates the change event too + } + } - + }