]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java
new file mode 100644 (file)
index 0000000..f8ea0c2
--- /dev/null
@@ -0,0 +1,76 @@
+package org.simantics.scl.ui.editor2;\r
+\r
+\r
+import org.eclipse.core.commands.AbstractHandler;\r
+import org.eclipse.core.commands.ExecutionEvent;\r
+import org.eclipse.core.commands.ExecutionException;\r
+import org.eclipse.swt.custom.StyledText;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
+import org.simantics.scl.ui.editor.completion.SCLTextEditorEnvironment;\r
+\r
+public class OpenDeclaration extends AbstractHandler {\r
+\r
+    private static boolean isIdentifierPart(char c) {\r
+        return Character.isJavaIdentifierPart(c) || c=='.';\r
+    }\r
+    \r
+    private static String extractIdentifierAt(String text, int caretPos) {\r
+        int startPos = caretPos;\r
+        while(startPos > 0 && isIdentifierPart(text.charAt(startPos-1)))\r
+            --startPos;\r
+        int endPos = caretPos;\r
+        while(endPos < text.length() && isIdentifierPart(text.charAt(endPos)))\r
+            ++endPos;\r
+        return text.substring(startPos, endPos);\r
+    }\r
+    \r
+    private static final String SYMBOL_CHARS = "!$%&*+/<=>?@\\^|-:~.";\r
+    \r
+    private static boolean isSymbolPart(char c) {\r
+        for(int i=0;i<SYMBOL_CHARS.length();++i)\r
+            if(SYMBOL_CHARS.charAt(i) == c)\r
+                return true;\r
+        return false;\r
+    }\r
+    \r
+    private static String extractSymbolAt(String text, int caretPos) {\r
+        int startPos = caretPos;\r
+        while(startPos > 0 && isSymbolPart(text.charAt(startPos-1)))\r
+            --startPos;\r
+        int endPos = caretPos;\r
+        while(endPos < text.length() && isSymbolPart(text.charAt(endPos)))\r
+            ++endPos;\r
+        return text.substring(startPos, endPos);\r
+    }\r
+    \r
+    public static String extractAt(String text, int caretPos) {\r
+        String result = extractIdentifierAt(text, caretPos);\r
+        if(!result.isEmpty())\r
+            return result;\r
+        return extractSymbolAt(text, caretPos);\r
+    }\r
+\r
+    \r
+    @Override\r
+    public Object execute(ExecutionEvent event) throws ExecutionException {\r
+        IEditorPart editor = \r
+                PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();\r
+        if(!(editor instanceof SCLModuleEditor2))\r
+            return null;\r
+        SCLModuleEditor2 moduleEditor = (SCLModuleEditor2)editor;\r
+        StyledText styledText = (StyledText)moduleEditor.getAdapter(Control.class);\r
+        String identifierAtCaret = extractAt(styledText.getText(), styledText.getCaretOffset());\r
+        if(identifierAtCaret.isEmpty())\r
+            return null;\r
+        SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();\r
+        editorEnvironment.updateEnvironment(moduleEditor.getDocument());\r
+        SCLValue value = editorEnvironment.getValue(identifierAtCaret);\r
+        if(value != null)\r
+            OpenSCLDefinition.openDefinition(value);\r
+        return null;\r
+    }\r
+\r
+}\r