/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.ui.editor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.CompletionProposal;
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;
public class SuppressionsContentAssistProcessor implements
IContentAssistProcessor {
@Override
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
int offset) {
List<ICompletionProposal> completions = new ArrayList<>();
IDocument doc = viewer.getDocument();
try {
// check if we're in the middle of a word
String prefix = completionWord(doc, offset);
int replacementOffset = offset;
int replacementLength = 0;
if (prefix != null) {
// replacing what's been typed so far
replacementLength = prefix.length();
// subtract prefix length from offset
replacementOffset -= replacementLength;
}
String toolName = getToolName(doc, replacementOffset);
String[] words = getCompletionStrings(prefix, toolName);
for (String word : words) {
completions.add(new CompletionProposal(word, replacementOffset, replacementLength, word.length()));
}
} catch (BadLocationException e) {
e.printStackTrace();
}
return completions.toArray(new ICompletionProposal[completions.size()]);
}
@Override
public IContextInformation[] computeContextInformation(ITextViewer viewer,
int offset) {
return new IContextInformation[0];
}
@Override
public char[] getCompletionProposalAutoActivationCharacters() {
return null;
}
@Override
public char[] getContextInformationAutoActivationCharacters() {
return null;
}
@Override
public IContextInformationValidator getContextInformationValidator() {
return null;
}
@Override
public String getErrorMessage() {
return null;
}
private String completionWord(IDocument doc, int offset)
throws BadLocationException {
String word = null;
if (offset > 0) {
for (int n = offset - 1; n >= 0 && word == null; n--) {
char c = doc.getChar(n);
if (!Character.isLetterOrDigit(c)) {
word = doc.get(n + 1, offset - n - 1);
}
else if (n == 0) {
// beginning of file
word = doc.get(0, offset - n);
}
}
}
return word;
}
private String[] getCompletionStrings(String prefix, String toolName) {
List<String> words = new ArrayList<>();
// If the cursor is after "Memcheck:"
if (toolName != null && toolName.equals(SuppressionsElementScanner.MEMCHECK)) {
for (String word : SuppressionsElementScanner.MEMCHECK_SUPP_TYPES) {
if (prefix == null || word.startsWith(prefix)) {
words.add(word);
}
}
} else {
if (prefix == null || SuppressionsElementScanner.MEMCHECK.startsWith(prefix)) {
words.add(SuppressionsElementScanner.MEMCHECK + ":"); //$NON-NLS-1$
}
for (String word : SuppressionsElementScanner.CONTEXTS) {
if (prefix == null || word.startsWith(prefix)) {
words.add(word + ":"); //$NON-NLS-1$
}
}
}
return words.toArray(new String[words.size()]);
}
private String getToolName(IDocument doc, int offset) throws BadLocationException {
String tool = null;
if (offset > 0) {
char c = doc.getChar(--offset);
// syntax is "toolName:suppressionKind"
if (c == ':' && offset > 0) {
for (int n = offset - 1; n >= 0 && tool == null; n--) {
c = doc.getChar(n);
if (!Character.isLetter(c)) {
tool = doc.get(n + 1, offset - n - 1);
} else if (n == 0) {
// Beginning of file
tool = doc.get(0, offset - n);
}
}
}
}
return tool;
}
}