]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java
Migrated source code from Simantics SVN
[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 extractAt(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     \r
57     @Override\r
58     public Object execute(ExecutionEvent event) throws ExecutionException {\r
59         IEditorPart editor = \r
60                 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();\r
61         if(!(editor instanceof SCLModuleEditor2))\r
62             return null;\r
63         SCLModuleEditor2 moduleEditor = (SCLModuleEditor2)editor;\r
64         StyledText styledText = (StyledText)moduleEditor.getAdapter(Control.class);\r
65         String identifierAtCaret = extractAt(styledText.getText(), styledText.getCaretOffset());\r
66         if(identifierAtCaret.isEmpty())\r
67             return null;\r
68         SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();\r
69         editorEnvironment.updateEnvironment(moduleEditor.getDocument());\r
70         SCLValue value = editorEnvironment.getValue(identifierAtCaret);\r
71         if(value != null)\r
72             OpenSCLDefinition.openDefinition(value);\r
73         return null;\r
74     }\r
75 \r
76 }\r