package junit.extensions.eclipse.quick.javadoc.ui.handlers;
import java.util.ArrayList;
import java.util.List;
import junit.extensions.eclipse.quick.javadoc.SearchJavaClassFromDocTagVisitor;
import junit.extensions.eclipse.quick.javadoc.ui.JavaDocUIActivator;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.search.SearchMatch;
import org.eclipse.jdt.core.search.SearchRequestor;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.widgets.Shell;
public class OpenTestingContextHandler extends AbstractJavaDocHandler {
private static class TypeLabelProvider extends LabelProvider {
public String getText(Object element) {
if(element == null){
return "null";
}
if (element instanceof IType) {
return ((IType) element).getFullyQualifiedName();
}
if(element instanceof IMethod){
IMethod method = (IMethod) element;
return method.getDeclaringType().getFullyQualifiedName() + "#" + method.getElementName();
}
String message = String.format("Illegal Element is gave '%s'",element.toString());
throw new IllegalArgumentException(message);
}
}
private static final class SearchJavaClassRequestor extends SearchRequestor {
private List<IJavaElement> results = new ArrayList<IJavaElement>();
@Override
public void acceptSearchMatch(SearchMatch match) throws CoreException {
results.add((IJavaElement) match.getElement());
}
public List<IJavaElement> getResults() {
return results;
}
}
public OpenTestingContextHandler() {
}
public Object doExecute(ExecutionEvent event) throws ExecutionException {
SearchJavaClassRequestor requestor = new SearchJavaClassRequestor();
try {
IJavaElement element = getElementOfJavaEditor();
if (element instanceof IMethod || element instanceof IType) {
IMember refs = (IMember) element;
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
String source = refs.getSource();
if(source == null){
return null;
}
parser.setSource(source.toCharArray());
ASTNode node = parser.createAST(new NullProgressMonitor());
ASTVisitor visitor = new SearchJavaClassFromDocTagVisitor(refs.getDeclaringType(),requestor);
node.accept(visitor);
}
List<IJavaElement> results = requestor.getResults();
Shell parent = getWorkbenchWindow().getShell();
if(!results.isEmpty()){
IJavaElement selectedType = selectType(event.getCommand(),results,parent);
JavaUI.openInEditor(selectedType,true,false);
}
} catch (JavaModelException e) {
JavaDocUIActivator.getDefault().handleSystemError(e, this);
} catch (CoreException e) {
JavaDocUIActivator.getDefault().handleSystemError(e, this);
} catch (NotDefinedException e) {
JavaDocUIActivator.getDefault().handleSystemError(e, this);
}
return null;
}
private IJavaElement selectType(Command command,List<IJavaElement> types,Shell shell) throws NotDefinedException {
if(types.size() == 1) return types.get(0);
PopupTableSelector selector = new PopupTableSelector(shell, types);
selector.setTitle(command.getName());
selector.setCommandForward(command.getId());
selector.setLabelProvider(new TypeLabelProvider());
return (IJavaElement) selector.select();
}
}