package name.abuchen.portfolio.ui.views;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;
import org.swtchart.ISeries;
import name.abuchen.portfolio.ui.Images;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.util.chart.TimelineChart;
import name.abuchen.portfolio.ui.util.chart.TimelineChartCSVExporter;
import name.abuchen.portfolio.ui.views.dataseries.DataSeries;
import name.abuchen.portfolio.ui.views.dataseries.DataSeriesCache;
import name.abuchen.portfolio.ui.views.dataseries.DataSeriesChartLegend;
import name.abuchen.portfolio.ui.views.dataseries.DataSeriesConfigurator;
import name.abuchen.portfolio.ui.views.dataseries.StatementOfAssetsSeriesBuilder;
public class StatementOfAssetsHistoryView extends AbstractHistoricView
{
private TimelineChart chart;
private DataSeriesConfigurator configurator;
private StatementOfAssetsSeriesBuilder seriesBuilder;
@Override
protected String getDefaultTitle()
{
return Messages.LabelStatementOfAssetsHistory;
}
@Override
protected void addButtons(ToolBar toolBar)
{
super.addButtons(toolBar);
addExportButton(toolBar);
addConfigButton(toolBar);
}
private void addExportButton(ToolBar toolBar)
{
Action export = new Action()
{
private Menu menu;
@Override
public void run()
{
if (menu == null)
menu = createContextMenu(getActiveShell(),
StatementOfAssetsHistoryView.this::exportMenuAboutToShow);
menu.setVisible(true);
}
};
export.setImageDescriptor(Images.EXPORT.descriptor());
export.setToolTipText(Messages.MenuExportData);
new ActionContributionItem(export).fill(toolBar, -1);
}
private void exportMenuAboutToShow(IMenuManager manager) // NOSONAR
{
manager.add(new Action(Messages.MenuExportChartData)
{
@Override
public void run()
{
TimelineChartCSVExporter exporter = new TimelineChartCSVExporter(chart);
exporter.addDiscontinousSeries(Messages.LabelTransferals);
exporter.export(getTitle() + ".csv"); //$NON-NLS-1$
}
});
manager.add(new Separator());
chart.exportMenuAboutToShow(manager, getTitle());
}
private void addConfigButton(ToolBar toolBar)
{
Action save = new Action()
{
@Override
public void run()
{
configurator.showSaveMenu(getActiveShell());
}
};
save.setImageDescriptor(Images.SAVE.descriptor());
save.setToolTipText(Messages.MenuSaveChart);
new ActionContributionItem(save).fill(toolBar, -1);
Action config = new Action()
{
@Override
public void run()
{
configurator.showMenu(getActiveShell());
}
};
config.setImageDescriptor(Images.CONFIG.descriptor());
config.setToolTipText(Messages.MenuConfigureChart);
new ActionContributionItem(config).fill(toolBar, -1);
}
@Override
protected Composite createBody(Composite parent)
{
Composite composite = new Composite(parent, SWT.NONE);
composite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
chart = new TimelineChart(composite);
chart.getTitle().setVisible(false);
DataSeriesCache cache = make(DataSeriesCache.class);
seriesBuilder = new StatementOfAssetsSeriesBuilder(chart, cache);
configurator = new DataSeriesConfigurator(this, DataSeries.UseCase.STATEMENT_OF_ASSETS);
configurator.addListener(() -> updateChart());
DataSeriesChartLegend legend = new DataSeriesChartLegend(composite, configurator);
updateTitle(Messages.LabelStatementOfAssetsHistory + " (" + configurator.getConfigurationName() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
chart.getTitle().setText(getTitle());
GridLayoutFactory.fillDefaults().numColumns(1).margins(0, 0).spacing(0, 0).applyTo(composite);
GridDataFactory.fillDefaults().grab(true, true).applyTo(chart);
GridDataFactory.fillDefaults().grab(true, false).align(SWT.CENTER, SWT.FILL).applyTo(legend);
configurator.getSelectedDataSeries().forEach(series -> seriesBuilder.build(series, getReportingPeriod()));
return composite;
}
@Override
public void setFocus()
{
try
{
chart.setRedraw(false);
chart.adjustRange();
}
finally
{
chart.setRedraw(true);
}
chart.setFocus();
}
@Override
public void notifyModelUpdated()
{
seriesBuilder.getCache().clear();
updateChart();
}
@Override
public void reportingPeriodUpdated()
{
seriesBuilder.getCache().clear();
updateChart();
}
private void updateChart()
{
try
{
updateTitle(Messages.LabelStatementOfAssetsHistory + " (" + configurator.getConfigurationName() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
chart.suspendUpdate(true);
chart.getTitle().setText(getTitle());
for (ISeries s : chart.getSeriesSet().getSeries())
chart.getSeriesSet().deleteSeries(s.getId());
configurator.getSelectedDataSeries().forEach(series -> seriesBuilder.build(series, getReportingPeriod()));
chart.adjustRange();
}
finally
{
chart.suspendUpdate(false);
}
chart.redraw();
}
}