001 /* =========================================================== 002 * JFreeChart : a free chart library for the Java(tm) platform 003 * =========================================================== 004 * 005 * (C) Copyright 2000-2009, 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 * SubseriesDataset.java 029 * --------------------- 030 * (C) Copyright 2001-2009, by Bill Kelemen and Contributors. 031 * 032 * Original Author: Bill Kelemen; 033 * Contributor(s): Sylvain Vieujot; 034 * David Gilbert (for Object Refinery Limited); 035 * 036 * Changes 037 * ------- 038 * 06-Dec-2001 : Version 1 (BK); 039 * 05-Feb-2002 : Added SignalsDataset (and small change to HighLowDataset 040 * interface) as requested by Sylvain Vieujot (DG); 041 * 28-Feb-2002 : Fixed bug: missing map[series] in IntervalXYDataset and 042 * SignalsDataset methods (BK); 043 * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG); 044 * 06-May-2004 : Now extends AbstractIntervalXYDataset (DG); 045 * 15-Jul-2004 : Switched getX() with getXValue() and getY() with 046 * getYValue() (DG); 047 * 29-Nov-2005 : Removed SignalsDataset (DG); 048 * ------------- JFREECHART 1.0.x --------------------------------------------- 049 * 02-Feb-2007 : Removed author tags from all over JFreeChart sources (DG); 050 * 04-Feb-2009 : Deprecated, this class won't be supported in version 051 * 1.2.0 (DG); 052 * 053 */ 054 055 package org.jfree.data.general; 056 057 import org.jfree.data.xy.AbstractIntervalXYDataset; 058 import org.jfree.data.xy.IntervalXYDataset; 059 import org.jfree.data.xy.OHLCDataset; 060 import org.jfree.data.xy.XYDataset; 061 062 /** 063 * This class will create a dataset with one or more series from another 064 * {@link SeriesDataset}. 065 * 066 * @deprecated As of version 1.0.13. This class will be removed from 067 * JFreeChart 1.2.0 onwards. Anyone needing this facility will need to 068 * maintain it outside of JFreeChart. 069 */ 070 public class SubSeriesDataset extends AbstractIntervalXYDataset 071 implements OHLCDataset, IntervalXYDataset, CombinationDataset { 072 073 /** The parent dataset. */ 074 private SeriesDataset parent = null; 075 076 /** Storage for map. */ 077 private int[] map; // maps our series into our parent's 078 079 /** 080 * Creates a SubSeriesDataset using one or more series from 081 * <code>parent</code>. The series to use are passed as an array of int. 082 * 083 * @param parent underlying dataset 084 * @param map int[] of series from parent to include in this Dataset 085 */ 086 public SubSeriesDataset(SeriesDataset parent, int[] map) { 087 this.parent = parent; 088 this.map = map; 089 } 090 091 /** 092 * Creates a SubSeriesDataset using one series from <code>parent</code>. 093 * The series to is passed as an int. 094 * 095 * @param parent underlying dataset 096 * @param series series from parent to include in this Dataset 097 */ 098 public SubSeriesDataset(SeriesDataset parent, int series) { 099 this(parent, new int[] {series}); 100 } 101 102 /////////////////////////////////////////////////////////////////////////// 103 // From HighLowDataset 104 /////////////////////////////////////////////////////////////////////////// 105 106 /** 107 * Returns the high-value for the specified series and item. 108 * <p> 109 * Note: throws <code>ClassCastException</code> if the series if not from a 110 * {@link OHLCDataset}. 111 * 112 * @param series the index of the series of interest (zero-based). 113 * @param item the index of the item of interest (zero-based). 114 * 115 * @return The high-value for the specified series and item. 116 */ 117 public Number getHigh(int series, int item) { 118 return ((OHLCDataset) this.parent).getHigh(this.map[series], item); 119 } 120 121 /** 122 * Returns the high-value (as a double primitive) for an item within a 123 * series. 124 * 125 * @param series the series (zero-based index). 126 * @param item the item (zero-based index). 127 * 128 * @return The high-value. 129 */ 130 public double getHighValue(int series, int item) { 131 double result = Double.NaN; 132 Number high = getHigh(series, item); 133 if (high != null) { 134 result = high.doubleValue(); 135 } 136 return result; 137 } 138 139 /** 140 * Returns the low-value for the specified series and item. 141 * <p> 142 * Note: throws <code>ClassCastException</code> if the series if not from a 143 * {@link OHLCDataset}. 144 * 145 * @param series the index of the series of interest (zero-based). 146 * @param item the index of the item of interest (zero-based). 147 * 148 * @return The low-value for the specified series and item. 149 */ 150 public Number getLow(int series, int item) { 151 return ((OHLCDataset) this.parent).getLow(this.map[series], item); 152 } 153 154 /** 155 * Returns the low-value (as a double primitive) for an item within a 156 * series. 157 * 158 * @param series the series (zero-based index). 159 * @param item the item (zero-based index). 160 * 161 * @return The low-value. 162 */ 163 public double getLowValue(int series, int item) { 164 double result = Double.NaN; 165 Number low = getLow(series, item); 166 if (low != null) { 167 result = low.doubleValue(); 168 } 169 return result; 170 } 171 172 /** 173 * Returns the open-value for the specified series and item. 174 * <p> 175 * Note: throws <code>ClassCastException</code> if the series if not from a 176 * {@link OHLCDataset}. 177 * 178 * @param series the index of the series of interest (zero-based). 179 * @param item the index of the item of interest (zero-based). 180 * 181 * @return The open-value for the specified series and item. 182 */ 183 public Number getOpen(int series, int item) { 184 return ((OHLCDataset) this.parent).getOpen(this.map[series], item); 185 } 186 187 /** 188 * Returns the open-value (as a double primitive) for an item within a 189 * series. 190 * 191 * @param series the series (zero-based index). 192 * @param item the item (zero-based index). 193 * 194 * @return The open-value. 195 */ 196 public double getOpenValue(int series, int item) { 197 double result = Double.NaN; 198 Number open = getOpen(series, item); 199 if (open != null) { 200 result = open.doubleValue(); 201 } 202 return result; 203 } 204 205 /** 206 * Returns the close-value for the specified series and item. 207 * <p> 208 * Note: throws <code>ClassCastException</code> if the series if not from a 209 * {@link OHLCDataset}. 210 * 211 * @param series the index of the series of interest (zero-based). 212 * @param item the index of the item of interest (zero-based). 213 * 214 * @return The close-value for the specified series and item. 215 */ 216 public Number getClose(int series, int item) { 217 return ((OHLCDataset) this.parent).getClose(this.map[series], item); 218 } 219 220 /** 221 * Returns the close-value (as a double primitive) for an item within a 222 * series. 223 * 224 * @param series the series (zero-based index). 225 * @param item the item (zero-based index). 226 * 227 * @return The close-value. 228 */ 229 public double getCloseValue(int series, int item) { 230 double result = Double.NaN; 231 Number close = getClose(series, item); 232 if (close != null) { 233 result = close.doubleValue(); 234 } 235 return result; 236 } 237 238 /** 239 * Returns the volume. 240 * <p> 241 * Note: throws <code>ClassCastException</code> if the series if not from a 242 * {@link OHLCDataset}. 243 * 244 * @param series the series (zero based index). 245 * @param item the item (zero based index). 246 * 247 * @return The volume. 248 */ 249 public Number getVolume(int series, int item) { 250 return ((OHLCDataset) this.parent).getVolume(this.map[series], item); 251 } 252 253 /** 254 * Returns the volume-value (as a double primitive) for an item within a 255 * series. 256 * 257 * @param series the series (zero-based index). 258 * @param item the item (zero-based index). 259 * 260 * @return The volume-value. 261 */ 262 public double getVolumeValue(int series, int item) { 263 double result = Double.NaN; 264 Number volume = getVolume(series, item); 265 if (volume != null) { 266 result = volume.doubleValue(); 267 } 268 return result; 269 } 270 271 /////////////////////////////////////////////////////////////////////////// 272 // From XYDataset 273 /////////////////////////////////////////////////////////////////////////// 274 275 /** 276 * Returns the X-value for the specified series and item. 277 * <p> 278 * Note: throws <code>ClassCastException</code> if the series if not from a 279 * {@link XYDataset}. 280 * 281 * @param series the index of the series of interest (zero-based); 282 * @param item the index of the item of interest (zero-based). 283 * 284 * @return The X-value for the specified series and item. 285 */ 286 public Number getX(int series, int item) { 287 return ((XYDataset) this.parent).getX(this.map[series], item); 288 } 289 290 /** 291 * Returns the Y-value for the specified series and item. 292 * <p> 293 * Note: throws <code>ClassCastException</code> if the series if not from a 294 * {@link XYDataset}. 295 * 296 * @param series the index of the series of interest (zero-based). 297 * @param item the index of the item of interest (zero-based). 298 * 299 * @return The Y-value for the specified series and item. 300 */ 301 public Number getY(int series, int item) { 302 return ((XYDataset) this.parent).getY(this.map[series], item); 303 } 304 305 /** 306 * Returns the number of items in a series. 307 * <p> 308 * Note: throws <code>ClassCastException</code> if the series if not from a 309 * {@link XYDataset}. 310 * 311 * @param series the index of the series of interest (zero-based). 312 * 313 * @return The number of items in a series. 314 */ 315 public int getItemCount(int series) { 316 return ((XYDataset) this.parent).getItemCount(this.map[series]); 317 } 318 319 /////////////////////////////////////////////////////////////////////////// 320 // From SeriesDataset 321 /////////////////////////////////////////////////////////////////////////// 322 323 /** 324 * Returns the number of series in the dataset. 325 * 326 * @return The number of series in the dataset. 327 */ 328 public int getSeriesCount() { 329 return this.map.length; 330 } 331 332 /** 333 * Returns the key for a series. 334 * 335 * @param series the series (zero-based index). 336 * 337 * @return The name of a series. 338 */ 339 public Comparable getSeriesKey(int series) { 340 return this.parent.getSeriesKey(this.map[series]); 341 } 342 343 /////////////////////////////////////////////////////////////////////////// 344 // From IntervalXYDataset 345 /////////////////////////////////////////////////////////////////////////// 346 347 /** 348 * Returns the starting X value for the specified series and item. 349 * 350 * @param series the index of the series of interest (zero-based). 351 * @param item the index of the item of interest (zero-based). 352 * 353 * @return The starting X value for the specified series and item. 354 */ 355 public Number getStartX(int series, int item) { 356 if (this.parent instanceof IntervalXYDataset) { 357 return ((IntervalXYDataset) this.parent).getStartX( 358 this.map[series], item 359 ); 360 } 361 else { 362 return getX(series, item); 363 } 364 } 365 366 /** 367 * Returns the ending X value for the specified series and item. 368 * 369 * @param series the index of the series of interest (zero-based). 370 * @param item the index of the item of interest (zero-based). 371 * 372 * @return The ending X value for the specified series and item. 373 */ 374 public Number getEndX(int series, int item) { 375 if (this.parent instanceof IntervalXYDataset) { 376 return ((IntervalXYDataset) this.parent).getEndX( 377 this.map[series], item 378 ); 379 } 380 else { 381 return getX(series, item); 382 } 383 } 384 385 /** 386 * Returns the starting Y value for the specified series and item. 387 * 388 * @param series the index of the series of interest (zero-based). 389 * @param item the index of the item of interest (zero-based). 390 * 391 * @return The starting Y value for the specified series and item. 392 */ 393 public Number getStartY(int series, int item) { 394 if (this.parent instanceof IntervalXYDataset) { 395 return ((IntervalXYDataset) this.parent).getStartY( 396 this.map[series], item 397 ); 398 } 399 else { 400 return getY(series, item); 401 } 402 } 403 404 /** 405 * Returns the ending Y value for the specified series and item. 406 * 407 * @param series the index of the series of interest (zero-based). 408 * @param item the index of the item of interest (zero-based). 409 * 410 * @return The ending Y value for the specified series and item. 411 */ 412 public Number getEndY(int series, int item) { 413 if (this.parent instanceof IntervalXYDataset) { 414 return ((IntervalXYDataset) this.parent).getEndY( 415 this.map[series], item 416 ); 417 } 418 else { 419 return getY(series, item); 420 } 421 } 422 423 /////////////////////////////////////////////////////////////////////////// 424 // New methods from CombinationDataset 425 /////////////////////////////////////////////////////////////////////////// 426 427 /** 428 * Returns the parent Dataset of this combination. 429 * 430 * @return The parent Dataset of this combination. 431 */ 432 public SeriesDataset getParent() { 433 return this.parent; 434 } 435 436 /** 437 * Returns a map or indirect indexing form our series into parent's series. 438 * 439 * @return A map or indirect indexing form our series into parent's series. 440 */ 441 public int[] getMap() { 442 return (int[]) this.map.clone(); 443 } 444 445 }