From 4ce1f056b6d49df96ad5c00fb393158574ad4c6d Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Fri, 19 Nov 2010 16:19:36 +0100
Subject: [PATCH] Added support for automatic completion.

---
 src/plugins/glsleditor/glslcodecompletion.cpp | 73 ++++++++++++++++++-
 1 file changed, 72 insertions(+), 1 deletion(-)

diff --git a/src/plugins/glsleditor/glslcodecompletion.cpp b/src/plugins/glsleditor/glslcodecompletion.cpp
index 79e7b1548d2..c0ab60c58bf 100644
--- a/src/plugins/glsleditor/glslcodecompletion.cpp
+++ b/src/plugins/glsleditor/glslcodecompletion.cpp
@@ -28,12 +28,53 @@
 **************************************************************************/
 #include "glslcodecompletion.h"
 #include "glsleditor.h"
+#include <texteditor/completionsettings.h>
 #include <QtGui/QIcon>
 #include <QtGui/QPainter>
 #include <QtCore/QDebug>
 
 using namespace GLSLEditor;
 
+static bool isIdentifierChar(QChar ch)
+{
+    return ch.isLetterOrNumber() || ch == QLatin1Char('_');
+}
+
+static bool isDelimiter(QChar ch)
+{
+    switch (ch.unicode()) {
+    case '{':
+    case '}':
+    case '[':
+    case ']':
+    case ')':
+    case '?':
+    case '!':
+    case ':':
+    case ';':
+    case ',':
+    case '+':
+    case '-':
+    case '*':
+    case '/':
+        return true;
+
+    default:
+        return false;
+    }
+}
+
+static bool checkStartOfIdentifier(const QString &word)
+{
+    if (! word.isEmpty()) {
+        const QChar ch = word.at(0);
+        if (ch.isLetter() || ch == QLatin1Char('_'))
+            return true;
+    }
+
+    return false;
+}
+
 // Temporary workaround until we have proper icons for QML completion items
 static QIcon iconForColor(const QColor &color)
 {
@@ -229,7 +270,37 @@ bool CodeCompletion::supportsEditor(TextEditor::ITextEditable *editor)
 
 bool CodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
 {
-    Q_UNUSED(editor);
+    const int cursorPosition = editor->position();
+    const QChar ch = editor->characterAt(cursorPosition - 1);
+
+    if (completionSettings().m_completionTrigger == TextEditor::AutomaticCompletion) {
+        const QChar characterUnderCursor = editor->characterAt(cursorPosition);
+
+        if (isIdentifierChar(ch) && (characterUnderCursor.isSpace() ||
+                                     characterUnderCursor.isNull() ||
+                                     isDelimiter(characterUnderCursor))) {
+            int pos = editor->position() - 1;
+            for (; pos != -1; --pos) {
+                if (! isIdentifierChar(editor->characterAt(pos)))
+                    break;
+            }
+            ++pos;
+
+            const QString word = editor->textAt(pos, cursorPosition - pos);
+            if (word.length() > 2 && checkStartOfIdentifier(word)) {
+                for (int i = 0; i < word.length(); ++i) {
+                    if (! isIdentifierChar(word.at(i)))
+                        return false;
+                }
+                return true;
+            }
+        }
+    }
+
+    //    if (ch == QLatin1Char('(') || ch == QLatin1Char('.') || ch == QLatin1Char('/'))
+    //        return true;
+
+
     return false;
 }
 
-- 
GitLab