org.eclipse.ui.examples.statushandlers.testtool.views.StatusHandlingView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ui.examples.statushandlers.testtool.views.StatusHandlingView.java

Source

/*******************************************************************************
 * Copyright (c) 2005, 2007 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.examples.statushandlers.testtool.views;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
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.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.examples.statushandlers.testtool.Messages;
import org.eclipse.ui.part.ViewPart;

/**
 * A view dedicated to generating status (error.
 */
public class StatusHandlingView extends ViewPart {

    private static final String XML_EXTENSIONS = "*.xml"; //$NON-NLS-1$

    /**
     * This class is responsible for executing test sequence in the background
     */
    private final class TestBedSequenceJob extends Job {

        private TestBedSequenceJob() {
            super(Messages.StatusHandlingView_TestBedSequence);
        }

        protected IStatus run(IProgressMonitor monitor) {
            monitor.beginTask(Messages.StatusHandlingView_ExecutingTestBedSequence, executionList.size());
            for (int i = 0; i < executionList.size(); i++) {
                TestBedRunnable runnable = (TestBedRunnable) executionList.get(i);
                runnable.run();
                monitor.worked(1);
            }
            monitor.done();
            return Status.OK_STATUS;
        }
    }

    private final class RemoveSelectionAdapter extends SelectionAdapter {
        public void widgetSelected(SelectionEvent e) {
            removeSelectedFromExecutionList();
        }
    }

    static final class MoveDownSelectionAdapter extends SelectionAdapter {
        private TableViewer viewer;
        private List[] list;

        public MoveDownSelectionAdapter(TableViewer viewer, List[] list) {
            super();
            this.viewer = viewer;
            this.list = list;
        }

        public void widgetSelected(SelectionEvent e) {
            int index = viewer.getTable().getSelectionIndex();
            list[0].add(index + 1, list[0].remove(index));
            viewer.getTable().setSelection(index + 1);
            viewer.refresh();
        }
    }

    static final class MoveUpSelectionAdapter extends SelectionAdapter {
        private TableViewer viewer;
        private List[] list;

        public MoveUpSelectionAdapter(TableViewer viewer, List[] list) {
            super();
            this.viewer = viewer;
            this.list = list;
        }

        public void widgetSelected(SelectionEvent e) {
            int index = viewer.getTable().getSelectionIndex();
            list[0].add(index - 1, list[0].remove(index));
            viewer.getTable().setSelection(index - 1);
            viewer.refresh();
        }
    }

    private TestBedComponent components[] = new TestBedComponent[] { new JobsAndRunnablesComponent(),
            new ShowViewComponent(), new StatusHandlingComponent(), new SleepingComponent() };
    private TabFolder tabFolder;
    private TabItem firstTab;

    private TableViewer viewer;

    private final List executionList = Collections.synchronizedList(new ArrayList());
    private Button addButton;
    private Button executeButton;
    private Button removeButton;
    private Button exportButton;

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        parent.setLayout(new FillLayout());

        ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
        sc.setLayout(new FillLayout());

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

