001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2007, 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-2007, 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.3 2007/02/02 15:14:53 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 * ------------- JFREECHART 1.0.x ---------------------------------------------
043 * 27-Nov-2006 : Added clone() override (DG);
044 * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
045 *
046 */
047
048 package org.jfree.data.xy;
049
050 import java.io.Serializable;
051 import java.util.List;
052
053 import org.jfree.util.ObjectUtilities;
054
055 /**
056 * Represents a collection of {@link MatrixSeries} that can be used as a
057 * dataset.
058 *
059 * @see org.jfree.data.xy.MatrixSeries
060 */
061 public class MatrixSeriesCollection extends AbstractXYZDataset
062 implements XYZDataset, Serializable {
063
064 /** For serialization. */
065 private static final long serialVersionUID = -3197705779242543945L;
066
067 /** The series that are included in the collection. */
068 private List seriesList;
069
070 /**
071 * Constructs an empty dataset.
072 */
073 public MatrixSeriesCollection() {
074 this(null);
075 }
076
077
078 /**
079 * Constructs a dataset and populates it with a single matrix series.
080 *
081 * @param series the time series.
082 */
083 public MatrixSeriesCollection(MatrixSeries series) {
084 this.seriesList = new java.util.ArrayList();
085
086 if (series != null) {
087 this.seriesList.add(series);
088 series.addChangeListener(this);
089 }
090 }
091
092 /**
093 * Returns the number of items in the specified series.
094 *
095 * @param seriesIndex zero-based series index.
096 *
097 * @return The number of items in the specified series.
098 */
099 public int getItemCount(int seriesIndex) {
100 return getSeries(seriesIndex).getItemCount();
101 }
102
103
104 /**
105 * Returns the series having the specified index.
106 *
107 * @param seriesIndex zero-based series index.
108 *
109 * @return The series.
110 *
111 * @throws IllegalArgumentException
112 */
113 public MatrixSeries getSeries(int seriesIndex) {
114 if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) {
115 throw new IllegalArgumentException("Index outside valid range.");
116 }
117
118 MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
119
120 return series;
121 }
122
123
124 /**
125 * Returns the number of series in the collection.
126 *
127 * @return The number of series in the collection.
128 */
129 public int getSeriesCount() {
130 return this.seriesList.size();
131 }
132
133
134 /**
135 * Returns the key for a series.
136 *
137 * @param seriesIndex zero-based series index.
138 *
139 * @return The key for a series.
140 */
141 public Comparable getSeriesKey(int seriesIndex) {
142 return getSeries(seriesIndex).getKey();
143 }
144
145
146 /**
147 * Returns the j index value of the specified Mij matrix item in the
148 * specified matrix series.
149 *
150 * @param seriesIndex zero-based series index.
151 * @param itemIndex zero-based item index.
152 *
153 * @return The j index value for the specified matrix item.
154 *
155 * @see org.jfree.data.xy.XYDataset#getXValue(int, int)
156 */
157 public Number getX(int seriesIndex, int itemIndex) {
158 MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
159 int x = series.getItemColumn(itemIndex);
160
161 return new Integer(x); // I know it's bad to create object. better idea?
162 }
163
164
165 /**
166 * Returns the i index value of the specified Mij matrix item in the
167 * specified matrix series.
168 *
169 * @param seriesIndex zero-based series index.
170 * @param itemIndex zero-based item index.
171 *
172 * @return The i index value for the specified matrix item.
173 *
174 * @see org.jfree.data.xy.XYDataset#getYValue(int, int)
175 */
176 public Number getY(int seriesIndex, int itemIndex) {
177 MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
178 int y = series.getItemRow(itemIndex);
179
180 return new Integer(y); // I know it's bad to create object. better idea?
181 }
182
183
184 /**
185 * Returns the Mij item value of the specified Mij matrix item in the
186 * specified matrix series.
187 *
188 * @param seriesIndex the series (zero-based index).
189 * @param itemIndex zero-based item index.
190 *
191 * @return The Mij item value for the specified matrix item.
192 *
193 * @see org.jfree.data.xy.XYZDataset#getZValue(int, int)
194 */
195 public Number getZ(int seriesIndex, int itemIndex) {
196 MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
197 Number z = series.getItem(itemIndex);
198 return z;
199 }
200
201
202 /**
203 * Adds a series to the collection.
204 * <P>
205 * Notifies all registered listeners that the dataset has changed.
206 * </p>
207 *
208 * @param series the series.
209 *
210 * @throws IllegalArgumentException
211 */
212 public void addSeries(MatrixSeries series) {
213 // check arguments...
214 if (series == null) {
215 throw new IllegalArgumentException("Cannot add null series.");
216 }
217 // FIXME: Check that there isn't already a series with the same key
218
219 // add the series...
220 this.seriesList.add(series);
221 series.addChangeListener(this);
222 fireDatasetChanged();
223 }
224
225
226 /**
227 * Tests this collection for equality with an arbitrary object.
228 *
229 * @param obj the object.
230 *
231 * @return A boolean.
232 */
233 public boolean equals(Object obj) {
234 if (obj == null) {
235 return false;
236 }
237
238 if (obj == this) {
239 return true;
240 }
241
242 if (obj instanceof MatrixSeriesCollection) {
243 MatrixSeriesCollection c = (MatrixSeriesCollection) obj;
244
245 return ObjectUtilities.equal(this.seriesList, c.seriesList);
246 }
247
248 return false;
249 }
250
251 /**
252 * Returns a hash code.
253 *
254 * @return A hash code.
255 */
256 public int hashCode() {
257 return (this.seriesList != null ? this.seriesList.hashCode() : 0);
258 }
259
260 /**
261 * Returns a clone of this instance.
262 *
263 * @return A clone.
264 *
265 * @throws CloneNotSupportedException if there is a problem.
266 */
267 public Object clone() throws CloneNotSupportedException {
268 MatrixSeriesCollection clone = (MatrixSeriesCollection) super.clone();
269 clone.seriesList = (List) ObjectUtilities.deepClone(this.seriesList);
270 return clone;
271 }
272
273 /**
274 * Removes all the series from the collection.
275 * <P>
276 * Notifies all registered listeners that the dataset has changed.
277 * </p>
278 */
279 public void removeAllSeries() {
280 // Unregister the collection as a change listener to each series in
281 // the collection.
282 for (int i = 0; i < this.seriesList.size(); i++) {
283 MatrixSeries series = (MatrixSeries) this.seriesList.get(i);
284 series.removeChangeListener(this);
285 }
286
287 // Remove all the series from the collection and notify listeners.
288 this.seriesList.clear();
289 fireDatasetChanged();
290 }
291
292
293 /**
294 * Removes a series from the collection.
295 * <P>
296 * Notifies all registered listeners that the dataset has changed.
297 * </p>
298 *
299 * @param series the series.
300 *
301 * @throws IllegalArgumentException
302 */
303 public void removeSeries(MatrixSeries series) {
304 // check arguments...
305 if (series == null) {
306 throw new IllegalArgumentException("Cannot remove null series.");
307 }
308
309 // remove the series...
310 if (this.seriesList.contains(series)) {
311 series.removeChangeListener(this);
312 this.seriesList.remove(series);
313 fireDatasetChanged();
314 }
315 }
316
317
318 /**
319 * Removes a series from the collection.
320 * <P>
321 * Notifies all registered listeners that the dataset has changed.
322 *
323 * @param seriesIndex the series (zero based index).
324 *
325 * @throws IllegalArgumentException
326 */
327 public void removeSeries(int seriesIndex) {
328 // check arguments...
329 if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) {
330 throw new IllegalArgumentException("Index outside valid range.");
331 }
332
333 // fetch the series, remove the change listener, then remove the series.
334 MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex);
335 series.removeChangeListener(this);
336 this.seriesList.remove(seriesIndex);
337 fireDatasetChanged();
338 }
339
340 }