001/* *********************************************************************** *
002 * project: org.matsim.*
003 *                                                                         *
004 * *********************************************************************** *
005 *                                                                         *
006 * copyright       : (C) 2013 by the members listed in the COPYING,        *
007 *                   LICENSE and WARRANTY file.                            *
008 * email           : info at matsim dot org                                *
009 *                                                                         *
010 * *********************************************************************** *
011 *                                                                         *
012 *   This program is free software; you can redistribute it and/or modify  *
013 *   it under the terms of the GNU General Public License as published by  *
014 *   the Free Software Foundation; either version 2 of the License, or     *
015 *   (at your option) any later version.                                   *
016 *   See also COPYING, LICENSE and WARRANTY file                           *
017 *                                                                         *
018 * *********************************************************************** */
019
020package org.matsim.contrib.util.chart;
021
022import java.util.*;
023
024import org.jfree.data.general.DatasetChangeEvent;
025import org.jfree.data.xy.*;
026import org.matsim.api.core.v01.Coord;
027
028/**
029 * @author michalm
030 */
031@SuppressWarnings("serial")
032public class CoordDataset extends AbstractXYDataset implements XYDataset {
033        public interface CoordSource {
034                int getCount();
035
036                Coord getCoord(int item);
037        }
038
039        private List<Comparable<String>> seriesKeys;
040        private List<CoordSource> seriesList;
041
042        public CoordDataset() {
043                seriesKeys = new ArrayList<>();
044                seriesList = new ArrayList<>();
045        }
046
047        @Override
048        public int getSeriesCount() {
049                return seriesList.size();
050        }
051
052        @Override
053        public Comparable<String> getSeriesKey(int series) {
054                return seriesKeys.get(series);
055        }
056
057        @Override
058        public int getItemCount(int series) {
059                return seriesList.get(series).getCount();
060        }
061
062        @Override
063        public Number getX(int series, int item) {
064                return new Double(getXValue(series, item));
065        }
066
067        @Override
068        public double getXValue(int series, int item) {
069                return getItem(series, item).getX();
070        }
071
072        @Override
073        public Number getY(int series, int item) {
074                return new Double(getYValue(series, item));
075        }
076
077        @Override
078        public double getYValue(int series, int item) {
079                return getItem(series, item).getY();
080        }
081
082        public String getText(int series, int item) {
083                return getItem(series, item).toString();
084        }
085
086        public Coord getItem(int series, int item) {
087                return seriesList.get(series).getCoord(item);
088        }
089
090        public void addSeries(String seriesKey, CoordSource data) {
091                if (seriesKey == null) {
092                        throw new IllegalArgumentException("The 'seriesKey' cannot be null.");
093                }
094
095                if (data == null) {
096                        throw new IllegalArgumentException("The 'data' is null.");
097                }
098
099                int seriesIndex = indexOf(seriesKey);
100
101                if (seriesIndex == -1) { // add a new series
102                        seriesKeys.add(seriesKey);
103                        seriesList.add(data);
104                } else { // replace an existing series
105                        seriesList.set(seriesIndex, data);
106                }
107
108                notifyListeners(new DatasetChangeEvent(this, this));
109        }
110
111        public void removeSeries(String seriesKey) {
112                int seriesIndex = indexOf(seriesKey);
113
114                if (seriesIndex >= 0) {
115                        seriesKeys.remove(seriesIndex);
116                        seriesList.remove(seriesIndex);
117
118                        notifyListeners(new DatasetChangeEvent(this, this));
119                }
120        }
121}