package name.abuchen.portfolio.ui.views.dashboard;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import name.abuchen.portfolio.model.Dashboard;
import name.abuchen.portfolio.money.CurrencyUnit;
import name.abuchen.portfolio.money.ExchangeRateProviderFactory;
import name.abuchen.portfolio.money.ExchangeRateTimeSeries;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.util.LabelOnly;
import name.abuchen.portfolio.ui.util.SimpleAction;
public class ExchangeRateSeriesConfig implements WidgetConfig
{
private WidgetDelegate delegate;
private List<ExchangeRateTimeSeries> available;
private ExchangeRateTimeSeries series;
public ExchangeRateSeriesConfig(WidgetDelegate delegate)
{
this.delegate = delegate;
ExchangeRateProviderFactory factory = delegate.getDashboardData().getExchangeRateProviderFactory();
this.available = factory.getAvailableTimeSeries();
Collections.sort(this.available, (Comparator<ExchangeRateTimeSeries>) (a, b) -> {
int c = a.getBaseCurrency().compareTo(b.getBaseCurrency());
if (c != 0)
return c;
return a.getTermCurrency().compareTo(b.getTermCurrency());
});
String code = delegate.getWidget().getConfiguration().get(Dashboard.Config.EXCHANGE_RATE_SERIES.name());
int slash = code != null ? code.indexOf('/') : -1;
@SuppressWarnings("null")
String base = slash > 0 ? code.substring(0, slash) : null; // NOSONAR
@SuppressWarnings("null")
String term = slash > 0 ? code.substring(slash + 1) : null; // NOSONAR
this.series = available.stream().filter(t -> t.getBaseCurrency().equals(base))
.filter(t -> t.getTermCurrency().equals(term)).findAny()
.orElse(factory.getTimeSeries(CurrencyUnit.EUR, CurrencyUnit.USD));
}
@Override
public void menuAboutToShow(IMenuManager manager)
{
manager.appendToGroup(DashboardView.INFO_MENU_GROUP_NAME, new LabelOnly(getLabel()));
MenuManager subMenu = new MenuManager(Messages.LabelExchangeRate);
available.stream().forEach(ts -> {
SimpleAction action = new SimpleAction(ts.getLabel(), a -> {
series = ts;
String code = ts.getBaseCurrency() + '/' + ts.getTermCurrency();
delegate.getWidget().getConfiguration().put(Dashboard.Config.EXCHANGE_RATE_SERIES.name(), code);
delegate.getClient().markDirty();
});
action.setChecked(series.equals(ts));
subMenu.add(action);
});
manager.add(subMenu);
}
@Override
public String getLabel()
{
return series.getLabel() + ' ' + series.getProvider().getName();
}
public ExchangeRateTimeSeries getSeries()
{
return series;
}
}