org.jboss.tools.openshift.express.internal.ui.wizard.environment.EnvironmentVariablesWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.openshift.express.internal.ui.wizard.environment.EnvironmentVariablesWizardPage.java

Source

/******************************************************************************
 * Copyright (c) 2013 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors: Red Hat, Inc. - initial API and implementation
 *
 *****************************************************************************/
package org.jboss.tools.openshift.express.internal.ui.wizard.environment;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
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.Table;
import org.jboss.tools.common.ui.WizardUtils;
import org.jboss.tools.common.ui.databinding.ValueBindingBuilder;
import org.jboss.tools.foundation.ui.widget.IWidgetVisitor;
import org.jboss.tools.openshift.express.internal.ui.ExpressUIMessages;
import org.jboss.tools.openshift.express.internal.ui.utils.Logger;
import org.jboss.tools.openshift.internal.common.core.job.AbstractDelegatingMonitorJob;
import org.jboss.tools.openshift.internal.common.ui.databinding.IsNotNull2BooleanConverter;
import org.jboss.tools.openshift.internal.common.ui.utils.TableViewerBuilder;
import org.jboss.tools.openshift.internal.common.ui.utils.TableViewerBuilder.IColumnLabelProvider;
import org.jboss.tools.openshift.internal.common.ui.utils.UIUtils;
import org.jboss.tools.openshift.internal.common.ui.wizard.AbstractOpenShiftWizardPage;
import org.jboss.tools.openshift.internal.common.ui.wizard.OkCancelButtonWizardDialog;

/**
 * @author Martes G Wigglesworth
 * @author Martin Rieman <mrieman@redhat.com>
 * @author Andre Dietisheim
 * 
 */
public class EnvironmentVariablesWizardPage extends AbstractOpenShiftWizardPage {

    private AbstractEnvironmentVariablesWizardModel model;
    private TableViewer viewer;

    public EnvironmentVariablesWizardPage(AbstractEnvironmentVariablesWizardModel model, IWizard wizard) {
        super(ExpressUIMessages.EnvironmentVariables, ExpressUIMessages.PleaseProvadeNewVariable, "", wizard);
        this.model = model;
    }

    @Override
    protected void doCreateControls(Composite container, DataBindingContext dbc) {
        GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(container);

        Group envVariableGroup = new Group(container, SWT.NONE);
        envVariableGroup.setText(ExpressUIMessages.EnvironmentVariables);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(envVariableGroup);
        GridLayoutFactory.fillDefaults().numColumns(2).margins(6, 6).applyTo(envVariableGroup);

        Composite tableContainer = new Composite(envVariableGroup, SWT.NONE);
        this.viewer = createTable(tableContainer);
        GridDataFactory.fillDefaults().span(1, 5).align(SWT.FILL, SWT.FILL).grab(true, true)
                .applyTo(tableContainer);
        ValueBindingBuilder.bind(ViewerProperties.singleSelection().observe(viewer))
                .to(BeanProperties.value(AbstractEnvironmentVariablesWizardModel.PROPERTY_SELECTED).observe(model))
                .in(dbc);
        viewer.setComparator(new ViewerComparator());
        viewer.setContentProvider(new ObservableListContentProvider());
        viewer.setInput(
                BeanProperties.list(AbstractEnvironmentVariablesWizardModel.PROPERTY_VARIABLES).observe(model));

        Button addButton = new Button(envVariableGroup, SWT.PUSH);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(addButton);
        addButton.setText(ExpressUIMessages.Add);
        addButton.addSelectionListener(onAdd());

        Button editExistingButton = new Button(envVariableGroup, SWT.PUSH);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(editExistingButton);
        editExistingButton.setText(ExpressUIMessages.Edit);
        editExistingButton.addSelectionListener(onEdit());
        ValueBindingBuilder.bind(WidgetProperties.enabled().observe(editExistingButton)).notUpdatingParticipant()
                .to(BeanProperties.value(AbstractEnvironmentVariablesWizardModel.PROPERTY_SELECTED).observe(model))
                .converting(new IsNotNull2BooleanConverter()).in(dbc);

        Button removeButton = new Button(envVariableGroup, SWT.PUSH);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(removeButton);
        removeButton.setText(ExpressUIMessages.Remove);
        removeButton.addSelectionListener(onRemove());
        ValueBindingBuilder.bind(WidgetProperties.enabled().observe(removeButton)).notUpdatingParticipant()
                .to(BeanProperties.value(AbstractEnvironmentVariablesWizardModel.PROPERTY_SELECTED).observe(model))
                .converting(new IsNotNull2BooleanConverter()).in(dbc);

        Label filler = new Label(envVariableGroup, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(false, true).applyTo(filler);

        Button refreshButton = new Button(envVariableGroup, SWT.PUSH);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(refreshButton);
        refreshButton.setText(ExpressUIMessages.Refresh);
        refreshButton.addSelectionListener(onRefresh());

        // not supported
        enableEnvVariableGroup(model.isSupported(), envVariableGroup);
        Label validationLabel = new Label(envVariableGroup, SWT.NONE);
        validationLabel.setVisible(false);
        GridDataFactory.fillDefaults().exclude(true).applyTo(validationLabel);
        ValueBindingBuilder
                .bind(WidgetProperties.enabled().observe(validationLabel)).notUpdating(BeanProperties
                        .value(AbstractEnvironmentVariablesWizardModel.PROPERTY_SUPPORTED).observe(model))
                .validatingAfterGet(new IValidator() {

                    @Override
                    public IStatus validate(Object value) {
                        if (Boolean.FALSE.equals((Boolean) value)) {
                            return ValidationStatus.warning(
                                    NLS.bind(ExpressUIMessages.ServerDoesNotSupportChanging, model.getHost()));
                        }
                        return ValidationStatus.ok();
                    }
                }).in(dbc);
    }

    protected TableViewer createTable(Composite tableContainer) {
        Table table = new Table(tableContainer, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        this.viewer = new TableViewerBuilder(table, tableContainer).contentProvider(new ArrayContentProvider())
                .column(new IColumnLabelProvider<EnvironmentVariableItem>() {

                    @Override
                    public String getValue(EnvironmentVariableItem variable) {
                        return variable.getName();
                    }
                }).name("Name").align(SWT.LEFT).weight(2).minWidth(100).buildColumn()
                .column(new IColumnLabelProvider<EnvironmentVariableItem>() {

                    @Override
                    public String getValue(EnvironmentVariableItem variable) {
                        return variable.getValue();
                    }
                }).name("Value").align(SWT.LEFT).weight(2).minWidth(100).buildColumn().buildViewer();

        return viewer;
    }

    private void enableEnvVariableGroup(final boolean enable, Group envVariableGroup) {
        envVariableGroup.setEnabled(enable);
        UIUtils.enableAllChildren(enable, envVariableGroup);
    }

    @Override
    protected void onPageActivated(DataBindingContext dbc) {
        try {
            WizardUtils.runInWizard(new LoadEnvironmentVariablesJob(), getContainer(), dbc);
        } catch (InvocationTargetException e) {
            Logger.error(ExpressUIMessages.CouldNotLoadVariables, e);
        } catch (InterruptedException e) {
            Logger.error(ExpressUIMessages.CouldNotLoadVariables, e);
        }
    }

    private SelectionListener onAdd() {
        return new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                EnvironmentVariableWizard wizard = new EnvironmentVariableWizard(model);
                new OkCancelButtonWizardDialog(getShell(), wizard).open();
            }
        };
    }

