/******************************************************************************* | |
* Copyright (c) 2012 IBM Corporation and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.wst.jsdt.ui.tests.hyperlink; | |
import java.util.ArrayList; | |
import junit.framework.Assert; | |
import org.eclipse.core.resources.IFile; | |
import org.eclipse.jface.text.IDocument; | |
import org.eclipse.jface.text.ITextViewer; | |
import org.eclipse.jface.text.Region; | |
import org.eclipse.jface.text.hyperlink.IHyperlink; | |
import org.eclipse.ui.IPartListener2; | |
import org.eclipse.ui.IWorkbenchPage; | |
import org.eclipse.ui.IWorkbenchPart; | |
import org.eclipse.ui.IWorkbenchPartReference; | |
import org.eclipse.ui.IWorkbenchWindow; | |
import org.eclipse.ui.PlatformUI; | |
import org.eclipse.wst.jsdt.internal.ui.javaeditor.JavaEditor; | |
import org.eclipse.wst.jsdt.internal.ui.javaeditor.JavaElementHyperlink; | |
import org.eclipse.wst.jsdt.internal.ui.javaeditor.JavaElementHyperlinkDetector; | |
import org.eclipse.wst.jsdt.ui.tests.utils.TestProjectSetup; | |
/** | |
* <p> | |
* Helpful utilities for running hyperlink tests. | |
* </p> | |
*/ | |
public class HyperLinkTestUtilities { | |
/** | |
* @param testProject | |
* @param lineNum | |
* @param lineRelativeCharOffset | |
* @param filePath | |
* @param filesExpected | |
* @throws Exception | |
*/ | |
public static void checkHyperlink(TestProjectSetup testProject, int lineNum, int lineRelativeCharOffset, String filePath, ArrayList filesExpected) | |
throws Exception { | |
final ArrayList expectedFilesNotOpened = new ArrayList(filesExpected); | |
class EditorListener implements IPartListener2 { | |
public void partActivated(IWorkbenchPartReference partRef) { | |
} | |
public void partBroughtToTop(IWorkbenchPartReference partRef) { | |
} | |
public void partClosed(IWorkbenchPartReference partRef) { | |
} | |
public void partDeactivated(IWorkbenchPartReference partRef) { | |
} | |
public void partOpened(IWorkbenchPartReference partRef) { | |
IWorkbenchPart part = partRef.getPart(false); | |
if(part instanceof JavaEditor) { | |
String fileOpened = part.getTitle(); | |
int index = 0; | |
boolean found = false; | |
String item = new String(); | |
while(index < expectedFilesNotOpened.size() && !found) { | |
item = (String) expectedFilesNotOpened.get(index); | |
if(item.equals(fileOpened)) { | |
found = true; | |
expectedFilesNotOpened.remove(index); | |
} else { | |
index++; | |
} | |
} | |
} | |
} | |
public void partHidden(IWorkbenchPartReference partRef) { | |
} | |
public void partVisible(IWorkbenchPartReference partRef) { | |
} | |
public void partInputChanged(IWorkbenchPartReference partRef) { | |
} | |
} | |
EditorListener listener = null; | |
listener = new EditorListener(); | |
IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); | |
IWorkbenchPage page = workbenchWindow.getActivePage(); | |
page.addPartListener(listener); | |
IHyperlink[] hyperLinks = getHyperlinks(testProject, lineNum, lineRelativeCharOffset, filePath); | |
Assert.assertTrue("No hyperlinks found", hyperLinks != null && hyperLinks.length > 0); | |
for(int i = 0; i < hyperLinks.length; i++) { | |
if(hyperLinks[i] instanceof JavaElementHyperlink) { | |
hyperLinks[i].open(); | |
} | |
} | |
Assert.assertTrue("Not all expected pages were opened.", expectedFilesNotOpened.isEmpty()); | |
page.removePartListener(listener); | |
} | |
/** | |
* | |
* @param lineNum | |
* @param lineRelativeCharOffset | |
* @param filePath | |
* @return | |
* @throws Exception | |
* gets the hyperlink for the element | |
*/ | |
public static IHyperlink[] getHyperlinks(TestProjectSetup testProject, int lineNum, int lineRelativeCharOffset, String filePath) throws Exception { | |
IFile file = testProject.getFile(filePath); | |
JavaEditor editor = testProject.getEditor(file); | |
IDocument doc = editor.getDocumentProvider().getDocument(editor.getEditorInput()); | |
int offset = doc.getLineOffset(lineNum) + lineRelativeCharOffset; | |
ITextViewer viewer = (ITextViewer) editor.getViewer(); | |
editor.setHighlightRange(offset, 0, true); | |
Region region = new Region(offset, 0); | |
JavaElementHyperlinkDetector hyperlinkDetector = new JavaElementHyperlinkDetector(); | |
hyperlinkDetector.setContext(editor); | |
Thread.sleep(1000); | |
IHyperlink[] hyperlinks = hyperlinkDetector.detectHyperlinks(viewer, region, true); | |
return hyperlinks; | |
} | |
} |