Frames | No Frames |
1: /* =========================================================== 2: * JFreeChart : a free chart library for the Java(tm) platform 3: * =========================================================== 4: * 5: * (C) Copyright 2000-2005, 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-2005, by Barak Naveh and Contributors. 31: * 32: * Original Author: Barak Naveh;; 33: * Contributor(s): David Gilbert (for Object Refinery Limited); 34: * 35: * $Id: MatrixSeriesCollection.java,v 1.7.2.1 2005/10/25 21:36:51 mungady Exp $ 36: * 37: * Changes 38: * ------- 39: * 10-Jul-2003 : Version 1 contributed by Barak Naveh (DG); 40: * 05-May-2004 : Now extends AbstractXYZDataset (DG); 41: * 15-Jul-2004 : Switched getZ() and getZValue() methods (DG); 42: * 43: */ 44: 45: package org.jfree.data.xy; 46: 47: import java.io.Serializable; 48: import java.util.List; 49: 50: import org.jfree.util.ObjectUtilities; 51: 52: /** 53: * Represents a collection of {@link MatrixSeries} that can be used as a 54: * dataset. 55: * 56: * @author Barak Naveh 57: * 58: * @see org.jfree.data.xy.MatrixSeries 59: */ 60: public class MatrixSeriesCollection extends AbstractXYZDataset 61: implements XYZDataset, Serializable { 62: 63: /** For serialization. */ 64: private static final long serialVersionUID = -3197705779242543945L; 65: 66: /** The series that are included in the collection. */ 67: private List seriesList; 68: 69: /** 70: * Constructs an empty dataset. 71: */ 72: public MatrixSeriesCollection() { 73: this(null); 74: } 75: 76: 77: /** 78: * Constructs a dataset and populates it with a single matrix series. 79: * 80: * @param series the time series. 81: */ 82: public MatrixSeriesCollection(MatrixSeries series) { 83: this.seriesList = new java.util.ArrayList(); 84: 85: if (series != null) { 86: this.seriesList.add(series); 87: series.addChangeListener(this); 88: } 89: } 90: 91: /** 92: * Returns the number of items in the specified series. 93: * 94: * @param seriesIndex zero-based series index. 95: * 96: * @return The number of items in the specified series. 97: */ 98: public int getItemCount(int seriesIndex) { 99: return getSeries(seriesIndex).getItemCount(); 100: } 101: 102: 103: /** 104: * Returns the series having the specified index. 105: * 106: * @param seriesIndex zero-based series index. 107: * 108: * @return The series. 109: * 110: * @throws IllegalArgumentException 111: */ 112: public MatrixSeries getSeries(int seriesIndex) { 113: if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) { 114: throw new IllegalArgumentException("Index outside valid range."); 115: } 116: 117: MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); 118: 119: return series; 120: } 121: 122: 123: /** 124: * Returns the number of series in the collection. 125: * 126: * @return The number of series in the collection. 127: */ 128: public int getSeriesCount() { 129: return this.seriesList.size(); 130: } 131: 132: 133: /** 134: * Returns the key for a series. 135: * 136: * @param seriesIndex zero-based series index. 137: * 138: * @return The key for a series. 139: */ 140: public Comparable getSeriesKey(int seriesIndex) { 141: return getSeries(seriesIndex).getKey(); 142: } 143: 144: 145: /** 146: * Returns the j index value of the specified Mij matrix item in the 147: * specified matrix series. 148: * 149: * @param seriesIndex zero-based series index. 150: * @param itemIndex zero-based item index. 151: * 152: * @return The j index value for the specified matrix item. 153: * 154: * @see org.jfree.data.xy.XYDataset#getXValue(int, int) 155: */ 156: public Number getX(int seriesIndex, int itemIndex) { 157: MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); 158: int x = series.getItemColumn(itemIndex); 159: 160: return new Integer(x); // I know it's bad to create object. better idea? 161: } 162: 163: 164: /** 165: * Returns the i index value of the specified Mij matrix item in the 166: * specified matrix series. 167: * 168: * @param seriesIndex zero-based series index. 169: * @param itemIndex zero-based item index. 170: * 171: * @return The i index value for the specified matrix item. 172: * 173: * @see org.jfree.data.xy.XYDataset#getYValue(int, int) 174: */ 175: public Number getY(int seriesIndex, int itemIndex) { 176: MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); 177: int y = series.getItemRow(itemIndex); 178: 179: return new Integer(y); // I know it's bad to create object. better idea? 180: } 181: 182: 183: /** 184: * Returns the Mij item value of the specified Mij matrix item in the 185: * specified matrix series. 186: * 187: * @param seriesIndex the series (zero-based index). 188: * @param itemIndex zero-based item index. 189: * 190: * @return The Mij item value for the specified matrix item. 191: * 192: * @see org.jfree.data.xy.XYZDataset#getZValue(int, int) 193: */ 194: public Number getZ(int seriesIndex, int itemIndex) { 195: MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); 196: Number z = series.getItem(itemIndex); 197: return z; 198: } 199: 200: 201: /** 202: * Adds a series to the collection. 203: * <P> 204: * Notifies all registered listeners that the dataset has changed. 205: * </p> 206: * 207: * @param series the series. 208: * 209: * @throws IllegalArgumentException 210: */ 211: public void addSeries(MatrixSeries series) { 212: // check arguments... 213: if (series == null) { 214: throw new IllegalArgumentException("Cannot add null series."); 215: } 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: * Removes all the series from the collection. 260: * <P> 261: * Notifies all registered listeners that the dataset has changed. 262: * </p> 263: */ 264: public void removeAllSeries() { 265: // Unregister the collection as a change listener to each series in 266: // the collection. 267: for (int i = 0; i < this.seriesList.size(); i++) { 268: MatrixSeries series = (MatrixSeries) this.seriesList.get(i); 269: series.removeChangeListener(this); 270: } 271: 272: // Remove all the series from the collection and notify listeners. 273: this.seriesList.clear(); 274: fireDatasetChanged(); 275: } 276: 277: 278: /** 279: * Removes a series from the collection. 280: * <P> 281: * Notifies all registered listeners that the dataset has changed. 282: * </p> 283: * 284: * @param series the series. 285: * 286: * @throws IllegalArgumentException 287: */ 288: public void removeSeries(MatrixSeries series) { 289: // check arguments... 290: if (series == null) { 291: throw new IllegalArgumentException("Cannot remove null series."); 292: } 293: 294: // remove the series... 295: if (this.seriesList.contains(series)) { 296: series.removeChangeListener(this); 297: this.seriesList.remove(series); 298: fireDatasetChanged(); 299: } 300: } 301: 302: 303: /** 304: * Removes a series from the collection. 305: * <P> 306: * Notifies all registered listeners that the dataset has changed. 307: * 308: * @param seriesIndex the series (zero based index). 309: * 310: * @throws IllegalArgumentException 311: */ 312: public void removeSeries(int seriesIndex) { 313: // check arguments... 314: if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) { 315: throw new IllegalArgumentException("Index outside valid range."); 316: } 317: 318: // fetch the series, remove the change listener, then remove the series. 319: MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); 320: series.removeChangeListener(this); 321: this.seriesList.remove(seriesIndex); 322: fireDatasetChanged(); 323: } 324: 325: }