cn.dockerfoundry.ide.eclipse.server.ui.internal.EnvironmentVariablesPart.java Source code

Java tutorial

Introduction

Here is the source code for cn.dockerfoundry.ide.eclipse.server.ui.internal.EnvironmentVariablesPart.java

Source

/*******************************************************************************
 * Copyright (c) 2013, 2014 Pivotal Software, Inc. 
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of 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://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License 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.
 *  
 *  Contributors:
 *     Pivotal Software, Inc. - initial API and implementation
 ********************************************************************************/
package cn.dockerfoundry.ide.eclipse.server.ui.internal;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

import cn.dockerfoundry.ide.eclipse.server.core.internal.ValueValidationUtil;
import cn.dockerfoundry.ide.eclipse.server.core.internal.application.EnvironmentVariable;

public class EnvironmentVariablesPart extends UIPart {

    private List<EnvironmentVariable> variables;

    private TableViewer envVariablesViewer;

    //   private Button editEnvVarButton;

    //   private Button removeEnvVarButton;

    public void setInput(List<EnvironmentVariable> variables) {
        this.variables = variables != null ? variables : new ArrayList<EnvironmentVariable>();
        if (envVariablesViewer != null) {
            envVariablesViewer.setInput(variables);
        }
    }

    public List<EnvironmentVariable> getVariables() {
        return variables;
    }

    public Control createPart(Composite parent) {
        Composite commonArea = new Composite(parent, SWT.NONE);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(commonArea);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(commonArea);

        Composite tableParent = new Composite(commonArea, SWT.NONE);

        GridLayoutFactory.fillDefaults().numColumns(1).applyTo(tableParent);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(tableParent);

        Table table = new Table(tableParent, SWT.BORDER | SWT.MULTI);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(table);
        envVariablesViewer = new TableViewer(table);
        //      Listener actionEnabler = new Listener() {
        //         @Override
        //         public void handleEvent(Event event) {
        //            setEnabledDisabled();
        //         }
        //      };

        //      table.addListener(SWT.Selection, actionEnabler);
        //      table.addListener(SWT.FocusOut, actionEnabler);
        envVariablesViewer.setContentProvider(new IStructuredContentProvider() {

            public Object[] getElements(Object inputElement) {
                if (inputElement instanceof Collection) {
                    return ((Collection<?>) inputElement).toArray(new Object[0]);
                }
                return null;
            }

            public void dispose() {

            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

            }

        });

        envVariablesViewer.setLabelProvider(new EnvVarLabelProvider(envVariablesViewer));

        table.setHeaderVisible(true);

        new TableResizeHelper(envVariablesViewer).enableResizing();

        int columnIndex = 0;
        ViewColumn[] columns = ViewColumn.values();
        String[] columnProperties = new String[columns.length];

        for (ViewColumn column : columns) {
            columnProperties[columnIndex] = column.name();
            TableColumn tableColumn = new TableColumn(table, SWT.NONE, columnIndex++);
            tableColumn.setData(column);
            tableColumn.setText(column.name());
            tableColumn.setWidth(column.getWidth());
        }

        envVariablesViewer.setColumnProperties(columnProperties);

        //      addEditButtons(commonArea);
        return commonArea;
    }

    //   protected void setEnabledDisabled() {
    //      removeEnvVarButton.setEnabled(isDeleteEnabled());
    //      editEnvVarButton.setEnabled(isEditEnabled());
    //   }

