org.talend.designer.runprocess.ui.JobVMArgumentsComposite.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.designer.runprocess.ui.JobVMArgumentsComposite.java

Source

// ============================================================================
//
// Copyright (C) 2006-2015 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.runprocess.ui;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.gef.commands.Command;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.model.process.IProcess;
import org.talend.core.model.process.IProcess2;
import org.talend.core.ui.CoreUIPlugin;
import org.talend.core.ui.process.IGEFProcess;
import org.talend.core.ui.services.IDesignerCoreUIService;
import org.talend.designer.core.model.components.EParameterName;
import org.talend.designer.core.ui.editor.cmd.PropertyChangeCommand;
import org.talend.designer.runprocess.RunProcessContext;
import org.talend.designer.runprocess.RunProcessPlugin;
import org.talend.designer.runprocess.i18n.Messages;
import org.talend.designer.runprocess.prefs.RunProcessPrefsConstants;

/**
 * gcui class global comment. Detailled comment <br/>
 * 
 */
public class JobVMArgumentsComposite {

    private static final List<String> EMPTY_STRING_LIST = Collections.unmodifiableList(new ArrayList<String>());

    protected TableViewer viewer;

    private List<String> list = new ArrayList<String>();

    private Composite buttonBox;

    protected Button addButton;

    protected Button removeButton;

    protected Button upButton;

    protected Button downButton;

    protected Button checkBox;

    private RunProcessContext processContext;

    private SelectionListener selectionListener;

    /**
     * DOC gcui RunVMArgumentsViewer constructor comment.
     * 
     * @param name
     * @param labelText
     * @param parent
     */
    public JobVMArgumentsComposite(String name, String labelText, Composite parent) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(labelText);

