com.amazonaws.eclipse.elasticbeanstalk.server.ui.configEditor.ExportTemplateDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.amazonaws.eclipse.elasticbeanstalk.server.ui.configEditor.ExportTemplateDialog.java

Source

/*
 * Copyright 2010-2011 Amazon Technologies, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *    http://aws.amazon.com/apache2.0
 *
 * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
 * OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and
 * limitations under the License.
 */
package com.amazonaws.eclipse.elasticbeanstalk.server.ui.configEditor;

import java.util.Collection;

import org.eclipse.core.databinding.AggregateValidationStatus;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.set.WritableSet;
import org.eclipse.core.databinding.observable.value.IObservableValue;
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.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import com.amazonaws.eclipse.elasticbeanstalk.server.ui.databinding.ChainValidator;
import com.amazonaws.eclipse.elasticbeanstalk.server.ui.databinding.DecorationChangeListener;
import com.amazonaws.eclipse.elasticbeanstalk.server.ui.databinding.NotEmptyValidator;
import com.amazonaws.eclipse.elasticbeanstalk.server.ui.databinding.NotInListValidator;

/**
 * Simple wizard to export an environment configuration template.
 */
public class ExportTemplateDialog extends MessageDialog {

    private String templateName;
    private Collection<String> existingTemplateNames;
    private DataBindingContext bindingContext = new DataBindingContext();
    private IObservableValue isCreatingNew = new WritableValue();
    private IObservableValue newTemplateName = new WritableValue();
    private IObservableValue existingTemplateName = new WritableValue();
    private IObservableValue templateDescription = new WritableValue();
    private AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(bindingContext,
            AggregateValidationStatus.MAX_SEVERITY);

    public boolean isCreatingNew() {
        return (Boolean) isCreatingNew.getValue();
    }

    public String getTemplateDescription() {
        return (String) templateDescription.getValue();
    }

    public String getTemplateName() {
        if (isCreatingNew()) {
            return (String) newTemplateName.getValue();
        } else {
            return (String) existingTemplateName.getValue();
        }
    }

    public ExportTemplateDialog(Shell parentShell, Collection<String> existingTemplateNames,
            String defaultTemplateName) {
        super(parentShell, "Export configuration template", null, "Choose a name and description for your template",
                MessageDialog.NONE, new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 0);
        this.templateName = defaultTemplateName;
        this.existingTemplateNames = existingTemplateNames;
    }

    @Override
    protected Control createCustomArea(Composite parent) {
        parent.setLayout(new FillLayout());

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(2, false));

        Group templateNameGroup = new Group(composite, SWT.None);
        templateNameGroup.setLayout(new GridLayout(2, false));
        GridData groupData = new GridData();
        groupData.horizontalSpan = 2;
        templateNameGroup.setLayoutData(groupData);

        // Update existing template
        final Button updateExistingRadioButton = new Button(templateNameGroup, SWT.RADIO);
        updateExistingRadioButton.setText("Update an existing template");
        final Combo existingTemplateNamesCombo = new Combo(templateNameGroup, SWT.READ_ONLY);
        existingTemplateNamesCombo.setEnabled(false);
        if (existingTemplateNames.isEmpty()) {
            updateExistingRadioButton.setEnabled(false);
        } else {
            existingTemplateNamesCombo
                    .setItems(existingTemplateNames.toArray(new String[existingTemplateNames.size()]));
            existingTemplateNamesCombo.select(0);
        }

        // Create new template -- default option
        Button createNewRadioButton = new Button(templateNameGroup, SWT.RADIO);
        createNewRadioButton.setText("Create a new template");
        final Text templateNameText = new Text(templateNameGroup, SWT.BORDER);
        templateNameText.setText(templateName);
        templateNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        updateExistingRadioButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                templateNameText.setEnabled(!updateExistingRadioButton.getSelection());
                existingTemplateNamesCombo.setEnabled(updateExistingRadioButton.getSelection());
            }

        });

        // Description
        new Label(composite, SWT.NONE).setText("Template description: ");
        final Text templateDescriptionText = new Text(composite, SWT.BORDER);
        templateDescriptionText.setText("");
        templateDescriptionText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        // Data binding
        bindingContext.bindValue(SWTObservables.observeSelection(createNewRadioButton), isCreatingNew);
        isCreatingNew.setValue(true);

        bindingContext.bindValue(SWTObservables.observeSelection(existingTemplateNamesCombo), existingTemplateName)
                .updateTargetToModel();
        bindingContext.bindValue(SWTObservables.observeText(templateNameText, SWT.Modify), newTemplateName);
        bindingContext.bindValue(SWTObservables.observeText(templateDescriptionText, SWT.Modify),
                templateDescription);

        WritableSet inUseNames = new WritableSet();
        inUseNames.addAll(existingTemplateNames);
        ChainValidator<String> validator = new ChainValidator<String>(newTemplateName, isCreatingNew,
                new NotEmptyValidator("Template name cannot be empty"),
                new NotInListValidator<String>(inUseNames, "Template name already in use"));
        bindingContext.addValidationStatusProvider(validator);

        // Decorate the new name field with error status
        ControlDecoration decoration = new ControlDecoration(templateNameText, SWT.TOP | SWT.LEFT);
        decoration.setDescriptionText("Invalid value");
        FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault()
                .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
        decoration.setImage(fieldDecoration.getImage());
        new DecorationChangeListener(decoration, validator.getValidationStatus());

        return composite;
    }

    /**
     * We need to add our button enabling listener here, because they haven't
     * been created yet in createCustomArea
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        super.createButtonsForButtonBar(parent);
        aggregateValidationStatus.addChangeListener(new IChangeListener() {

            public void handleChange(ChangeEvent event) {
                Object value = aggregateValidationStatus.getValue();
                if (value instanceof IStatus == false)
                    return;

                IStatus status = (IStatus) value;
                Button okButton = getButton(0);
                if (okButton != null) {
                    if (status.getSeverity() == IStatus.OK) {
                        okButton.setEnabled(true);
                    } else {
                        okButton.setEnabled(false);
                    }
                }
            }
        });

        getButton(0).setEnabled(false);
    }
}