package name.abuchen.portfolio.ui.views.dashboard;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.widgets.Display;
import name.abuchen.portfolio.model.Dashboard;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.dialogs.ListSelectionDialog;
import name.abuchen.portfolio.ui.util.LabelOnly;
import name.abuchen.portfolio.ui.util.SimpleAction;
import name.abuchen.portfolio.ui.views.dataseries.DataSeries;
import name.abuchen.portfolio.ui.views.dataseries.DataSeriesLabelProvider;
public class DataSeriesConfig implements WidgetConfig
{
private final WidgetDelegate delegate;
private final boolean supportsBenchmarks;
private DataSeries dataSeries;
public DataSeriesConfig(WidgetDelegate delegate, boolean supportsBenchmarks)
{
this.delegate = delegate;
this.supportsBenchmarks = supportsBenchmarks;
String uuid = delegate.getWidget().getConfiguration().get(Dashboard.Config.DATA_SERIES.name());
if (uuid != null && !uuid.isEmpty())
dataSeries = delegate.getDashboardData().getDataSeriesSet().lookup(uuid);
if (dataSeries == null)
dataSeries = delegate.getDashboardData().getDataSeriesSet().getAvailableSeries().stream()
.filter(ds -> ds.getType().equals(DataSeries.Type.CLIENT)).findAny().get();
}
public DataSeries getDataSeries()
{
return dataSeries;
}
@Override
public void menuAboutToShow(IMenuManager manager)
{
manager.appendToGroup(DashboardView.INFO_MENU_GROUP_NAME, new LabelOnly(dataSeries.getLabel()));
MenuManager subMenu = new MenuManager(Messages.LabelDataSeries);
subMenu.add(new LabelOnly(dataSeries.getLabel()));
subMenu.add(new Separator());
subMenu.add(new SimpleAction(Messages.MenuSelectDataSeries, a -> doAddSeries(false)));
if (supportsBenchmarks)
subMenu.add(new SimpleAction(Messages.MenuSelectBenchmarkDataSeries, a -> doAddSeries(true)));
manager.add(subMenu);
}
private void doAddSeries(boolean showOnlyBenchmark)
{
List<DataSeries> list = delegate.getDashboardData().getDataSeriesSet().getAvailableSeries().stream()
.filter(ds -> ds.isBenchmark() == showOnlyBenchmark).collect(Collectors.toList());
ListSelectionDialog dialog = new ListSelectionDialog(Display.getDefault().getActiveShell(),
new DataSeriesLabelProvider());
dialog.setTitle(Messages.ChartSeriesPickerTitle);
dialog.setMessage(Messages.ChartSeriesPickerTitle);
dialog.setElements(list);
dialog.setMultiSelection(false);
if (dialog.open() != ListSelectionDialog.OK)
return;
Object[] result = dialog.getResult();
if (result == null || result.length == 0)
return;
dataSeries = (DataSeries) result[0];
delegate.getWidget().getConfiguration().put(Dashboard.Config.DATA_SERIES.name(), dataSeries.getUUID());
// construct label to indicate the data series (user can manually change
// the label later)
String label = WidgetFactory.valueOf(delegate.getWidget().getType()).getLabel() + ", " + dataSeries.getLabel(); //$NON-NLS-1$
delegate.getWidget().setLabel(label);
delegate.getClient().markDirty();
}
@Override
public String getLabel()
{
return Messages.LabelDataSeries + ": " + dataSeries.getLabel(); //$NON-NLS-1$
}
}