package com.aptana.ide.editors.unified; import java.util.Arrays; import java.util.Comparator; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.contentassist.IContextInformationValidator; import com.aptana.ide.editors.unified.contentassist.IUnifiedContentAssistProcessor; import com.aptana.ide.editors.unified.contentassist.UnifiedContentAssistProcessor; import com.aptana.ide.editors.unified.contentassist.UnifiedTemplateCompletionProcessor; import com.aptana.ide.parsing.IOffsetMapper; public class MergingContentProcessor implements IContentAssistProcessor, IUnifiedContentAssistProcessor { private IContentAssistProcessor processor; private UnifiedTemplateCompletionProcessor templateProcessor; /** * MergingContentProcessor * * @param processor * @param unifiedTemplateCompletionProcessor */ public MergingContentProcessor(IContentAssistProcessor processor, UnifiedTemplateCompletionProcessor unifiedTemplateCompletionProcessor) { this.processor = processor; this.templateProcessor = unifiedTemplateCompletionProcessor; } /** * computeCompletionProposals */ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { return computeCompletionProposals(viewer, offset, UnifiedContentAssistProcessor.DEFAULT_CHARACTER); } /** * computeCompletionProposals */ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset, char activationChar) { return computeCompletionProposals(viewer, offset, activationChar, false); } /** * computeCompletionProposals */ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset, char activationChar, boolean autoActivated) { ICompletionProposal[] proposals; if (processor instanceof IUnifiedContentAssistProcessor) { proposals = ((IUnifiedContentAssistProcessor) processor).computeCompletionProposals(viewer, offset, activationChar, autoActivated); } else { proposals = processor.computeCompletionProposals(viewer, offset); } ICompletionProposal[] templates = templateProcessor.computeCompletionProposals(viewer, offset); if (proposals == null || proposals.length == 0) return templates; if (templates == null || templates.length == 0) return proposals; ICompletionProposal[] combined = new ICompletionProposal[proposals.length + templates.length]; System.arraycopy(proposals, 0, combined, 0, proposals.length); System.arraycopy(templates, 0, combined, proposals.length, templates.length); Arrays.sort(combined, new Comparator<ICompletionProposal>() { public int compare(ICompletionProposal o1, ICompletionProposal o2) { if (o1 == null) return -1; if (o2 == null) return 1; return o1.getDisplayString().compareTo(o2.getDisplayString()); } }); return combined; } /** * computeContextInformation */ public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) { return processor.computeContextInformation(viewer, offset); } /** * getCompletionProposalAutoActivationCharacters */ public char[] getCompletionProposalAutoActivationCharacters() { return processor.getCompletionProposalAutoActivationCharacters(); } /** * getCompletionProposalIdleActivationTokens */ public int[] getCompletionProposalIdleActivationTokens() { if (processor instanceof IUnifiedContentAssistProcessor) { return ((IUnifiedContentAssistProcessor) processor).getCompletionProposalIdleActivationTokens(); } return null; } /** * getContentAssistProcessor * * @return */ public IContentAssistProcessor getContentAssistProcessor() { return processor; } /** * getContextInformationAutoActivationCharacters */ public char[] getContextInformationAutoActivationCharacters() { return processor.getContextInformationAutoActivationCharacters(); } /** * getContextInformationValidator */ public IContextInformationValidator getContextInformationValidator() { return processor.getContextInformationValidator(); } /** * getErrorMessage */ public String getErrorMessage() { return processor.getErrorMessage(); } /** * getOffsetMapper */ public IOffsetMapper getOffsetMapper() { if (processor instanceof IUnifiedContentAssistProcessor) { return ((IUnifiedContentAssistProcessor) processor).getOffsetMapper(); } return null; } /** * isValidIdleActivationLocation */ public boolean isValidIdleActivationLocation(ITextViewer viewer, int offset) { if (processor instanceof IUnifiedContentAssistProcessor) { return ((IUnifiedContentAssistProcessor) processor).isValidIdleActivationLocation(viewer, offset); } return false; } }