Index: src/org/eclipse/jdt/internal/junit/ui/HierarchyRunView.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/HierarchyRunView.java,v retrieving revision 1.20 diff -u -r1.20 HierarchyRunView.java --- src/org/eclipse/jdt/internal/junit/ui/HierarchyRunView.java 16 Jul 2003 16:43:39 -0000 1.20 +++ src/org/eclipse/jdt/internal/junit/ui/HierarchyRunView.java 6 Aug 2003 22:24:40 -0000 @@ -7,11 +7,12 @@ * * Contributors: * IBM Corporation - initial API and implementation - * Sebastian Davids - sdavids@gmx.de bug 26754 + * Sebastian Davids - sdavids@gmx.de bugs 26754, 36352 *******************************************************************************/ package org.eclipse.jdt.internal.junit.ui; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Vector; @@ -24,6 +25,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseAdapter; @@ -67,7 +69,133 @@ } } - + class PlainTextFormatter { + private StringBuffer fBuffer; + private Vector fSuitInfos; + int fExecuted; + int fErrors; + int fFailures; + + public PlainTextFormatter( + Vector suitInfos, + int executed, + int errors, + int failures) { + + fSuitInfos= suitInfos; + fExecuted= executed; + fErrors= errors; + fFailures= failures; + } + + private TestRunInfo getTestRunInfo(TreeItem item) { + return (TestRunInfo) item.getData(); + } + + protected void append(String s) { + fBuffer.append(s); + } + + protected void append(char c) { + fBuffer.append(c); + } + + protected void append(int i) { + fBuffer.append(i); + } + + private void writeSuite(TreeItem item) { + writeSuiteHead(getTestRunInfo(item)); + TreeItem[] testCases = item.getItems(); + for (int i= 0, n = testCases.length; i < n; ++i) + writeTestCase(item.getItems()[i]); + } + + protected void writeSuiteHead(TestRunInfo testCase) { + append("\n\n"); //$NON-NLS-1$ + writeNameAndStatus(testCase); + } + + private void writeSingleTestCase(Iterator iterator, TreeItem item) { + writeTestCase(item); + for (;iterator.hasNext();) + writeTestCase(((SuiteInfo) iterator.next()).fTreeItem); + } + + private void writeTestCase(TreeItem item) { + writeTestCaseHead(getTestRunInfo(item)); + TreeItem[] methods= item.getItems(); + for (int i= 0, n= methods.length; i < n; ++i) + writeTestMethod(getTestRunInfo(methods[i])); + } + + protected void writeTestCaseHead(TestRunInfo testCase) { + append("\n\n"); //$NON-NLS-1$ + writeNameAndStatus(testCase); + } + + protected void writeNameAndStatus(TestRunInfo info) { + append(info.getTestMethodName()); + append(' '); + append(getStatus(info)); + } + + protected void writeTestMethod(TestRunInfo testCase) { + append("\n\t"); //$NON-NLS-1$ + writeNameAndStatus(testCase); + writeTrace(testCase); + } + + protected void writeTrace(TestRunInfo testMethod) { + String trace = testMethod.getTrace(); + if (trace == null) + return; + append("\n\t\t"); //$NON-NLS-1$ + append(trace.replaceAll("\t", "\t\t")); //$NON-NLS-1$ + } + + protected void writeHead() { + append(JUnitMessages.getString("CounterPanel.label.runs")); //$NON-NLS-1$ + append(fExecuted); + append(' '); + append(JUnitMessages.getString("CounterPanel.label.errors")); //$NON-NLS-1$ + append(fErrors); + append(' '); + append(JUnitMessages.getString("CounterPanel.label.failures")); //$NON-NLS-1$ + append(fFailures); + } + + private boolean isSuite(TreeItem item) { + TreeItem[] items= item.getItems(); + if (items.length == 0) + return false; + return items[0].getItemCount() > 0; + } + + protected String getStatus(TestRunInfo info) { + int status = info.getStatus(); + if (status == ITestRunListener.STATUS_FAILURE) + return JUnitMessages.getString("CopyHierachy.failure"); //$NON-NLS-1$ + if (status == ITestRunListener.STATUS_ERROR) + return JUnitMessages.getString("CopyHierachy.error"); //$NON-NLS-1$ + if (status == ITestRunListener.STATUS_OK) + return JUnitMessages.getString("CopyHierachy.ok"); //$NON-NLS-1$ + return JUnitMessages.getString("CopyHierachy.unknown"); //$NON-NLS-1$ + } + + public String format() { + fBuffer= new StringBuffer(); + writeHead(); + Iterator it= fSuitInfos.iterator(); + TreeItem item= ((SuiteInfo) it.next()).fTreeItem; + if (isSuite(item)) + writeSuite(item); + else + writeSingleTestCase(it, item); + return fBuffer.toString(); + } + } + /** * Vector of SuiteInfo items */ @@ -78,6 +206,7 @@ private Map fTreeItemMap= new HashMap(); private TestRunnerViewPart fTestRunnerPart; + private final Clipboard fClipboard; private final Image fOkIcon= TestRunnerViewPart.createImage("obj16/testok.gif"); //$NON-NLS-1$ private final Image fErrorIcon= TestRunnerViewPart.createImage("obj16/testerr.gif"); //$NON-NLS-1$ @@ -99,8 +228,9 @@ expandAll(); } } - public HierarchyRunView(CTabFolder tabFolder, TestRunnerViewPart runner) { + public HierarchyRunView(CTabFolder tabFolder, Clipboard clipboard, TestRunnerViewPart runner) { fTestRunnerPart= runner; + fClipboard= clipboard; CTabItem hierarchyTab= new CTabItem(tabFolder, SWT.NONE); hierarchyTab.setText(getName()); @@ -353,20 +483,34 @@ } public void menuAboutToShow(IMenuManager manager) { - if (fTree.getSelectionCount() > 0) { + boolean selection= fTree.getSelectionCount() > 0; + if (selection) { TreeItem treeItem= fTree.getSelection()[0]; TestRunInfo testInfo= (TestRunInfo) treeItem.getData(); String testLabel= testInfo.getTestName(); - if (isSuiteSelected()) { + if (isSuiteSelected()) manager.add(new OpenTestAction(fTestRunnerPart, testLabel)); - } else { - manager.add(new OpenTestAction(fTestRunnerPart, getClassName(), getTestMethod())); - manager.add(new RerunAction(fTestRunnerPart, getSelectedTestId(), getClassName(), getTestMethod())); + else { + manager.add( + new OpenTestAction( + fTestRunnerPart, + getClassName(), + getTestMethod())); + manager.add( + new RerunAction( + fTestRunnerPart, + getSelectedTestId(), + getClassName(), + getTestMethod())); } + } + if (fTree.getItemCount() > 0) { manager.add(new Separator()); - manager.add(new ExpandAllAction()); + manager.add(new CopyHierachyAction(fTestRunnerPart, this, fClipboard)); } - } + if (selection) + manager.add(new ExpandAllAction()); + } public void newTreeEntry(String treeEntry) { // format: testId","testName","isSuite","testcount @@ -595,4 +739,14 @@ expandAll(items[i]); } } + + String getHierachyAsString() { + PlainTextFormatter formatter= + new PlainTextFormatter( + fSuiteInfos, + fTestRunnerPart.fExecutedTests, + fTestRunnerPart.fErrorCount, + fTestRunnerPart.fFailureCount); + return formatter.format(); + } } Index: src/org/eclipse/jdt/internal/junit/ui/IJUnitHelpContextIds.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/IJUnitHelpContextIds.java,v retrieving revision 1.7 diff -u -r1.7 IJUnitHelpContextIds.java --- src/org/eclipse/jdt/internal/junit/ui/IJUnitHelpContextIds.java 11 May 2003 21:20:04 -0000 1.7 +++ src/org/eclipse/jdt/internal/junit/ui/IJUnitHelpContextIds.java 6 Aug 2003 22:24:40 -0000 @@ -18,6 +18,7 @@ // Actions public static final String COPYTRACE_ACTION= PREFIX + "copy_trace_action_context"; //$NON-NLS-1$ + public static final String COPYHIERACHY_ACTION= PREFIX + "copy_hierachy_action_context"; //$NON-NLS-1$ public static final String COPYFAILURELIST_ACTION= PREFIX + "copy_failure_list_action_context"; //$NON-NLS-1$ public static final String ENABLEFILTER_ACTION= PREFIX + "enable_filter_action_context"; //$NON-NLS-1$ public static final String OPENEDITORATLINE_ACTION= PREFIX + "open_editor_atline_action_context"; //$NON-NLS-1$ Index: src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.properties =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.properties,v retrieving revision 1.31 diff -u -r1.31 JUnitMessages.properties --- src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.properties 16 Jul 2003 09:47:15 -0000 1.31 +++ src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.properties 6 Aug 2003 22:24:41 -0000 @@ -16,6 +16,14 @@ CopyFailureList.problem=Problem Copying Failure List to Clipboard CopyFailureList.clipboard_busy=There was a problem when accessing the system clipboard. Retry? +CopyHierachy.action.label=Copy Hierachy +CopyHierachy.problem=Problem Copying Hierachy to Clipboard +CopyHierachy.clipboard_busy=There was a problem when accessing the system clipboard. Retry? +CopyHierachy.error=Error +CopyHierachy.failure=Failure +CopyHierachy.ok=Success +CopyHierachy.unknown=Unknown + CounterPanel.label.runs=Runs: CounterPanel.label.errors=Errors: CounterPanel.label.failures=Failures: Index: src/org/eclipse/jdt/internal/junit/ui/TestRunnerViewPart.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestRunnerViewPart.java,v retrieving revision 1.50 diff -u -r1.50 TestRunnerViewPart.java --- src/org/eclipse/jdt/internal/junit/ui/TestRunnerViewPart.java 5 Jun 2003 16:37:18 -0000 1.50 +++ src/org/eclipse/jdt/internal/junit/ui/TestRunnerViewPart.java 6 Aug 2003 22:24:41 -0000 @@ -758,7 +758,7 @@ tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL)); ITestRunView failureRunView= new FailureRunView(tabFolder, fClipboard, this); - ITestRunView testHierarchyRunView= new HierarchyRunView(tabFolder, this); + ITestRunView testHierarchyRunView= new HierarchyRunView(tabFolder, fClipboard, this); fTestRunViews.addElement(failureRunView); fTestRunViews.addElement(testHierarchyRunView); Index: src/org/eclipse/jdt/internal/junit/ui/CopyHierachyAction.java =================================================================== RCS file: src/org/eclipse/jdt/internal/junit/ui/CopyHierachyAction.java diff -N src/org/eclipse/jdt/internal/junit/ui/CopyHierachyAction.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/jdt/internal/junit/ui/CopyHierachyAction.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Sebastian Davids - sdavids@gmx.de; initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.junit.ui; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringReader; +import java.io.StringWriter; + +import org.eclipse.jdt.internal.ui.JavaPlugin; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.SWTError; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.ui.help.WorkbenchHelp; + +/** + * Copies the test hierachy to the clipboard. + */ +public class CopyHierachyAction extends Action { + private HierarchyRunView fView; + + private final Clipboard fClipboard; + + /** + * Constructor for CopyHierachyAction. + */ + public CopyHierachyAction(TestRunnerViewPart runner, HierarchyRunView view, Clipboard clipboard) { + super(JUnitMessages.getString("CopyHierachy.action.label")); //$NON-NLS-1$ + WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.COPYHIERACHY_ACTION); + fView= view; + fClipboard= clipboard; + } + + /* + * @see IAction#run() + */ + public void run() { + TextTransfer plainTextTransfer = TextTransfer.getInstance(); + try{ + fClipboard.setContents( + new String[]{ convertLineTerminators(fView.getHierachyAsString())}, + new Transfer[]{ plainTextTransfer }); + } catch (SWTError e){ + if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) + throw e; + if (MessageDialog.openQuestion(JavaPlugin.getActiveWorkbenchShell(), JUnitMessages.getString("CopyHierachy.problem"), JUnitMessages.getString("CopyHierachy.clipboard_busy"))) //$NON-NLS-1$ //$NON-NLS-2$ + run(); + } + } + + private String convertLineTerminators(String in) { + StringWriter stringWriter= new StringWriter(); + PrintWriter printWriter= new PrintWriter(stringWriter); + StringReader stringReader= new StringReader(in); + BufferedReader bufferedReader= new BufferedReader(stringReader); + String line; + try { + while ((line= bufferedReader.readLine()) != null) + printWriter.println(line); + } catch (IOException e) { + return in; // return the hierachy unfiltered + } + return stringWriter.toString(); + } +}