package name.abuchen.portfolio.ui.util;
import java.util.LinkedList;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.widgets.ToolBar;
import name.abuchen.portfolio.snapshot.ReportingPeriod;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.PortfolioPart;
import name.abuchen.portfolio.ui.dialogs.EditReportingPeriodsDialog;
import name.abuchen.portfolio.ui.dialogs.ReportingPeriodDialog;
public final class ReportingPeriodDropDown extends AbstractDropDown
{
@FunctionalInterface
public interface ReportingPeriodListener
{
void reportingPeriodUpdated();
}
private ReportingPeriodListener listener;
private LinkedList<ReportingPeriod> periods = new LinkedList<>();
public ReportingPeriodDropDown(ToolBar toolBar, final PortfolioPart part, ReportingPeriodListener listener)
{
super(toolBar, "x"); //$NON-NLS-1$
this.periods = part.loadReportingPeriods();
this.listener = listener;
getToolItem().setText(periods.getFirst().toString());
toolBar.addDisposeListener(e -> part.storeReportingPeriods(periods));
}
@Override
public void menuAboutToShow(IMenuManager manager)
{
boolean isFirst = true;
for (final ReportingPeriod period : periods)
{
Action action = new Action(period.toString())
{
@Override
public void run()
{
periods.remove(period);
periods.addFirst(period);
setLabel(period.toString());
if (listener != null)
listener.reportingPeriodUpdated();
}
};
if (isFirst)
action.setChecked(true);
isFirst = false;
manager.add(action);
}
manager.add(new Separator());
manager.add(new Action(Messages.LabelReportingAddPeriod)
{
@Override
public void run()
{
ReportingPeriodDialog dialog = new ReportingPeriodDialog(getToolBar().getShell(), periods.getFirst());
if (dialog.open() == Dialog.OK)
{
ReportingPeriod period = dialog.getReportingPeriod();
periods.addFirst(period);
setLabel(period.toString());
if (listener != null)
listener.reportingPeriodUpdated();
if (periods.size() > 20)
periods.removeLast();
}
}
});
manager.add(new Action(Messages.MenuReportingPeriodManage)
{
@Override
public void run()
{
EditReportingPeriodsDialog dialog = new EditReportingPeriodsDialog(getToolBar().getShell());
dialog.setReportingPeriods(periods);
if (dialog.open() == Dialog.OK)
{
ReportingPeriod currentSelection = periods.getFirst();
periods.clear();
periods.addAll(dialog.getReportingPeriods());
// make sure at least one entry exists
if (periods.isEmpty())
periods.add(currentSelection);
if (listener != null && !currentSelection.equals(periods.getFirst()))
{
setLabel(periods.getFirst().toString());
listener.reportingPeriodUpdated();
}
}
}
});
}
public LinkedList<ReportingPeriod> getPeriods()
{
return periods;
}
}