content: /* ===========================================================
   * JFreeChart : a free chart library for the Java(tm) platform
   * ===========================================================
   *
   * (C) Copyright 2000-2012, by Object Refinery Limited and Contributors.
   *
   * Project Info:  http://www.jfree.org/jfreechart/index.html
   *
   * This library is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as published by
   * the Free Software Foundation; either version 2.1 of the License, or
   * (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
   * License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this library; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
   * USA.
   *
   * [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
   * Other names may be trademarks of their respective owners.]
   *
   * ----------------------
   * MouseWheelHandler.java
   * ----------------------
   * (C) Copyright 2009, by Object Refinery Limited and Contributors.
   *
   * Original Author:  David Gilbert (for Object Refinery Limited);
   * Contributor(s):   Ulrich Voigt - patch 2686040;
   *                   Jim Goodwin - bug fix;
   *
   * Changes
   * -------
   * 18-Mar-2009 : Version 1, based on ideas by UV in patch 2686040 (DG);
   * 26-Mar-2009 : Implemented Serializable (DG);
   * 10-Sep-2009 : Bug fix by Jim Goodwin to respect domain/rangeZoomable flags
   *               in the ChartPanel (DG);
   * 04-Nov-2009 : Pass mouse wheel notification to PiePlot (DG);
   *
   */
  
  package org.jfree.chart;
  
  import java.awt.event.MouseWheelEvent;
  import java.awt.event.MouseWheelListener;
  import java.awt.geom.Point2D;
  
  import java.io.Serializable;
  import org.jfree.chart.plot.PiePlot;
  import org.jfree.chart.plot.Plot;
  import org.jfree.chart.plot.PlotRenderingInfo;
  import org.jfree.chart.plot.Zoomable;
  
  /**
   * A class that handles mouse wheel events for the {@link ChartPanel} class.
   * Mouse wheel event support was added in JDK 1.4, so this class will be omitted
   * from JFreeChart if you build it using JDK 1.3.
   *
   * @since 1.0.13
   */
  class MouseWheelHandler implements MouseWheelListener, Serializable {
  
      /** The chart panel. */
      private ChartPanel chartPanel;
  
      /** The zoom factor. */
      double zoomFactor;
  
      /**
       * Creates a new instance for the specified chart panel.
       *
       * @param chartPanel  the chart panel (<code>null</code> not permitted).
       */
      public MouseWheelHandler(ChartPanel chartPanel) {
          this.chartPanel = chartPanel;
          this.zoomFactor = 0.10;
          this.chartPanel.addMouseWheelListener(this);
      }
  
      /**
       * 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.
       */
      @Override
      public void mouseWheelMoved(MouseWheelEvent e) {
          JFreeChart chart = this.chartPanel.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 = this.chartPanel.getChartRenderingInfo();
          PlotRenderingInfo pinfo = info.getPlotInfo();
          Point2D p = this.chartPanel.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 (this.chartPanel.isDomainZoomable()) {
              zoomable.zoomDomainAxes(zf, pinfo, p, true);
          }
          if (this.chartPanel.isRangeZoomable()) {
              zoomable.zoomRangeAxes(zf, pinfo, p, true);
          }
          plot.setNotify(notifyState);  // this generates the change event too
      }
  
  }
  