From ba7fc92b2ef83fb6eacab03321d9cd8bc79ac223 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 20 Jun 2007 13:21:37 +0000 Subject: [PATCH] Fix for 126871, invalid auto-activation of content-assist after ':' and '>'. --- .../contentassist/ContentAssistTests.java | 3 +- .../AbstractContentAssistTest.java | 3 +- .../ui/text/CSourceViewerConfiguration.java | 11 +-- .../CContentAssistProcessor.java | 77 ++++++++++++++++++- .../contentassist/ContentAssistProcessor.java | 5 +- 5 files changed, 89 insertions(+), 10 deletions(-) diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java index e9733251d02..7c7a0140135 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ /* @@ -174,7 +175,7 @@ public class ContentAssistTests extends BaseUITestCase { String contentType = editor.getViewer().getDocument().getContentType(offset); ContentAssistant assistant = new ContentAssistant(); - CContentAssistProcessor processor = new CContentAssistProcessor(editor, assistant, contentType); + CContentAssistProcessor processor = new CContentAssistProcessor(editor, editor.getViewer(), assistant, contentType); return processor.computeCompletionProposals(editor.getViewer(), offset); } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/AbstractContentAssistTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/AbstractContentAssistTest.java index 7953aa8561c..5aeff12cbe7 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/AbstractContentAssistTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/AbstractContentAssistTest.java @@ -9,6 +9,7 @@ * IBM Rational Software - Initial API and implementation * Anton Leherbauer (Wind River Systems) * Bryan Wilkinson (QNX) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.ui.tests.text.contentassist2; @@ -102,7 +103,7 @@ public abstract class AbstractContentAssistTest extends BaseUITestCase { ISourceViewer sourceViewer= EditorTestHelper.getSourceViewer((AbstractTextEditor)fEditor); String contentType = sourceViewer.getDocument().getContentType(offset); ContentAssistant assistant = new ContentAssistant(); - CContentAssistProcessor processor = new CContentAssistProcessor(fEditor, assistant, contentType); + CContentAssistProcessor processor = new CContentAssistProcessor(fEditor, sourceViewer, assistant, contentType); long startTime= System.currentTimeMillis(); Object[] results = isCompletion ? (Object[]) processor.computeCompletionProposals(sourceViewer, offset) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java index d6b1daaee7b..047dfbe92c0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java @@ -10,6 +10,7 @@ * QNX Software System * Anton Leherbauer (Wind River Systems) * Sergey Prigogin, Google + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text; @@ -357,19 +358,19 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { assistant.setRestoreCompletionProposalSize(getSettings("completion_proposal_size")); //$NON-NLS-1$ - IContentAssistProcessor processor = new CContentAssistProcessor(getEditor(), assistant, IDocument.DEFAULT_CONTENT_TYPE); + IContentAssistProcessor processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, IDocument.DEFAULT_CONTENT_TYPE); assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE); - processor = new CContentAssistProcessor(getEditor(), assistant, ICPartitions.C_MULTI_LINE_COMMENT); + processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_MULTI_LINE_COMMENT); assistant.setContentAssistProcessor(processor, ICPartitions.C_MULTI_LINE_COMMENT); - processor = new CContentAssistProcessor(getEditor(), assistant, ICPartitions.C_SINGLE_LINE_COMMENT); + processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_SINGLE_LINE_COMMENT); assistant.setContentAssistProcessor(processor, ICPartitions.C_SINGLE_LINE_COMMENT); - processor = new CContentAssistProcessor(getEditor(), assistant, ICPartitions.C_STRING); + processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_STRING); assistant.setContentAssistProcessor(processor, ICPartitions.C_STRING); - processor = new CContentAssistProcessor(getEditor(), assistant, ICPartitions.C_PREPROCESSOR); + processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_PREPROCESSOR); assistant.setContentAssistProcessor(processor, ICPartitions.C_PREPROCESSOR); ContentAssistPreference.configure(assistant, fPreferenceStore); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistProcessor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistProcessor.java index 278eee8be22..a396a7cfb69 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistProcessor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistProcessor.java @@ -9,6 +9,7 @@ * IBM Corporation - initial API and implementation * Anton Leherbauer (Wind River Systems) * Bryan Wilkinson (QNX) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text.contentassist; @@ -20,12 +21,14 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.InvalidRegistryObjectException; +import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.ContentAssistant; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.contentassist.IContextInformationValidator; +import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.ui.IEditorPart; @@ -120,12 +123,22 @@ public class CContentAssistProcessor extends ContentAssistProcessor { } + private static final int IDX_AFTERDASH = 0; + private static final int IDX_AFTERCOLON = 1; + private static final int IDX_AFTEROTHER = 2; + private static final int IDX_ALL = 3; + + + private IContextInformationValidator fValidator; private final IEditorPart fEditor; + private char[][] fCompletionAutoActivationCharacters; + private ISourceViewer fViewer; - public CContentAssistProcessor(IEditorPart editor, ContentAssistant assistant, String partition) { + public CContentAssistProcessor(IEditorPart editor, ISourceViewer viewer, ContentAssistant assistant, String partition) { super(assistant, partition); fEditor= editor; + fViewer= viewer; } /* @@ -205,5 +218,67 @@ public class CContentAssistProcessor extends ContentAssistProcessor { protected ContentAssistInvocationContext createContext(ITextViewer viewer, int offset, boolean isCompletion) { return new CContentAssistInvocationContext(viewer, offset, fEditor, isCompletion); } + + public void setCompletionProposalAutoActivationCharacters(char[] activationSet) { + if (activationSet == null) { + fCompletionAutoActivationCharacters= null; + } + else { + final int len= activationSet.length; + StringBuffer afterDash= new StringBuffer(len); + StringBuffer afterColon= new StringBuffer(len); + StringBuffer afterOther= new StringBuffer(len); + for (int i = 0; i < activationSet.length; i++) { + final char c = activationSet[i]; + switch(c) { + case ':': + afterColon.append(c); + break; + case '>': + afterDash.append(c); + break; + default: + afterDash.append(c); + afterColon.append(c); + afterOther.append(c); + break; + } + } + fCompletionAutoActivationCharacters= new char[4][]; + fCompletionAutoActivationCharacters[IDX_AFTERDASH]= afterDash.toString().toCharArray(); + fCompletionAutoActivationCharacters[IDX_AFTERCOLON]= afterColon.toString().toCharArray(); + fCompletionAutoActivationCharacters[IDX_AFTEROTHER]= afterOther.toString().toCharArray(); + fCompletionAutoActivationCharacters[IDX_ALL]= activationSet; + } + } + + + public char[] getCompletionProposalAutoActivationCharacters() { + if (fCompletionAutoActivationCharacters == null) { + return null; + } + + if (fViewer != null) { + char prevChar= 0; + try { + final IDocument doc= fViewer.getDocument(); + if (doc != null) { + prevChar= doc.getChar(fViewer.getSelectedRange().x-1); + } + } + catch (BadLocationException e) { + // beginning of document. + } + switch (prevChar) { + case ':': + return fCompletionAutoActivationCharacters[IDX_AFTERCOLON]; + case '-': + return fCompletionAutoActivationCharacters[IDX_AFTERDASH]; + default: + return fCompletionAutoActivationCharacters[IDX_AFTEROTHER]; + } + } + return fCompletionAutoActivationCharacters[IDX_ALL]; + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistProcessor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistProcessor.java index 250791ab98d..6e7588e364e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistProcessor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistProcessor.java @@ -9,6 +9,7 @@ * IBM Corporation - initial API and implementation * Anton Leherbauer (Wind River Systems) * Bryan Wilkinson (QNX) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text.contentassist; @@ -333,7 +334,7 @@ public class ContentAssistProcessor implements IContentAssistProcessor { * * @param activationSet the activation set */ - public final void setCompletionProposalAutoActivationCharacters(char[] activationSet) { + public void setCompletionProposalAutoActivationCharacters(char[] activationSet) { fCompletionAutoActivationCharacters= activationSet; } @@ -341,7 +342,7 @@ public class ContentAssistProcessor implements IContentAssistProcessor { /* * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters() */ - public final char[] getCompletionProposalAutoActivationCharacters() { + public char[] getCompletionProposalAutoActivationCharacters() { return fCompletionAutoActivationCharacters; }