package name.abuchen.portfolio.ui.views.dataseries; import org.swtchart.IBarSeries; import org.swtchart.ILineSeries; import name.abuchen.portfolio.money.Values; import name.abuchen.portfolio.snapshot.PerformanceIndex; import name.abuchen.portfolio.snapshot.ReportingPeriod; import name.abuchen.portfolio.ui.util.chart.TimelineChart; import name.abuchen.portfolio.ui.views.dataseries.DataSeries.ClientDataSeries; public class StatementOfAssetsSeriesBuilder extends AbstractChartSeriesBuilder { public StatementOfAssetsSeriesBuilder(TimelineChart chart, DataSeriesCache cache) { super(chart, cache); } public void build(DataSeries series, ReportingPeriod reportingPeriod) { PerformanceIndex index = getCache().lookup(series, reportingPeriod); if (series.getType() == DataSeries.Type.CLIENT) { addClient(series, index); } else { ILineSeries lineSeries = getChart().addDateSeries(index.getDates(), toDouble(index.getTotals(), Values.Amount.divider()), series.getLabel()); configure(series, lineSeries); } } private void addClient(DataSeries series, PerformanceIndex clientIndex) { double[] values; switch ((ClientDataSeries) series.getInstance()) { case TOTALS: values = toDouble(clientIndex.getTotals(), Values.Amount.divider()); break; case TRANSFERALS: values = toDouble(clientIndex.getTransferals(), Values.Amount.divider()); break; case INVESTED_CAPITAL: values = toDouble(clientIndex.calculateInvestedCapital(), Values.Amount.divider()); break; case ABSOLUTE_INVESTED_CAPITAL: values = toDouble(clientIndex.calculateAbsoluteInvestedCapital(), Values.Amount.divider()); break; case ABSOLUTE_DELTA: values = toDouble(clientIndex.calculateDelta(), Values.Amount.divider()); break; case ABSOLUTE_DELTA_ALL_RECORDS: values = toDouble(clientIndex.calculateAbsoluteDelta(), Values.Amount.divider()); break; case TAXES: values = accumulateAndToDouble(clientIndex.getTaxes(), Values.Amount.divider()); break; case DIVIDENDS: values = toDouble(clientIndex.getDividends(), Values.Amount.divider()); break; case DIVIDENDS_ACCUMULATED: values = accumulateAndToDouble(clientIndex.getDividends(), Values.Amount.divider()); break; case INTEREST: values = toDouble(clientIndex.getInterest(), Values.Amount.divider()); break; case INTEREST_ACCUMULATED: values = accumulateAndToDouble(clientIndex.getInterest(), Values.Amount.divider()); break; case INTEREST_CHARGE: values = toDouble(clientIndex.getInterestCharge(), Values.Amount.divider()); break; case INTEREST_CHARGE_ACCUMULATED: values = accumulateAndToDouble(clientIndex.getInterestCharge(), Values.Amount.divider()); break; default: throw new IllegalArgumentException(String.valueOf(series.getInstance())); } if (series.isLineChart()) { ILineSeries lineSeries = getChart().addDateSeries(clientIndex.getDates(), values, series.getLabel()); configure(series, lineSeries); } else { IBarSeries barSeries = getChart().addDateBarSeries(clientIndex.getDates(), values, series.getLabel()); configure(series, barSeries); } } private double[] toDouble(long[] input, double divider) { double[] answer = new double[input.length]; for (int ii = 0; ii < answer.length; ii++) answer[ii] = input[ii] / divider; return answer; } private double[] accumulateAndToDouble(long[] input, double divider) { double[] answer = new double[input.length]; long current = 0; for (int ii = 0; ii < answer.length; ii++) { current += input[ii]; answer[ii] = current / divider; } return answer; } }