001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.text.javadoc;
011:
012: import java.util.ArrayList;
013: import java.util.Collections;
014: import java.util.List;
015:
016: import org.eclipse.core.runtime.CoreException;
017: import org.eclipse.core.runtime.IConfigurationElement;
018: import org.eclipse.core.runtime.IExtensionRegistry;
019: import org.eclipse.core.runtime.IProgressMonitor;
020: import org.eclipse.core.runtime.Platform;
021:
022: import org.eclipse.swt.graphics.Point;
023:
024: import org.eclipse.jface.text.contentassist.IContextInformation;
025:
026: import org.eclipse.jdt.core.ICompilationUnit;
027:
028: import org.eclipse.jdt.ui.JavaUI;
029: import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer;
030: import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
031: import org.eclipse.jdt.ui.text.java.IJavadocCompletionProcessor;
032: import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
033: import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
034:
035: import org.eclipse.jdt.internal.ui.JavaPlugin;
036:
037: /**
038: * Java doc completion processor using contributed IJavaDocCompletionProcessor's
039: * to evaluate proposals.
040: *
041: * @since 3.2
042: */
043: public class LegacyJavadocCompletionProposalComputer implements
044: IJavaCompletionProposalComputer {
045:
046: private static final String PROCESSOR_CONTRIBUTION_ID = "javadocCompletionProcessor"; //$NON-NLS-1$
047:
048: private IJavadocCompletionProcessor[] fSubProcessors;
049:
050: private String fErrorMessage;
051:
052: public LegacyJavadocCompletionProposalComputer() {
053: fSubProcessors = null;
054: }
055:
056: private IJavadocCompletionProcessor[] getContributedProcessors() {
057: if (fSubProcessors == null) {
058: try {
059: IExtensionRegistry registry = Platform
060: .getExtensionRegistry();
061: IConfigurationElement[] elements = registry
062: .getConfigurationElementsFor(JavaUI.ID_PLUGIN,
063: PROCESSOR_CONTRIBUTION_ID);
064: IJavadocCompletionProcessor[] result = new IJavadocCompletionProcessor[elements.length];
065: for (int i = 0; i < elements.length; i++) {
066: result[i] = (IJavadocCompletionProcessor) elements[i]
067: .createExecutableExtension("class"); //$NON-NLS-1$
068: }
069: fSubProcessors = result;
070: } catch (CoreException e) {
071: JavaPlugin.log(e);
072: fSubProcessors = new IJavadocCompletionProcessor[0];
073: }
074: }
075: return fSubProcessors;
076: }
077:
078: /*
079: * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#computeContextInformation(org.eclipse.jface.text.contentassist.TextContentAssistInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
080: */
081: public List computeContextInformation(
082: ContentAssistInvocationContext context,
083: IProgressMonitor monitor) {
084: if (context instanceof JavaContentAssistInvocationContext) {
085: JavaContentAssistInvocationContext javaContext = (JavaContentAssistInvocationContext) context;
086:
087: ICompilationUnit cu = javaContext.getCompilationUnit();
088: int offset = javaContext.getInvocationOffset();
089:
090: ArrayList result = new ArrayList();
091:
092: IJavadocCompletionProcessor[] processors = getContributedProcessors();
093: String error = null;
094: for (int i = 0; i < processors.length; i++) {
095: IJavadocCompletionProcessor curr = processors[i];
096: IContextInformation[] contextInfos = curr
097: .computeContextInformation(cu, offset);
098: if (contextInfos != null) {
099: for (int k = 0; k < contextInfos.length; k++) {
100: result.add(contextInfos[k]);
101: }
102: } else if (error == null) {
103: error = curr.getErrorMessage();
104: }
105: }
106: fErrorMessage = error;
107: return result;
108: }
109: return Collections.EMPTY_LIST;
110: }
111:
112: /*
113: * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#computeCompletionProposals(org.eclipse.jface.text.contentassist.TextContentAssistInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
114: */
115: public List computeCompletionProposals(
116: ContentAssistInvocationContext context,
117: IProgressMonitor monitor) {
118: if (context instanceof JavadocContentAssistInvocationContext) {
119: JavadocContentAssistInvocationContext javaContext = (JavadocContentAssistInvocationContext) context;
120:
121: ICompilationUnit cu = javaContext.getCompilationUnit();
122: int offset = javaContext.getInvocationOffset();
123: int length = javaContext.getSelectionLength();
124: Point selection = javaContext.getViewer()
125: .getSelectedRange();
126: if (selection.y > 0) {
127: offset = selection.x;
128: length = selection.y;
129: }
130:
131: ArrayList result = new ArrayList();
132:
133: IJavadocCompletionProcessor[] processors = getContributedProcessors();
134: for (int i = 0; i < processors.length; i++) {
135: IJavadocCompletionProcessor curr = processors[i];
136: IJavaCompletionProposal[] proposals = curr
137: .computeCompletionProposals(cu, offset, length,
138: javaContext.getFlags());
139: if (proposals != null) {
140: for (int k = 0; k < proposals.length; k++) {
141: result.add(proposals[k]);
142: }
143: }
144: }
145: return result;
146: }
147: return Collections.EMPTY_LIST;
148: }
149:
150: /*
151: * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#getErrorMessage()
152: */
153: public String getErrorMessage() {
154: return fErrorMessage;
155: }
156:
157: /*
158: * @see org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer#sessionStarted()
159: */
160: public void sessionStarted() {
161: }
162:
163: /*
164: * @see org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer#sessionEnded()
165: */
166: public void sessionEnded() {
167: fErrorMessage = null;
168: }
169: }
|