        checkBox = new Button(parent, SWT.CHECK);
        checkBox.setText(EParameterName.JOB_RUN_VM_ARGUMENTS_OPTION.getDisplayName());
        final Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = getNumberOfControls();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.horizontalSpacing = 8;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        doFillIntoGrid(composite, layout.numColumns);
        composite.setEnabled(false);
        checkBox.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                setAllEnabled(composite, checkBox.isEnabled() && checkBox.getSelection());
                if (getJobProcess() != null) {
                    executeCommand(new PropertyChangeCommand(getJobProcess(),
                            EParameterName.JOB_RUN_VM_ARGUMENTS_OPTION.getName(), checkBox.getSelection()));
                }
            }

        });

    }

    private void setAllEnabled(Composite parent, boolean enabled) {
        setControlEnable(parent, enabled);
        if (viewer != null) {
            setControlEnable(viewer.getTable(), enabled);
            if (parent == null) {
                setControlEnable(viewer.getTable().getParent(), enabled);
            }
        }

        setControlEnable(addButton, enabled);
        setControlEnable(removeButton, enabled);
        setControlEnable(upButton, enabled);
        setControlEnable(downButton, enabled);
        selectionChanged();
    }

    protected void doFillIntoGrid(Composite parent, int numColumns) {
        GridData gd = new GridData();
        gd.horizontalSpan = numColumns;

        viewer = getTableControl(parent);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.verticalAlignment = GridData.FILL;
        gd.horizontalSpan = numColumns - 1;
        gd.grabExcessHorizontalSpace = true;
        viewer.getTable().setLayoutData(gd);

        buttonBox = getButtonBoxControl(parent);
        gd = new GridData();
        gd.verticalAlignment = GridData.BEGINNING;
        buttonBox.setLayoutData(gd);
    }

    /**
     * Returns this field editor's button box containing the Add, Remove, Up, and Down button.
     * 
     * @param parent the parent control
     * @return the button box
     */
    public Composite getButtonBoxControl(Composite parent) {
        if (buttonBox == null) {
            buttonBox = new Composite(parent, SWT.NULL);
            GridLayout layout = new GridLayout();
            layout.marginWidth = 0;
            buttonBox.setLayout(layout);
            GridData layoutData = new GridData();
            layoutData.widthHint = 100;
            layoutData.minimumWidth = 100;
            buttonBox.setLayoutData(layoutData);
            createButtons(buttonBox);
            buttonBox.addDisposeListener(new DisposeListener() {

                @Override
                public void widgetDisposed(DisposeEvent event) {
                    addButton = null;
                    removeButton = null;
                    upButton = null;
                    downButton = null;
                    buttonBox = null;
                }
            });

        }
        selectionChanged();
        return buttonBox;
    }

    protected void createButtons(Composite box) {
        // addButton = createPushButton(box, WorkingSetMessages.WorkingSetConfigurationDialog_new_label);
        addButton = createPushButton(box, Messages.getString("WorkingSetConfigurationDialog_new_label")); //$NON-NLS-1$
        addButton.setEnabled(false);
        // removeButton = createPushButton(box, WorkingSetMessages.WorkingSetConfigurationDialog_remove_label);
        removeButton = createPushButton(box, Messages.getString("WorkingSetConfigurationDialog_remove_label")); //$NON-NLS-1$
        removeButton.setEnabled(false);
        // upButton = createPushButton(box, WorkingSetMessages.WorkingSetConfigurationDialog_up_label);
        upButton = createPushButton(box, Messages.getString("WorkingSetConfigurationDialog_up_label")); //$NON-NLS-1$
        upButton.setEnabled(false);
        // downButton = createPushButton(box, WorkingSetMessages.WorkingSetConfigurationDialog_down_label);
        downButton = createPushButton(box, Messages.getString("WorkingSetConfigurationDialog_down_label")); //$NON-NLS-1$
        downButton.setEnabled(false);
    }

    protected Button createPushButton(Composite parent, String key) {
        Button button = new Button(parent, SWT.PUSH);
        button.setText(key);
        button.setFont(parent.getFont());
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        button.setLayoutData(data);
        button.addSelectionListener(getSelectionListener());
        return button;
    }

    private void addPressed() {
        String input = getNewInputObject();
        if (input != null) {
            int index = viewer.getTable().getSelectionIndex();
            if (index >= 0) {
                list.add(index + 1, input);
            } else {
                list.add(input);
            }
            viewer.refresh();
            doSave();
            selectionChanged();
        }
    }

    private void removePressed() {
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
        if (selection.isEmpty()) {
            return;
        }
        for (Object obj : selection.toArray()) {
            list.remove(obj);
        }
        viewer.refresh();
        doSave();
        selectionChanged();
    }

    private void upPressed() {
        swap(true);
    }

    private void downPressed() {
        swap(false);
    }

    private void swap(boolean up) {
        int index = viewer.getTable().getSelectionIndex();
        int target = up ? index - 1 : index + 1;

        if (index >= 0) {
            Collections.swap(list, index, target);
        }
        viewer.refresh();
        doSave();
        selectionChanged();
    }

    protected void selectionChanged() {
        if (viewer != null) {
            int index = viewer.getTable().getSelectionIndex();
            int size = viewer.getTable().getItemCount();
            setControlEnable(removeButton, index >= 0);
            setControlEnable(upButton, size > 1 && index > 0);
            setControlEnable(downButton, size > 1 && index >= 0 && index < size - 1);
        }
    }

    /**
     * Creates a selection listener.
     */
    public void createSelectionListener() {
        selectionListener = new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent event) {
                Widget widget = event.widget;
                if (widget == addButton) {
                    addPressed();
                } else if (widget == removeButton) {
                    removePressed();
                } else if (widget == upButton) {
                    upPressed();
                } else if (widget == downButton) {
                    downPressed();
                } else if (widget == viewer.getTable()) {
                    selectionChanged();
                }
            }
        };
    }

    protected void doSave() {
        String s = writeString(list);
        if (s != null && getJobProcess() != null) {
            executeCommand(
                    new PropertyChangeCommand(getJobProcess(), EParameterName.JOB_RUN_VM_ARGUMENTS.getName(), s));
        }
    }

    private IProcess getJobProcess() {
        if (getProcessContext() != null) {
            return getProcessContext().getProcess();
        }
        return null;
    }

    private void executeCommand(Command cmd) {
        boolean executed = false;
        if (processContext != null && processContext.getProcess() instanceof IProcess2) {
            IProcess2 process = processContext.getProcess();
            if (process != null && process instanceof IGEFProcess) {
                IDesignerCoreUIService designerCoreUIService = CoreUIPlugin.getDefault().getDesignerCoreUIService();
                if (designerCoreUIService != null) {
                    executed = designerCoreUIService.executeCommand((IGEFProcess) process, cmd);
                }
            }
        }

        if (!executed) {
            cmd.execute();
        }
    }

    /**
     * Returns this field editor's list control.
     * 
     * @param parent the parent control
     * @return the list control
     */
    protected TableViewer getTableControl(Composite parent) {
        if (viewer == null) {
            Table table = createTable(parent);
            viewer = new TableViewer(table);
            viewer.setContentProvider(createContentProvider());
            viewer.setLabelProvider(createLabelProvider());
            table.setFont(parent.getFont());
            viewer.addSelectionChangedListener(new ISelectionChangedListener() {

                @Override
                public void selectionChanged(SelectionChangedEvent event) {
                    JobVMArgumentsComposite.this.selectionChanged();
                }
            });
            viewer.addDoubleClickListener(new IDoubleClickListener() {

                @Override
                public void doubleClick(DoubleClickEvent event) {
                    editItem(event.getSelection());
                }
            });
        }
        // doLoadDefault();
        return viewer;
    }

    protected void editItem(ISelection sel) {
        IStructuredSelection selection = (IStructuredSelection) sel;
        String existing = (String) selection.getFirstElement();
        String value = getExistingInputObject(existing.replace(" ", ""));
        if (value != null) {
            int indexOf = list.indexOf(existing);
            list.remove(existing);
            list.add(indexOf, value);
            viewer.refresh();
            doSave();
        }
    }

    public int getNumberOfControls() {
        return 2;
    }

    /**
     * Returns this field editor's selection listener. The listener is created if nessessary.
     * 
     * @return the selection listener
     */
    private SelectionListener getSelectionListener() {
        if (selectionListener == null) {
            createSelectionListener();
        }
        return selectionListener;
    }

    protected Shell getShell() {
        if (addButton == null) {
            return null;
        }
        return addButton.getShell();
    }

    protected void setControlEnable(Control control, boolean enable) {
        if (control != null && !control.isDisposed()) {
            control.setEnabled(enable);
        }
    }

    /**
     * Getter for list.
     * 
     * @return the list
     */
    public List<String> getList() {
        return this.list;
    }

    public RunProcessContext getProcessContext() {
        return this.processContext;
    }

    public void setProcessContext(RunProcessContext processContext) {
        this.processContext = processContext;
        list.clear();
        if (getProcessContext() != null && getJobProcess() != null) {
            checkBox.setEnabled(!this.processContext.getProcess().isReadOnly());
            if (checkBox != null && !checkBox.isDisposed()) {
                IElementParameter param = getJobProcess()
                        .getElementParameter(EParameterName.JOB_RUN_VM_ARGUMENTS_OPTION.getName());
                if (param != null && param.getValue() instanceof Boolean && (Boolean) param.getValue()) { // checked
                    checkBox.setSelection(true);
                } else {
                    checkBox.setSelection(false);
                }
                setAllEnabled(null, checkBox.isEnabled() && checkBox.getSelection());
            }
            if (viewer != null && !viewer.getTable().isDisposed()) {
                String vmarguments = "";
                if (!checkBox.getSelection()) {
                    vmarguments = RunProcessPlugin.getDefault().getPreferenceStore()
                            .getString(RunProcessPrefsConstants.VMARGUMENTS);
                } else {
                    IElementParameter param = getJobProcess()
                            .getElementParameter(EParameterName.JOB_RUN_VM_ARGUMENTS.getName());
                    if (param != null && param.getValue() != null) {
                        vmarguments = (String) param.getValue();
                    }
                }
                if (vmarguments != null && !"".equals(vmarguments)) { //$NON-NLS-1$
                    for (String tmp : readString(vmarguments)) {
                        list.add(tmp);
                    }
                }
            }
        } else {
            if (checkBox != null && !checkBox.isDisposed()) {
                checkBox.setSelection(false);
                setAllEnabled(null, checkBox.isEnabled() && checkBox.getSelection());
            }
        }
        viewer.setInput(list);
    }

    protected IStructuredContentProvider createContentProvider() {
        return new IStructuredContentProvider() {

            @Override
            public Object[] getElements(Object inputElement) {
                return ((List) inputElement).toArray();
            }

            @Override
            public void dispose() {
            }

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

        };
    }

    protected ITableLabelProvider createLabelProvider() {
        return new ITableLabelProvider() {

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

            @Override
            public String getColumnText(Object element, int columnIndex) {
                String value = ((String) element);
                if (columnIndex == 0) {
                    return value.replace(" ", "");
                }
                throw new IllegalStateException();
            }

            @Override
            public void addListener(ILabelProviderListener listener) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            @Override
            public void removeListener(ILabelProviderListener listener) {
            }

        };
    }

    protected Table createTable(Composite parent) {
        Table contextTable = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION);
        contextTable.setLinesVisible(true);
        contextTable.setHeaderVisible(true);

        TableColumn engineName = new TableColumn(contextTable, SWT.NONE);
        engineName.setText(Messages.getString("VMArgumentsViewer.argument")); //$NON-NLS-1$
        engineName.setWidth(200);
        return contextTable;
    }

    protected String getExistingInputObject(String obj) {
        VMArgumentDialog dialog = new VMArgumentDialog(getShell(), obj);
        if (dialog.open() == Dialog.OK) {
            return dialog.getNewItem();
        }
        return obj;
    }

    protected String getNewInputObject() {
        VMArgumentDialog dialog = new VMArgumentDialog(getShell(), null);
        if (dialog.open() == Dialog.OK) {
            return dialog.getNewItem();
        }
        return null;
    }

    protected List<String> readString(String stringList) {
        if (stringList == null || "".equals(stringList)) { //$NON-NLS-1$        
            return EMPTY_STRING_LIST;
        }
        ArrayList<String> result = new ArrayList<String>(50);
        for (String tmp : stringList.split(" ")) {
            if (tmp != null && !"".equals(tmp)) { //$NON-NLS-1$
                result.add(tmp);
            }
        }
        return result;
    }

    protected String writeString(List<String> items) {
        int size = items.size();
        StringBuffer buf = new StringBuffer(size * 50);
        buf.append(" ");
        for (int i = 0; i < size; i++) {
            buf.append(items.get(i).trim().replaceAll(" ", ""));
            buf.append(" "); //$NON-NLS-1$
        }
        return buf.toString();
    }

    protected String getArgumentsString() {
        String argumentsString = writeString(getList());

        return argumentsString;
    }

    /**
     * DOC gcui RunVMArgumentsViewer class global comment. Detailled comment
     */
    class VMArgumentDialog extends Dialog {

        private Text argText;

        private final String arg;

        private String newItem;

        /**
         * DOC gcui VMArgumentDialog constructor comment.
         * 
         * @param parentShell
         * @param item
         */
        protected VMArgumentDialog(Shell parentShell, String item) {
            super(parentShell);
            if (item == null || "".equals(item)) { //$NON-NLS-1$
                arg = ""; //$NON-NLS-1$
            } else {
                arg = item;
            }
            setShellStyle(getShellStyle() | SWT.RESIZE | SWT.DIALOG_TRIM | SWT.MIN | SWT.MAX);
        }

        @Override
        protected void configureShell(Shell newShell) {
            super.configureShell(newShell);
            newShell.setText(Messages.getString("VMArgumentsViewer.vmArgument")); //$NON-NLS-1$
        }

        @Override
        protected Control createDialogArea(Composite parent) {
            Composite container = (Composite) super.createDialogArea(parent);
            container.setLayout(new GridLayout(2, false));
            Label addLabel = new Label(container, SWT.NONE);
            addLabel.setText(Messages.getString("VMArgumentsViewer.argumentcolon")); //$NON-NLS-1$
            argText = new Text(container, SWT.BORDER);
            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.heightHint = 50;
            gridData.widthHint = 200;
            argText.setLayoutData(gridData);
            argText.setText(arg);

            return container;
        }

        @Override
        protected void okPressed() {
            newItem = argText.getText();
            super.okPressed();
        }

        public String getNewItem() {
            return newItem;
        }
    }
}