package com.vaadin.addon.spreadsheet.charts.converter.xssfreader; /* * #%L * Vaadin Spreadsheet Charts Integration * %% * Copyright (C) 2016 Vaadin Ltd * %% * This program is available under Commercial Vaadin Add-On License 3.0 * (CVALv3). * * See the file license.html distributed with this software for more * information about licensing. * * You should have received a copy of the CVALv3 along with this program. * If not, see <http://vaadin.com/license/cval-3>. * #L% */ import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.util.CellReference; import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterSer; import com.vaadin.addon.spreadsheet.Spreadsheet; import com.vaadin.addon.spreadsheet.charts.converter.Utils; import com.vaadin.addon.spreadsheet.charts.converter.chartdata.AbstractSeriesData.DataSelectListener; import com.vaadin.addon.spreadsheet.charts.converter.chartdata.AbstractSeriesData.SeriesPoint; import com.vaadin.addon.spreadsheet.charts.converter.chartdata.ScatterSeriesData; public class ScatterSeriesReader extends AbstractSeriesReader<CTScatterSer, ScatterSeriesData> { public ScatterSeriesReader(CTScatterChart ctChart, Spreadsheet spreadsheet, boolean showDataInHiddenCells) { super(ctChart, spreadsheet, showDataInHiddenCells); } @Override protected ScatterSeriesData createSeriesDataObject(CTScatterSer serie) { return new ScatterSeriesData(); } @Override protected void fillSeriesData(ScatterSeriesData seriesData, CTScatterSer serie) { seriesData.name = tryGetSeriesName(serie.getTx()); if (serie.getXVal() == null) { createSeriesDataPoints(serie.getYVal(), seriesData); } else { createSeriesDataPointsForScatter(serie.getXVal(), serie.getYVal(), seriesData); } if (serie.getMarker() != null) { LineSeriesReaderUtils.setMarkerForData(seriesData, serie.getMarker()); } if (serie.getSpPr() != null) { LineSeriesReaderUtils.setDashStyleForData(seriesData, serie.getSpPr()); LineSeriesReaderUtils.setLineWidthForData(seriesData, serie.getSpPr()); } } /** * Scatter requires x and y values, for other charts we use only X */ protected void createSeriesDataPointsForScatter(CTAxDataSource xVal, CTNumDataSource yVal, ScatterSeriesData seriesData) { final List<CellReference> ptListX = Utils.getAllReferencedCells(xVal .getNumRef().getF(), getSpreadsheet(), showDataInHiddenCells); final String formulaY = yVal.getNumRef().getF(); final List<CellReference> ptListY = Utils.getAllReferencedCells( formulaY, getSpreadsheet(), showDataInHiddenCells); final List<SeriesPoint> list = new ArrayList<SeriesPoint>(); for (int i = 0; i < ptListY.size(); i++) { list.add(new SeriesPoint( getNumericValueFromCellRef(ptListX.get(i)), getNumericValueFromCellRef(ptListY.get(i)))); } seriesData.seriesData = list; // TODO: fix interaction, handle updates has to be made compatible with // this type, requires figuring out how to set selection to two ranges. handleReferencedValueUpdates(ptListY, seriesData, ValueUpdateMode.Y_VALUES); handleReferencedValueUpdates(ptListX, seriesData, ValueUpdateMode.X_VALUES); seriesData.dataSelectListener = new DataSelectListener() { @Override public void dataSelected() { getSpreadsheet().setSelection(formulaY); } }; } }