org.cheetahplatform.tdm.explorer.TDMProjectExplorerView.java Source code

Java tutorial

Introduction

Here is the source code for org.cheetahplatform.tdm.explorer.TDMProjectExplorerView.java

Source

/*******************************************************************************
 * This file is provided under the terms of the Eclipse Public License 1.0. 
 * Any use, reproduction or distribution of the program
 * constitutes recipient's acceptance of this agreement.
 *******************************************************************************/
package org.cheetahplatform.tdm.explorer;

import static org.cheetahplatform.core.service.SimpleCheetahServiceLookup.NAMESPACE_WORKSPACE;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import org.cheetahplatform.common.logging.AuditTrailEntry;
import org.cheetahplatform.common.logging.IPromLogger;
import org.cheetahplatform.common.ui.SelectionSensitiveAction;
import org.cheetahplatform.core.common.IIdentifiableObject;
import org.cheetahplatform.core.service.Services;
import org.cheetahplatform.modeler.Activator;
import org.cheetahplatform.modeler.configuration.CheetahPlatformConfigurator;
import org.cheetahplatform.modeler.configuration.IConfiguration;
import org.cheetahplatform.tdm.command.TDMCommand;
import org.cheetahplatform.tdm.engine.ITDMStep;
import org.cheetahplatform.tdm.engine.ITestListener;
import org.cheetahplatform.tdm.engine.TDMProcess;
import org.cheetahplatform.tdm.engine.TDMTest;
import org.cheetahplatform.tdm.modeler.test.TDMTestEditor;
import org.cheetahplatform.tdm.modeler.test.TDMTestEditorInput;
import org.cheetahplatform.tdm.modeler.test.TDMTestWorkspace;
import org.cheetahplatform.tdm.problemview.ProblemView;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import com.swtdesigner.ResourceManager;

public class TDMProjectExplorerView extends ViewPart {
    private class AddTestAction extends Action {
        public AddTestAction() {
            setText("Create Test");
            setImageDescriptor(
                    ResourceManager.getPluginImageDescriptor(Activator.getDefault(), "img/tdm/add_test.png"));
        }

        @Override
        public void run() {
            addTest();
        }
    }

    private class EditTestNameAction extends SelectionSensitiveAction<TDMTest> {
        public EditTestNameAction() {
            super(composite.getTreeViewer(), TDMTest.class);
            setText("Edit Name");
            setImageDescriptor(ResourceManager.getPluginImageDescriptor(Activator.getDefault(), "img/rename.gif"));
        }

        @Override
        public void run() {
            TDMTest selection = getSelection();
            editName(selection);
        }
    }

    private class RemoveTestAction extends SelectionSensitiveAction<TDMTest> {

        public RemoveTestAction() {
            super(composite.getTreeViewer(), TDMTest.class);

            setText("Delete Test");
            setImageDescriptor(
                    ResourceManager.getPluginImageDescriptor(Activator.getDefault(), "img/tdm/remove_test.png"));
        }

        @Override
        public void run() {
            TDMTest selection = getSelection();
            if (!MessageDialog.openQuestion(getSite().getShell(), "Delete Test?",
                    "Do you really want to delete this test?")) {
                return;
            }

            removeTest(selection);
        }

    }

    private class TestListener implements ITestListener, PropertyChangeListener {

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if (evt.getPropertyName().equals(TDMCommand.ATTRIBUTE_TEST_NAME)) {
                composite.getTreeViewer().update(evt.getSource(), null);
            }
        }

        @Override
        public void testFailed(TDMTest tdmTest, List<ITDMStep> failures) {
            updateViewer(tdmTest);
        }

