1 package coboled.editors.command;
3 import java.util.regex.Matcher;
4 import java.util.regex.Pattern;
6 import org.eclipse.core.commands.AbstractHandler;
7 import org.eclipse.core.commands.ExecutionEvent;
8 import org.eclipse.core.commands.ExecutionException;
9 import org.eclipse.jface.dialogs.MessageDialog;
10 import org.eclipse.jface.text.BadLocationException;
11 import org.eclipse.jface.text.IDocument;
12 import org.eclipse.jface.text.ITextSelection;
13 import org.eclipse.jface.viewers.ISelectionProvider;
14 import org.eclipse.ui.IWorkbenchWindow;
15 import org.eclipse.ui.handlers.HandlerUtil;
16 import org.eclipse.ui.texteditor.IDocumentProvider;
18 import coboled.editors.CobolEditor;
20 public class JumpHandler extends AbstractHandler {
23 public Object execute(ExecutionEvent event) throws ExecutionException {
24 CobolEditor editor = (CobolEditor) HandlerUtil.getActiveEditor(event);
25 String source = getDocument(editor).get();
26 String selection = getSelection(editor);
27 int offset = findDefinition(source, selection);
29 editor.selectAndReveal(offset, selection.length());
31 IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
32 MessageDialog.openInformation(window.getShell(),
34 selection + "は見つかりませんでした");
39 private String getSelection(CobolEditor editor) {
40 ISelectionProvider selectionProvider = editor.getSelectionProvider();
41 ITextSelection selection = (ITextSelection) selectionProvider.getSelection();
42 if(selection.getLength() != 0) {
43 return selection.getText();
45 return getSelectWord(editor);
49 private String getSelectWord(CobolEditor editor) {
50 IDocument doc = getDocument(editor);
51 int caretPos = getCaretPos(editor);
60 if (!Character.isJavaIdentifierPart(c))
68 int length = doc.getLength();
70 while (pos < length) {
72 if (!Character.isJavaIdentifierPart(c))
78 int offset = startPos + 1;
79 int wordLength = endPos - offset;
80 return doc.get(offset, wordLength);
82 } catch (BadLocationException e) {
87 private IDocument getDocument(CobolEditor editor) {
88 IDocumentProvider provider = editor.getDocumentProvider();
89 IDocument doc = provider.getDocument(editor.getEditorInput());
93 private int getCaretPos(CobolEditor editor) {
94 ISelectionProvider selectionProvider = editor.getSelectionProvider();
95 ITextSelection selection = (ITextSelection) selectionProvider.getSelection();
96 int caretPos = selection.getOffset();
100 private int findDefinition(String source, String selection) {
101 int offset = findSectionDefinition(source, selection);
103 offset = findDataDefinition(source, selection);
108 private int findSectionDefinition(String source, String selection) {
109 StringBuilder patternString = new StringBuilder();
110 patternString.append("^.{6} ( {0,3})");
111 patternString.append("(");
112 patternString.append(selection);
113 patternString.append(")");
114 patternString.append("( +?SECTION)");
115 return find(source, patternString.toString(), 2);
118 private int findDataDefinition(String source, String selection) {
119 StringBuilder patternString = new StringBuilder();
120 patternString.append("^.{6} ( *?)([0-9][0-9])( +?)");
121 patternString.append("(");
122 patternString.append(selection);
123 patternString.append(")");
124 return find(source, patternString.toString(), 4);
128 * オフセットを返却する。検索結果が0の場合は-1を返却する。
131 * @param patternString
134 private int find(String source, String patternString, int group) {
135 Pattern pattern = Pattern.compile(patternString, Pattern.MULTILINE);
136 Matcher matcher = pattern.matcher(source);
138 return matcher.start(group);