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 * YIntervalSeriesCollection.java
029 * ------------------------------
030 * (C) Copyright 2006, 2007, by Object Refinery Limited.
031 *
032 * Original Author:  David Gilbert (for Object Refinery Limited);
033 * Contributor(s):   -;
034 *
035 * Changes
036 * -------
037 * 20-Oct-2006 : Version 1 (DG);
038 * 27-Nov-2006 : Added clone() override (DG);
039 * 20-Feb-2007 : Added getYValue(), getStartYValue() and getEndYValue() 
040 *               methods (DG);
041 *
042 */
043
044package org.jfree.data.xy;
045
046import java.io.Serializable;
047import java.util.List;
048
049import org.jfree.data.general.DatasetChangeEvent;
050import org.jfree.util.ObjectUtilities;
051
052/**
053 * A collection of {@link YIntervalSeries} objects.
054 *
055 * @since 1.0.3
056 *
057 * @see YIntervalSeries
058 */
059public class YIntervalSeriesCollection extends AbstractIntervalXYDataset
060                                implements IntervalXYDataset, Serializable {
061
062    /** Storage for the data series. */
063    private List data;
064    
065    /** 
066     * Creates a new instance of <code>YIntervalSeriesCollection</code>. 
067     */
068    public YIntervalSeriesCollection() {
069        this.data = new java.util.ArrayList();
070    }
071
072    /**
073     * Adds a series to the collection and sends a {@link DatasetChangeEvent} 
074     * to all registered listeners.
075     *
076     * @param series  the series (<code>null</code> not permitted).
077     */
078    public void addSeries(YIntervalSeries series) {
079        if (series == null) {
080            throw new IllegalArgumentException("Null 'series' argument.");
081        }
082        this.data.add(series);
083        series.addChangeListener(this);
084        fireDatasetChanged();
085    }
086
087    /**
088     * Returns the number of series in the collection.
089     *
090     * @return The series count.
091     */
092    public int getSeriesCount() {
093        return this.data.size();
094    }
095
096    /**
097     * Returns a series from the collection.
098     *
099     * @param series  the series index (zero-based).
100     *
101     * @return The series.
102     * 
103     * @throws IllegalArgumentException if <code>series</code> is not in the
104     *     range <code>0</code> to <code>getSeriesCount() - 1</code>.
105     */
106    public YIntervalSeries getSeries(int series) {
107        if ((series < 0) || (series >= getSeriesCount())) {
108            throw new IllegalArgumentException("Series index out of bounds");
109        }
110        return (YIntervalSeries) this.data.get(series);
111    }
112
113    /**
114     * Returns the key for a series.
115     *
116     * @param series  the series index (in the range <code>0</code> to 
117     *     <code>getSeriesCount() - 1</code>).
118     *
119     * @return The key for a series.
120     * 
121     * @throws IllegalArgumentException if <code>series</code> is not in the
122     *     specified range.
123     */
124    public Comparable getSeriesKey(int series) {
125        // defer argument checking
126        return getSeries(series).getKey();
127    }
128
129    /**
130     * Returns the number of items in the specified series.
131     *
132     * @param series  the series (zero-based index).
133     *
134     * @return The item count.
135     * 
136     * @throws IllegalArgumentException if <code>series</code> is not in the
137     *     range <code>0</code> to <code>getSeriesCount() - 1</code>.
138     */
139    public int getItemCount(int series) {
140        // defer argument checking
141        return getSeries(series).getItemCount();
142    }
143
144    /**
145     * Returns the x-value for an item within a series.
146     *
147     * @param series  the series index.
148     * @param item  the item index.
149     *
150     * @return The x-value.
151     */
152    public Number getX(int series, int item) {
153        YIntervalSeries s = (YIntervalSeries) this.data.get(series);
154        return s.getX(item);
155    }
156
157    /**
158     * Returns the y-value (as a double primitive) for an item within a 
159     * series.
160     * 
161     * @param series  the series index (zero-based).
162     * @param item  the item index (zero-based).
163     * 
164     * @return The value.
165     */
166    public double getYValue(int series, int item) {
167        YIntervalSeries s = (YIntervalSeries) this.data.get(series);
168        return s.getYValue(item);
169    }
170
171    /**
172     * Returns the start y-value (as a double primitive) for an item within a 
173     * series.
174     * 
175     * @param series  the series index (zero-based).
176     * @param item  the item index (zero-based).
177     * 
178     * @return The value.
179     */
180    public double getStartYValue(int series, int item) {
181        YIntervalSeries s = (YIntervalSeries) this.data.get(series);
182        return s.getYLowValue(item);
183    }
184
185    /**
186     * Returns the end y-value (as a double primitive) for an item within a 
187     * series.
188     * 
189     * @param series  the series (zero-based index).
190     * @param item  the item (zero-based index).
191     * 
192     * @return The value.
193     */
194    public double getEndYValue(int series, int item) {
195        YIntervalSeries s = (YIntervalSeries) this.data.get(series);
196        return s.getYHighValue(item);
197    }
198
199    /**
200     * Returns the y-value for an item within a series.
201     *
202     * @param series  the series index.
203     * @param item  the item index.
204     *
205     * @return The y-value.
206     */
207    public Number getY(int series, int item) {
208        YIntervalSeries s = (YIntervalSeries) this.data.get(series);
209        return new Double(s.getYValue(item));
210    }
211
212    /**
213     * Returns the start x-value for an item within a series.  This method
214     * maps directly to {@link #getX(int, int)}.
215     *
216     * @param series  the series index.
217     * @param item  the item index.
218     *
219     * @return The x-value.
220     */
221    public Number getStartX(int series, int item) {
222        return getX(series, item);
223    }
224
225    /**
226     * Returns the end x-value for an item within a series.  This method
227     * maps directly to {@link #getX(int, int)}.
228     *
229     * @param series  the series index.
230     * @param item  the item index.
231     *
232     * @return The x-value.
233     */
234    public Number getEndX(int series, int item) {
235        return getX(series, item);
236    }
237
238    /**
239     * Returns the start y-value for an item within a series.
240     *
241     * @param series  the series index.
242     * @param item  the item index.
243     *
244     * @return The start y-value.
245     */
246    public Number getStartY(int series, int item) {
247        YIntervalSeries s = (YIntervalSeries) this.data.get(series);
248        return new Double(s.getYLowValue(item));
249    }
250
251    /**
252     * Returns the end y-value for an item within a series.
253     *
254     * @param series  the series index.
255     * @param item  the item index.
256     *
257     * @return The end y-value.
258     */
259    public Number getEndY(int series, int item) {
260        YIntervalSeries s = (YIntervalSeries) this.data.get(series);
261        return new Double(s.getYHighValue(item));
262    }
263    
264    /**
265     * Tests this instance for equality with an arbitrary object.
266     *
267     * @param obj  the object (<code>null</code> permitted).
268     *
269     * @return A boolean. 
270     */
271    public boolean equals(Object obj) {
272        if (obj == this) {
273            return true;
274        }
275        if (!(obj instanceof YIntervalSeriesCollection)) {
276            return false;
277        }
278        YIntervalSeriesCollection that = (YIntervalSeriesCollection) obj;
279        return ObjectUtilities.equal(this.data, that.data);
280    }
281    
282    /**
283     * Returns a clone of this instance.
284     * 
285     * @return A clone.
286     * 
287     * @throws CloneNotSupportedException if there is a problem.
288     */
289    public Object clone() throws CloneNotSupportedException {
290        YIntervalSeriesCollection clone 
291                = (YIntervalSeriesCollection) super.clone();
292        clone.data = (List) ObjectUtilities.deepClone(this.data);
293        return clone;
294    }
295    
296}