org.eclipse.rcptt.ui.launching.ScenariosLaunchTab.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.rcptt.ui.launching.ScenariosLaunchTab.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2015 Xored Software Inc and others.
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.rcptt.ui.launching;

import static com.google.common.collect.Iterables.concat;
import static com.google.common.collect.Iterables.toArray;
import static java.util.Arrays.asList;

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

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import org.eclipse.rcptt.core.model.IQ7Element;
import org.eclipse.rcptt.core.model.IQ7NamedElement;
import org.eclipse.rcptt.core.model.ITestCase;
import org.eclipse.rcptt.core.model.search.AllProjectScope;
import org.eclipse.rcptt.core.model.search.Q7SearchCore;
import org.eclipse.rcptt.core.workspace.RcpttCore;
import org.eclipse.rcptt.internal.core.model.OneProjectScope;
import org.eclipse.rcptt.internal.launching.Q7LaunchingPlugin;
import org.eclipse.rcptt.internal.ui.Images;
import org.eclipse.rcptt.internal.ui.Messages;
import org.eclipse.rcptt.launching.Aut;
import org.eclipse.rcptt.launching.AutManager;
import org.eclipse.rcptt.launching.IQ7Launch;
import org.eclipse.rcptt.launching.Q7Launcher;
import org.eclipse.rcptt.launching.utils.TestSuiteUtils;
import org.eclipse.rcptt.ui.commons.ColumnViewerSorter;
import org.eclipse.rcptt.ui.controls.TestSuiteButtonsPanel;
import org.eclipse.rcptt.ui.utils.ModelUtils;

public class ScenariosLaunchTab extends AbstractLaunchConfigurationTab {
    private static final String NOTHING_SELECTED = "";

    private TableViewer viewer;
    private ComboViewer autCombo;

    private final List<ITableElement> elements = new ArrayList<ITableElement>();

    TestSuiteButtonsPanel testSuiteButtonsPanel;

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse
     * .swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        setControl(composite);

        GridLayout topLayout = new GridLayout();
        topLayout.numColumns = 2;
        composite.setLayout(topLayout);

