package org.netbeans.editor.ext.q; import studio.kdb.K; import studio.kdb.Server; import studio.kdb.ConnectionPool; import studio.ui.Util; import org.netbeans.editor.BaseDocument; import org.netbeans.editor.SyntaxSupport; import org.netbeans.editor.ext.CompletionQuery; import javax.swing.*; import javax.swing.text.BadLocationException; import javax.swing.text.Caret; import javax.swing.text.JTextComponent; import java.awt.*; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import studio.kdb.Config; public class QCompletionQuery implements CompletionQuery { private static ImageIcon currentIcon; private static boolean lowerCase; public CompletionQuery.Result query(JTextComponent component, int offset, SyntaxSupport support) { CompletionQuery.Result r = null; currentIcon= null; try { if (component instanceof JEditorPane) { Server s = (Server) ((JEditorPane) component).getDocument().getProperty("server"); if (s != null) { List result = new ArrayList(); String text = ((JEditorPane) component).getDocument().getText(0, offset); StringTokenizer t= new StringTokenizer(text, " %$!&()=~#;:><?,+-'\"/*"); while( t.hasMoreTokens()) { text= t.nextToken(); } kx.c c= null; try { c=ConnectionPool.getInstance().leaseConnection(s); ConnectionPool.getInstance().checkConnected(c); if(text.endsWith(".")) { c.k(new K.KCharacterVector("cols "+text.substring(0,text.length()-1))); Object res = c.getResponse(); if( res instanceof K.KSymbolVector) { K.KSymbolVector tables= (K.KSymbolVector)res; for (int i = 0; i < tables.getLength(); i++) { result.add(new BooleanAttribItem(((K.KSymbol)tables.at(i)).s, offset, 0, false)); } currentIcon= Util.getImage(Config.imageBase2+"column.png"); r = new CompletionQuery.DefaultResult(component, "Columns", result, offset, 0); } } else { c.k(new K.KCharacterVector("tables[]")); Object res = c.getResponse(); if( res instanceof K.KSymbolVector) { K.KSymbolVector tables= (K.KSymbolVector)res; for(int i = 0; i < tables.getLength(); i++) { result.add(new BooleanAttribItem(((K.KSymbol)tables.at(i)).s, offset, 0, false)); } currentIcon= Util.getImage(Config.imageBase2+"table.png"); r = new CompletionQuery.DefaultResult(component, "Tables", result, offset, 0); } } } catch (Throwable th) { } finally { if(c != null) ConnectionPool.getInstance().freeConnection(s,c); } } } } catch (Throwable th) { } return r; } private static abstract class QResultItem implements CompletionQuery.ResultItem { static javax.swing.JLabel rubberStamp = new javax.swing.JLabel(); static { rubberStamp.setOpaque(true); } String baseText; int offset; int length; public QResultItem(String baseText, int offset, int length) { this.baseText = lowerCase ? baseText.toLowerCase() : baseText; this.offset = offset; this.length = length; } boolean replaceText(JTextComponent component, String text) { BaseDocument doc = (BaseDocument) component.getDocument(); doc.atomicLock(); try { doc.remove(offset, length); doc.insertString(offset, text, null); } catch (BadLocationException exc) { return false; //not sucessfull } finally { doc.atomicUnlock(); } return true; } public boolean substituteCommonText(JTextComponent c, int a, int b, int subLen) { return replaceText(c, getItemText().substring(0, subLen)); } public boolean substituteText(JTextComponent c, int a, int b, boolean shift) { return replaceText(c, getItemText()); } /** @return Properly colored JLabel with text gotten from <CODE>getPaintText()</CODE>. */ public java.awt.Component getPaintComponent(javax.swing.JList list, boolean isSelected, boolean cellHasFocus) { // The space is prepended to avoid interpretation as Q Label rubberStamp.setText(" " + getPaintText()); // NOI18N if( currentIcon != null) { rubberStamp.setIcon( currentIcon); rubberStamp.setIconTextGap(8); } if (isSelected) { rubberStamp.setBackground(list.getSelectionBackground()); rubberStamp.setForeground(list.getSelectionForeground()); } else { rubberStamp.setBackground(list.getBackground()); rubberStamp.setForeground(getPaintColor()); } return rubberStamp; } String getPaintText() { return getItemText(); } abstract Color getPaintColor(); public String getItemText() { return baseText; } } static class EndTagItem extends QResultItem { public EndTagItem(String baseText, int offset, int length) { super(baseText, offset, length); } Color getPaintColor() { return Color.blue; } public String getItemText() { return "</" + baseText + ">"; } // NOI18N public boolean substituteText(JTextComponent c, int a, int b, boolean shift) { return super.substituteText(c, a, b, shift); } } private static class CharRefItem extends QResultItem { public CharRefItem(String name, int offset, int length) { super(name, offset, length); } Color getPaintColor() { return Color.red.darker(); } public String getItemText() { return "&" + baseText + ";"; } // NOI18N } private static class TagItem extends QResultItem { public TagItem(String name, int offset, int length) { super(name, offset, length); } public boolean substituteText(JTextComponent c, int a, int b, boolean shift) { replaceText(c, "<" + baseText + (shift ? " >" : ">")); // NOI18N if (shift) { Caret caret = c.getCaret(); caret.setDot(caret.getDot() - 1); } return !shift; // flag == false; } Color getPaintColor() { return Color.blue; } public String getItemText() { return "<" + baseText + ">"; } // NOI18N } private static class SetAttribItem extends QResultItem { boolean required; public SetAttribItem(String name, int offset, int length, boolean required) { super(name, offset, length); this.required = required; } Color getPaintColor() { return required ? Color.red : Color.green.darker(); } String getPaintText() { return baseText; } public String getItemText() { return baseText + "="; } //NOI18N public boolean substituteText(JTextComponent c, int a, int b, boolean shift) { super.substituteText(c, 0, 0, shift); return false; // always refresh } } private static class BooleanAttribItem extends QResultItem { boolean required; public BooleanAttribItem(String name, int offset, int length, boolean required) { super(name, offset, length); this.required = required; } Color getPaintColor() { return required ? Color.red : Color.green.darker(); } public boolean substituteText(JTextComponent c, int a, int b, boolean shift) { replaceText(c, shift ? baseText + " " : baseText); return false; // always refresh } } private static class PlainAttribItem extends QResultItem { boolean required; public PlainAttribItem(String name, int offset, int length, boolean required) { super(name, offset, length); this.required = required; } Color getPaintColor() { return required ? Color.red : Color.green.darker(); } public boolean substituteText(JTextComponent c, int a, int b, boolean shift) { replaceText(c, baseText + "=''"); //NOI18N if (shift) { Caret caret = c.getCaret(); caret.setDot(caret.getDot() - 1); } return false; // always refresh } } private static class ValueItem extends QResultItem { public ValueItem(String name, int offset, int length) { super(name, offset, length); } Color getPaintColor() { return Color.magenta; } public boolean substituteText(JTextComponent c, int a, int b, boolean shift) { replaceText(c, shift ? baseText + " " : baseText); // NOI18N return !shift; } } }