package name.abuchen.portfolio.ui.wizards.splits; import java.text.MessageFormat; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.validation.MultiValidator; import org.eclipse.core.databinding.validation.ValidationStatus; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.databinding.swt.ISWTObservableValue; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.viewers.ViewersObservables; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Spinner; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.util.BindingHelper; import name.abuchen.portfolio.ui.util.DateTimePicker; import name.abuchen.portfolio.ui.util.SimpleDateTimeSelectionProperty; import name.abuchen.portfolio.ui.wizards.AbstractWizardPage; public class SelectSplitPage extends AbstractWizardPage { private StockSplitModel model; private BindingHelper bindings; public SelectSplitPage(StockSplitModel model) { super("select-stock-split"); //$NON-NLS-1$ setTitle(Messages.SplitWizardDefinitionTitle); setDescription(Messages.SplitWizardDefinitionDescription); this.model = model; bindings = new BindingHelper(model) { @Override public void onValidationStatusChanged(IStatus status) { boolean isOK = status.getSeverity() == IStatus.OK; setErrorMessage(isOK ? null : status.getMessage()); setPageComplete(isOK); } }; } @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); setControl(container); container.setLayout(new FormLayout()); Label labelSecurity = new Label(container, SWT.NONE); labelSecurity.setText(Messages.ColumnSecurity); List<Security> securities = model.getClient().getActiveSecurities(); if (model.getSecurity() != null && !securities.contains(model.getSecurity())) securities.add(0, model.getSecurity()); ComboViewer comboSecurity = new ComboViewer(container, SWT.READ_ONLY); comboSecurity.setContentProvider(ArrayContentProvider.getInstance()); comboSecurity.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { return ((Security) element).getName(); } }); comboSecurity.setInput(securities); Label labelExDate = new Label(container, SWT.NONE); labelExDate.setText(Messages.ColumnExDate); DateTimePicker boxExDate = new DateTimePicker(container); Label labelSplit = new Label(container, SWT.NONE); labelSplit.setText(Messages.SplitWizardLabelSplit); Spinner spinnerNewShares = new Spinner(container, SWT.BORDER); spinnerNewShares.setMinimum(1); spinnerNewShares.setMaximum(1000000); spinnerNewShares.setSelection(1); spinnerNewShares.setIncrement(1); spinnerNewShares.setFocus(); Label labelColon = new Label(container, SWT.NONE); labelColon.setText(Messages.SplitWizardLabelNewForOld); Spinner spinnerOldShares = new Spinner(container, SWT.BORDER); spinnerOldShares.setMinimum(1); spinnerOldShares.setMaximum(1000000); spinnerOldShares.setSelection(1); spinnerOldShares.setIncrement(1); // form layout data FormData data = new FormData(); data.top = new FormAttachment(comboSecurity.getControl(), 0, SWT.CENTER); labelSecurity.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(labelSecurity, 5); data.right = new FormAttachment(100); comboSecurity.getControl().setLayoutData(data); data = new FormData(); data.top = new FormAttachment(boxExDate.getControl(), 0, SWT.CENTER); labelExDate.setLayoutData(data); data = new FormData(); data.top = new FormAttachment(comboSecurity.getControl(), 5); data.left = new FormAttachment(comboSecurity.getControl(), 2, SWT.LEFT); boxExDate.setLayoutData(data); data = new FormData(); data.top = new FormAttachment(spinnerNewShares, 0, SWT.CENTER); labelSplit.setLayoutData(data); data = new FormData(); data.top = new FormAttachment(boxExDate.getControl(), 5); data.left = new FormAttachment(boxExDate.getControl(), 0, SWT.LEFT); spinnerNewShares.setLayoutData(data); data = new FormData(); data.top = new FormAttachment(spinnerNewShares, 0, SWT.CENTER); data.left = new FormAttachment(spinnerNewShares, 5); labelColon.setLayoutData(data); data = new FormData(); data.top = new FormAttachment(boxExDate.getControl(), 5); data.left = new FormAttachment(labelColon, 5); spinnerOldShares.setLayoutData(data); // model binding DataBindingContext context = bindings.getBindingContext(); context.bindValue(ViewersObservables.observeSingleSelection(comboSecurity), BeanProperties.value("security").observe(model), null, null); //$NON-NLS-1$ context.bindValue(new SimpleDateTimeSelectionProperty().observe(boxExDate.getControl()), // BeanProperties.value("exDate").observe(model), //$NON-NLS-1$ new UpdateValueStrategy() // .setAfterConvertValidator(value -> { return value != null ? ValidationStatus.ok() : ValidationStatus.error(MessageFormat.format( Messages.MsgDialogInputRequired, Messages.ColumnExDate)); }), null); final ISWTObservableValue observeNewShares = WidgetProperties.selection().observe(spinnerNewShares); context.bindValue(observeNewShares, BeanProperties.value("newShares").observe(model)); //$NON-NLS-1$ final ISWTObservableValue observeOldShares = WidgetProperties.selection().observe(spinnerOldShares); context.bindValue(observeOldShares, BeanProperties.value("oldShares").observe(model)); //$NON-NLS-1$ MultiValidator validator = new MultiValidator() { @Override protected IStatus validate() { Object newShares = observeNewShares.getValue(); Object oldShares = observeOldShares.getValue(); return newShares.equals(oldShares) ? ValidationStatus.error(Messages.SplitWizardErrorNewAndOldMustNotBeEqual) : ValidationStatus.ok(); } }; context.addValidationStatusProvider(validator); } }