]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java
Merge commit '53059ca'
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / OpenDeclaration.java
1 package org.simantics.scl.ui.editor2;\r
2 \r
3 \r
4 import org.eclipse.core.commands.AbstractHandler;\r
5 import org.eclipse.core.commands.ExecutionEvent;\r
6 import org.eclipse.core.commands.ExecutionException;\r
7 import org.eclipse.swt.custom.StyledText;\r
8 import org.eclipse.swt.widgets.Control;\r
9 import org.eclipse.ui.IEditorPart;\r
10 import org.eclipse.ui.PlatformUI;\r
11 import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
12 import org.simantics.scl.ui.editor.completion.SCLTextEditorEnvironment;\r
13 \r
14 public class OpenDeclaration extends AbstractHandler {\r
15 \r
16     private static boolean isIdentifierPart(char c) {\r
17         return Character.isJavaIdentifierPart(c) || c=='.';\r
18     }\r
19     \r
20     private static String extractIdentifierAt(String text, int caretPos) {\r
21         int startPos = caretPos;\r
22         while(startPos > 0 && isIdentifierPart(text.charAt(startPos-1)))\r
23             --startPos;\r
24         int endPos = caretPos;\r
25         while(endPos < text.length() && isIdentifierPart(text.charAt(endPos)))\r
26             ++endPos;\r
27         return text.substring(startPos, endPos);\r
28     }\r
29     \r
30     private static final String SYMBOL_CHARS = "!$%&*+/<=>?@\\^|-:~.";\r
31     \r
32     private static boolean isSymbolPart(char c) {\r
33         for(int i=0;i<SYMBOL_CHARS.length();++i)\r
34             if(SYMBOL_CHARS.charAt(i) == c)\r
35                 return true;\r
36         return false;\r
37     }\r
38     \r
39     private static String extractSymbolAt(String text, int caretPos) {\r
40         int startPos = caretPos;\r
41         while(startPos > 0 && isSymbolPart(text.charAt(startPos-1)))\r
42             --startPos;\r
43         int endPos = caretPos;\r
44         while(endPos < text.length() && isSymbolPart(text.charAt(endPos)))\r
45             ++endPos;\r
46         return text.substring(startPos, endPos);\r
47     }\r
48     \r
49     public static String extractIdentifierOrSymbolAt(String text, int caretPos) {\r
50         String result = extractIdentifierAt(text, caretPos);\r
51         if(!result.isEmpty())\r
52             return result;\r
53         return extractSymbolAt(text, caretPos);\r
54     }\r
55     \r
56     private static String extractLineAt(String text, int caretPos) {\r
57         int startPos = caretPos;\r
58         while(startPos > 0 && !isNewline(text.charAt(startPos-1)))\r
59             --startPos;\r
60         int endPos = caretPos;\r
61         while(endPos < text.length() && !isNewline(text.charAt(endPos)))\r
62             ++endPos;\r
63         return text.substring(startPos, endPos);\r
64     }\r
65     \r
66     private static boolean isNewline(char c) {\r
67         return c=='\n' || c=='\r';\r
68     }\r
69 \r
70     @Override\r
71     public Object execute(ExecutionEvent event) throws ExecutionException {\r
72         IEditorPart editor = \r
73                 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();\r
74         if(!(editor instanceof SCLModuleEditor2))\r
75             return null;\r
76         SCLModuleEditor2 moduleEditor = (SCLModuleEditor2)editor;\r
77         StyledText styledText = (StyledText)moduleEditor.getAdapter(Control.class);\r
78         String text = styledText.getText();\r
79         int caretOffset = styledText.getCaretOffset();\r
80         \r
81         // Find the line where the caret is\r
82         String lineAtCaret = extractLineAt(text, caretOffset);\r
83         if(lineAtCaret.startsWith("import ") || lineAtCaret.startsWith("include ")) {\r
84             int p1 = lineAtCaret.indexOf('"', 6);\r
85             int p2 = lineAtCaret.indexOf('"', p1+1);\r
86             String moduleName = lineAtCaret.substring(p1+1, p2);\r
87             OpenSCLModule.openModule(moduleName);\r
88         }\r
89         else {\r
90             // Try to find an identifier at caret\r
91             String identifierAtCaret = extractIdentifierOrSymbolAt(text, caretOffset);\r
92             if(identifierAtCaret.isEmpty())\r
93                 return null;\r
94             SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();\r
95             editorEnvironment.updateEnvironment(moduleEditor.getDocument());\r
96             SCLValue value = editorEnvironment.getValue(identifierAtCaret);\r
97             if(value != null)\r
98                 OpenSCLDefinition.openDefinition(value);\r
99         }\r
100         return null;\r
101     }\r
102 \r
103 }\r