/******************************************************************************* * Copyright (c) 2011 Spring IDE Developers * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Spring IDE Developers - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.beans.ui.editor.contentassist.bean; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal; import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest; import org.springframework.ide.eclipse.beans.ui.model.BeansModelImages; import org.springframework.ide.eclipse.core.java.JdtUtils; /** * Utility class that creates content assist proposals for attribute names used * in the c namespace. * * @author Leo Dos Santos * @since 2.8.0 */ @SuppressWarnings("restriction") public class ConstructorArgNameSearchRequestor { public static final int CONSTRUCTOR_RELEVANCE = 10; protected JavaElementImageProvider imageProvider; protected Set<String> argNames; protected ContentAssistRequest request; private String prefix; private boolean attrAtLocationHasValue; private String namespacePrefix = ""; public ConstructorArgNameSearchRequestor(ContentAssistRequest request, String prefix, boolean attrAtLocationHasValue, String nameSpacePrefix) { this.request = request; this.argNames = new HashSet<String>(); this.imageProvider = new JavaElementImageProvider(); this.prefix = prefix; this.attrAtLocationHasValue = attrAtLocationHasValue; if (namespacePrefix != null) { this.namespacePrefix = nameSpacePrefix + ":"; } } public void acceptSearchMatch(IMethod constructor) throws CoreException { if (Flags.isPublic(constructor.getFlags()) && ((IType) constructor.getParent()).isClass() && constructor.isConstructor() && constructor.exists()) { createConstructorArgProposal(constructor); } } protected void createConstructorArgProposal(IMethod constructor) { try { String[] parameterNames = constructor.getParameterNames(); String[] parameterTypes = JdtUtils .getParameterTypesString(constructor); for (String name : parameterNames) { if (!argNames.contains(name)) { String replaceText = namespacePrefix + prefix + name; StringBuffer buf = new StringBuffer(); buf.append(" - "); buf.append(constructor.getElementName()); buf.append('('); if (parameterTypes != null && parameterNames != null && parameterTypes.length > 0 && parameterNames.length > 0) { buf.append(parameterTypes[0]); buf.append(' '); buf.append(parameterNames[0]); if (parameterTypes.length > 1 && parameterTypes.length > 1) { for (int i = 1; i < parameterTypes.length; i++) { buf.append(", "); buf.append(parameterTypes[i]); buf.append(' '); buf.append(parameterNames[i]); } } } buf.append(')'); String displayText = buf.toString(); Image image = imageProvider.getImageLabel(constructor, constructor.getFlags() | JavaElementImageProvider.SMALL_ICONS); int cursor = replaceText.length(); String refReplaceText = replaceText + "-ref"; if (!attrAtLocationHasValue) { replaceText += "=\"\""; cursor = replaceText.length() - 1; } else { cursor = replaceText.length() + 2; } CustomCompletionProposal proposal1 = new CustomCompletionProposal( replaceText, request.getReplacementBeginPosition(), request.getReplacementLength(), cursor, image, namespacePrefix + name + displayText, null, null, CONSTRUCTOR_RELEVANCE); if (!attrAtLocationHasValue) { refReplaceText += "=\"\""; cursor = refReplaceText.length() - 1; } else { cursor = refReplaceText.length() + 2; } image = BeansModelImages.getDecoratedImage(image, BeansModelImages.FLAG_EXTERNAL); CustomCompletionProposal proposal2 = new CustomCompletionProposal( refReplaceText, request.getReplacementBeginPosition(), request.getReplacementLength(), cursor, image, namespacePrefix + name + "-ref" + displayText, null, null, CONSTRUCTOR_RELEVANCE); request.addProposal(proposal1); request.addProposal(proposal2); argNames.add(name); } } } catch (JavaModelException e) { // do nothing } } }