1 package org.simantics.scl.ui.editor2;
\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
14 public class OpenDeclaration extends AbstractHandler {
\r
16 private static boolean isIdentifierPart(char c) {
\r
17 return Character.isJavaIdentifierPart(c) || c=='.';
\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
24 int endPos = caretPos;
\r
25 while(endPos < text.length() && isIdentifierPart(text.charAt(endPos)))
\r
27 return text.substring(startPos, endPos);
\r
30 private static final String SYMBOL_CHARS = "!$%&*+/<=>?@\\^|-:~.";
\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
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
43 int endPos = caretPos;
\r
44 while(endPos < text.length() && isSymbolPart(text.charAt(endPos)))
\r
46 return text.substring(startPos, endPos);
\r
49 public static String extractAt(String text, int caretPos) {
\r
50 String result = extractIdentifierAt(text, caretPos);
\r
51 if(!result.isEmpty())
\r
53 return extractSymbolAt(text, caretPos);
\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
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
68 SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();
\r
69 editorEnvironment.updateEnvironment(moduleEditor.getDocument());
\r
70 SCLValue value = editorEnvironment.getValue(identifierAtCaret);
\r
72 OpenSCLDefinition.openDefinition(value);
\r