        @Override
        public void testPassed(TDMTest tdmTest) {
            updateViewer(tdmTest);
        }

    }

    public static final String ID = "org.cheetahplatform.tdd.views.TddProjectExplorer";
    private TDMProjectExplorerComposite composite;

    private TDMProjectExplorerModel model;
    private TestListener testListener;

    public TDMProjectExplorerView() {
        this.testListener = new TestListener();
    }

    private void addContextMenu() {
        final MenuManager manager = new MenuManager();
        manager.add(new AddTestAction());
        manager.add(new EditTestNameAction());
        manager.add(new RemoveTestAction());

        final Tree tree = composite.getTreeViewer().getTree();
        tree.addMenuDetectListener(new MenuDetectListener() {

            @Override
            public void menuDetected(MenuDetectEvent e) {
                tree.setMenu(manager.createContextMenu(tree));
            }
        });
    }

    public void addTest() {
        InputDialog dialog = new InputDialog(getSite().getShell(), "Test's name", "Please enter the test's name",
                "", null);
        if (dialog.open() != Window.OK) {
            return;
        }

        addTest(dialog.getValue(), IIdentifiableObject.NO_ID);
    }

    public void addTest(String testName, long id) {
        TDMTest test = model.addTest(testName, id);

        openNewTest(test);
    }

    public void addTest(TDMTest test) {
        model.addTest(test);

        openNewTest(test);
    }

    @Override
    public void createPartControl(Composite parent) {
        composite = new TDMProjectExplorerComposite(parent, SWT.NONE);
        model = new TDMProjectExplorerModel();

        TreeViewer viewer = composite.getTreeViewer();
        viewer.setContentProvider(model.createContentProvider());
        viewer.setLabelProvider(model.createLabelProvider());

        viewer.addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent event) {
                openTestEditor();
            }
        });

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                openTestEditor();
            }
        });

        if (CheetahPlatformConfigurator.getBoolean(IConfiguration.ALLOW_MODIFICATION_OF_TESTS)) {
            addContextMenu();
        }
    }

    protected void editName(TDMTest toEdit) {
        InputDialog dialog = new InputDialog(composite.getShell(), "Edit Name", "Please enter the test's name",
                toEdit.getName(), null);
        if (dialog.open() != Window.OK) {
            return;
        }

        AuditTrailEntry entry = new AuditTrailEntry(TDMCommand.COMMAND_EDIT_TEST_NAME);
        entry.setAttribute(TDMCommand.ATTRIBUTE_TEST_NAME, dialog.getValue());
        entry.setAttribute(TDMCommand.ATTRIBUTE_OLD_TEST_NAME, toEdit.getName());
        entry.setAttribute(TDMCommand.ATTRIBUTE_TEST_ID, toEdit.getCheetahId());
        model.log(entry);

        toEdit.setName(dialog.getValue());
    }

    public IPromLogger getLogger() {
        return model.getLogger();
    }

    protected void openNewTest(TDMTest test) {
        composite.getTreeViewer().refresh();
        composite.getTreeViewer().expandAll();
        openTestEditor(test);
        test.addTestListener(testListener);
        test.addPropertyListener(testListener);

        ProblemView view = (ProblemView) getSite().getWorkbenchWindow().getActivePage().findView(ProblemView.ID);
        view.testAdded(test);
    }

    protected void openTestEditor() {
        IStructuredSelection selection = (IStructuredSelection) composite.getTreeViewer().getSelection();
        Object element = selection.getFirstElement();
        if (!(element instanceof TDMTest)) {
            return;
        }

        openTestEditor((TDMTest) element);
    }

    private void openTestEditor(TDMTest test) {
        TDMTestEditorInput input = new TDMTestEditorInput(test, model.getLogger());
        try {
            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(input,
                    TDMTestEditor.ID);
        } catch (PartInitException e) {
            Activator.logError("Could not open the test editor.", e);
        }
    }

    public TDMTest removeTest(long idToRemove) {
        TDMTest toRemove = model.getTest(idToRemove);
        removeTest(toRemove);

        return toRemove;
    }

    public void removeTest(TDMTest toRemove) {
        model.removeTest(toRemove);
        composite.getTreeViewer().refresh();
        toRemove.removeTestListener(testListener);
        toRemove.removePropertyListener(testListener);
        TDMTestWorkspace workspace = TDMTestEditor.getTDMWorkspace(toRemove);
        Services.getCheetahObjectLookup().unregisterObject(NAMESPACE_WORKSPACE, workspace);

        model.getInput().runAllTests();
        IEditorPart toClose = getSite().getPage().findEditor(new TDMTestEditorInput(toRemove, model.getLogger()));
        if (toClose != null) {
            getSite().getPage().closeEditor(toClose, false);
        }
        ProblemView view = (ProblemView) getSite().getWorkbenchWindow().getActivePage().findView(ProblemView.ID);
        view.testRemoved(toRemove);
    }

    public void select(TDMTest test) {
        composite.getTreeViewer().setSelection(new StructuredSelection(test));
    }

    @Override
    public void setFocus() {
        // ignore
    }

    public void setInput(TDMProcess process, IPromLogger logger) {
        model.setProcess(process);
        model.setLogger(logger);
        composite.getTreeViewer().setInput(new Object[] { process });
        composite.getTreeViewer().expandAll();

        for (TDMTest test : process.getTests()) {
            test.addTestListener(testListener);
            ProblemView view = (ProblemView) getSite().getWorkbenchWindow().getActivePage()
                    .findView(ProblemView.ID);
            view.testAdded(test);
            test.addPropertyListener(testListener);
        }
    }

    protected void updateViewer(TDMTest tdmTest) {
        composite.getTreeViewer().update(tdmTest, null);
        composite.getTreeViewer().update(tdmTest.getProcess(), null);
    }

}