/*******************************************************************************
* Copyright (c) 2017 Rogue Wave 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:
* Rogue Wave Software Inc. - initial implementation
*******************************************************************************/
package org.eclipse.php.phpunit.ui.view;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.php.phpunit.model.elements.PHPUnitElement;
import org.eclipse.php.phpunit.model.elements.PHPUnitTestEvent;
import org.eclipse.php.phpunit.model.elements.PHPUnitTestException;
import org.eclipse.php.phpunit.model.elements.PHPUnitTraceFrame;
import org.eclipse.php.phpunit.model.providers.PHPUnitTestDiffTreeContentProvider;
import org.eclipse.php.phpunit.ui.view.actions.OpenEditorAction;
import org.eclipse.php.phpunit.ui.view.actions.OpenEditorAtLineAction;
import org.eclipse.php.phpunit.ui.view.actions.OpenTestAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
/**
* A pane that shows a object of a failed test.
*/
public class DiffTrace implements IMenuListener {
private final class CopyListener extends SelectionAdapter implements KeyListener {
@Override
public void keyPressed(KeyEvent event) {
if ((((event.stateMask & SWT.CTRL) == SWT.CTRL) || ((event.stateMask & SWT.COMMAND) == SWT.COMMAND))
&& (event.keyCode == 'c' || event.keyCode == 'C')) {
copyPressed();
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
}
private PHPUnitElement fInput;
private PHPUnitView fTestRunner;
private TreeViewer fTreeViewer;
public DiffTrace(final Composite parent, final PHPUnitView testRunner) {
fTreeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
fTreeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
fTestRunner = testRunner;
fTreeViewer.setLabelProvider(new DiffLabelProvider());
final CopyListener copyListener = new CopyListener();
fTreeViewer.getTree().addKeyListener(copyListener);
initMenu();
}
/**
* Returns the composite used to present the diff
*
* @return The composite
*/
Composite getComposite() {
return fTreeViewer.getTree();
}
public PHPUnitElement getFailedTest() {
return fInput;
}
public PHPUnitElement getTrace() {
return fInput;
}
private void initMenu() {
final MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(this);
final Menu menu = menuMgr.createContextMenu(fTreeViewer.getTree());
fTreeViewer.getTree().setMenu(menu);
}
@Override
public void menuAboutToShow(final IMenuManager manager) {
final IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
if (!selection.isEmpty()) {
final PHPUnitElement test = (PHPUnitElement) selection.getFirstElement();
final String fileName = test.getLocalFile();
final int lineNumber = test.getLine();
String methodName = null;
if (test instanceof PHPUnitTraceFrame)
methodName = ((PHPUnitTraceFrame) test).getFunction();
String openLabel = OpenEditorAction.GOTO_FILE;
if (test instanceof PHPUnitTraceFrame)
openLabel = OpenEditorAction.GOTO_CALL;
else if (test instanceof PHPUnitTestEvent)
openLabel = OpenEditorAction.GOTO_OCCURANCE;
manager.add(new OpenEditorAtLineAction(openLabel, fTestRunner, fileName, lineNumber, methodName));
if (test instanceof PHPUnitTestException)
manager.add(new OpenTestAction(OpenEditorAction.GOTO_CLASS, fTestRunner,
((PHPUnitTestException) test).getExceptionClass(), fileName, lineNumber));
if (test instanceof PHPUnitTraceFrame) {
final PHPUnitTraceFrame frame = (PHPUnitTraceFrame) test;
final String className = frame.getClassName();
if (className != null && !className.equals("")) { //$NON-NLS-1$
manager.add(new OpenTestAction(OpenEditorAction.GOTO_CLASS, fTestRunner, className, null, 0, null));
manager.add(new OpenTestAction(OpenEditorAction.GOTO_METHOD, fTestRunner, className, null, 0,
methodName));
} else
manager.add(
new OpenTestAction(OpenEditorAction.GOTO_FUNCTION, fTestRunner, null, null, 0, methodName));
}
}
}
/**
* Refresh the table from the diff.
*/
public void refresh() {
showFailure(fInput);
}
/**
* Shows a TestFailure
*
* @param failure
* the failed test
*/
public void showFailure(final PHPUnitElement failure) {
fTreeViewer.setContentProvider(new PHPUnitTestDiffTreeContentProvider());
fTreeViewer.setInput(failure);
fInput = failure;
fTreeViewer.refresh();
fTreeViewer.expandAll();
}
private void copyPressed() {
final IContentProvider contentProvider = fTreeViewer.getContentProvider();
if (contentProvider instanceof PHPUnitTestDiffTreeContentProvider) {
Clipboard cb = new Clipboard(Display.getDefault());
TextTransfer textTransfer = TextTransfer.getInstance();
final String diff = ((PHPUnitTestDiffTreeContentProvider) contentProvider).getDiff();
cb.setContents(new Object[] { diff }, new Transfer[] { textTransfer });
}
}
}