content: /* ===========================================================
   * JFreeChart : a free chart library for the Java(tm) platform
   * ===========================================================
   *
   * (C) Copyright 2000-2011, 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.]
   *
   * --------------------
   * WaferMapDataset.java
   * --------------------
   * (C)opyright 2003-2008, by Robert Redburn and Contributors.
   *
   * Original Author:  Robert Redburn;
   * Contributor(s):   David Gilbert (for Object Refinery Limited);
   *
   * Changes
   * -------
   * 25-Nov-2003 : Version 1 contributed by Robert Redburn (with some
   *               modifications to match style conventions) (DG);
   * ------------- JFREECHART 1.0.x ---------------------------------------------
   * 02-Feb-2007 : Removed author tags from all over JFreeChart sources (DG);
   *
   */
  
  package org.jfree.data.general;
  
  import java.util.Set;
  import java.util.TreeSet;
  
  import org.jfree.data.DefaultKeyedValues2D;
  
  /**
   * A dataset that can be used with the {@link org.jfree.chart.plot.WaferMapPlot}
   * class.
   */
  public class WaferMapDataset extends AbstractDataset {
  
      /**
       * Storage structure for the data values (row key is chipx, column is
       * chipy)
       */
      private DefaultKeyedValues2D data;
  
      /** wafer x dimension */
      private int maxChipX;
  
      /** wafer y dimension */
      private int maxChipY;
  
      /** space to draw between chips */
      private double chipSpace;
  
      /** maximum value in this dataset */
      private Double maxValue;
  
      /** minimum value in this dataset */
      private Double minValue;
  
      /** default chip spacing */
      private static final double DEFAULT_CHIP_SPACE = 1d;
  
      /**
       * Creates a new dataset using the default chipspace.
       *
       * @param maxChipX  the wafer x-dimension.
       * @param maxChipY  the wafer y-dimension.
       */
      public WaferMapDataset(int maxChipX, int maxChipY) {
          this(maxChipX, maxChipY, null);
      }
  
      /**
       * Creates a new dataset.
       *
       * @param maxChipX  the wafer x-dimension.
       * @param maxChipY  the wafer y-dimension.
       * @param chipSpace  the space between chips.
       */
      public WaferMapDataset(int maxChipX, int maxChipY, Number chipSpace) {
  
          this.maxValue = Double.NEGATIVE_INFINITY;
          this.minValue = Double.POSITIVE_INFINITY;
          this.data = new DefaultKeyedValues2D();
  
          this.maxChipX = maxChipX;
          this.maxChipY = maxChipY;
          if (chipSpace == null) {
              this.chipSpace = DEFAULT_CHIP_SPACE;
          }
          else {
              this.chipSpace = chipSpace.doubleValue();
          }
  
      }
  
      /**
       * Sets a value in the dataset.
       *
       * @param value  the value.
       * @param chipx  the x-index for the chip.
       * @param chipy  the y-index for the chip.
       */
      public void addValue(Number value, Comparable chipx, Comparable chipy) {
          setValue(value, chipx, chipy);
      }
  
      /**
       * Adds a value to the dataset.
       *
       * @param v  the value.
       * @param x  the x-index.
       * @param y  the y-index.
       */
      public void addValue(int v, int x, int y) {
          setValue((double) v, x, y);
      }
  
      /**
       * Sets a value in the dataset and updates min and max value entries.
       *
       * @param value  the value.
       * @param chipx  the x-index.
       * @param chipy  the y-index.
       */
      public void setValue(Number value, Comparable chipx, Comparable chipy) {
          this.data.setValue(value, chipx, chipy);
          if (isMaxValue(value)) {
              this.maxValue = (Double) value;
          }
          if (isMinValue(value)) {
              this.minValue = (Double) value;
          }
      }
  
      /**
       * Returns the number of unique values.
       *
       * @return The number of unique values.
       */
      public int getUniqueValueCount() {
          return getUniqueValues().size();
      }
  
      /**
       * Returns the set of unique values.
       *
       * @return The set of unique values.
       */
      public Set<Number> getUniqueValues() {
          Set<Number> unique = new TreeSet<Number>();
          //step through all the values and add them to the hash
          for (int r = 0; r < this.data.getRowCount(); r++) {
              for (int c = 0; c < this.data.getColumnCount(); c++) {
                  Number value = this.data.getValue(r, c);
                  if (value != null) {
                      unique.add(value);
                  }
              }
          }
          return unique;
      }
  
      /**
       * Returns the data value for a chip.
       *
       * @param chipx  the x-index.
       * @param chipy  the y-index.
       *
       * @return The data value.
       */
      public Number getChipValue(int chipx, int chipy) {
          return getChipValue(Integer.valueOf(chipx), Integer.valueOf(chipy));
      }
  
      /**
       * Returns the value for a given chip x and y or null.
       *
       * @param chipx  the x-index.
       * @param chipy  the y-index.
       *
       * @return The data value.
       */
      public Number getChipValue(Comparable chipx, Comparable chipy) {
          int rowIndex = this.data.getRowIndex(chipx);
          if (rowIndex < 0) {
              return null;
          }
          int colIndex = this.data.getColumnIndex(chipy);
          if (colIndex < 0) {
              return null;
          }
          return this.data.getValue(rowIndex, colIndex);
      }
  
      /**
       * Tests to see if the passed value is larger than the stored maxvalue.
       *
       * @param check  the number to check.
       *
       * @return A boolean.
       */
      public boolean isMaxValue(Number check) {
          if (check.doubleValue() > this.maxValue) {
              return true;
          }
          return false;
      }
  
      /**
       * Tests to see if the passed value is smaller than the stored minvalue.
       *
       * @param check  the number to check.
       *
       * @return A boolean.
       */
      public boolean isMinValue(Number check) {
          if (check.doubleValue() < this.minValue) {
              return true;
          }
          return false;
      }
  
      /**
       * Returns the maximum value stored in the dataset.
       *
       * @return The maximum value.
       */
      public Number getMaxValue() {
          return this.maxValue;
      }
  
      /**
       * Returns the minimum value stored in the dataset.
       *
       * @return The minimum value.
       */
      public Number getMinValue() {
          return this.minValue;
      }
  
      /**
       * Returns the wafer x-dimension.
       *
       * @return The number of chips in the x-dimension.
       */
      public int getMaxChipX() {
          return this.maxChipX;
      }
  
      /**
       * Sets wafer x dimension.
       *
       * @param maxChipX  the number of chips in the x-dimension.
       */
      public void setMaxChipX(int maxChipX) {
          this.maxChipX = maxChipX;
      }
  
      /**
       * Returns the number of chips in the y-dimension.
       *
       * @return The number of chips.
       */
      public int getMaxChipY() {
          return this.maxChipY;
      }
  
      /**
       * Sets the number of chips in the y-dimension.
       *
       * @param maxChipY  the number of chips.
       */
      public void setMaxChipY(int maxChipY) {
          this.maxChipY = maxChipY;
      }
  
      /**
       * Returns the space to draw between chips.
       *
       * @return The space.
       */
      public double getChipSpace() {
          return this.chipSpace;
      }
  
      /**
       * Sets the space to draw between chips.
       *
       * @param space  the space.
       */
      public void setChipSpace(double space) {
          this.chipSpace = space;
      }
  
  }
  