package name.abuchen.portfolio.ui.views.dashboard; import java.util.Objects; import java.util.function.BiFunction; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import name.abuchen.portfolio.model.Dashboard.Widget; import name.abuchen.portfolio.money.Values; import name.abuchen.portfolio.snapshot.ReportingPeriod; import name.abuchen.portfolio.ui.util.InfoToolTip; import name.abuchen.portfolio.ui.views.dataseries.DataSeries; public class IndicatorWidget<N extends Number> extends AbstractIndicatorWidget { public static class Builder<N extends Number> { private Widget widget; private DashboardData dashboardData; private Values<N> formatter; private BiFunction<DataSeries, ReportingPeriod, N> provider; private BiFunction<DataSeries, ReportingPeriod, String> tooltip; private boolean supportsBenchmarks = true; private boolean isValueColored = true; public Builder(Widget widget, DashboardData dashboardData) { this.widget = widget; this.dashboardData = dashboardData; } Builder<N> with(Values<N> formatter) { this.formatter = formatter; return this; } Builder<N> with(BiFunction<DataSeries, ReportingPeriod, N> provider) { this.provider = provider; return this; } Builder<N> withTooltip(BiFunction<DataSeries, ReportingPeriod, String> tooltip) { this.tooltip = tooltip; return this; } Builder<N> withBenchmarkDataSeries(boolean supportsBenchmarks) { this.supportsBenchmarks = supportsBenchmarks; return this; } Builder<N> withColoredValues(boolean isValueColored) { this.isValueColored = isValueColored; return this; } IndicatorWidget<N> build() { Objects.requireNonNull(formatter); Objects.requireNonNull(provider); IndicatorWidget<N> indicatorWidget = new IndicatorWidget<>(widget, dashboardData, supportsBenchmarks); indicatorWidget.setFormatter(formatter); indicatorWidget.setProvider(provider); indicatorWidget.setTooltip(tooltip); indicatorWidget.setValueColored(isValueColored); return indicatorWidget; } } private Values<N> formatter; private BiFunction<DataSeries, ReportingPeriod, N> provider; private BiFunction<DataSeries, ReportingPeriod, String> tooltip; private boolean isValueColored = true; public IndicatorWidget(Widget widget, DashboardData dashboardData, boolean supportsBenchmarks) { super(widget, dashboardData, supportsBenchmarks); } public static <N extends Number> Builder<N> create(Widget widget, DashboardData dashboardData) { return new IndicatorWidget.Builder<>(widget, dashboardData); } void setFormatter(Values<N> formatter) { this.formatter = formatter; } void setProvider(BiFunction<DataSeries, ReportingPeriod, N> provider) { this.provider = provider; } void setTooltip(BiFunction<DataSeries, ReportingPeriod, String> tooltip) { this.tooltip = tooltip; } void setValueColored(boolean isValueColored) { this.isValueColored = isValueColored; } @Override public Composite createControl(Composite parent, DashboardResources resources) { Composite container = super.createControl(parent, resources); if (tooltip != null) InfoToolTip.attach(indicator, () -> tooltip.apply(get(DataSeriesConfig.class).getDataSeries(), get(ReportingPeriodConfig.class).getReportingPeriod())); return container; } @Override public void update() { super.update(); N value = provider.apply(get(DataSeriesConfig.class).getDataSeries(), get(ReportingPeriodConfig.class).getReportingPeriod()); indicator.setText(formatter.format(value)); if (isValueColored) indicator.setForeground(Display.getDefault() .getSystemColor(value.doubleValue() < 0 ? SWT.COLOR_DARK_RED : SWT.COLOR_DARK_GREEN)); } }