--- /dev/null
+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