]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/assist/SCLContentProposalProvider.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / assist / SCLContentProposalProvider.java
diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/assist/SCLContentProposalProvider.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/assist/SCLContentProposalProvider.java
new file mode 100644 (file)
index 0000000..8c51a11
--- /dev/null
@@ -0,0 +1,63 @@
+package org.simantics.scl.ui.assist;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.eclipse.jface.fieldassist.IContentProposal;\r
+import org.eclipse.jface.fieldassist.IContentProposalProvider;\r
+import org.simantics.scl.compiler.commands.CommandSession;\r
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
+import org.simantics.scl.compiler.environment.Environments;\r
+import org.simantics.scl.compiler.types.Type;\r
+\r
+\r
+public class SCLContentProposalProvider implements IContentProposalProvider {\r
+\r
+    private final CommandSession session;\r
+\r
+    public SCLContentProposalProvider(CommandSession session) {\r
+        this.session = session;\r
+    }\r
+\r
+    @Override\r
+    public IContentProposal[] getProposals(String contents, int position) {\r
+        int startPos = getPrefixStartPos(contents, position);\r
+        String prefix = contents.substring(startPos, position);\r
+        int prefixLength = prefix.length();\r
+        int namespaceLength = prefix.indexOf('.');\r
+        if(namespaceLength < 0)\r
+            namespaceLength = 0;\r
+        else\r
+            ++namespaceLength;\r
+        \r
+        List<SCLValue> values = Environments.findValuesForPrefix(\r
+                session.getRuntimeEnvironment().getEnvironment(),\r
+                prefix);\r
+        \r
+        ArrayList<IContentProposal> proposals = new ArrayList<IContentProposal>();\r
+        for(SCLValue value : values)\r
+            if(!value.isPrivate() && !(value.getName().name.contains("$") &&\r
+                    Character.isLetter(value.getName().name.charAt(0))))\r
+                proposals.add(new SCLContentProposal(value));\r
+        \r
+        prefix = prefix.toLowerCase();\r
+        for(Map.Entry<String,Type> entry : session.localNamesForContentProposals().entrySet())\r
+            if(entry.getKey().toLowerCase().startsWith(prefix))\r
+                proposals.add(new SCLContentProposal(entry.getKey(), "LocalEnvironment", entry.getValue()));\r
+        \r
+        return proposals.toArray(new IContentProposal[proposals.size()]);\r
+    }\r
+    \r
+    private static int getPrefixStartPos(String contents, int position) {\r
+        int pos = position;\r
+        while(pos > 0) {\r
+            char c = contents.charAt(pos-1);\r
+            if(Character.isJavaIdentifierPart(c) || c == '.')\r
+                --pos;\r
+            else\r
+                break;\r
+        }\r
+        return pos;\r
+    }\r
+}
\ No newline at end of file