package com.baselet.element.elementnew.plot.elements;
import java.util.List;
import com.baselet.diagram.draw.DrawHandler;
import com.baselet.diagram.draw.helper.ColorOwn;
import com.baselet.diagram.draw.helper.ColorOwn.Transparency;
import com.baselet.element.elementnew.plot.drawer.AxisConfig;
import com.baselet.element.elementnew.plot.drawer.PlotDrawHandler;
import com.baselet.element.elementnew.plot.drawer.PlotGridDrawConfig;
import com.baselet.element.elementnew.plot.parser.DataSet;
import com.baselet.element.elementnew.plot.parser.ParserException;
import com.baselet.element.elementnew.plot.parser.PlotConstants;
import com.baselet.element.elementnew.plot.parser.PlotConstants.AxisList;
import com.baselet.element.elementnew.plot.parser.PlotConstants.AxisShow;
import com.baselet.element.elementnew.plot.parser.PlotState;
public abstract class AbstractPlot {
protected PlotDrawHandler plot;
protected PlotGridDrawConfig plotDrawConfig;
protected PlotState plotState;
private final Integer xPosition;
private final Integer yPosition;
public AbstractPlot(DrawHandler drawer, PlotGridDrawConfig plotDrawConfig, PlotState plotState, int xPosition, int yPosition) {
this.plotDrawConfig = plotDrawConfig;
this.plotState = plotState;
this.xPosition = xPosition;
this.yPosition = yPosition;
plot = new PlotDrawHandler(drawer, plotDrawConfig.getRealSize());
setupAxis();
setupAbstractPlot();
}
public Integer getPlotLineNr() {
return plotState.getPlotLineNr();
}
public Integer getXPosition() {
return xPosition;
}
public Integer getYPosition() {
return yPosition;
}
private void setupAxis() {
plot.getAxisConfig().enableDescAxis(
plotState.getValueListValidated(AxisShow.getKeyDescAxis(), PlotConstants.toStringList(defaultDescAxisShow()), PlotConstants.toStringList(AxisShow.values()), false));
plot.getAxisConfig().enableValueAxis(
plotState.getValueListValidated(AxisShow.getKeyValueAxis(), PlotConstants.toStringList(defaultValueAxisShow()), PlotConstants.toStringList(AxisShow.values()), false),
plotState.getValueListValidated(AxisList.getKey(), PlotConstants.toStringList(defaultValueAxisList()), PlotConstants.toStringList(AxisList.values()), true));
}
private void setupAbstractPlot() {
DataSet ds = plotState.getDataSet();
ds.setInvert(plotState.getValueAsBoolean(PlotConstants.KEY_BOOL_DATA_INVERT, PlotConstants.DATA_INVERT_DEFAULT));
String[] desc = ds.titleRow();
String[] title = ds.titleCol();
// System.out.print("\ntitle of ds " + ds.getLineNr() + " :");
// for (String t : title) System.out.print("<" + t + ">");
Double[][] values = ds.data();
List<String> colors = plotState.getValueList(PlotConstants.KEY_LIST_COLORS, PlotConstants.COLORS_DEFAULT);
for (String color : colors) {
if (ColorOwn.forStringOrNull(color, Transparency.FOREGROUND) == null) {
throw new ParserException("Unknown color: " + color + "(line: " + plotState.getLine(PlotConstants.KEY_LIST_COLORS) + ")");
}
}
if (values.length > getMaxAllowedValueRows()) {
throw new ParserException("The dataset (line: " + plotState.getDataSet().getLineNr() + ") has too many rows for the plot (line: " + plotState.getPlotLineNr() + ")");
}
plot.setValues(desc, title, values, colors);
setMinMaxValue(PlotConstants.KEY_INT_MIN_VALUE);
setMinMaxValue(PlotConstants.KEY_INT_MAX_VALUE);
}
private void setMinMaxValue(String key) {
String stringValue = plotState.getValue(key, null);
if (stringValue != null) {
try {
if (key.equals(PlotConstants.KEY_INT_MIN_VALUE)) {
if (stringValue.equals(PlotConstants.MIN_VALUE_ALL)) {
plot.setMinValue(plotDrawConfig.getMinValue());
}
else {
plot.setMinValue(Double.valueOf(stringValue));
}
}
else if (key.equals(PlotConstants.KEY_INT_MAX_VALUE)) {
if (stringValue.equals(PlotConstants.MAX_VALUE_ALL)) {
plot.setMaxValue(plotDrawConfig.getMaxValue());
}
else {
plot.setMaxValue(Double.valueOf(stringValue));
}
}
} catch (Exception e) {
throw new ParserException(key, stringValue, plotState.getLine(key), e.getMessage());
}
}
}
protected void setPlotPosition(int columnCount, int rowCount) {
if (xPosition > columnCount) {
throw new ParserException("The x coordinate is invalid. PlotGrid width is too small");
}
if (yPosition > rowCount) {
throw new ParserException("The y coordinate is invalid. PlotGrid height is too small");
}
double segmentWidth = (double) plotDrawConfig.getRealSize().width / columnCount;
double segmentHeight = (double) plotDrawConfig.getRealSize().height / rowCount;
int spaceLeft = (int) (segmentWidth * xPosition);
int spaceRight = (int) (segmentWidth * (columnCount - xPosition - 1));
int spaceTop = (int) (segmentHeight * yPosition);
int spaceBottom = (int) (segmentHeight * (rowCount - yPosition - 1));
plot.getCanvas().setBorder(spaceLeft, spaceTop, spaceRight, spaceBottom, AxisConfig.ARROW_DISTANCE);
}
public abstract void plot(int columnCount, int rowCount);
protected abstract List<AxisShow> defaultDescAxisShow();
protected abstract List<AxisShow> defaultValueAxisShow();
protected abstract List<AxisList> defaultValueAxisList();
protected abstract int getMaxAllowedValueRows();
}