    private SelectionListener onEdit() {
        return new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                OkCancelButtonWizardDialog editVariableWizardDialog = new OkCancelButtonWizardDialog(getShell(),
                        new EnvironmentVariableWizard(model.getSelected(), model));
                editVariableWizardDialog.open();
                viewer.refresh();
            }
        };
    }

    private SelectionListener onRemove() {
        return new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                EnvironmentVariableItem selectedVariable = model.getSelected();
                if (selectedVariable == null) {
                    return;
                }
                if (MessageDialog.openConfirm(getShell(), ExpressUIMessages.RemoveVariable,
                        NLS.bind(ExpressUIMessages.DoYouWantToRemoveVariable,
                                selectedVariable.getName() + "=" + selectedVariable.getValue())))
                    model.remove(selectedVariable);
            }
        };
    }

    private SelectionListener onRefresh() {
        return new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                try {
                    if (MessageDialog.openConfirm(getShell(), ExpressUIMessages.RefreshVariables,
                            ExpressUIMessages.DoYouWantToRefreshVariables))
                        WizardUtils.runInWizard(new RefreshEnvironmentVariablesJob(), getContainer(),
                                getDatabindingContext());
                } catch (InvocationTargetException e) {
                    Logger.error(ExpressUIMessages.CouldNotRefreshVariables, e);
                } catch (InterruptedException e) {
                    Logger.error(ExpressUIMessages.CouldNotRefreshVariables, e);
                }
            }
        };
    }

    private class LoadEnvironmentVariablesJob extends AbstractDelegatingMonitorJob {

        public LoadEnvironmentVariablesJob() {
            super(ExpressUIMessages.LoadingVariables);
        }

        @Override
        protected IStatus doRun(IProgressMonitor monitor) {
            model.loadEnvironmentVariables();
            return Status.OK_STATUS;
        }
    }

    private class RefreshEnvironmentVariablesJob extends AbstractDelegatingMonitorJob {

        public RefreshEnvironmentVariablesJob() {
            super(ExpressUIMessages.RefreshingVariables);
        }

        @Override
        protected IStatus doRun(IProgressMonitor monitor) {
            model.refreshEnvironmentVariables();
            return Status.OK_STATUS;
        }
    }

}