1 package org.simantics.scl.ui.editor2;
4 import org.eclipse.core.commands.AbstractHandler;
5 import org.eclipse.core.commands.ExecutionEvent;
6 import org.eclipse.core.commands.ExecutionException;
7 import org.eclipse.search.ui.NewSearchUI;
8 import org.eclipse.swt.custom.StyledText;
9 import org.eclipse.swt.widgets.Control;
10 import org.eclipse.ui.IEditorPart;
11 import org.eclipse.ui.PlatformUI;
12 import org.simantics.scl.compiler.common.names.Name;
13 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
14 import org.simantics.scl.compiler.errors.Locations;
15 import org.simantics.scl.compiler.module.InvalidModulePathException;
16 import org.simantics.scl.compiler.module.ModuleUtils;
17 import org.simantics.scl.compiler.source.ModuleSource;
18 import org.simantics.scl.osgi.SCLOsgi;
19 import org.simantics.scl.ui.editor.completion.SCLTextEditorEnvironment;
20 import org.simantics.scl.ui.search.SCLSearchQuery;
22 public class FindSCLSearchAction extends AbstractHandler {
24 private static boolean isIdentifierPart(char c) {
25 return Character.isJavaIdentifierPart(c) || c=='.';
28 private static String extractIdentifierAt(String text, int caretPos) {
29 int startPos = caretPos;
30 while(startPos > 0 && isIdentifierPart(text.charAt(startPos-1)))
32 int endPos = caretPos;
33 while(endPos < text.length() && isIdentifierPart(text.charAt(endPos)))
35 return text.substring(startPos, endPos);
38 private static final String SYMBOL_CHARS = "!$%&*+/<=>?@\\^|-:~."; //$NON-NLS-1$
40 private static boolean isSymbolPart(char c) {
41 for(int i=0;i<SYMBOL_CHARS.length();++i)
42 if(SYMBOL_CHARS.charAt(i) == c)
47 private static String extractSymbolAt(String text, int caretPos) {
48 int startPos = caretPos;
49 while(startPos > 0 && isSymbolPart(text.charAt(startPos-1)))
51 int endPos = caretPos;
52 while(endPos < text.length() && isSymbolPart(text.charAt(endPos)))
54 return text.substring(startPos, endPos);
57 public static String extractIdentifierOrSymbolAt(String text, int caretPos) {
58 String result = extractIdentifierAt(text, caretPos);
61 return extractSymbolAt(text, caretPos);
64 private static String extractLineAt(String text, int caretPos) {
65 int startPos = caretPos;
66 while(startPos > 0 && !isNewline(text.charAt(startPos-1)))
68 int endPos = caretPos;
69 while(endPos < text.length() && !isNewline(text.charAt(endPos)))
71 return text.substring(startPos, endPos);
74 private static boolean isNewline(char c) {
75 return c=='\n' || c=='\r';
79 public Object execute(ExecutionEvent event) throws ExecutionException {
81 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
82 if(!(editor instanceof SCLModuleEditor2))
84 SCLModuleEditor2 moduleEditor = (SCLModuleEditor2)editor;
85 StyledText styledText = (StyledText)moduleEditor.getAdapter(Control.class);
86 String text = styledText.getText();
87 int caretOffset = styledText.getCaretOffset();
89 // Find the line where the caret is
90 // String lineAtCaret = extractLineAt(text, caretOffset);
91 // Try to find an identifier at caret
92 String identifierAtCaret = extractIdentifierOrSymbolAt(text, caretOffset);
93 if(identifierAtCaret.isEmpty())
95 SCLModuleEditorInput input = (SCLModuleEditorInput)moduleEditor.getEditorInput();
96 String localModuleName = input.getModuleName();
98 SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();
99 editorEnvironment.updateEnvironment(moduleEditor.getDocument());
100 SCLValue value = editorEnvironment.getValue(identifierAtCaret);
103 name = Name.create(localModuleName, identifierAtCaret);
105 name = value.getName();
107 SCLSearchQuery query = new SCLSearchQuery(name, localModuleName);
108 NewSearchUI.runQueryInBackground(query);
112 // SCLTextEditorEnvironment editorEnvironment = moduleEditor.getSCLTextEditorEnvironment();
113 // editorEnvironment.updateEnvironment(moduleEditor.getDocument());
114 // SCLValue value = editorEnvironment.getValue(identifierAtCaret);
115 // //System.out.println("identifierAtCaret = " + identifierAtCaret + " [" + Locations.beginOf(value.definitionLocation) + ", " + Locations.endOf(value.definitionLocation) + "]");
117 // OpenSCLDefinition.openDefinition(value);