Skip to main content

This CGIT instance is deprecated, and repositories have been moved to Gitlab or Github. See the repository descriptions for specific locations.

summaryrefslogtreecommitdiffstats
blob: c254d14761c3c8d3b4a94c8164c5ee480cffcb10 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package org.eclipse.jst.jsp.ui.internal.contentassist;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jdt.core.CompletionProposal;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.search.TypeNameRequestor;
import org.eclipse.jdt.ui.text.java.CompletionProposalLabelProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.jsp.ui.internal.editor.JSPEditorPluginImageHelper;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.javascript.ui.internal.common.contentassist.IRelevanceConstants;

/**
 * Use w/ JDT search engine to find all type names.
 * Creates proposals from matches reported.
 *
 * @plannedfor 1.0
 */
public class JavaTypeNameRequestor extends TypeNameRequestor {
	
	private int fJSPOffset = -1;
	private int fReplacementLength = -1;
	private List fProposals = new ArrayList();
	private boolean fIgnoreAbstractClasses = false;
	
	private CompletionProposalLabelProvider fLabelProvider = new CompletionProposalLabelProvider();
	
	public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) {

        int offset = getJSPOffset();
        int length = getReplacementLength();
		
		// somehow offset or length was set incorrectly
		if(offset == -1 || length == -1)
			return;
		// ignore abstract classes?
		if(ignoreAbstractClasses() && Flags.isAbstract(modifiers))
			return;
		
		Image image = calculateImage(modifiers);
		
        String containerNameString = new String(packageName);
        String typeNameString = String.valueOf(simpleTypeName);
			
        // 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(typeQualifier);
        }
		
        JavaTypeCompletionProposal proposal = new JavaTypeCompletionProposal(fullName, offset, length, fullName, image, typeNameString, typeQualifier, IRelevanceConstants.R_NONE, true);
        proposal.setTriggerCharacters(JSPProposalCollector.getTypeTriggers());
		fProposals.add(proposal);
	}


	private Image calculateImage(int modifiers) {
		CompletionProposal p = CompletionProposal.create(CompletionProposal.TYPE_REF, getJSPOffset());
		p.setFlags(modifiers);
		
		//https://bugs.eclipse.org/bugs/show_bug.cgi?id=102206
		char[] sig = new char[]{Signature.C_UNRESOLVED};
		p.setSignature(sig);
		
		ImageDescriptor descriptor = fLabelProvider.createImageDescriptor(p);
		Image image = JSPEditorPluginImageHelper.getInstance().getImage(descriptor);
		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();
    }
	
	int getJSPOffset() {
		return fJSPOffset;
	}

	void setJSPOffset(int offset) {
		fJSPOffset = offset;
	}

	int getReplacementLength() {
		return fReplacementLength;
	}

	void setReplacementLength(int replacementLength) {
		fReplacementLength = replacementLength;
	}
	void setIgnoreAbstractClasses(boolean ignore) {
		fIgnoreAbstractClasses = ignore;
	}
	boolean ignoreAbstractClasses() {
		return fIgnoreAbstractClasses;
	}
	
	JavaTypeCompletionProposal[] getProposals() {
		return (JavaTypeCompletionProposal[])fProposals.toArray(new JavaTypeCompletionProposal[fProposals.size()]);
	}
}

Back to the top