        createSuitTable(composite);
        createPanel(composite);
        validatePage();
    }

    private void createSuitTable(Composite parent) {
        viewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
        GridData tableGridData = new GridData(GridData.FILL_BOTH);
        tableGridData.widthHint = 1;
        viewer.getTable().setLayoutData(tableGridData);
        viewer.getTable().setLinesVisible(true);
        viewer.getTable().setHeaderVisible(true);
        viewer.setContentProvider(new TableContentProvider());
        createTableColumns();
    }

    private void createTableColumns() {
        final TableViewerColumn columnTestCase = new TableViewerColumn(viewer, SWT.NONE);
        columnTestCase.getColumn().setText(Messages.ScenariosLaunchTab_ColumnTestCaseText);
        columnTestCase.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public Image getImage(Object element) {
                return ((NamedTableElement) element).getImage();
            }

            @Override
            public String getText(Object element) {
                return ((NamedTableElement) element).getText();
            }
        });

        final TableViewerColumn columnLocation = new TableViewerColumn(viewer, SWT.NONE);
        columnLocation.getColumn().setText(Messages.ScenariosLaunchTab_ColumnLocationText);
        columnLocation.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                return ((NamedTableElement) element).getPath();
            }
        });

        viewer.getTable().addControlListener(new ControlAdapter() {
            @Override
            public void controlResized(ControlEvent e) {
                int width = viewer.getTable().getClientArea().width;
                int testCaseColWidth = columnTestCase.getColumn().getWidth();
                int locationColWidth = columnLocation.getColumn().getWidth();
                double ratio = 0.5;
                if (testCaseColWidth != 0 && locationColWidth != 0) {
                    ratio = (double) testCaseColWidth / (testCaseColWidth + locationColWidth);
                }
                columnTestCase.getColumn().setWidth((int) (width * ratio));
                columnLocation.getColumn().setWidth((int) (width * (1 - ratio)));
            }
        });

        new ColumnViewerSorter(viewer, columnTestCase) {

            @Override
            protected int doCompare(Viewer viewer, Object element1, Object element2) {
                NamedTableElement named1 = (NamedTableElement) element1;
                NamedTableElement named2 = (NamedTableElement) element2;
                return named1.getText().compareToIgnoreCase(named2.getText());
            }

            @Override
            protected void afterSort() {
                reorderSourceList();
            }

        };

        new ColumnViewerSorter(viewer, columnLocation) {

            @Override
            protected int doCompare(Viewer viewer, Object element1, Object element2) {
                NamedTableElement named1 = (NamedTableElement) element1;
                NamedTableElement named2 = (NamedTableElement) element2;
                return named1.getPath().compareToIgnoreCase(named2.getPath());
            }

            @Override
            protected void afterSort() {
                reorderSourceList();
            }

        };

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                testSuiteButtonsPanel.updateButtons(viewer);
            }
        });
    }

    private void createPanel(Composite parent) {
        testSuiteButtonsPanel = new TestSuiteButtonsPanel(parent, false);

        testSuiteButtonsPanel.getAddTestCaseBtn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                addTestCase();
            }
        });

        testSuiteButtonsPanel.getAddFolderBtn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                addFolder();
            }
        });

        testSuiteButtonsPanel.getRemoveBtn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                removeSelected();
            }
        });

        testSuiteButtonsPanel.getRemoveAllBtn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                removeAll();
            }
        });

        testSuiteButtonsPanel.getMoveUpBtn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveUp();
            }
        });

        testSuiteButtonsPanel.getMoveDownBtn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveDown();
            }
        });

        testSuiteButtonsPanel.getAddTaggedBtn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                addTagged();
            }
        });

        new Label(testSuiteButtonsPanel, SWT.HORIZONTAL | SWT.SEPARATOR);
        //TODO: make the label closer to combo
        Label label = new Label(testSuiteButtonsPanel, SWT.BOTTOM);
        label.setText("AUT:");
        autCombo = createAutCombo(testSuiteButtonsPanel);

    }

    private ComboViewer createAutCombo(Composite parent) {
        ComboViewer autCombo = new ComboViewer(parent);
        autCombo.setContentProvider(new ArrayContentProvider());
        autCombo.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof Aut) {
                    return ((Aut) element).getName();
                }
                return super.getText(element);
            }
        });
        autCombo.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                updateLaunchConfigurationDialog();
            }
        });
        autCombo.setInput(toArray(concat(asList(NOTHING_SELECTED), AutManager.INSTANCE.getAuts()), Object.class));
        return autCombo;
    }

    private void addTestCase() {
        List<IQ7NamedElement> excluded = new ArrayList<IQ7NamedElement>();
        for (ITableElement element : elements) {
            excluded.add(element.getElement());
        }
        IQ7NamedElement[] selected = TestSuiteButtonsPanel.selectTestCase(new AllProjectScope(), excluded, true);
        for (int i = 0; i < selected.length; i++) {
            elements.add(new NamedTableElement(selected[i]));
        }
        sourceListChanged();
    }

    private void addFolder() {
        IContainer container = TestSuiteButtonsPanel.selectFolder();

        if (container != null) {
            IPath fullPath = container.getFullPath();
            IQ7NamedElement[] allElements = Q7SearchCore
                    .findAllElements(new OneProjectScope(RcpttCore.create(container.getProject())));

            for (int i = 0; i < allElements.length; i++) {
                IQ7NamedElement el = allElements[i];
                if (el instanceof ITestCase && fullPath.isPrefixOf(el.getPath())) {
                    if (!isElementInList(el)) {
                        elements.add(new NamedTableElement(el));
                    }
                }
            }
        }
        sourceListChanged();
    }

    private void addTagged() {
        List<IQ7NamedElement> excluded = new ArrayList<IQ7NamedElement>();
        for (ITableElement element : elements) {
            excluded.add(element.getElement());
        }

        IQ7NamedElement[] filteredByTags = TestSuiteButtonsPanel.selectTags(new AllProjectScope(), excluded, true);
        for (int i = 0; i < filteredByTags.length; i++) {
            elements.add(new NamedTableElement(filteredByTags[i]));
        }

        sourceListChanged();
    }

    private void removeSelected() {
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
        List<?> selectedElements = selection.toList();
        elements.removeAll(selectedElements);
        sourceListChanged();
    }

    private void removeAll() {
        elements.clear();
        sourceListChanged();
    }

    private void moveUp() {
        resetTableSort();
        Table table = viewer.getTable();
        int indices[] = table.getSelectionIndices();
        int newSelection[] = new int[indices.length];
        for (int i = 0; i < indices.length; i++) {
            int index = indices[i];
            if (index > 0) {
                swapElements(index, index - 1);
                newSelection[i] = index - 1;
            } else if (index == 0) {
                newSelection[i] = 0;
            }
        }
        sourceListChanged();
        table.setSelection(newSelection);
        testSuiteButtonsPanel.updateButtons(viewer);
    }

    private void moveDown() {
        resetTableSort();
        Table table = viewer.getTable();
        int[] indices = table.getSelectionIndices();
        if (indices.length < 1) {
            return;
        }
        int newSelection[] = new int[indices.length];
        int max = table.getItemCount() - 1;
        for (int i = indices.length - 1; i >= 0; i--) {
            int index = indices[i];
            if (index < max) {
                swapElements(index, index + 1);
                newSelection[i] = index + 1;
            } else if (index == max) {
                newSelection[i] = max;
            }
        }
        sourceListChanged();
        table.setSelection(newSelection);
        testSuiteButtonsPanel.updateButtons(viewer);
    }

    private void swapElements(int a, int b) {
        ITableElement aElement = elements.get(a);
        ITableElement bElement = elements.get(b);
        elements.set(a, bElement);
        elements.set(b, aElement);
    }

    private void resetTableSort() {
        viewer.getTable().setSortColumn(null);
        viewer.getTable().setSortDirection(ColumnViewerSorter.NONE);
        viewer.setSorter(null);
    }

    private void sourceListChanged() {
        viewer.refresh();
        validatePage();
        updateLaunchConfigurationDialog();
        testSuiteButtonsPanel.updateButtons(viewer);
    }

    private void reorderSourceList() {
        elements.clear();
        for (int i = 0; i < viewer.getTable().getItemCount(); i++) {
            elements.add((ITableElement) viewer.getElementAt(i));
        }
        validatePage();
        updateLaunchConfigurationDialog();
    }

    private boolean isElementInList(IQ7NamedElement namedElement) {
        if (namedElement == null) {
            return true;
        }
        for (ITableElement element : elements) {
            if (element.getElement().equals(namedElement)) {
                return true;
            }
        }
        return false;
    }

    private void buildElements(IResource[] resources) {
        elements.clear();
        if (resources != null) {
            for (IResource resource : resources) {
                if (resource != null && resource.exists()) {
                    try {
                        ITableElement element = buildElement(resource);
                        if (element != null) {
                            elements.add(element);
                        }
                    } catch (Exception e) {
                        // ignore exceptions
                    }
                }
            }
        }
        viewer.setInput(elements);
        testSuiteButtonsPanel.updateButtons(viewer);
    }

    private ITableElement buildElement(IResource res) {
        try {
            if (res instanceof IFile) {
                IFile file = (IFile) res;
                IQ7Element element = RcpttCore.create(file);
                if (element != null && element instanceof IQ7NamedElement) {
                    return new NamedTableElement((IQ7NamedElement) element);
                }
            }
        } catch (Exception e) {
            // any exceptions mean there is no tree elements
        }
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse
     * .debug.core.ILaunchConfiguration)
     */
    public void initializeFrom(ILaunchConfiguration config) {
        IResource[] resources = null;
        Aut aut = null;
        try {
            int resourceCount = config.getAttribute(IQ7Launch.EXEC_RESOURCES, -1);
            resources = config.getMappedResources();
            if (resourceCount > 0) {
                IResource[] subarray = new IResource[resourceCount];
                System.arraycopy(resources, 0, subarray, 0, Math.min(resourceCount, resources.length));
                resources = subarray;
            }
            String autName = config.getAttribute(IQ7Launch.ATTR_BOUND_AUT_NAME, "");
            aut = AutManager.INSTANCE.getByName(autName);
        } catch (CoreException e) {
            Q7LaunchingPlugin.log(e);
        }
        buildElements(resources);
        setSelectedAut(aut);
        validatePage();
    }

    private void setSelectedAut(Aut aut) {
        Object toSelect = aut;
        if (toSelect == null)
            toSelect = NOTHING_SELECTED;
        autCombo.setSelection(new StructuredSelection(toSelect));
    }

    private Aut getSelectedAut() {
        if (autCombo == null)
            return null;
        IStructuredSelection selection = (IStructuredSelection) autCombo.getSelection();
        Object selected = selection.getFirstElement();
        if (selected instanceof Aut)
            return (Aut) selected;
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse
     * .debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void performApply(ILaunchConfigurationWorkingCopy config) {
        List<IResource> resources = new ArrayList<IResource>();
        for (ITableElement element : elements) {
            resources.add(element.getResource());
        }
        config.setMappedResources(resources.toArray(new IResource[resources.size()]));
        config.setAttribute(IQ7Launch.EXEC_RESOURCES, resources.size());
        // Set ATTR_NO_SORT to true to prevent sorting list in execution view
        config.setAttribute(IQ7Launch.ATTR_NO_SORT, true);
        Aut aut = getSelectedAut();
        config.setAttribute(IQ7Launch.ATTR_BOUND_AUT_NAME, aut == null ? null : aut.getName());
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
     */
    @Override
    public Image getImage() {
        return Images.getImage(Images.CONTEXT);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse
     * .debug.core.ILaunchConfiguration)
     */
    @Override
    public boolean isValid(ILaunchConfiguration config) {
        validatePage();
        return getErrorMessage() == null;
    }

    private void validatePage() {
        setErrorMessage(null);
        setMessage(null);

        if (viewer.getTable().getItemCount() == 0) {
            setErrorMessage(Messages.ScenariosLaunchTab_NothingSelectedMsg);
            return;
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.
     * debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void setDefaults(ILaunchConfigurationWorkingCopy config) {
        IResource[] resources = LaunchUtils.getContext();
        IQ7NamedElement[] elements = TestSuiteUtils.getElements(resources, false);
        String name = Q7Launcher.getLaunchName(elements);
        config.setMappedResources(resources);
        initializeName(config, name);
        config.setAttribute(IQ7Launch.ATTR_NO_SORT, true);
        config.setAttribute(IQ7Launch.ATTR_AUT_NAME, "");
    }

    private void initializeName(ILaunchConfigurationWorkingCopy config, String name) {
        int index = name.lastIndexOf('.');
        if (index > 0) {
            name = name.substring(index + 1);
        }
        name = getLaunchConfigurationDialog().generateName(name);
        config.rename(name);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
     */
    public String getName() {
        return Messages.ScenariosLaunchTab_Name;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
     */
    @Override
    public String getId() {
        return "org.eclipse.rcptt.ui.launching.ScenariosLaunchTab"; //$NON-NLS-1$
    }

    private final WorkbenchLabelProvider wbLabelProvider = new WorkbenchLabelProvider();

    @Override
    public void dispose() {
        super.dispose();
        wbLabelProvider.dispose();
    }

    private class TableContentProvider implements IStructuredContentProvider {

        public void dispose() {
        }

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

        public Object[] getElements(Object inputElement) {
            if (inputElement instanceof List<?>) {
                return ((List<?>) inputElement).toArray();
            }

            return ITableElement.EMPTY;
        }
    }

    private interface ITableElement {

        public static ITableElement[] EMPTY = new ITableElement[0];

        public IResource getResource();

        public IQ7NamedElement getElement();

        public Image getImage();

        public String getText();

        public String getPath();
    }

    private class NamedTableElement implements ITableElement {

        private final IQ7NamedElement element;

        public NamedTableElement(IQ7NamedElement element) {
            this.element = element;
        }

        public IResource getResource() {
            return element.getResource();
        }

        public IQ7NamedElement getElement() {
            return element;
        }

        public Image getImage() {
            return ModelUtils.getImage(element);
        }

        public String getText() {
            return ModelUtils.getText(element);
        }

        public String getPath() {
            return getResource().getProject().getName() + "/" //$NON-NLS-1$
                    + getResource().getProjectRelativePath().removeLastSegments(1).toString();
        }
    }
}