diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/PartitionDamager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/PartitionDamager.java index 06099b8246c..a16bf0c313b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/PartitionDamager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/PartitionDamager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. * 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 @@ -11,10 +11,12 @@ package org.eclipse.cdt.internal.ui.text; +import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITypedRegion; +import org.eclipse.jface.text.Region; import org.eclipse.jface.text.presentation.IPresentationDamager; /** @@ -30,6 +32,17 @@ public class PartitionDamager implements IPresentationDamager { */ public IRegion getDamageRegion(ITypedRegion partition, DocumentEvent event, boolean documentPartitioningChanged) { + if (!documentPartitioningChanged && event.getOffset() == partition.getOffset() + partition.getLength()) { + IRegion lineRegion; + try { + lineRegion = event.fDocument.getLineInformationOfOffset(event.getOffset()); + int start= partition.getOffset(); + int end= lineRegion.getOffset() + lineRegion.getLength(); + return new Region(start, end - start); + } catch (BadLocationException exc) { + // ignore + } + } return partition; } 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 b27cf437324..278eee8be22 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 @@ -12,16 +12,22 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.text.contentassist; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; 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.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.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; import org.eclipse.ui.IEditorPart; import org.eclipse.cdt.ui.CUIPlugin; @@ -37,6 +43,83 @@ import org.eclipse.cdt.internal.ui.text.CParameterListValidator; */ public class CContentAssistProcessor extends ContentAssistProcessor { + /** + * A wrapper for {@link ICompetionProposal}s. + */ + private static class CCompletionProposalWrapper implements ICCompletionProposal { + + private ICompletionProposal fWrappedProposal; + + public CCompletionProposalWrapper(ICompletionProposal proposal) { + fWrappedProposal= proposal; + } + + /* + * @see org.eclipse.cdt.ui.text.ICCompletionProposal#getIdString() + */ + public String getIdString() { + return fWrappedProposal.getDisplayString(); + } + + /* + * @see org.eclipse.cdt.ui.text.ICCompletionProposal#getRelevance() + */ + public int getRelevance() { + return -1; + } + + /* + * @see org.eclipse.jface.text.contentassist.ICompletionProposal#apply(org.eclipse.jface.text.IDocument) + */ + public void apply(IDocument document) { + throw new UnsupportedOperationException(); + } + + /* + * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo() + */ + public String getAdditionalProposalInfo() { + return fWrappedProposal.getAdditionalProposalInfo(); + } + + /* + * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getContextInformation() + */ + public IContextInformation getContextInformation() { + return fWrappedProposal.getContextInformation(); + } + + /* + * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString() + */ + public String getDisplayString() { + return fWrappedProposal.getDisplayString(); + } + + /* + * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage() + */ + public Image getImage() { + return fWrappedProposal.getImage(); + } + + /* + * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection(org.eclipse.jface.text.IDocument) + */ + public Point getSelection(IDocument document) { + return fWrappedProposal.getSelection(document); + } + + /** + * @return the original proposal + */ + public ICompletionProposal unwrap() { + return fWrappedProposal; + } + + } + + private IContextInformationValidator fValidator; private final IEditorPart fEditor; @@ -60,10 +143,29 @@ public class CContentAssistProcessor extends ContentAssistProcessor { */ protected List filterAndSortProposals(List proposals, IProgressMonitor monitor, ContentAssistInvocationContext context) { IProposalFilter filter = getCompletionFilter(); - ICCompletionProposal[] proposalsInput = (ICCompletionProposal[]) proposals.toArray(new ICCompletionProposal[proposals.size()]) ; + ICCompletionProposal[] proposalsInput= new ICCompletionProposal[proposals.size()]; + // wrap proposals which are no ICCompletionProposals + int i=0; + for (Iterator iterator = proposals.iterator(); iterator.hasNext(); ) { + ICompletionProposal proposal= (ICompletionProposal) iterator.next(); + if (proposal instanceof ICCompletionProposal) { + proposalsInput[i++]= (ICCompletionProposal)proposal; + } else { + proposalsInput[i++]= new CCompletionProposalWrapper(proposal); + } + } ICCompletionProposal[] proposalsFiltered = filter.filterProposals(proposalsInput); - - return Arrays.asList(proposalsFiltered); + // unwrap again + ArrayList filteredList= new ArrayList(proposalsFiltered.length); + for (int j= 0; j < proposalsFiltered.length; j++) { + ICCompletionProposal proposal= proposalsFiltered[j]; + if (proposal instanceof CCompletionProposalWrapper) { + filteredList.add(((CCompletionProposalWrapper)proposal).unwrap()); + } else { + filteredList.add(proposal); + } + } + return filteredList; } private IProposalFilter getCompletionFilter() {