package name.abuchen.portfolio.ui.views.dividends; import java.time.LocalDate; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ToolBar; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.money.CurrencyConverterImpl; import name.abuchen.portfolio.money.ExchangeRateProviderFactory; import name.abuchen.portfolio.ui.AbstractFinanceView; import name.abuchen.portfolio.ui.Images; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.util.AbstractDropDown; import name.abuchen.portfolio.ui.util.SimpleAction; public class DividendsView extends AbstractFinanceView { private static final String KEY_TAB = DividendsView.class.getSimpleName() + "-tab"; //$NON-NLS-1$ private static final String KEY_YEAR = DividendsView.class.getSimpleName() + "-year"; //$NON-NLS-1$ private static final String KEY_USE_GROSS_VALUE = DividendsView.class.getSimpleName() + "-use-gross-value"; //$NON-NLS-1$ @Inject private Client client; @Inject private IPreferenceStore preferences; @Inject private ExchangeRateProviderFactory factory; private DividendsViewModel model; private CTabFolder folder; @PostConstruct public void setupModel() { CurrencyConverterImpl converter = new CurrencyConverterImpl(factory, client.getBaseCurrency()); model = new DividendsViewModel(preferences, converter, client); int year = preferences.getInt(KEY_YEAR); LocalDate now = LocalDate.now(); if (year <= now.getYear() - 10 || year > now.getYear()) year = now.getYear() - 2; model.updateWith(year); boolean useGrossValue = preferences.getBoolean(KEY_USE_GROSS_VALUE); model.setUseGrossValue(useGrossValue); model.addUpdateListener(() -> { preferences.setValue(KEY_YEAR, model.getStartYear()); preferences.setValue(KEY_USE_GROSS_VALUE, model.usesGrossValue()); }); } @Override public void notifyModelUpdated() { model.recalculate(); } @Override protected String getDefaultTitle() { return Messages.LabelDividends; } @Override protected void addButtons(ToolBar toolBar) { new StartYearSelectionDropDown(toolBar, model); AbstractDropDown dropDown = AbstractDropDown.create(toolBar, Messages.MenuChooseClientFilter, Images.FILTER_OFF.image(), SWT.NONE, model.getClientFilterMenu()::menuAboutToShow); model.getClientFilterMenu() .addListener(f -> dropDown.getToolItem().setImage(model.getClientFilterMenu().hasActiveFilter() ? Images.FILTER_ON.image() : Images.FILTER_OFF.image())); new AbstractDropDown(toolBar, Messages.MenuExportData, Images.EXPORT.image(), SWT.NONE) { @Override public void menuAboutToShow(IMenuManager manager) { final int itemCount = folder.getItemCount(); for (int ii = 0; ii < itemCount; ii++) { DividendsTab tab = (DividendsTab) folder.getItem(ii).getData(); if (tab != null) tab.addExportActions(manager); } } }; new AbstractDropDown(toolBar, Messages.MenuConfigureChart, Images.CONFIG.image(), SWT.NONE) { @Override public void menuAboutToShow(IMenuManager manager) { Action action = new SimpleAction(Messages.LabelUseGrossDividends, a -> model.setUseGrossValue(!model.usesGrossValue())); action.setChecked(model.usesGrossValue()); manager.add(action); } }; } @Override protected Control createBody(Composite parent) { folder = new CTabFolder(parent, SWT.BORDER); createTab(folder, DividendsMatrixTab.class); createTab(folder, DividendsChartTab.class); createTab(folder, DividendsPerYearChartTab.class); createTab(folder, AccumulatedDividendsChartTab.class); createTab(folder, TransactionsTab.class); int tab = preferences.getInt(KEY_TAB); if (tab <= 0 || tab >= 4) tab = 0; folder.setSelection(tab); folder.addDisposeListener(e -> preferences.setValue(KEY_TAB, folder.getSelectionIndex())); return folder; } private void createTab(CTabFolder folder, Class<? extends DividendsTab> tabClass) { DividendsTab tab = this.make(tabClass, model); Control control = tab.createControl(folder); CTabItem item = new CTabItem(folder, SWT.NONE); item.setText(tab.getLabel()); item.setControl(control); item.setData(tab); } }