Index: src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor.java,v
retrieving revision 1.26
diff -u -r1.26 CCompletionProcessor.java
--- src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor.java 13 Dec 2004 21:16:29 -0000 1.26
+++ src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor.java 17 Dec 2004 09:37:29 -0000
@@ -10,6 +10,7 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.regex.Pattern;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
@@ -32,13 +33,15 @@
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IFunctionSummary;
import org.eclipse.cdt.ui.IWorkingCopyManager;
-import org.eclipse.cdt.ui.text.ICHelpInvocationContext;
import org.eclipse.cdt.ui.text.ICCompletionProposal;
+import org.eclipse.cdt.ui.text.ICHelpInvocationContext;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TypedRegion;
import org.eclipse.jface.text.contentassist.ContextInformation;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
@@ -54,12 +57,13 @@
*/
public class CCompletionProcessor implements IContentAssistProcessor {
+
private static class ContextInformationWrapper implements IContextInformation, IContextInformationExtension {
private final IContextInformation fContextInformation;
private int fPosition;
- public ContextInformationWrapper(IContextInformation contextInformation) {
+ public ContextInformationWrapper(IContextInformation contextInformation) {
fContextInformation= contextInformation;
}
@@ -122,7 +126,6 @@
public CCompletionProcessor(IEditorPart editor) {
fEditor = (CEditor) editor;
-
// Needed for search
searchResultCollector = new BasicSearchResultCollector ();
resultCollector = new ResultCollector();
@@ -327,12 +330,109 @@
if (fCurrentCompletionNode != null) {
addProposalsFromSearch(fCurrentCompletionNode, completions);
addProposalsFromCompletionContributors(fCurrentCompletionNode, completions);
- addProposalsFromTemplates(viewer, fCurrentCompletionNode, completions);
- return order( (ICCompletionProposal[]) completions.toArray(new ICCompletionProposal[0]));
+ addProposalsFromTemplates(viewer, fCurrentCompletionNode, completions);
+ ICCompletionProposal fastProposal = null;
+ if (completions.size() > 1) {
+ fastProposal = checkForFastCompletion(completions);
+ }
+ if (fastProposal == null) {
+ return order((ICCompletionProposal[]) completions.toArray(new ICCompletionProposal[0]));
+ }
+ return new ICCompletionProposal[] { fastProposal };
}
return null;
}
-
+
+ /**
+ * Determines if character matches separator in fast completion postfix end.
+ *
+ * @param ch
+ * Character to check.
+ * @return true
if matches.
+ */
+ private static boolean isProposalEnd(char ch) {
+ return ch == '(' || Character.isWhitespace(ch);
+ }
+
+ /**
+ * Retrieves matching proposals. These which matches proposals.
+ * @param proposals Proposals to check.
+ * @param prefixChars Prefix to match.
+ * @return List of proposals which match to prefix.
+ */
+ private static List getMatchingProposals(List proposals, char[] prefixChars)
+ {
+ final List matchingCompletions = new LinkedList();
+ final int size = proposals.size();
+
+ // Retrieves only matching proposals.
+ for (int i = 0; i < size; i++) {
+ final ICCompletionProposal proposal = (ICCompletionProposal) proposals.get(i);
+ final char[] proposalChars = proposal.getDisplayString().toCharArray();
+ boolean skip = false;
+ for (int j = 0; j < prefixChars.length; j++) {
+ if (prefixChars[j] != proposalChars[j]) {
+ skip = true;
+ break;
+ }
+ }
+ if (!skip) {
+ matchingCompletions.add(proposal);
+ }
+ }
+ return matchingCompletions;
+ }
+ /**
+ * Checks if completions have their common part at the begining.
+ * If yes, it creates proposal with usage of this part.
+ * It is case sensitive.
+
+ * @param completions Completions for check.
+ * @return Found completion or null
+ */
+ private ICCompletionProposal checkForFastCompletion(List completions)
+ {
+ final char[] prefixChars = fCurrentCompletionNode.getCompletionPrefix().toCharArray();
+ final List matching = getMatchingProposals(completions, prefixChars);
+
+ // If no matching, all proposals should be shown.
+ final int size = matching.size();
+ if (size == 0) {
+ return null;
+ }
+
+ final StringBuffer resultProposal = new StringBuffer();
+ final char[] current = ((ICCompletionProposal) matching.get(0)).getDisplayString().toCharArray();
+ for (int currentCharIdx = prefixChars.length; currentCharIdx < current.length; currentCharIdx++) {
+ boolean end = false;
+ final char ch = current[currentCharIdx];
+ if (isProposalEnd(ch))
+ {
+ break;
+ }
+ for (int i = 0; i < size; i++) {
+ final char[] proposalChars = ((ICCompletionProposal) matching.get(i)).getDisplayString().toCharArray();
+ if (currentCharIdx < proposalChars.length) {
+ if (proposalChars[currentCharIdx] != ch) {
+ end = true;
+ break;
+ }
+ }
+ else {
+ end = true;
+ break;
+ }
+ }
+ if (end) {
+ break;
+ }
+ resultProposal.append(ch);
+ }
+ return resultProposal.length() == 0
+ ? null
+ : new CCompletionProposal(resultProposal.toString(), fCurrentOffset, resultProposal.length(), null, null, 0);
+ }
+
private void addProposalsFromTemplates(ITextViewer viewer, IASTCompletionNode completionNode, List completions){
if (completionNode == null)
return;
@@ -343,9 +443,9 @@
IASTCompletionNode.CompletionKind kind = completionNode.getCompletionKind();
-// if ((kind == IASTCompletionNode.CompletionKind.VARIABLE_TYPE) ||
-// (kind == IASTCompletionNode.CompletionKind.CLASS_REFERENCE)
-// || (kind == IASTCompletionNode.CompletionKind.SINGLE_NAME_REFERENCE)) {
+// if ((kind == IASTCompletionNode.CompletionKind.VARIABLE_TYPE) ||
+// (kind == IASTCompletionNode.CompletionKind.CLASS_REFERENCE)
+// || (kind == IASTCompletionNode.CompletionKind.SINGLE_NAME_REFERENCE)) {
addProposalsFromTemplateEngine(viewer, fTemplateEngine, completions);
// }
}