]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.ui.assist;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\r
5 import java.util.Map;\r
6 \r
7 import org.eclipse.jface.fieldassist.IContentProposal;\r
8 import org.eclipse.jface.fieldassist.IContentProposalProvider;\r
9 import org.simantics.scl.compiler.commands.CommandSession;\r
10 import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
11 import org.simantics.scl.compiler.environment.Environments;\r
12 import org.simantics.scl.compiler.types.Type;\r
13 \r
14 \r
15 public class SCLContentProposalProvider implements IContentProposalProvider {\r
16 \r
17     private final CommandSession session;\r
18 \r
19     public SCLContentProposalProvider(CommandSession session) {\r
20         this.session = session;\r
21     }\r
22 \r
23     @Override\r
24     public IContentProposal[] getProposals(String contents, int position) {\r
25         int startPos = getPrefixStartPos(contents, position);\r
26         String prefix = contents.substring(startPos, position);\r
27         int prefixLength = prefix.length();\r
28         int namespaceLength = prefix.indexOf('.');\r
29         if(namespaceLength < 0)\r
30             namespaceLength = 0;\r
31         else\r
32             ++namespaceLength;\r
33         \r
34         List<SCLValue> values = Environments.findValuesForPrefix(\r
35                 session.getRuntimeEnvironment().getEnvironment(),\r
36                 prefix);\r
37         \r
38         ArrayList<IContentProposal> proposals = new ArrayList<IContentProposal>();\r
39         for(SCLValue value : values)\r
40             if(!value.isPrivate() && !(value.getName().name.contains("$") &&\r
41                     Character.isLetter(value.getName().name.charAt(0))))\r
42                 proposals.add(new SCLContentProposal(value));\r
43         \r
44         prefix = prefix.toLowerCase();\r
45         for(Map.Entry<String,Type> entry : session.localNamesForContentProposals().entrySet())\r
46             if(entry.getKey().toLowerCase().startsWith(prefix))\r
47                 proposals.add(new SCLContentProposal(entry.getKey(), "LocalEnvironment", entry.getValue()));\r
48         \r
49         return proposals.toArray(new IContentProposal[proposals.size()]);\r
50     }\r
51     \r
52     private static int getPrefixStartPos(String contents, int position) {\r
53         int pos = position;\r
54         while(pos > 0) {\r
55             char c = contents.charAt(pos-1);\r
56             if(Character.isJavaIdentifierPart(c) || c == '.')\r
57                 --pos;\r
58             else\r
59                 break;\r
60         }\r
61         return pos;\r
62     }\r
63 }