package net.java.xpath.completion; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyEvent; import javax.swing.JToolTip; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.text.StyledDocument; import org.netbeans.api.editor.completion.Completion; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionResultSet; import org.netbeans.spi.editor.completion.CompletionTask; import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery; import org.netbeans.spi.editor.completion.support.AsyncCompletionTask; import org.netbeans.spi.editor.completion.support.CompletionUtilities; import org.openide.util.Exceptions; /** * * @author Michael Bien */ public class XPathCompletionItem implements CompletionItem { private String text; private static Color fieldColor = Color.decode("0x0000B2"); private int caretOffset; private int dotOffset; public XPathCompletionItem(String text, int dotOffset, int caretOffset) { this.text = text; this.dotOffset = dotOffset; this.caretOffset = caretOffset; } @Override public void defaultAction(JTextComponent component) { try { StyledDocument doc = (StyledDocument) component.getDocument(); if(component.getSelectionStart() == component.getSelectionEnd()) { doc.remove(dotOffset, caretOffset - dotOffset); }else{ doc.remove(dotOffset, component.getSelectionEnd() - dotOffset); } doc.insertString(dotOffset, text, null); Completion.get().hideAll(); } catch (BadLocationException ex) { Exceptions.printStackTrace(ex); } } @Override public void processKeyEvent(KeyEvent evt) { if(evt.getKeyCode() == KeyEvent.VK_ENTER && evt.getSource() instanceof JTextComponent) defaultAction((JTextComponent) evt.getSource()); } @Override public int getPreferredWidth(Graphics graphics, Font font) { return CompletionUtilities.getPreferredWidth(text, null, graphics, font); } @Override public void render(Graphics g, Font defaultFont, Color defaultColor, Color backgroundColor, int width, int height, boolean selected) { CompletionUtilities.renderHtml(null, text, null, g, defaultFont, (selected ? Color.white : fieldColor), width, height, selected); } @Override public CompletionTask createDocumentationTask() { return null; } @Override public CompletionTask createToolTipTask() { return new AsyncCompletionTask(new AsyncCompletionQuery() { @Override protected void query(CompletionResultSet completionResultSet, Document document, int i) { JToolTip toolTip = new JToolTip(); toolTip.setTipText("Press Enter to insert \"" + text + "\""); completionResultSet.setToolTip(toolTip); completionResultSet.finish(); } }); } @Override public boolean instantSubstitution(JTextComponent component) { defaultAction(component); return true; } @Override public int getSortPriority() { return 0; } @Override public CharSequence getSortText() { return text; } public String getText() { return text; } @Override public CharSequence getInsertPrefix() { return text; } }