blob: 02ea17d552e905478866412ef6406bff92861783 [file] [log] [blame]
package org.eclipse.jst.jsp.ui.internal.contentassist;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.CompletionProposal;
import org.eclipse.jdt.core.CompletionRequestor;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.ui.JavaElementImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ContextInformation;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jst.jsp.core.internal.java.JSP2ServletNameUtil;
import org.eclipse.jst.jsp.ui.internal.editor.JSPEditorPluginImageHelper;
import org.eclipse.jst.jsp.ui.internal.editor.JSPEditorPluginImages;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
/**
* Most "accept" methods copied from JDT ResultCollector.
*
* @author pavery
*/
public class JSPCompletionRequestor extends CompletionRequestor {
// for debugging
private static final boolean DEBUG;
static {
String value = Platform.getDebugOption("org.eclipse.jst.jsp.ui/debug/jspcontentassist"); //$NON-NLS-1$
DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
}
private final static char[] METHOD_WITH_ARGUMENTS_TRIGGERS = new char[] {'(', '-', ' ' };
private final static char[] METHOD_TRIGGERS = new char[] { ';', ',', '.','\t', '[', ' ' };
private final static char[] TYPE_TRIGGERS = new char[] { '.', '\t', '[','(', ' ' };
private final static char[] VAR_TRIGGER = new char[] { '\t', ' ', '=',';', '.' };
// private IJavaProject fJavaProject;
// set when imports can be added
private ICompilationUnit fCompilationUnit;
private int fCodeAssistOffset;
// private int fContextOffset;
protected ITextViewer fTextViewer;
private List fFields = new ArrayList();
private List fKeywords = new ArrayList();
private List fLabels = new ArrayList();
private List fMethods = new ArrayList();
private List fModifiers = new ArrayList();
private List fPackages = new ArrayList();
private List fTypes = new ArrayList();
private List fVariables = new ArrayList();
private boolean fCursorInExpression = false;
private int fJavaToJSPOffset;
private String fJspName;
private String fMangledName;
public boolean isCursorInExpression() {
return fCursorInExpression;
}
/**
* @param doFilter
* The doFilter to set.
*/
public void setCursorInExpression(boolean inExpression) {
fCursorInExpression = inExpression;
}
/**
* @return Returns the fJavaToJSPOffset.
*/
public int getJavaToJSPOffset() {
return fJavaToJSPOffset;
}
/**
* @param javaToJSPOffset
* The fJavaToJSPOffset to set.
*/
public void setJavaToJSPOffset(int javaToJSPOffset) {
fJavaToJSPOffset = javaToJSPOffset;
}
/**
* Copied logic from CompletionRequestorWrapper
*
* @see org.eclipse.jdt.core.CompletionRequestor#accept(org.eclipse.jdt.core.CompletionProposal)
*/
public void accept(CompletionProposal proposal) {
switch (proposal.getKind()) {
case CompletionProposal.KEYWORD:
acceptKeyword(proposal.getName(), proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.PACKAGE_REF:
acceptPackage(proposal.getDeclarationSignature(), proposal.getCompletion(), proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.TYPE_REF:
if ((proposal.getFlags() & Flags.AccEnum) != 0) {
// does not exist for old requestor
} else if ((proposal.getFlags() & Flags.AccInterface) != 0) {
acceptInterface(proposal.getDeclarationSignature(), Signature.getSignatureSimpleName(proposal.getSignature()), proposal.getCompletion(), proposal.getFlags() & ~Flags.AccInterface,
proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
} else {
acceptClass(proposal.getDeclarationSignature(), Signature.getSignatureSimpleName(proposal.getSignature()), proposal.getCompletion(), proposal.getFlags(), proposal.getReplaceStart(),
proposal.getReplaceEnd(), proposal.getRelevance());
}
break;
case CompletionProposal.FIELD_REF:
acceptField(Signature.getSignatureQualifier(proposal.getDeclarationSignature()), Signature.getSignatureSimpleName(proposal.getDeclarationSignature()), proposal.getName(), Signature
.getSignatureQualifier(proposal.getSignature()), Signature.getSignatureSimpleName(proposal.getSignature()), proposal.getCompletion(), proposal.getFlags(), proposal
.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.METHOD_REF:
acceptMethod(Signature.getSignatureQualifier(proposal.getDeclarationSignature()), Signature.getSignatureSimpleName(proposal.getDeclarationSignature()), proposal.getName(),
getParameterPackages(proposal.getSignature()), getParameterTypes(proposal.getSignature()), proposal.findParameterNames(null) == null ? CharOperation.NO_CHAR_CHAR : proposal
.findParameterNames(null), Signature.getSignatureQualifier(Signature.getReturnType(proposal.getSignature())), Signature.getSignatureSimpleName(Signature
.getReturnType(proposal.getSignature())), proposal.getCompletion(), proposal.getFlags(), proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.METHOD_DECLARATION:
acceptMethodDeclaration(Signature.getSignatureQualifier(proposal.getDeclarationSignature()), Signature.getSignatureSimpleName(proposal.getDeclarationSignature()), proposal.getName(),
getParameterPackages(proposal.getSignature()), getParameterTypes(proposal.getSignature()), proposal.findParameterNames(null) == null ? CharOperation.NO_CHAR_CHAR : proposal
.findParameterNames(null), Signature.getSignatureQualifier(Signature.getReturnType(proposal.getSignature())), Signature.getSignatureSimpleName(Signature
.getReturnType(proposal.getSignature())), proposal.getCompletion(), proposal.getFlags(), proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.ANONYMOUS_CLASS_DECLARATION:
acceptAnonymousType(Signature.getSignatureQualifier(proposal.getDeclarationSignature()), Signature.getSignatureSimpleName(proposal.getDeclarationSignature()),
getParameterPackages(proposal.getSignature()), getParameterTypes(proposal.getSignature()), proposal.findParameterNames(null) == null ? CharOperation.NO_CHAR_CHAR : proposal
.findParameterNames(null), proposal.getCompletion(), proposal.getFlags(), proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.LABEL_REF:
acceptLabel(proposal.getCompletion(), proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.LOCAL_VARIABLE_REF:
acceptLocalVariable(proposal.getCompletion(), Signature.getSignatureQualifier(proposal.getSignature()), Signature.getSignatureSimpleName(proposal.getSignature()), proposal.getFlags(),
proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.VARIABLE_DECLARATION:
acceptLocalVariable(proposal.getCompletion(), Signature.getSignatureQualifier(proposal.getSignature()), Signature.getSignatureSimpleName(proposal.getSignature()), proposal.getFlags(),
proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
case CompletionProposal.POTENTIAL_METHOD_DECLARATION:
acceptPotentialMethodDeclaration(Signature.getSignatureQualifier(proposal.getDeclarationSignature()), Signature.getSignatureSimpleName(proposal.getDeclarationSignature()), proposal
.getName(), proposal.getReplaceStart(), proposal.getReplaceEnd(), proposal.getRelevance());
break;
}
}
private void acceptPotentialMethodDeclaration(char[] declaringTypePackageName, char[] declaringTypeName, char[] selector, int completionStart, int completionEnd, int relevance) {
if (DEBUG)
System.out.println("TODO: implement acceptPotentialMethodDeclaration");
// if (fCompilationUnit == null) {
// return;
// }
// String prefix= new String(selector);
//
// try {
// IJavaElement element=
// getCompilationUnit().getElementAt(getCodeAssistOffset());
// if (element != null) {
// IType type= (IType) element.getAncestor(IJavaElement.TYPE);
// if (type != null) {
// GetterSetterCompletionProposal.evaluateProposals(type, prefix,
// completionStart, completionEnd - completionStart, relevance + 100,
// fSuggestedMethodNames, fMethods);
// MethodCompletionProposal.evaluateProposals(type, prefix,
// completionStart, completionEnd - completionStart, relevance + 99,
// fSuggestedMethodNames, fMethods);
// }
// }
// } catch (CoreException e) {
//
// }
}
private void acceptLocalVariable(char[] name, char[] typePackageName, char[] typeName, int modifiers, int start, int end, int relevance) {
String completionString = new String(name);
int offset = start + getJavaToJSPOffset();
int length = end - start;
Image image = JSPEditorPluginImageHelper.getInstance().getImage(JSPEditorPluginImages.LOCAL_VARIABLE_OBJ);
StringBuffer buf = new StringBuffer();
buf.append(name);
if (typeName != null) {
buf.append(" "); //$NON-NLS-1$
buf.append(fixupTypeName(typeName));
}
String displayString = buf.toString();
CustomCompletionProposal proposal = new CustomCompletionProposal(completionString, offset, length, completionString.length(), image, displayString, null, null, relevance);
proposal.setTriggerCharacters(VAR_TRIGGER);
fVariables.add(proposal);
}
private void acceptLabel(char[] completion, int replaceStart, int replaceEnd, int relevance) {
if (DEBUG)
System.out.println("implement acceptLabel");
}
private void acceptAnonymousType(char[] signatureQualifier, char[] signatureSimpleName, char[][] parameterPackages, char[][] parameterTypes, char[][] cs, char[] completion, int flags,
int replaceStart, int replaceEnd, int relevance) {
if (DEBUG)
System.out.println("implement acceptAnonymousType");
}
private void acceptMethodDeclaration(char[] declaringTypePackageName, char[] declaringTypeName, char[] name, char[][] parameterPackageNames, char[][] parameterTypeNames, char[][] parameterNames,
char[] returnTypePackageName, char[] returnTypeName, char[] completionName, int modifiers, int start, int end, int relevance) {
if (!isCursorInExpression())
return;
StringBuffer displayString = getMethodDisplayString(null, name, parameterTypeNames, parameterNames, returnTypeName);
displayString.append(" - "); //$NON-NLS-1$
displayString.append("Override method in '" + new String(declaringTypeName) + "'");
StringBuffer typeName = new StringBuffer();
if (declaringTypePackageName.length > 0) {
typeName.append(declaringTypePackageName);
typeName.append('.');
}
typeName.append(declaringTypeName);
String[] paramTypes = new String[parameterTypeNames.length];
for (int i = 0; i < parameterTypeNames.length; i++) {
paramTypes[i] = Signature.createTypeSignature(parameterTypeNames[i], true);
}
// JavaCompletionProposal proposal= new
// OverrideCompletionProposal(fJavaProject, fCompilationUnit,
// typeName.toString(), new String(name), paramTypes, start,
// getLength(start, end), displayString.toString(), new
// String(completionName));
// proposal.setImage(getImage(getMemberDescriptor(modifiers)));
// proposal.setProposalInfo(new ProposalInfo(fJavaProject,
// declaringTypePackageName, declaringTypeName, name,
// parameterPackageNames, parameterTypeNames, returnTypeName.length ==
// 0));
String completionString = new String(completionName);
int offset = start + getJavaToJSPOffset();
int length = end - start;
Image image = createMethodImage(modifiers);
CustomCompletionProposal proposal = new CustomCompletionProposal(completionString, offset, length, completionString.length(), image, displayString.toString(), null, null, relevance + 100);
// proposal.setRelevance(relevance + 100);
fMethods.add(proposal);
// fSuggestedMethodNames.add(new String(name));
}
private void acceptMethod(char[] declaringTypePackageName, char[] declaringTypeName, char[] name, char[][] parameterPackageNames, char[][] parameterTypeNames, char[][] parameterNames,
char[] returnTypePackageName, char[] returnTypeName, char[] completionName, int modifiers, int start, int end, int relevance) {
if (completionName == null)
return;
if (!isCursorInExpression())
return;
// if (TypeFilter.isFiltered(declaringTypePackageName,
// declaringTypeName)) {
// return;
// }
String completionString = new String(completionName);
String displayString = getMethodDisplayString(declaringTypeName, name, parameterTypeNames, parameterNames, returnTypeName).toString();
int offset = start + getJavaToJSPOffset();
int length = end - start;
Image image = createMethodImage(modifiers);
boolean hasOpeningBracket = completionName.length == 0 || (completionName.length > 0 && completionName[completionName.length - 1] == ')');
ContextInformation contextInformation = null;
if (hasOpeningBracket && parameterTypeNames.length > 0) {
contextInformation = new ContextInformation(image, displayString, getParameterSignature(parameterTypeNames, parameterNames));
// int position = (completionName.length == 0) ? fContextOffset : -1;
//contextInformation.setContextInformationPosition(position);
}
boolean userMustCompleteParameters = (contextInformation != null && completionName.length > 0);
char[] triggers = userMustCompleteParameters ? METHOD_WITH_ARGUMENTS_TRIGGERS : METHOD_TRIGGERS;
int cursorPosition = completionString.length();
if (userMustCompleteParameters) {
// set the cursor before the closing bracket
//proposal.setCursorPosition(completionName.length - 1);
cursorPosition--;
}
CustomCompletionProposal proposal = new CustomCompletionProposal(completionString, offset, length, cursorPosition, image, displayString, contextInformation, null, relevance);
proposal.setTriggerCharacters(triggers);
// boolean isConstructor= returnTypeName == null ? true :
// returnTypeName.length == 0;
// proposal.setProposalInfo(new ProposalInfo(fJavaProject,
// declaringTypePackageName, declaringTypeName, name,
// parameterPackageNames, parameterTypeNames, isConstructor));
fMethods.add(proposal);
}
private StringBuffer getMethodDisplayString(char[] declaringTypeName, char[] name, char[][] parameterTypeNames, char[][] parameterNames, char[] returnTypeName) {
StringBuffer nameBuffer = new StringBuffer();
nameBuffer.append(name);
nameBuffer.append('(');
if (parameterTypeNames != null && parameterTypeNames.length > 0) {
nameBuffer.append(getParameterSignature(parameterTypeNames, parameterNames));
}
nameBuffer.append(')');
if (returnTypeName != null && returnTypeName.length > 0) {
nameBuffer.append(" "); //$NON-NLS-1$
nameBuffer.append(returnTypeName);
}
// if declaring type is mangled, unmangle
if (declaringTypeName != null && declaringTypeName.length > 0) {
nameBuffer.append(" - "); //$NON-NLS-1$
nameBuffer.append(fixupTypeName(declaringTypeName));
}
return nameBuffer;
}
protected String getParameterSignature(char[][] parameterTypeNames, char[][] parameterNames) {
StringBuffer buf = new StringBuffer();
if (parameterTypeNames != null) {
for (int i = 0; i < parameterTypeNames.length; i++) {
if (i > 0) {
buf.append(',');
buf.append(' ');
}
buf.append(parameterTypeNames[i]);
if (parameterNames != null && parameterNames[i] != null) {
buf.append(' ');
buf.append(parameterNames[i]);
}
}
}
return buf.toString();
}
/**
* @param flags
* @return
*/
private Image createMethodImage(int flags) {
ImageDescriptor imageDescriptor = null;
if ((flags & Flags.AccDefault) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.DEFAULT_CO);
} else if ((flags & Flags.AccPrivate) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.PRIVATE_CO);
} else if ((flags & Flags.AccProtected) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.PROTECTED_CO);
} else if ((flags & Flags.AccPublic) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.PUBLIC_CO);
} else {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.PUBLIC_CO);
}
Image image = JSPEditorPluginImageHelper.getInstance().getImage(decorateImage(imageDescriptor, flags));
return image;
}
private ImageDescriptor decorateImage(ImageDescriptor base, int modifiers) {
int adornments = 0;
if (Flags.isDeprecated(modifiers))
adornments = adornments | JavaElementImageDescriptor.DEPRECATED;
if (Flags.isStatic(modifiers))
adornments = adornments | JavaElementImageDescriptor.STATIC;
JavaElementImageDescriptor javaDescriptor = new JavaElementImageDescriptor(base, adornments, new Point(16, 16));
return javaDescriptor;
}
private void acceptField(char[] declaringTypePackageName, char[] declaringTypeName, char[] name, char[] typePackageName, char[] typeName, char[] completionName, int modifiers, int start, int end,
int relevance) {
// if (TypeFilter.isFiltered(declaringTypePackageName,
// declaringTypeName)) {
// return;
// }
String completionNameString = new String(completionName);
int offset = start + getJavaToJSPOffset();
int length = end - start;
Image image = createFieldImage(modifiers);
StringBuffer nameBuffer = new StringBuffer();
nameBuffer.append(name);
if (typeName.length > 0) {
nameBuffer.append(" "); //$NON-NLS-1$
nameBuffer.append(typeName);
}
// also fix up name if it's the servlet class
// (since it's that ugly mangled string)
if (declaringTypeName != null && declaringTypeName.length > 0) {
nameBuffer.append(" - "); //$NON-NLS-1$
nameBuffer.append(fixupTypeName(declaringTypeName));
}
// JavaCompletionProposal proposal= createCompletion(start, end, new
// String(completionName), descriptor, nameBuffer.toString(),
// relevance);
CustomCompletionProposal proposal = new CustomCompletionProposal(completionNameString, offset, length, completionNameString.length(), image, nameBuffer.toString(), null, null, relevance);
proposal.setTriggerCharacters(VAR_TRIGGER);
fFields.add(proposal);
// proposal.setProposalInfo(new ProposalInfo(fJavaProject,
// declaringTypePackageName, declaringTypeName, name));
}
/**
* @param flags
* @return
*/
private Image createFieldImage(int flags) {
ImageDescriptor imageDescriptor = null;
if ((flags & Flags.AccDefault) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.FIELD_DEFAULT_OBJ);
} else if ((flags & Flags.AccPrivate) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.FIELD_PRIVATE_OBJ);
} else if ((flags & Flags.AccProtected) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.FIELD_PROTECTED_OBJ);
} else if ((flags & Flags.AccPublic) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.FIELD_PUBLIC_OBJ);
} else {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.FIELD_DEFAULT_OBJ);
}
Image image = JSPEditorPluginImageHelper.getInstance().getImage(decorateImage(imageDescriptor, flags));
return image;
}
protected void acceptClass(char[] packageName, char[] typeName, char[] completionName, int modifiers, int start, int end, int relevance) {
// if (TypeFilter.isFiltered(packageName, typeName)) {
// return;
// }
// ProposalInfo info= new ProposalInfo(fJavaProject, packageName,
// typeName);
int offset = start + getJavaToJSPOffset();
int length = end - start;
Image image = createClassImage(modifiers);
String completionNameString = new String(completionName);
String containerNameString = new String(packageName);
String typeNameString = fixupTypeName(typeName);
if (typeNameString == getJspName())
return;
// containername can be null
String fullName = concatenateName(containerNameString, typeNameString);
String simpleName = Signature.getSimpleName(fullName);
StringBuffer buf = new StringBuffer(simpleName);
String typeQualifier = Signature.getQualifier(fullName);
if (typeQualifier.length() > 0) {
buf.append(" - "); //$NON-NLS-1$
buf.append(fixupTypeName(typeQualifier));
}
String name = buf.toString();
// ICompilationUnit cu= null;
// if (containerNameString != null && fCompilationUnit != null) {
// if (completionNameString.equals(fullName)) {
// cu= fCompilationUnit;
// }
// }
//CustomCompletionProposal proposal = new CustomCompletionProposal(completionNameString, offset, length, completionNameString.length(), image, name, null, null, relevance);
JavaTypeCompletionProposal proposal = new JavaTypeCompletionProposal(completionNameString, offset, length, fullName, image, typeNameString, typeQualifier, relevance, true);
proposal.setTriggerCharacters(TYPE_TRIGGERS);
fTypes.add(proposal);
// JavaCompletionProposal proposal= new
// JavaTypeCompletionProposal(completion, cu, start, getLength(start,
// end), getImage(descriptor), name, relevance, typeName,
// containerName);
// proposal.setProposalInfo(proposalInfo);
// fTypes.add(createTypeCompletion(start, end, new
// String(completionName), descriptor, new String(typeName), new
// String(packageName), info, relevance));
}
/**
* @param modifiers
*/
private Image createClassImage(int modifiers) {
ImageDescriptor descriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.IMG_OBJ_CLASS_OBJ);
if ((modifiers & Flags.AccDefault) != 0) {
descriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERCLASS_DEFAULT_OBJ);
} else if ((modifiers & Flags.AccPrivate) != 0) {
descriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERCLASS_PRIVATE_OBJ);
} else if ((modifiers & Flags.AccProtected) != 0) {
descriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERCLASS_PROTECTED_OBJ);
} else if ((modifiers & Flags.AccPublic) != 0) {
descriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.IMG_OBJ_CLASS_OBJ);
} else {
descriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERCLASS_DEFAULT_OBJ);
}
Image image = JSPEditorPluginImageHelper.getInstance().getImage(decorateImage(descriptor, modifiers));
return image;
}
/**
* Concatenates two names. Uses a dot for separation. Both strings can be
* empty or <code>null</code>.
*/
public String concatenateName(String name1, String name2) {
StringBuffer buf = new StringBuffer();
if (name1 != null && name1.length() > 0) {
buf.append(name1);
}
if (name2 != null && name2.length() > 0) {
if (buf.length() > 0) {
buf.append('.');
}
buf.append(name2);
}
return buf.toString();
}
protected void acceptInterface(char[] packageName, char[] typeName, char[] completionName, int modifiers, int start, int end, int relevance) {
// if (TypeFilter.isFiltered(packageName, typeName)) {
// return;
// }
String completionNameString = new String(completionName);
int offset = start + getJavaToJSPOffset();
int length = end - start;
Image image = createInterfaceImage(modifiers);
String containerNameString = new String(packageName);
String typeNameString = fixupTypeName(new String(typeName));
if (typeNameString == getJspName())
return;
// container name can be null
String fullName = concatenateName(containerNameString, typeNameString);
StringBuffer buf = new StringBuffer(Signature.getSimpleName(fullName));
String typeQualifier = Signature.getQualifier(fullName);
if (typeQualifier.length() > 0) {
buf.append(" - "); //$NON-NLS-1$
buf.append(fixupTypeName(typeQualifier));
}
String name = buf.toString();
CustomCompletionProposal proposal = new CustomCompletionProposal(completionNameString, offset, length, completionNameString.length(), image, name, null, null, relevance);
fTypes.add(proposal);
// ProposalInfo info= new ProposalInfo(fJavaProject, packageName,
// typeName);
// fTypes.add(createTypeCompletion(start, end, new
// String(completionName), descriptor, new String(typeName), new
// String(packageName), info, relevance));
}
/**
* @param modifiers
* @return
*/
private Image createInterfaceImage(int modifiers) {
ImageDescriptor imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERINTERFACE_PUBLIC_OBJ);
if ((modifiers & Flags.AccDefault) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERINTERFACE_DEFAULT_OBJ);
} else if ((modifiers & Flags.AccPrivate) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERINTERFACE_PRIVATE_OBJ);
} else if ((modifiers & Flags.AccProtected) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERINTERFACE_PROTECTED_OBJ);
} else if ((modifiers & Flags.AccPublic) != 0) {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERINTERFACE_PUBLIC_OBJ);
} else {
imageDescriptor = JSPEditorPluginImageHelper.getInstance().getImageDescriptor(JSPEditorPluginImages.INNERINTERFACE_DEFAULT_OBJ);
}
Image image = JSPEditorPluginImageHelper.getInstance().getImage(decorateImage(imageDescriptor, modifiers));
return image;
}
private void acceptPackage(char[] packageName, char[] completionName, int start, int end, int relevance) {
// if (TypeFilter.isFiltered(new String(packageName))) {
// return;
// }
String packageNameString = new String(packageName);
String completionNameString = new String(completionName);
int offset = start + getJavaToJSPOffset();
int length = end - start;
Image image = JSPEditorPluginImageHelper.getInstance().getImage(JSPEditorPluginImages.PACKAGE_OBJ);
CustomCompletionProposal proposal = new CustomCompletionProposal(packageNameString, offset, length, packageNameString.length(), image, completionNameString, null, null, relevance);
fPackages.add(proposal);
}
private void acceptKeyword(char[] name, int replaceStart, int replaceEnd, int relevance) {
if(DEBUG)
System.out.println("TODO: implement accept keyword");
}
private char[][] getParameterPackages(char[] methodSignature) {
char[][] parameterQualifiedTypes = Signature.getParameterTypes(methodSignature);
int length = parameterQualifiedTypes == null ? 0 : parameterQualifiedTypes.length;
char[][] parameterPackages = new char[length][];
for (int i = 0; i < length; i++) {
parameterPackages[i] = Signature.getSignatureQualifier(parameterQualifiedTypes[i]);
}
return parameterPackages;
}
private char[][] getParameterTypes(char[] methodSignature) {
char[][] parameterQualifiedTypes = Signature.getParameterTypes(methodSignature);
int length = parameterQualifiedTypes == null ? 0 : parameterQualifiedTypes.length;
char[][] parameterPackages = new char[length][];
for (int i = 0; i < length; i++) {
parameterPackages[i] = Signature.getSignatureSimpleName(parameterQualifiedTypes[i]);
}
return parameterPackages;
}
public ICompletionProposal[] getResults() {
// TODO: eventually do better custom sorting here..
List results = new ArrayList();
results.addAll(fFields);
results.addAll(fKeywords);
results.addAll(fLabels);
results.addAll(fMethods);
results.addAll(fModifiers);
results.addAll(fPackages);
results.addAll(fTypes);
results.addAll(fVariables);
return (ICompletionProposal[]) results.toArray(new ICompletionProposal[results.size()]);
}
/**
* @param compilationUnit
* The fCompilationUnit to set.
*/
public void setCompilationUnit(ICompilationUnit compilationUnit) {
fCompilationUnit = compilationUnit;
// set some names for fixing up mangled name
// in proposals later
String cuName = getCompilationUnit().getPath().lastSegment();
setMangledName(cuName.substring(0, cuName.lastIndexOf('.')));
String unmangled = JSP2ServletNameUtil.unmangle(cuName);
setJspName(unmangled.substring(unmangled.lastIndexOf('/') + 1));
}
/**
* @return Returns the fCompilationUnit.
*/
public ICompilationUnit getCompilationUnit() {
return fCompilationUnit;
}
private String fixupTypeName(char[] typeNameChars) {
String typeName = new String(typeNameChars);
return fixupTypeName(typeName);
}
/**
* Changes mangled type name to the name of the jsp file Or if it's an inner
* type, returns the name of the inner type (minus the mangled parent type
* name)
*
* @param typeNameChars
* @return
*/
private String fixupTypeName(String typeName) {
String mangledName = getMangledName();
// can be null if no CU was ever set
if(mangledName != null) {
if (typeName.equals(mangledName))
return getJspName();
else if (typeName.startsWith(mangledName))
return typeName.substring(typeName.lastIndexOf('.')+1);
}
return typeName;
}
private String getMangledName() {
return fMangledName;
}
private void setMangledName(String mangledName) {
fMangledName = mangledName;
}
private String getJspName() {
return fJspName;
}
private void setJspName(String jspName) {
fJspName = jspName;
}
public int getCodeAssistOffset() {
return fCodeAssistOffset;
}
public void setCodeAssistOffset(int offset) {
fCodeAssistOffset = offset;
}
}