package ctagsinterface.jedit; import static completion.util.CompletionUtil.createAbbrev; import java.awt.Component; import javax.swing.DefaultListCellRenderer; import javax.swing.JList; import javax.swing.ListCellRenderer; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.buffer.JEditBuffer; import org.gjt.sp.jedit.textarea.TextArea; import superabbrevs.SuperAbbrevs; import completion.service.CompletionCandidate; import completion.util.CompletionUtil; import ctagsinterface.main.KindIconProvider; import ctagsinterface.main.Tag; /** * Use this class for Ctags code completions. * */ @SuppressWarnings("serial") public class CtagsCompletionCandidate extends DefaultListCellRenderer implements CompletionCandidate { public Tag tag; public CtagsCompletionCandidate (Tag tag) { this.tag = tag; } @Override public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, null, index, isSelected, cellHasFocus); String kind = tag.getKind(); if (kind == null) kind = ""; setIcon(KindIconProvider.getIcon(kind)); setText(CompletionUtil.prefixByIndex(getDescription(), index)); return this; } @Override public void complete (View view) { TextArea textArea = view.getTextArea(); String prefix = CompletionUtil.getCompletionPrefix(view); int caret = textArea.getCaretPosition(); JEditBuffer buffer = textArea.getBuffer(); if (prefix.length() > 0) { buffer.remove(caret - prefix.length(), prefix.length()); } // Check if a parametrized abbreviation is needed String sig = getDescription(); if (sig == null || sig.length() == 0) return; String abbrev = createAbbrev(sig); SuperAbbrevs.expandAbbrev(view, abbrev, null); } @Override public ListCellRenderer getCellRenderer () { return this; } @Override public String getDescription () { StringBuilder sb = new StringBuilder(); sb.append(tag.getName()); String signature = tag.getExtension("signature"); if (signature != null && signature.length() > 0) sb.append(signature); String namespace = tag.getNamespace(); if (namespace != null && namespace.length() > 0) sb.append(" - " + namespace); return sb.toString(); } @Override public boolean isValid (View view) { String prefix = CompletionUtil.getCompletionPrefix(view); if (prefix == null || prefix.length() == 0) { return true; } //If the completion matches the prefix exactly, ignore it (it doesn't add anything) if (prefix.trim().equals(getDescription().trim())) { return false; } //If the prefix is all in lower case, ignore case. if (prefix.toLowerCase().equals(prefix)) { return tag.getName().toLowerCase().startsWith(prefix.toLowerCase()); } else { return tag.getName().startsWith(prefix); } } @Override public int compareTo (CompletionCandidate o) { if (o instanceof CtagsCompletionCandidate) { tag.getName().compareTo(((CtagsCompletionCandidate)o).tag.getName()); } return tag.getName().compareTo(o.getDescription()); } @Override public String getLabelText() { return null; } }