Source for org.jfree.data.xy.MatrixSeriesCollection

   1: /* ===========================================================
   2:  * JFreeChart : a free chart library for the Java(tm) platform
   3:  * ===========================================================
   4:  *
   5:  * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
   6:  *
   7:  * Project Info:  http://www.jfree.org/jfreechart/index.html
   8:  *
   9:  * This library is free software; you can redistribute it and/or modify it 
  10:  * under the terms of the GNU Lesser General Public License as published by 
  11:  * the Free Software Foundation; either version 2.1 of the License, or 
  12:  * (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but 
  15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16:  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17:  * License for more details.
  18:  *
  19:  * You should have received a copy of the GNU Lesser General Public
  20:  * License along with this library; if not, write to the Free Software
  21:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22:  * USA.  
  23:  *
  24:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25:  * in the United States and other countries.]
  26:  *
  27:  * ---------------------------
  28:  * MatrixSeriesCollection.java
  29:  * ---------------------------
  30:  * (C) Copyright 2003-2007, by Barak Naveh and Contributors.
  31:  *
  32:  * Original Author:  Barak Naveh;;
  33:  * Contributor(s):   David Gilbert (for Object Refinery Limited);
  34:  *
  35:  * Changes
  36:  * -------
  37:  * 10-Jul-2003 : Version 1 contributed by Barak Naveh (DG);
  38:  * 05-May-2004 : Now extends AbstractXYZDataset (DG);
  39:  * 15-Jul-2004 : Switched getZ() and getZValue() methods (DG);
  40:  * ------------- JFREECHART 1.0.x ---------------------------------------------
  41:  * 27-Nov-2006 : Added clone() override (DG);
  42:  * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
  43:  *
  44:  */
  45:  
  46: package org.jfree.data.xy;
  47: 
  48: import java.io.Serializable;
  49: import java.util.List;
  50: 
  51: import org.jfree.util.ObjectUtilities;
  52: 
  53: /**
  54:  * Represents a collection of {@link MatrixSeries} that can be used as a 
  55:  * dataset.
  56:  *
  57:  * @see org.jfree.data.xy.MatrixSeries
  58:  */
  59: public class MatrixSeriesCollection extends AbstractXYZDataset
  60:                                     implements XYZDataset, Serializable {
  61:     
  62:     /** For serialization. */
  63:     private static final long serialVersionUID = -3197705779242543945L;
  64:     
  65:     /** The series that are included in the collection. */
  66:     private List seriesList;
  67: 
  68:     /**
  69:      * Constructs an empty dataset.
  70:      */
  71:     public MatrixSeriesCollection() {
  72:         this(null);
  73:     }
  74: 
  75: 
  76:     /**
  77:      * Constructs a dataset and populates it with a single matrix series.
  78:      *
  79:      * @param series the time series.
  80:      */
  81:     public MatrixSeriesCollection(MatrixSeries series) {
  82:         this.seriesList = new java.util.ArrayList();
  83: 
  84:         if (series != null) {
  85:             this.seriesList.add(series);
  86:             series.addChangeListener(this);
  87:         }
  88:     }
  89: 
  90:     /**
  91:      * Returns the number of items in the specified series.
  92:      *
  93:      * @param seriesIndex zero-based series index.
  94:      *
  95:      * @return The number of items in the specified series.
  96:      */
  97:     public int getItemCount(int seriesIndex) {
  98:         return getSeries(seriesIndex).getItemCount();
  99:     }
 100: 
 101: 
 102:     /**
 103:      * Returns the series having the specified index.
 104:      *
 105:      * @param seriesIndex zero-based series index.
 106:      *
 107:      * @return The series.
 108:      *
 109:      * @throws IllegalArgumentException
 110:      */
 111:     public MatrixSeries getSeries(int seriesIndex) {
 112:         if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) {
 113:             throw new IllegalArgumentException("Index outside valid range.");
 114:         }
 115: 
 116:         MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
 117: 
 118:         return series;
 119:     }
 120: 
 121: 
 122:     /**
 123:      * Returns the number of series in the collection.
 124:      *
 125:      * @return The number of series in the collection.
 126:      */
 127:     public int getSeriesCount() {
 128:         return this.seriesList.size();
 129:     }
 130: 
 131: 
 132:     /**
 133:      * Returns the key for a series.
 134:      *
 135:      * @param seriesIndex zero-based series index.
 136:      *
 137:      * @return The key for a series.
 138:      */
 139:     public Comparable getSeriesKey(int seriesIndex) {
 140:         return getSeries(seriesIndex).getKey();
 141:     }
 142: 
 143: 
 144:     /**
 145:      * Returns the j index value of the specified Mij matrix item in the
 146:      * specified matrix series.
 147:      *
 148:      * @param seriesIndex zero-based series index.
 149:      * @param itemIndex zero-based item index.
 150:      *
 151:      * @return The j index value for the specified matrix item.
 152:      *
 153:      * @see org.jfree.data.xy.XYDataset#getXValue(int, int)
 154:      */
 155:     public Number getX(int seriesIndex, int itemIndex) {
 156:         MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
 157:         int x = series.getItemColumn(itemIndex);
 158: 
 159:         return new Integer(x); // I know it's bad to create object. better idea?
 160:     }
 161: 
 162: 
 163:     /**
 164:      * Returns the i index value of the specified Mij matrix item in the
 165:      * specified matrix series.
 166:      *
 167:      * @param seriesIndex zero-based series index.
 168:      * @param itemIndex zero-based item index.
 169:      *
 170:      * @return The i index value for the specified matrix item.
 171:      *
 172:      * @see org.jfree.data.xy.XYDataset#getYValue(int, int)
 173:      */
 174:     public Number getY(int seriesIndex, int itemIndex) {
 175:         MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
 176:         int y = series.getItemRow(itemIndex);
 177: 
 178:         return new Integer(y); // I know it's bad to create object. better idea?
 179:     }
 180: 
 181: 
 182:     /**
 183:      * Returns the Mij item value of the specified Mij matrix item in the
 184:      * specified matrix series.
 185:      *
 186:      * @param seriesIndex the series (zero-based index).
 187:      * @param itemIndex zero-based item index.
 188:      *
 189:      * @return The Mij item value for the specified matrix item.
 190:      *
 191:      * @see org.jfree.data.xy.XYZDataset#getZValue(int, int)
 192:      */
 193:     public Number getZ(int seriesIndex, int itemIndex) {
 194:         MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
 195:         Number z = series.getItem(itemIndex);
 196:         return z;
 197:     }
 198: 
 199: 
 200:     /**
 201:      * Adds a series to the collection.
 202:      * <P>
 203:      * Notifies all registered listeners that the dataset has changed.
 204:      * </p>
 205:      *
 206:      * @param series the series.
 207:      *
 208:      * @throws IllegalArgumentException
 209:      */
 210:     public void addSeries(MatrixSeries series) {
 211:         // check arguments...
 212:         if (series == null) {
 213:             throw new IllegalArgumentException("Cannot add null series.");
 214:         }
 215:         // FIXME: Check that there isn't already a series with the same key
 216:         
 217:         // add the series...
 218:         this.seriesList.add(series);
 219:         series.addChangeListener(this);
 220:         fireDatasetChanged();
 221:     }
 222: 
 223: 
 224:     /**
 225:      * Tests this collection for equality with an arbitrary object.
 226:      *
 227:      * @param obj the object.
 228:      *
 229:      * @return A boolean.
 230:      */
 231:     public boolean equals(Object obj) {
 232:         if (obj == null) {
 233:             return false;
 234:         }
 235: 
 236:         if (obj == this) {
 237:             return true;
 238:         }
 239: 
 240:         if (obj instanceof MatrixSeriesCollection) {
 241:             MatrixSeriesCollection c = (MatrixSeriesCollection) obj;
 242: 
 243:             return ObjectUtilities.equal(this.seriesList, c.seriesList);
 244:         }
 245: 
 246:         return false;
 247:     }
 248: 
 249:     /**
 250:      * Returns a hash code.
 251:      * 
 252:      * @return A hash code.
 253:      */
 254:     public int hashCode() {
 255:         return (this.seriesList != null ? this.seriesList.hashCode() : 0);
 256:     }
 257:     
 258:     /**
 259:      * Returns a clone of this instance.
 260:      * 
 261:      * @return A clone.
 262:      * 
 263:      * @throws CloneNotSupportedException if there is a problem.
 264:      */
 265:     public Object clone() throws CloneNotSupportedException {
 266:         MatrixSeriesCollection clone = (MatrixSeriesCollection) super.clone();
 267:         clone.seriesList = (List) ObjectUtilities.deepClone(this.seriesList);
 268:         return clone;
 269:     }
 270: 
 271:     /**
 272:      * Removes all the series from the collection.
 273:      * <P>
 274:      * Notifies all registered listeners that the dataset has changed.
 275:      * </p>
 276:      */
 277:     public void removeAllSeries() {
 278:         // Unregister the collection as a change listener to each series in 
 279:         // the collection.
 280:         for (int i = 0; i < this.seriesList.size(); i++) {
 281:             MatrixSeries series = (MatrixSeries) this.seriesList.get(i);
 282:             series.removeChangeListener(this);
 283:         }
 284: 
 285:         // Remove all the series from the collection and notify listeners.
 286:         this.seriesList.clear();
 287:         fireDatasetChanged();
 288:     }
 289: 
 290: 
 291:     /**
 292:      * Removes a series from the collection.
 293:      * <P>
 294:      * Notifies all registered listeners that the dataset has changed.
 295:      * </p>
 296:      *
 297:      * @param series the series.
 298:      *
 299:      * @throws IllegalArgumentException
 300:      */
 301:     public void removeSeries(MatrixSeries series) {
 302:         // check arguments...
 303:         if (series == null) {
 304:             throw new IllegalArgumentException("Cannot remove null series.");
 305:         }
 306: 
 307:         // remove the series...
 308:         if (this.seriesList.contains(series)) {
 309:             series.removeChangeListener(this);
 310:             this.seriesList.remove(series);
 311:             fireDatasetChanged();
 312:         }
 313:     }
 314: 
 315: 
 316:     /**
 317:      * Removes a series from the collection.
 318:      * <P>
 319:      * Notifies all registered listeners that the dataset has changed.
 320:      *
 321:      * @param seriesIndex the series (zero based index).
 322:      *
 323:      * @throws IllegalArgumentException
 324:      */
 325:     public void removeSeries(int seriesIndex) {
 326:         // check arguments...
 327:         if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) {
 328:             throw new IllegalArgumentException("Index outside valid range.");
 329:         }
 330: 
 331:         // fetch the series, remove the change listener, then remove the series.
 332:         MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
 333:         series.removeChangeListener(this);
 334:         this.seriesList.remove(seriesIndex);
 335:         fireDatasetChanged();
 336:     }
 337:     
 338: }