    private void addEditButtons(Composite parent) {

        Composite buttonArea = new Composite(parent, SWT.NONE);

        GridLayoutFactory.fillDefaults().numColumns(1).spacing(SWT.DEFAULT, 4).applyTo(buttonArea);
        GridDataFactory.fillDefaults().grab(false, true).applyTo(buttonArea);

        Button newEnvVarButton = new Button(buttonArea, SWT.NONE);
        newEnvVarButton.setText(Messages.EnvironmentVariablesPart_TEXT_NEW_ENV_VAR);
        GridDataFactory.fillDefaults().grab(false, false).applyTo(newEnvVarButton);
        newEnvVarButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleAdd();
            }
        });

        //      editEnvVarButton = new Button(buttonArea, SWT.NONE);
        //      editEnvVarButton.setText(Messages.COMMONTXT_EDIT);
        //      editEnvVarButton.setEnabled(false);
        //      GridDataFactory.fillDefaults().grab(false, false).applyTo(editEnvVarButton);
        //      editEnvVarButton.addSelectionListener(new SelectionAdapter() {
        //         public void widgetSelected(SelectionEvent e) {
        //            handleEdit();
        //         }
        //      });
        //
        //      removeEnvVarButton = new Button(buttonArea, SWT.NONE);
        //      removeEnvVarButton.setText(Messages.COMMONTXT_REMOVE);
        //      removeEnvVarButton.setEnabled(false);
        //      GridDataFactory.fillDefaults().grab(false, false).applyTo(removeEnvVarButton);
        //      removeEnvVarButton.addSelectionListener(new SelectionAdapter() {
        //         public void widgetSelected(SelectionEvent e) {
        //            handleDelete();
        //         }
        //      });
    }

    private boolean isEditEnabled() {
        final List<EnvironmentVariable> vars = getViewerSelection();
        boolean isEnabled = vars != null && vars.size() == 1;
        return isEnabled;
    }

    private boolean isDeleteEnabled() {
        final List<EnvironmentVariable> vars = getViewerSelection();
        boolean isEnabled = vars != null && vars.size() > 0;
        return isEnabled;
    }

    protected void handleAdd() {
        boolean variableChanged = false;
        Shell shell = CloudUiUtil.getShell();
        if (shell != null) {
            VariableDialogue dialogue = new VariableDialogue(shell, null);
            if (dialogue.open() == Window.OK) {
                variableChanged = updateVariables(dialogue.getEnvironmentVariable(), null);
            }
        }

        if (variableChanged) {
            notifyStatusChange(Status.OK_STATUS);
        }
    }

    protected void handleEdit() {
        boolean variableChanged = false;
        Shell shell = CloudUiUtil.getShell();
        List<EnvironmentVariable> selection = getViewerSelection();
        if (shell != null && selection != null && !selection.isEmpty()) {
            EnvironmentVariable toEdit = selection.get(0);
            VariableDialogue dialogue = new VariableDialogue(shell, toEdit);
            if (dialogue.open() == Window.OK) {
                variableChanged = updateVariables(dialogue.getEnvironmentVariable(), toEdit);
            }
        }

        if (variableChanged) {
            notifyStatusChange(Status.OK_STATUS);
            //         setEnabledDisabled();
        }
    }

    protected void handleDelete() {
        boolean variableChanged = false;
        List<EnvironmentVariable> selection = getViewerSelection();
        if (selection != null && !selection.isEmpty()) {
            for (EnvironmentVariable toDelete : selection) {
                variableChanged = variableChanged || updateVariables(null, toDelete);
            }
        }

        if (variableChanged) {
            notifyStatusChange(Status.OK_STATUS);
            //         setEnabledDisabled();
        }
    }

    protected boolean updateVariables(EnvironmentVariable add, EnvironmentVariable delete) {
        boolean variableChanged = false;
        if (variables == null) {
            variables = new ArrayList<EnvironmentVariable>();
        }

        if (delete != null) {
            List<EnvironmentVariable> updatedList = new ArrayList<EnvironmentVariable>();

            for (EnvironmentVariable var : variables) {
                if (var.equals(delete)) {
                    variableChanged = true;
                } else {
                    updatedList.add(var);
                }
            }

            variables = updatedList;
        }

        if (add != null) {
            variables.add(add);
            variableChanged = true;
        }

        setInput(variables);
        return variableChanged;
    }

    protected List<EnvironmentVariable> getViewerSelection() {
        IStructuredSelection selection = (IStructuredSelection) envVariablesViewer.getSelection();
        List<EnvironmentVariable> selectedVars = new ArrayList<EnvironmentVariable>();
        if (!selection.isEmpty()) {
            Object[] servicesObjs = selection.toArray();
            for (Object serviceObj : servicesObjs) {
                selectedVars.add((EnvironmentVariable) serviceObj);
            }
        }
        return selectedVars;
    }

    protected void setViewerSelection(EnvironmentVariable var) {
        if (var != null) {
            envVariablesViewer.setSelection(new StructuredSelection(var));
        }
    }

    enum ViewColumn {
        Variable(200), Value(200);
        private int width;

        private ViewColumn(int width) {
            this.width = width;
        }

        public int getWidth() {
            return width;
        }
    }

    protected class EnvVarLabelProvider extends LabelProvider implements ITableLabelProvider {

        private final TableViewer viewer;

        public EnvVarLabelProvider(TableViewer viewer) {
            this.viewer = viewer;
        }

        @Override
        public Image getImage(Object element) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            String result = null;
            TableColumn column = viewer.getTable().getColumn(columnIndex);
            if (column != null) {
                ViewColumn serviceColumn = (ViewColumn) column.getData();
                if (serviceColumn != null) {
                    EnvironmentVariable var = (EnvironmentVariable) element;
                    switch (serviceColumn) {
                    case Variable:
                        result = var.getVariable();
                        break;
                    case Value:
                        result = var.getValue();
                        break;
                    }
                }
            }
            return result;
        }

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

    }

    protected class VariableDialogue extends Dialog {

        private EnvironmentVariable envVar;

        private Text name;

        private Text value;

        public VariableDialogue(Shell shell, EnvironmentVariable envVar) {
            super(shell);
            this.envVar = new EnvironmentVariable();

            if (envVar != null) {
                this.envVar.setValue(envVar.getValue());
            }
            if (envVar != null) {
                this.envVar.setVariable(envVar.getVariable());
            }
        }

        public EnvironmentVariable getEnvironmentVariable() {
            return envVar;
        }

        @Override
        protected Control createButtonBar(Composite parent) {
            Control control = super.createButtonBar(parent);
            validate();
            return control;
        }

        protected void setValues(Control control) {
            if (control == null || control.isDisposed()) {
                return;
            }
            if (control == name) {
                envVar.setVariable(name.getText());
            } else if (control == value) {
                envVar.setValue(value.getText());
            }

            validate();
        }

        protected void validate() {
            Button okButton = getButton(IDialogConstants.OK_ID);
            if (okButton != null && !okButton.isDisposed()) {

                boolean isValid = !ValueValidationUtil.isEmpty(envVar.getValue())
                        && !ValueValidationUtil.isEmpty(envVar.getVariable());

                okButton.setEnabled(isValid);
            }
        }

        protected Control createDialogArea(Composite parent) {
            getShell().setText(Messages.EnvironmentVariablesPart_TEXT_DIALOG_TITLE);

            Composite control = (Composite) super.createDialogArea(parent);

            Composite composite = new Composite(control, SWT.NONE);
            GridDataFactory.fillDefaults().grab(false, false).applyTo(composite);
            GridLayoutFactory.fillDefaults().numColumns(1).applyTo(composite);

            Label nameLabel = new Label(composite, SWT.NONE);
            nameLabel.setText(Messages.COMMONTXT_NAME_WITH_COLON);
            GridDataFactory.fillDefaults().grab(false, false).align(SWT.FILL, SWT.FILL).hint(300, SWT.DEFAULT)
                    .applyTo(nameLabel);

            name = new Text(composite, SWT.BORDER);
            GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).hint(300, SWT.DEFAULT)
                    .applyTo(name);

            if (envVar != null && envVar.getVariable() != null) {
                name.setText(envVar.getVariable());
            }

            name.addModifyListener(new ModifyListener() {

                public void modifyText(ModifyEvent e) {
                    setValues(name);
                }
            });

            Label valueLabel = new Label(composite, SWT.NONE);
            valueLabel.setText(Messages.EnvironmentVariablesPart_TEXT_VALUE_LABEL);
            GridDataFactory.fillDefaults().grab(false, false).align(SWT.FILL, SWT.FILL).hint(300, SWT.DEFAULT)
                    .applyTo(valueLabel);

            value = new Text(composite, SWT.BORDER);
            GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.FILL).hint(300, SWT.DEFAULT)
                    .applyTo(value);

            if (envVar != null && envVar.getValue() != null) {
                value.setText(envVar.getValue());
            }

            value.addModifyListener(new ModifyListener() {

                public void modifyText(ModifyEvent e) {
                    setValues(value);
                }
            });

            validate();

            return control;
        }

    }

}