Browse Source

Stub autocompletion

Toni Helenius 8 months ago
parent
commit
1e340deb99

+ 121 - 0
jme3-glsl-highlighter/src/com/jme3/gde/glsl/highlighter/editor/GlslCompletionProvider.java

@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2003-2024 jMonkeyEngine
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * 
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.glsl.highlighter.editor;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.StyledDocument;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.spi.editor.completion.CompletionProvider;
+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.openide.util.Exceptions;
+
+@MimeRegistration(mimeType = "text/x-glsl", service = CompletionProvider.class)
+public class GlslCompletionProvider implements CompletionProvider {
+
+    @Override
+    public CompletionTask createTask(int queryType, JTextComponent component) {
+        if (queryType != CompletionProvider.COMPLETION_QUERY_TYPE) {
+            return null;
+        }
+
+        return new AsyncCompletionTask(new AsyncCompletionQuery() {
+            @Override
+            protected void query(CompletionResultSet completionResultSet,
+                    Document document, int caretOffset) {
+
+                String filter = getFilter(caretOffset, document);
+
+                // TODO: get the posibilities
+                // TODO: filter out the special chars
+
+                completionResultSet.finish();
+            }
+
+            private String getFilter(int caretOffset, Document document) {
+                try {
+                    final StyledDocument bDoc = (StyledDocument) document;
+                    final int lineStartOffset = getRowFirstNonWhite(bDoc, caretOffset);
+                    final char[] line = bDoc.getText(lineStartOffset, caretOffset - lineStartOffset).toCharArray();
+                    final int whiteOffset = indexOfWhite(line);
+
+                    return new String(line, whiteOffset + 1, line.length - whiteOffset - 1);
+                } catch (BadLocationException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+
+                return "";
+            }
+        }, component);
+    }
+
+    private static int getRowFirstNonWhite(StyledDocument doc, int offset)
+            throws BadLocationException {
+        Element lineElement = doc.getParagraphElement(offset);
+        int start = lineElement.getStartOffset();
+        while (start + 1 < lineElement.getEndOffset()) {
+            try {
+                if (doc.getText(start, 1).charAt(0) != ' ') {
+                    break;
+                }
+            } catch (BadLocationException ex) {
+                throw (BadLocationException) new BadLocationException(
+                        "calling getText(" + start + ", " + (start + 1)
+                        + ") on doc of length: " + doc.getLength(), start
+                ).initCause(ex);
+            }
+            start++;
+        }
+        return start;
+    }
+
+    private static int indexOfWhite(char[] line) {
+        int i = line.length;
+        while (--i > -1) {
+            final char c = line[i];
+            if (Character.isWhitespace(c)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    @Override
+    public int getAutoQueryTypes(JTextComponent jtc, String string) {
+        return 0;
+    }
+}