001 /* =========================================================== 002 * JFreeChart : a free chart library for the Java(tm) platform 003 * =========================================================== 004 * 005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jfreechart/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * --------------------------- 028 * MatrixSeriesCollection.java 029 * --------------------------- 030 * (C) Copyright 2003-2005, by Barak Naveh and Contributors. 031 * 032 * Original Author: Barak Naveh;; 033 * Contributor(s): David Gilbert (for Object Refinery Limited); 034 * 035 * $Id: MatrixSeriesCollection.java,v 1.7.2.1 2005/10/25 21:36:51 mungady Exp $ 036 * 037 * Changes 038 * ------- 039 * 10-Jul-2003 : Version 1 contributed by Barak Naveh (DG); 040 * 05-May-2004 : Now extends AbstractXYZDataset (DG); 041 * 15-Jul-2004 : Switched getZ() and getZValue() methods (DG); 042 * 043 */ 044 045 package org.jfree.data.xy; 046 047 import java.io.Serializable; 048 import java.util.List; 049 050 import org.jfree.util.ObjectUtilities; 051 052 /** 053 * Represents a collection of {@link MatrixSeries} that can be used as a 054 * dataset. 055 * 056 * @author Barak Naveh 057 * 058 * @see org.jfree.data.xy.MatrixSeries 059 */ 060 public class MatrixSeriesCollection extends AbstractXYZDataset 061 implements XYZDataset, Serializable { 062 063 /** For serialization. */ 064 private static final long serialVersionUID = -3197705779242543945L; 065 066 /** The series that are included in the collection. */ 067 private List seriesList; 068 069 /** 070 * Constructs an empty dataset. 071 */ 072 public MatrixSeriesCollection() { 073 this(null); 074 } 075 076 077 /** 078 * Constructs a dataset and populates it with a single matrix series. 079 * 080 * @param series the time series. 081 */ 082 public MatrixSeriesCollection(MatrixSeries series) { 083 this.seriesList = new java.util.ArrayList(); 084 085 if (series != null) { 086 this.seriesList.add(series); 087 series.addChangeListener(this); 088 } 089 } 090 091 /** 092 * Returns the number of items in the specified series. 093 * 094 * @param seriesIndex zero-based series index. 095 * 096 * @return The number of items in the specified series. 097 */ 098 public int getItemCount(int seriesIndex) { 099 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 }