        tabFolder = new TabFolder(parent, SWT.NONE);
        tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));

        firstTab = createTab(components[0]);
        for (int i = 1; i < components.length; i++) {
            createTab(components[i]);
        }

        viewer = new TableViewer(parent, SWT.BORDER | SWT.MULTI);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        viewer.getTable().setLayoutData(gridData);
        viewer.setContentProvider(new IStructuredContentProvider() {

            public Object[] getElements(Object inputElement) {
                return executionList.toArray();
            }

            public void dispose() {
            }

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

            }

        });
        viewer.setInput(new Object[0]);
        getSite().setSelectionProvider(viewer);
        viewer.addPostSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                ISelection iSelection = event.getSelection();
                if (iSelection instanceof StructuredSelection) {
                    StructuredSelection selection = (StructuredSelection) iSelection;
                    TestBedRunnable runnable = (TestBedRunnable) selection.getFirstElement();
                    for (int i = 0; i < components.length; i++) {
                        if (components[i].accept(runnable)) {
                            tabFolder.setSelection(i);
                            break;
                        }
                    }
                }
            }

        });

        createPopMenu(viewer, new List[] { executionList }, new RemoveSelectionAdapter());

        Composite tabButtons = new Composite(parent, SWT.NONE);
        tabButtons.setLayout(new GridLayout(2, true));
        createExecuteButton(tabButtons);

        addButton = new Button(tabButtons, SWT.NONE);
        addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        addButton.setText(Messages.StatusHandlingView_AddToTheExecutionList);

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

        Button executeAll = new Button(listButtons, SWT.NONE);
        exportButton = new Button(listButtons, SWT.NONE);
        removeButton = new Button(listButtons, SWT.NONE);
        final Button importButton = new Button(listButtons, SWT.NONE);

        executeAll.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        executeAll.setText(Messages.StatusHandlingView_ExecuteAll);
        executeAll.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                Job job = new TestBedSequenceJob();
                job.schedule();
            }

        });

        removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        removeButton.setText(Messages.StatusHandlingView_Remove);
        removeButton.setEnabled(false);
        removeButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                removeSelectedFromExecutionList();
            }

        });

        exportButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        exportButton.setText(Messages.StatusHandlingView_Export);
        exportButton.setEnabled(false);
        exportButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                storeState();
            }
        });

        importButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        importButton.setText(Messages.StatusHandlingView_Import);
        importButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                restoreState();
                if (executionList.size() == 0) {
                    removeButton.setEnabled(false);
                    exportButton.setEnabled(false);
                } else {
                    removeButton.setEnabled(true);
                    exportButton.setEnabled(true);
                }
                viewer.refresh();
            }
        });

        addButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                int index = tabFolder.getSelectionIndex();
                TestBedRunnable runnable = components[index].getTestBedRunnable();
                executionList.add(runnable);
                viewer.refresh();
                removeButton.setEnabled(true);
                exportButton.setEnabled(true);
            }

        });

        sc.setMinSize(parent.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        sc.setContent(parent);
        sc.setExpandHorizontal(true);
        sc.setExpandVertical(true);

    }

    public static void createPopMenu(final TableViewer viewer, final List[] list, final SelectionAdapter remove) {
        Menu menu = new Menu(viewer.getControl().getShell(), SWT.POP_UP);
        viewer.getTable().setMenu(menu);

        final MenuItem upMenuItem = new MenuItem(menu, SWT.PUSH);
        upMenuItem.setText(Messages.StatusHandlingView_Up);
        upMenuItem.addSelectionListener(new MoveUpSelectionAdapter(viewer, list));

        final MenuItem downMenuItem = new MenuItem(menu, SWT.PUSH);
        downMenuItem.setText(Messages.StatusHandlingView_Down);
        downMenuItem.addSelectionListener(new MoveDownSelectionAdapter(viewer, list));

        final MenuItem deleteMenuItem = new MenuItem(menu, SWT.PUSH);
        deleteMenuItem.setText(Messages.StatusHandlingView_Delete);
        deleteMenuItem.addSelectionListener(remove);

        menu.addListener(SWT.Show, new Listener() {

            public void handleEvent(Event event) {
                if (viewer.getTable().getItems().length > 1
                        && viewer.getTable().getSelectionIndices().length == 1) {
                    if (viewer.getTable().getSelectionIndex() == 0) {
                        upMenuItem.setEnabled(false);
                        downMenuItem.setEnabled(true);
                    } else if (viewer.getTable().getSelectionIndex() == viewer.getTable().getItems().length - 1) {
                        upMenuItem.setEnabled(true);
                        downMenuItem.setEnabled(false);
                    } else {
                        upMenuItem.setEnabled(true);
                        downMenuItem.setEnabled(true);
                    }
                } else {
                    upMenuItem.setEnabled(false);
                    downMenuItem.setEnabled(false);
                }
                deleteMenuItem.setEnabled(viewer.getTable().getItems().length != 0);
            }

        });
    }

    private void createExecuteButton(Composite parent) {
        executeButton = new Button(parent, SWT.PUSH);
        executeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        executeButton.setText(Messages.StatusHandlingView_ExecuteTab);
        executeButton.setToolTipText(Messages.StatusHandlingView_ExecuteTabTooltip);
        executeButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                int index = tabFolder.getSelectionIndex();
                TestBedRunnable runnable = components[index].getTestBedRunnable();
                runnable.run();
            }

        });
    }

    private TabItem createTab(TestBedComponent component) {
        Composite composite = component.createComposite(tabFolder);
        TabItem tab = new TabItem(tabFolder, SWT.NONE);
        tab.setControl(composite);
        tab.setText(component.getName());
        return tab;
    }

    public void setFocus() {
        tabFolder.setSelection(firstTab);
    }

    private void storeState() {
        try {
            FileDialog fd = new FileDialog(tabFolder.getShell(), SWT.SAVE);
            fd.setText(Messages.StatusHandlingView_SaveDialogTitle);
            fd.setFilterExtensions(new String[] { XML_EXTENSIONS });
            String path = fd.open();
            if (path == null)
                return;
            BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path)));
            XMLMemento memento = XMLMemento.createWriteRoot("runnables"); //$NON-NLS-1$
            for (int i = 0; i < executionList.size(); i++) {
                TestBedRunnable runnable = (TestBedRunnable) executionList.get(i);
                runnable.save(memento);
            }
            memento.save(bw);
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void restoreState() {
        try {
            FileDialog fd = new FileDialog(tabFolder.getShell(), SWT.OPEN);
            fd.setText(Messages.StatusHandlingView_LoadDialogTitle);
            fd.setFilterExtensions(new String[] { XML_EXTENSIONS });
            String path = fd.open();
            if (path == null)
                return;
            executionList.clear();
            BufferedReader br = new BufferedReader(new FileReader(new File(path)));
            XMLMemento memento = XMLMemento.createReadRoot(br);
            IMemento children[] = memento.getChildren(TestBedRunnable.TEST_BED_RUNNABLE);
            for (int i = 0; i < children.length; i++) {
                executionList.add(TestBedRunnable.restore(children[i]));
            }
        } catch (IOException e) {
            executionList.clear();
            viewer.refresh();
            e.printStackTrace();
        } catch (WorkbenchException e) {
            executionList.clear();
            viewer.refresh();
            e.printStackTrace();
        }
    }

    private void removeSelectedFromExecutionList() {
        int indices[] = viewer.getTable().getSelectionIndices();
        for (int i = indices.length; i > 0; i--) {
            executionList.remove(indices[i - 1]);
        }
        if (executionList.size() == 0) {
            removeButton.setEnabled(false);
            exportButton.setEnabled(false);
        }
        viewer.refresh();
    }
}