16224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala/*
26224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Copyright 2012 AndroidPlot.com
36224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
46224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    Licensed under the Apache License, Version 2.0 (the "License");
56224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    you may not use this file except in compliance with the License.
66224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    You may obtain a copy of the License at
76224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
86224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *        http://www.apache.org/licenses/LICENSE-2.0
96224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    Unless required by applicable law or agreed to in writing, software
116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    distributed under the License is distributed on an "AS IS" BASIS,
126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    See the License for the specific language governing permissions and
146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    limitations under the License.
156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */
166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapackage com.androidplot.xy;
186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport android.graphics.Canvas;
206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport android.util.Log;
216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport android.util.Pair;
226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport com.androidplot.Plot;
236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport com.androidplot.PlotListener;
246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.LinkedList;
266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.List;
276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.NoSuchElementException;
286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.concurrent.locks.ReentrantReadWriteLock;
296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala/**
326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * A convenience class used to create instances of XYPlot generated from Lists of Numbers.
336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */
346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapublic class SimpleXYSeries implements XYSeries, PlotListener {
356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private static final String TAG = SimpleXYSeries.class.getName();
376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void onBeforeDraw(Plot source, Canvas canvas) {
406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.readLock().lock();
416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void onAfterDraw(Plot source, Canvas canvas) {
456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.readLock().unlock();
466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public enum ArrayFormat {
496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        Y_VALS_ONLY,
506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        XY_VALS_INTERLEAVED
516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private volatile LinkedList<Number> xVals = new LinkedList<Number>();
546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private volatile LinkedList<Number> yVals = new LinkedList<Number>();
556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private volatile String title = null;
566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public SimpleXYSeries(String title) {
606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.title = title;
616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Generates an XYSeries instance from the List of numbers passed in.  This is a convenience class
646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * and should only be used for static data models; it is not suitable for representing dynamically
656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * changing data.
666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     *
676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param model  A List of Number elements comprising the data model.
686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param format Format of the model.  A format of Y_VALS_ONLY means that the array only contains y-values.
696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     *               For this format x values are autogenerated using values of 0 through n-1 where n is the size of the model.
706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param title  Title of the series
716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public SimpleXYSeries(List<? extends Number> model, ArrayFormat format, String title) {
736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this(title);
746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        setModel(model, format);
756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public SimpleXYSeries(List<? extends Number> xVals, List<? extends Number> yVals, String title) {
786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this(title);
796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(xVals == null || yVals == null) {
806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            throw new IllegalArgumentException("Neither the xVals nor the yVals parameters may be null.");
816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
826224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
836224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(xVals.size() != yVals.size()) {
846224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            throw new IllegalArgumentException("xVals and yVals List parameters must be of the same size.");
856224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
866224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
876224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.xVals.addAll(xVals);
886224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.yVals.addAll(yVals);
896224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
906224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
916224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
926224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Use index value as xVal, instead of explicit, user provided xVals.
936224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
946224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void useImplicitXVals() {
956224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
966224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
976224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            xVals = null;
986224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
996224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
1006224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1016224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1026224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1036224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
1046224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Use the provided list of Numbers as yVals and their corresponding indexes as xVals.
1056224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param model A List of Number elements comprising the data model.
1066224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param format Format of the model.  A format of Y_VALS_ONLY means that the array only contains y-values.
1076224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     *               For this format x values are autogenerated using values of 0 through n-1 where n is the size of the model.
1086224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
1096224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setModel(List<? extends Number> model, ArrayFormat format) {
1106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
1126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
1136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            // empty the current values:
1146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            //xVals.clear();
1156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            xVals = null;
1166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            yVals.clear();
1176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            // make sure the new model has data:
1196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            if (model == null || model.size() == 0) {
1206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                return;
1216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
1226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            switch (format) {
1246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                // array containing only y-vals. assume x = index:
1266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                case Y_VALS_ONLY:
1276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    for(Number n : model) {
1286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                        yVals.add(n);
1296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    }
1306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    /*for (int i = 0; i < model.size(); i++) {
1316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                        //xVals.add(i);
1326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                        yVals.add(model.get(i));
1336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    }*/
1346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    break;
1356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                // xy interleaved array:
1376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                case XY_VALS_INTERLEAVED:
1386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    if (xVals == null) {
1396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                        xVals = new LinkedList<Number>();
1406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    }
1416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    if (model.size() % 2 != 0) {
1426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                        throw new IndexOutOfBoundsException("Cannot auto-generate series from odd-sized xy List.");
1436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    }
1446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    // always need an x and y array so init them now:
1456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    int sz = model.size() / 2;
1466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    for (int i = 0, j = 0; i < sz; i++, j += 2) {
1476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                        xVals.add(model.get(j));
1486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                        yVals.add(model.get(j + 1));
1496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    }
1506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    break;
1516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                default:
1526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    throw new IllegalArgumentException("Unexpected enum value: " + format);
1536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
1546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
1556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
1566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
1606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Sets individual x value based on index
1616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param value
1626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param index
1636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
1646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setX(Number value, int index) {
1656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
1666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
1676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            xVals.set(index, value);
1686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
1696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
1706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
1746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Sets individual y value based on index
1756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param value
1766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param index
1776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
1786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setY(Number value, int index) {
1796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
1806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
1816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            yVals.set(index, value);
1826224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
1836224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
1846224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1856224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1866224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1876224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
1886224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Sets xy values based on index
1896224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param xVal
1906224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param yVal
1916224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param index
1926224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
1936224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setXY(Number xVal, Number yVal, int index) {
1946224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
1956224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
1966224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            yVals.set(index, yVal);
1976224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            xVals.set(index, xVal);
1986224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {lock.writeLock().unlock();}
1996224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2006224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2016224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void addFirst(Number x, Number y) {
2026224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
2036224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
2046224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            if (xVals != null) {
2056224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                xVals.addFirst(x);
2066224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
2076224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            yVals.addFirst(y);
2086224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
2096224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
2106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
2116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
2146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     *
2156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @return Pair<Number, Number> with first equal to x-val and second equal to y-val.
2166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
2176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public Pair<Number, Number> removeFirst() {
2186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
2196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
2206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            if (size() <= 0) {
2216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                throw new NoSuchElementException();
2226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
2236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            return new Pair<Number, Number>(xVals != null ? xVals.removeFirst() : 0, yVals.removeFirst());
2246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
2256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
2266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
2276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void addLast(Number x, Number y) {
2306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
2316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
2326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            if (xVals != null) {
2336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                xVals.addLast(x);
2346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
2356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            yVals.addLast(y);
2366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
2376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
2386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
2396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
2426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     *
2436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @return Pair<Number, Number> with first equal to x-val and second equal to y-val.
2446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
2456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public Pair<Number, Number> removeLast() {
2466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
2476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
2486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            if (size() <= 0) {
2496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                throw new NoSuchElementException();
2506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
2516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            return new Pair<Number, Number>(xVals != null ? xVals.removeLast() : yVals.size() - 1, yVals.removeLast());
2526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
2536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            lock.writeLock().unlock();
2546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
2556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
2586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public String getTitle() {
2596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return title;
2606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setTitle(String title) {
2636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        lock.writeLock().lock();
2646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
2656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            this.title = title;
2666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {lock.writeLock().unlock();}
2676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
2706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public int size() {
2716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return yVals != null ? yVals.size() : 0;
2726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
2756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public Number getX(int index) {
2766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return xVals != null ? xVals.get(index) : index;
2776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
2796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
2806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public Number getY(int index) {
2816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return yVals.get(index);
2826224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
2836224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala}
284