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