package name.abuchen.portfolio.ui.views.dashboard; import java.text.MessageFormat; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.Optional; 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.Control; import org.eclipse.swt.widgets.Label; import name.abuchen.portfolio.model.Dashboard.Widget; import name.abuchen.portfolio.money.ExchangeRate; import name.abuchen.portfolio.money.ExchangeRateTimeSeries; import name.abuchen.portfolio.money.Values; import name.abuchen.portfolio.snapshot.ReportingPeriod; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.util.InfoToolTip; public class ExchangeRateWidget extends WidgetDelegate { private DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG) .withZone(ZoneId.systemDefault()); private Label title; private Label indicator; public ExchangeRateWidget(Widget widget, DashboardData dashboardData) { super(widget, dashboardData); addConfig(new ExchangeRateSeriesConfig(this)); addConfig(new ReportingPeriodConfig(this)); } @Override public Composite createControl(Composite parent, DashboardResources resources) { Composite container = new Composite(parent, SWT.NONE); container.setBackground(parent.getBackground()); GridLayoutFactory.fillDefaults().numColumns(1).margins(5, 5).applyTo(container); title = new Label(container, SWT.NONE); title.setText(getWidget().getLabel()); GridDataFactory.fillDefaults().grab(true, false).applyTo(title); indicator = new Label(container, SWT.NONE); indicator.setFont(resources.getKpiFont()); indicator.setText(""); //$NON-NLS-1$ GridDataFactory.fillDefaults().grab(true, false).applyTo(indicator); InfoToolTip.attach(indicator, () -> { ReportingPeriod period = get(ReportingPeriodConfig.class).getReportingPeriod(); ExchangeRateTimeSeries series = get(ExchangeRateSeriesConfig.class).getSeries(); Optional<ExchangeRate> rate = series.lookupRate(period.getEndDate()); return rate.isPresent() ? MessageFormat.format(Messages.TooltipDateOfExchangeRate, formatter.format(rate.get().getTime())) : ""; //$NON-NLS-1$ }); return container; } @Override Control getTitleControl() { return title; } @Override void update() { this.title.setText(getWidget().getLabel()); ReportingPeriod period = get(ReportingPeriodConfig.class).getReportingPeriod(); ExchangeRateTimeSeries series = get(ExchangeRateSeriesConfig.class).getSeries(); Optional<ExchangeRate> rate = series.lookupRate(period.getEndDate()); this.indicator.setText(series.getLabel() + ' ' + (rate.isPresent() ? Values.ExchangeRate.format(rate.get().getValue()) : '-')); } }