package name.abuchen.portfolio.ui.dialogs;
import name.abuchen.portfolio.ui.util.BindingHelper;
import name.abuchen.portfolio.ui.util.BindingHelper.Model;
import org.eclipse.core.databinding.AggregateValidationStatus;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/* package */abstract class AbstractDialog extends Dialog
{
private String title;
private Model model;
private BindingHelper bindings;
public AbstractDialog(Shell parentShell, String title, Model model)
{
super(parentShell);
this.title = title;
this.model = model;
this.bindings = new BindingHelper(model)
{
@Override
public void onValidationStatusChanged(IStatus status)
{
Control button = getButton(IDialogConstants.OK_ID);
if (button != null)
button.setEnabled(status.getSeverity() == IStatus.OK);
}
};
}
protected void configureShell(Shell shell)
{
super.configureShell(shell);
shell.setText(title);
}
protected Model getModel()
{
return model;
}
protected DataBindingContext getBindingContext()
{
return bindings.getBindingContext();
}
protected BindingHelper bindings()
{
return bindings;
}
@Override
protected final Control createContents(Composite parent)
{
Control answer = super.createContents(parent);
bindings.onValidationStatusChanged(AggregateValidationStatus.getStatusMaxSeverity(getBindingContext()
.getValidationStatusProviders()));
return answer;
}
protected final Control createDialogArea(Composite parent)
{
Composite composite = (Composite) super.createDialogArea(parent);
Composite editArea = new Composite(composite, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(2).applyTo(editArea);
editArea.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
createFormElements(editArea);
bindings.createErrorLabel(editArea);
return composite;
}
protected abstract void createFormElements(Composite editArea);
@Override
protected void okPressed()
{
model.applyChanges();
super.okPressed();
}
}