package com.amazonaws.eclipse.opsworks.deploy.wizard.page;
import static com.amazonaws.eclipse.core.ui.wizards.WizardWidgetFactory.newControlDecoration;
import static com.amazonaws.eclipse.core.ui.wizards.WizardWidgetFactory.newFillingLabel;
import org.eclipse.core.databinding.AggregateValidationStatus;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import com.amazonaws.eclipse.databinding.ChainValidator;
import com.amazonaws.eclipse.databinding.DecorationChangeListener;
import com.amazonaws.eclipse.databinding.JsonStringValidator;
import com.amazonaws.eclipse.opsworks.deploy.wizard.model.DeployProjectToOpsworksWizardDataModel;
public class DeploymentActionConfigurationPage extends WizardPageWithOnEnterHook {
/* Data model */
private final DeployProjectToOpsworksWizardDataModel dataModel;
private final DataBindingContext bindingContext;
private final AggregateValidationStatus aggregateValidationStatus;
/* UI widgets */
private Text deployCommentText;
private Text customChefJsonText;
private ControlDecoration customChefJsonTextDecoration;
private ISWTObservableValue deployCommentTextObservable;
private ISWTObservableValue customChefJsonTextObservable;
public DeploymentActionConfigurationPage(DeployProjectToOpsworksWizardDataModel dataModel) {
super("Deployment Action Configuration");
setTitle("Deployment Action Configuration");
setDescription("");
this.dataModel = dataModel;
this.bindingContext = new DataBindingContext();
this.aggregateValidationStatus = new AggregateValidationStatus(
bindingContext, AggregateValidationStatus.MAX_SEVERITY);
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(3, true));
newFillingLabel(composite, "Command").setFont(JFaceResources.getBannerFont());
newFillingLabel(composite, "Deploy", 2);
newFillingLabel(composite, "Comment (optional)").setFont(JFaceResources.getBannerFont());
deployCommentText = newTextArea(composite, 2, 4);
newFillingLabel(composite, "Custom Chef JSON (optional)").setFont(JFaceResources.getBannerFont());
customChefJsonText = newTextArea(composite, 2, 4);
customChefJsonTextDecoration = newControlDecoration(
customChefJsonText,
"Enter a valid JSON String.");
bindControls();
initializeValidators();
setControl(composite);
}
private void bindControls() {
deployCommentTextObservable = SWTObservables
.observeText(deployCommentText, SWT.Modify);
bindingContext.bindValue(
deployCommentTextObservable,
PojoObservables.observeValue(
dataModel,
DeployProjectToOpsworksWizardDataModel.DEPLOY_COMMENT));
customChefJsonTextObservable = SWTObservables
.observeText(customChefJsonText, SWT.Modify);
bindingContext.bindValue(
customChefJsonTextObservable,
PojoObservables.observeValue(
dataModel,
DeployProjectToOpsworksWizardDataModel.CUSTOM_CHEF_JSON));
}
private void initializeValidators() {
// Bind the validation status to the wizard page message
aggregateValidationStatus.addChangeListener(new IChangeListener() {
public void handleChange(ChangeEvent arg0) {
Object value = aggregateValidationStatus.getValue();
if (value instanceof IStatus == false) return;
IStatus status = (IStatus)value;
boolean success = (status.getSeverity() == IStatus.OK);
setPageComplete(success);
if (success) {
setMessage("", IStatus.OK);
} else {
setMessage(status.getMessage(), IStatus.ERROR);
}
}
});
// Validation status providers
ChainValidator<String> customChefJsonValidator = new ChainValidator<String>(
customChefJsonTextObservable,
new JsonStringValidator("Please enter a valid JSON String", true));
bindingContext.addValidationStatusProvider(customChefJsonValidator);
new DecorationChangeListener(customChefJsonTextDecoration,
customChefJsonValidator.getValidationStatus());
}
private static Text newTextArea(Composite parent, int colspan, int lines) {
Text text = new Text(parent, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL );
GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
gridData.horizontalSpan = colspan;
gridData.heightHint = lines * text.getLineHeight();
text.setLayoutData(gridData);
return text;
}
@Override
protected void onEnterPage() {
}
}