blob: 0a7a253b0ffba658d1be9b18c2a7020b8f8690e6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 Christian Pontesegger 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/
*
* SPDX-License_Identifier: EPL-2.0
*
* Contributors:
* Christian Pontesegger - initial API and implementation
*******************************************************************************/
package org.eclipse.ease.ui.completions.java.provider;
import java.util.Collection;
import java.util.Map.Entry;
import org.eclipse.ease.ICompletionContext;
import org.eclipse.ease.ui.completion.IHelpResolver;
import org.eclipse.ease.ui.completion.IImageResolver;
import org.eclipse.ease.ui.completion.ScriptCompletionProposal;
import org.eclipse.ease.ui.completion.provider.AbstractCompletionProvider;
import org.eclipse.ease.ui.completion.tokenizer.InputTokenizer;
import org.eclipse.ease.ui.completion.tokenizer.TokenList;
import org.eclipse.ease.ui.completions.java.help.handlers.JavaClassHelpResolver;
import org.eclipse.ease.ui.completions.java.provider.JavaMethodCompletionProvider.JDTImageResolver;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StyledString;
public class JavaClassCompletionProvider extends AbstractCompletionProvider {
@Override
public boolean isActive(final ICompletionContext context) {
return (super.isActive(context) && (isPackage(context))) || (isClass(context))
// also activate when no package is provided and the first letter is capitalized and we see at least 3 characters
|| ((context.getFilter().length() >= 3) && (Character.isUpperCase(context.getFilter().charAt(0))));
}
private boolean isClass(ICompletionContext context) {
return new TokenList(context.getTokens()).getFromLast(Class.class).size() == 1;
}
private boolean isPackage(ICompletionContext context) {
final TokenList tokens = new TokenList(context.getTokens()).getFromLast(Package.class);
if (!tokens.isEmpty()) {
tokens.remove(0);
tokens.removeIfMatches(0, ".");
return (tokens.isEmpty()) || InputTokenizer.isTextFilter(tokens.get(0));
}
return false;
}
@Override
protected void prepareProposals(final ICompletionContext context) {
final String filter = context.getFilter();
if (isPackage(context)) {
final Collection<String> candidates = JavaResources.getInstance().getClasses(getPackageName(context));
for (final String candidate : candidates) {
if (candidate.startsWith(filter)) {
final IHelpResolver helpResolver = new JavaClassHelpResolver(getPackageName(context), candidate);
final IImageResolver imageResolver = new JavaClassImageResolver(getPackageName(context), candidate);
addProposal(candidate, candidate, imageResolver, ScriptCompletionProposal.ORDER_CLASS, helpResolver);
}
}
} else {
// no package provided, look in all packages for matching class
for (final Entry<String, Collection<String>> packageEntry : JavaResources.getInstance().getClasses().entrySet()) {
for (final String candidate : packageEntry.getValue()) {
if (candidate.startsWith(filter)) {
final IHelpResolver helpResolver = new JavaClassHelpResolver(packageEntry.getKey(), candidate);
final IImageResolver imageResolver = new JavaClassImageResolver(packageEntry.getKey(), candidate);
final StyledString styledString = new StyledString(candidate);
styledString.append(" - " + packageEntry.getKey(), StyledString.QUALIFIER_STYLER);
addProposal(styledString, packageEntry.getKey() + "." + candidate, imageResolver, ScriptCompletionProposal.ORDER_CLASS, helpResolver);
}
}
}
}
}
private String getPackageName(ICompletionContext context) {
return ((Package) (new TokenList(context.getTokens()).getFromLast(Package.class).get(0))).getName();
}
private static final class JavaClassImageResolver extends DescriptorImageResolver {
private final String fPackageName;
private final String fClassName;
private JavaClassImageResolver(final String packageName, final String className) {
fPackageName = packageName;
fClassName = className;
}
@Override
protected ImageDescriptor getDescriptor() {
try {
final Class<?> clazz = JavaClassCompletionProvider.class.getClassLoader().loadClass(fPackageName + "." + fClassName.replace('.', '$'));
if (clazz.isEnum())
return JDTImageResolver.getDescriptor(ISharedImages.IMG_OBJS_ENUM);
else if (clazz.isInterface())
return JDTImageResolver.getDescriptor(ISharedImages.IMG_OBJS_INTERFACE);
} catch (final ClassNotFoundException e) {
// if we cannot find the class, use the default image
}
return JDTImageResolver.getDescriptor(ISharedImages.IMG_OBJS_CLASS);
}
}
}