package name.abuchen.portfolio.ui.views; import java.beans.PropertyChangeListener; import java.time.LocalDate; import java.util.Collections; import java.util.List; import javax.inject.Inject; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.swt.SWT; 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.CurrencyConverter; import name.abuchen.portfolio.money.CurrencyConverterImpl; import name.abuchen.portfolio.money.CurrencyUnit; import name.abuchen.portfolio.money.ExchangeRateProviderFactory; import name.abuchen.portfolio.money.Values; import name.abuchen.portfolio.snapshot.ClientSnapshot; import name.abuchen.portfolio.ui.AbstractFinanceView; import name.abuchen.portfolio.ui.Images; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.dialogs.DateSelectionDialog; import name.abuchen.portfolio.ui.util.AbstractDropDown; import name.abuchen.portfolio.ui.util.ClientFilterDropDown; import name.abuchen.portfolio.ui.util.LabelOnly; import name.abuchen.portfolio.ui.util.SimpleAction; import name.abuchen.portfolio.ui.util.TableViewerCSVExporter; public class StatementOfAssetsView extends AbstractFinanceView { private StatementOfAssetsViewer assetViewer; private PropertyChangeListener currencyChangeListener; private ClientFilterDropDown clientFilter; private LocalDate snapshotDate = LocalDate.now(); @Inject private ExchangeRateProviderFactory factory; @Override protected String getDefaultTitle() { return assetViewer == null ? Messages.LabelStatementOfAssets : Messages.LabelStatementOfAssets + // " (" + assetViewer.getColumnHelper().getConfigurationName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } @Override public void notifyModelUpdated() { CurrencyConverter converter = new CurrencyConverterImpl(factory, getClient().getBaseCurrency()); Client filteredClient = clientFilter.getSelectedFilter().filter(getClient()); ClientSnapshot snapshot = ClientSnapshot.create(filteredClient, converter, snapshotDate); assetViewer.setInput(snapshot, clientFilter.getSelectedFilter()); updateTitle(getDefaultTitle()); } @Override protected void addButtons(final ToolBar toolBar) { AbstractDropDown dropdown = new AbstractDropDown(toolBar, getClient().getBaseCurrency()) { @Override public void menuAboutToShow(IMenuManager manager) { List<CurrencyUnit> available = CurrencyUnit.getAvailableCurrencyUnits(); Collections.sort(available); for (final CurrencyUnit unit : available) { Action action = new SimpleAction(unit.getLabel(), a -> { setLabel(unit.getCurrencyCode()); getClient().setBaseCurrency(unit.getCurrencyCode()); }); action.setChecked(getClient().getBaseCurrency().equals(unit.getCurrencyCode())); manager.add(action); } } }; currencyChangeListener = e -> dropdown.setLabel(e.getNewValue().toString()); getClient().addPropertyChangeListener("baseCurrency", currencyChangeListener); //$NON-NLS-1$ addCalendarButton(toolBar); this.clientFilter = new ClientFilterDropDown(toolBar, getClient(), getPreferenceStore(), filter -> notifyModelUpdated()); Action export = new SimpleAction(null, action -> new TableViewerCSVExporter(assetViewer.getTableViewer()) .export(Messages.LabelStatementOfAssets + ".csv")); //$NON-NLS-1$ export.setImageDescriptor(Images.EXPORT.descriptor()); export.setToolTipText(Messages.MenuExportData); new ActionContributionItem(export).fill(toolBar, -1); Action save = new SimpleAction(null, a -> assetViewer.showSaveMenu(getActiveShell())); save.setImageDescriptor(Images.SAVE.descriptor()); save.setToolTipText(Messages.MenuSaveColumns); new ActionContributionItem(save).fill(toolBar, -1); Action config = new SimpleAction(null, a -> assetViewer.showConfigMenu(toolBar.getShell())); config.setImageDescriptor(Images.CONFIG.descriptor()); config.setToolTipText(Messages.MenuShowHideColumns); new ActionContributionItem(config).fill(toolBar, -1); } private void addCalendarButton(ToolBar toolBar) { AbstractDropDown.create(toolBar, Messages.LabelPortfolioTimeMachine, Images.CALENDAR_OFF.image(), SWT.NONE, (dropDown, manager) -> { manager.add(new LabelOnly(Values.Date.format(snapshotDate))); manager.add(new Separator()); SimpleAction action = new SimpleAction(Messages.LabelToday, a -> { snapshotDate = LocalDate.now(); notifyModelUpdated(); dropDown.getToolItem().setImage(Images.CALENDAR_OFF.image()); }); action.setEnabled(!snapshotDate.equals(LocalDate.now())); manager.add(action); manager.add(new SimpleAction(Messages.MenuPickOtherDate, a -> { DateSelectionDialog dialog = new DateSelectionDialog(getActiveShell(), date -> !date.isAfter(LocalDate.now())); dialog.setSelection(snapshotDate); if (dialog.open() != DateSelectionDialog.OK) return; if (snapshotDate.equals(dialog.getSelection())) return; snapshotDate = dialog.getSelection(); notifyModelUpdated(); dropDown.getToolItem().setImage(LocalDate.now().equals(snapshotDate) ? Images.CALENDAR_OFF.image() : Images.CALENDAR_ON.image()); })); }); } @Override protected Control createBody(Composite parent) { assetViewer = make(StatementOfAssetsViewer.class); Control control = assetViewer.createControl(parent); updateTitle(getDefaultTitle()); assetViewer.getColumnHelper().addListener(() -> updateTitle(getDefaultTitle())); hookContextMenu(assetViewer.getTableViewer().getControl(), manager -> assetViewer.hookMenuListener(manager, StatementOfAssetsView.this)); notifyModelUpdated(); return control; } @Override public void dispose() { if (currencyChangeListener != null) getClient().removePropertyChangeListener("baseCurrency", currencyChangeListener); //$NON-NLS-1$ } }