package name.abuchen.portfolio.ui.dialogs.transactions;
import java.util.Objects;
import java.util.function.Consumer;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import name.abuchen.portfolio.model.Account;
import name.abuchen.portfolio.model.Portfolio;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.ui.AbstractFinanceView;
public class OpenDialogAction extends Action
{
private AbstractFinanceView owner;
private Class<? extends AbstractTransactionDialog> type;
private Consumer<? extends AbstractTransactionDialog> prepare;
private Consumer<AbstractTransactionDialog> onSuccess;
private Object[] parameters;
private Account account;
private Portfolio portfolio;
private Security security;
public OpenDialogAction(AbstractFinanceView owner, String label)
{
super(label);
this.owner = owner;
}
public OpenDialogAction type(Class<? extends AbstractTransactionDialog> type)
{
this.type = type;
this.prepare = null;
return this;
}
public <D extends AbstractTransactionDialog> OpenDialogAction type(Class<D> type, Consumer<D> prepare)
{
this.type = type;
this.prepare = prepare;
return this;
}
public OpenDialogAction onSuccess(Consumer<AbstractTransactionDialog> onSuccess)
{
this.onSuccess = onSuccess;
return this;
}
public OpenDialogAction parameters(Object... parameters)
{
this.parameters = parameters;
return this;
}
public OpenDialogAction with(Account account)
{
this.account = account;
return this;
}
public OpenDialogAction with(Portfolio portfolio)
{
this.portfolio = portfolio;
return this;
}
public OpenDialogAction with(Security security)
{
this.security = security;
return this;
}
public void addTo(IMenuManager manager)
{
manager.add(this);
}
@SuppressWarnings("unchecked")
@Override
public void run()
{
Objects.requireNonNull(type);
AbstractTransactionDialog dialog = owner.make(type, parameters);
if (prepare != null)
((Consumer<AbstractTransactionDialog>) prepare).accept(dialog);
if (account != null)
dialog.setAccount(account);
if (portfolio != null)
dialog.setPortfolio(portfolio);
if (security != null)
dialog.setSecurity(security);
if (dialog.open() == AbstractTransactionDialog.OK)
{
if (onSuccess != null)
{
onSuccess.accept(dialog);
}
else
{
owner.markDirty();
owner.notifyModelUpdated();
}
}
}
}