package org.marketcetera.photon.internal.strategy.engine.ui.workbench;
import org.eclipse.core.databinding.AggregateValidationStatus;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.ObservablesManager;
import org.eclipse.core.databinding.observable.value.ComputedValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.SWTObservables;
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.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.marketcetera.photon.commons.ui.databinding.DataBindingUtils;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Helper dialog for {@link DeployedStrategyConfigurationPropertyPage} used for
* adding new parameters.
*
* TODO: maybe validate non-empty value if EG-782 is not fixed soon.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: NewPropertyInputDialog.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
@ClassVersion("$Id: NewPropertyInputDialog.java 16154 2012-07-14 16:34:05Z colin $")
final class NewPropertyInputDialog extends Dialog {
/**
* Provided property key (after OK is pressed).
*/
private final WritableValue mPropertyKey = WritableValue
.withValueType(String.class);
/**
* Provided property value (after OK is pressed).
*/
private final WritableValue mPropertyValue = new WritableValue("", //$NON-NLS-1$
String.class);
private final DataBindingContext mDataBindingContext = new DataBindingContext();
private final ObservablesManager mObservablesManager = new ObservablesManager();
/**
* Constructor.
*
* @param parentShell
* the parent shell, or <code>null</code> to create a top-level
* shell
*/
public NewPropertyInputDialog(Shell parentShell) {
super(parentShell);
mObservablesManager.addObservablesFromContext(mDataBindingContext,
true, true);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.NEW_PROPERTY_INPUT_DIALOG__TEXT.getText());
}
@Override
protected Control createDialogArea(Composite parent) {
final Composite composite = (Composite) super.createDialogArea(parent);
{
Label label = new Label(composite, SWT.NONE);
label.setText(Messages.NEW_PROPERTY_INPUT_DIALOG_KEY__LABEL
.getText());
}
{
Text keyText = new Text(composite, SWT.SINGLE | SWT.BORDER);
DataBindingUtils.bindRequiredField(mDataBindingContext,
SWTObservables.observeText(keyText, SWT.Modify),
mPropertyKey,
Messages.NEW_PROPERTY_INPUT_DIALOG_KEY__DESCRIPTION
.getText());
}
{
Label label = new Label(composite, SWT.NONE);
label.setText(Messages.NEW_PROPERTY_INPUT_DIALOG_VALUE__LABEL
.getText());
}
{
Text valueText = new Text(composite, SWT.SINGLE | SWT.BORDER);
mDataBindingContext.bindValue(SWTObservables
.observeText(valueText, SWT.Modify), mPropertyValue);
}
GridLayoutFactory.swtDefaults().numColumns(2).spacing(10, 10)
.generateLayout(composite);
applyDialogFont(composite);
return composite;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
final AggregateValidationStatus agg = new AggregateValidationStatus(
mDataBindingContext, AggregateValidationStatus.MAX_SEVERITY);
mObservablesManager.addObservable(agg);
mDataBindingContext.bindValue(SWTObservables
.observeEnabled(getButton(IDialogConstants.OK_ID)),
new ComputedValue() {
@Override
protected Object calculate() {
return ((IStatus) agg.getValue()).isOK();
}
});
}
/**
* Returns the property key entered by the user. Should only be called when
* this dialog returned OK.
*
* @return the provided property key
*/
public String getPropertyKey() {
return (String) mPropertyKey.getValue();
}
/**
* Returns the property value entered by the user. Should only be called
* when this dialog returned OK.
*
* @return the provided property value
*/
public String getPropertyValue() {
return (String) mPropertyValue.getValue();
}
@Override
public boolean close() {
final boolean close = super.close();
/*
* Dispose ObservablesManager first, see http://bugs.eclipse.org/287247
* and o.m.p.commons.ui.databinding.ObservablesManagerCaveatTest.
*/
mObservablesManager.dispose();
mDataBindingContext.dispose();
return close;
}
}