package name.abuchen.portfolio.ui.views.dividends;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.swtchart.Chart;
import org.swtchart.IBarSeries;
import org.swtchart.ISeries.SeriesType;
import name.abuchen.portfolio.money.Values;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.util.Colors;
import name.abuchen.portfolio.ui.util.chart.TimelineChartToolTip;
import name.abuchen.portfolio.ui.views.dividends.DividendsViewModel.Line;
public class DividendsPerYearChartTab extends AbstractChartTab
{
private class DividendPerYearToolTip extends TimelineChartToolTip
{
private DividendsViewModel model;
public DividendPerYearToolTip(Chart chart, DividendsViewModel model)
{
super(chart);
this.model = model;
}
@Override
protected void createComposite(Composite parent)
{
final int year = (Integer) getFocusedObject();
int totalNoOfMonths = model.getNoOfMonths();
IBarSeries barSeries = (IBarSeries) getChart().getSeriesSet().getSeries()[0];
List<Line> lines = model.getLines().stream() //
.filter(line -> {
for (int index = year * 12; index < (year + 1) * 12
&& index < totalNoOfMonths; index += 1)
if (line.getValue(index) != 0L)
return true;
return false;
})
.sorted((l1, l2) -> l1.getVehicle().getName()
.compareToIgnoreCase(l2.getVehicle().getName()))
.collect(Collectors.toList());
final Composite container = new Composite(parent, SWT.NONE);
container.setBackgroundMode(SWT.INHERIT_FORCE);
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(container);
Color foregroundColor = Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
container.setForeground(foregroundColor);
Color backgroundColor = new Color(container.getDisplay(), Colors.INFO_TOOLTIP_BACKGROUND.swt());
container.addDisposeListener(e -> backgroundColor.dispose());
container.setBackground(backgroundColor);
Label topLeft = new Label(container, SWT.NONE);
topLeft.setForeground(foregroundColor);
topLeft.setText(Messages.ColumnSecurity);
Label label = new Label(container, SWT.CENTER);
label.setBackground(barSeries.getBarColor());
label.setForeground(Colors.getTextColor(barSeries.getBarColor()));
label.setText(String.valueOf(model.getStartYear() + year));
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(label);
lines.forEach(line -> {
Label l = new Label(container, SWT.NONE);
l.setForeground(foregroundColor);
l.setText(line.getVehicle().getName());
long value = 0;
for (int m = year * 12; m < (year + 1) * 12 && m < totalNoOfMonths; m += 1)
value += line.getValue(m);
l = new Label(container, SWT.RIGHT);
l.setForeground(foregroundColor);
l.setText(Values.Amount.format(value));
GridDataFactory.fillDefaults().align(SWT.END, SWT.FILL).applyTo(l);
});
Label l = new Label(container, SWT.NONE);
l.setForeground(foregroundColor);
l.setText(Messages.ColumnSum);
long value = 0;
for (int m = year * 12; m < (year + 1) * 12 && m < totalNoOfMonths; m += 1)
value += model.getSum().getValue(m);
l = new Label(container, SWT.RIGHT);
l.setBackground(barSeries.getBarColor());
l.setForeground(Colors.getTextColor(barSeries.getBarColor()));
l.setText(Values.Amount.format(value));
}
}
@Override
public String getLabel()
{
return Messages.LabelDividendsPerYear;
}
@Override
protected void attachTooltipTo(Chart chart)
{
DividendPerYearToolTip toolTip = new DividendPerYearToolTip(chart, model);
toolTip.enableCategory(true);
}
private void updateCategorySeries()
{
int startYear = model.getStartYear();
String[] labels = new String[LocalDate.now().getYear() - startYear + 1];
for (int ii = 0; ii < labels.length; ii++)
labels[ii] = String.valueOf(startYear + ii);
getChart().getAxisSet().getXAxis(0).setCategorySeries(labels);
}
@Override
protected void createSeries()
{
updateCategorySeries();
int startYear = model.getStartYear();
double[] series = new double[LocalDate.now().getYear() - startYear + 1];
for (int index = 0; index < model.getNoOfMonths(); index += 12)
{
int year = (index / 12);
long total = 0;
int months = Math.min(12, model.getNoOfMonths() - index);
for (int ii = 0; ii < months; ii++)
total += model.getSum().getValue(index + ii);
series[year] = total / Values.Amount.divider();
}
IBarSeries barSeries = (IBarSeries) getChart().getSeriesSet().createSeries(SeriesType.BAR, getLabel());
barSeries.setYSeries(series);
barSeries.setBarColor(getResources().createColor(Colors.HEADINGS.swt()));
}
}