]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/OpenDeclaration.java
Open module when pressing F3 on import or include declaration
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / OpenDeclaration.java
index f8ea0c20d1b9960e4258cc53cf6898a77ffbc5f3..522b8d3ed22a4e097ad0e98722abad9e331e8612 100644 (file)
@@ -46,14 +46,27 @@ public class OpenDeclaration extends AbstractHandler {
         return text.substring(startPos, endPos);\r
     }\r
     \r
-    public static String extractAt(String text, int caretPos) {\r
+    public static String extractIdentifierOrSymbolAt(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
+    private static String extractLineAt(String text, int caretPos) {\r
+        int startPos = caretPos;\r
+        while(startPos > 0 && !isNewline(text.charAt(startPos-1)))\r
+            --startPos;\r
+        int endPos = caretPos;\r
+        while(endPos < text.length() && !isNewline(text.charAt(endPos)))\r
+            ++endPos;\r
+        return text.substring(startPos, endPos);\r
+    }\r
+    \r
+    private static boolean isNewline(char c) {\r
+        return c=='\n' || c=='\r';\r
+    }\r
+\r
     @Override\r
     public Object execute(ExecutionEvent event) throws ExecutionException {\r
         IEditorPart editor = \r
@@ -62,14 +75,28 @@ public class OpenDeclaration extends AbstractHandler {
             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
+        String text = styledText.getText();\r
+        int caretOffset = styledText.getCaretOffset();\r
+        \r
+        // Find the line where the caret is\r
+        String lineAtCaret = extractLineAt(text, caretOffset);\r
+        if(lineAtCaret.startsWith("import ") || lineAtCaret.startsWith("include ")) {\r
+            int p1 = lineAtCaret.indexOf('"', 6);\r
+            int p2 = lineAtCaret.indexOf('"', p1+1);\r
+            String moduleName = lineAtCaret.substring(p1+1, p2);\r
+            OpenSCLModule.openModule(moduleName);\r
+        }\r
+        else {\r
+            // Try to find an identifier at caret\r
+            String identifierAtCaret = extractIdentifierOrSymbolAt(text, caretOffset);\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
+        }\r
         return null;\r
     }\r
 \r