gt:             double value = plot.getValue(this.datasetIndex);
context: /* ===========================================================
   * JFreeChart : a free chart library for the Java(tm) platform
   * ===========================================================
   *
   * (C) Copyright 2000-2013, 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.]
   *
   * ----------------
   * DialPointer.java
   * ----------------
   * (C) Copyright 2006-2013, by Object Refinery Limited.
   *
   * Original Author:  David Gilbert (for Object Refinery Limited);
   * Contributor(s):   -;
   *
   * Changes
   * -------
   * 03-Nov-2006 : Version 1 (DG);
   * 17-Oct-2007 : Added equals() overrides (DG);
   * 24-Oct-2007 : Implemented PublicCloneable, changed default radius,
   *               and added argument checks (DG);
   * 23-Nov-2007 : Added fillPaint and outlinePaint attributes to
   *               DialPointer.Pointer (DG);
   * 03-Jul-2013 : Use ParamChecks (DG);
   *
   */
  
  package org.jfree.chart.plot.dial;
  
  import java.awt.BasicStroke;
  import java.awt.Color;
  import java.awt.Graphics2D;
  import java.awt.Paint;
  import java.awt.Stroke;
  import java.awt.geom.Arc2D;
  import java.awt.geom.GeneralPath;
  import java.awt.geom.Line2D;
  import java.awt.geom.Point2D;
  import java.awt.geom.Rectangle2D;
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.Serializable;
  
  import org.jfree.chart.HashUtilities;
  import org.jfree.chart.util.ParamChecks;
  import org.jfree.io.SerialUtilities;
  import org.jfree.util.PaintUtilities;
  import org.jfree.util.PublicCloneable;
  
  /**
   * A base class for the pointer in a {@link DialPlot}.
   *
   * @since 1.0.7
   */
  public abstract class DialPointer extends AbstractDialLayer
          implements DialLayer, Cloneable, PublicCloneable, Serializable {
  
      /** The needle radius. */
      double radius;
  
      /**
       * The dataset index for the needle.
       */
      int datasetIndex;
  
      /**
       * Creates a new <code>DialPointer</code> instance.
       */
      protected DialPointer() {
          this(0);
      }
  
      /**
       * Creates a new pointer for the specified dataset.
       *
       * @param datasetIndex  the dataset index.
       */
      protected DialPointer(int datasetIndex) {
          this.radius = 0.9;
          this.datasetIndex = datasetIndex;
      }
  
      /**
       * Returns the dataset index that the pointer maps to.
       *
       * @return The dataset index.
       *
       * @see #getDatasetIndex()
       */
      public int getDatasetIndex() {
          return this.datasetIndex;
      }
  
      /**
       * Sets the dataset index for the pointer and sends a
       * {@link DialLayerChangeEvent} to all registered listeners.
       *
       * @param index  the index.
       *
       * @see #getDatasetIndex()
       */
      public void setDatasetIndex(int index) {
          this.datasetIndex = index;
          notifyListeners(new DialLayerChangeEvent(this));
      }
  
      /**
       * Returns the radius of the pointer, as a percentage of the dial's
       * framing rectangle.
       *
       * @return The radius.
       *
       * @see #setRadius(double)
       */
      public double getRadius() {
          return this.radius;
      }
  
      /**
       * Sets the radius of the pointer and sends a
       * {@link DialLayerChangeEvent} to all registered listeners.
       *
       * @param radius  the radius.
       *
       * @see #getRadius()
       */
      public void setRadius(double radius) {
          this.radius = radius;
          notifyListeners(new DialLayerChangeEvent(this));
      }
  
      /**
       * Returns <code>true</code> to indicate that this layer should be
       * clipped within the dial window.
       *
       * @return <code>true</code>.
       */
      @Override
      public boolean isClippedToWindow() {
          return true;
      }
  
      /**
       * Checks this instance for equality with an arbitrary object.
       *
       * @param obj  the object (<code>null</code> not permitted).
       *
       * @return A boolean.
       */
      @Override
      public boolean equals(Object obj) {
          if (obj == this) {
              return true;
          }
          if (!(obj instanceof DialPointer)) {
              return false;
          }
          DialPointer that = (DialPointer) obj;
          if (this.datasetIndex != that.datasetIndex) {
              return false;
          }
          if (this.radius != that.radius) {
              return false;
          }
          return super.equals(obj);
      }
  
      /**
       * Returns a hash code.
       *
       * @return A hash code.
       */
      @Override
      public int hashCode() {
          int result = 23;
          result = HashUtilities.hashCode(result, this.radius);
          return result;
      }
  
      /**
       * Returns a clone of the pointer.
       *
       * @return a clone.
       *
       * @throws CloneNotSupportedException if one of the attributes cannot
       *     be cloned.
       */
      @Override
      public Object clone() throws CloneNotSupportedException {
          return super.clone();
      }
  
      /**
       * A dial pointer that draws a thin line (like a pin).
       */
      public static class Pin extends DialPointer {
  
          /** For serialization. */
          static final long serialVersionUID = -8445860485367689750L;
  
          /** The paint. */
          private transient Paint paint;
  
          /** The stroke. */
          private transient Stroke stroke;
  
          /**
           * Creates a new instance.
           */
          public Pin() {
              this(0);
          }
  
          /**
           * Creates a new instance.
           *
           * @param datasetIndex  the dataset index.
           */
          public Pin(int datasetIndex) {
              super(datasetIndex);
              this.paint = Color.red;
              this.stroke = new BasicStroke(3.0f, BasicStroke.CAP_ROUND,
                      BasicStroke.JOIN_BEVEL);
          }
  
          /**
           * Returns the paint.
           *
           * @return The paint (never <code>null</code>).
           *
           * @see #setPaint(Paint)
           */
          public Paint getPaint() {
              return this.paint;
          }
  
          /**
           * Sets the paint and sends a {@link DialLayerChangeEvent} to all
           * registered listeners.
           *
           * @param paint  the paint (<code>null</code> not permitted).
           *
           * @see #getPaint()
           */
          public void setPaint(Paint paint) {
              ParamChecks.nullNotPermitted(paint, "paint");
              this.paint = paint;
              notifyListeners(new DialLayerChangeEvent(this));
          }
  
          /**
           * Returns the stroke.
           *
           * @return The stroke (never <code>null</code>).
           *
           * @see #setStroke(Stroke)
           */
          public Stroke getStroke() {
              return this.stroke;
          }
  
          /**
           * Sets the stroke and sends a {@link DialLayerChangeEvent} to all
           * registered listeners.
           *
           * @param stroke  the stroke (<code>null</code> not permitted).
           *
           * @see #getStroke()
           */
          public void setStroke(Stroke stroke) {
              ParamChecks.nullNotPermitted(stroke, "stroke");
              this.stroke = stroke;
              notifyListeners(new DialLayerChangeEvent(this));
          }
  
          /**
           * Draws the pointer.
           *
           * @param g2  the graphics target.
           * @param plot  the plot.
           * @param frame  the dial's reference frame.
           * @param view  the dial's view.
           */
          @Override
          public void draw(Graphics2D g2, DialPlot plot, Rectangle2D frame,
              Rectangle2D view) {
  
              g2.setPaint(this.paint);
              g2.setStroke(this.stroke);
              Rectangle2D arcRect = DialPlot.rectangleByRadius(frame,
                      this.radius, this.radius);
  
  