OSDN Git Service

ジャンプ機能を実装
[coboled/CobolEditor.git] / src / coboled / editors / command / JumpHandler.java
1 package coboled.editors.command;
2
3 import java.util.regex.Matcher;
4 import java.util.regex.Pattern;
5
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;
17
18 import coboled.editors.CobolEditor;
19
20 public class JumpHandler extends AbstractHandler {
21
22         @Override
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);
28                 if(offset != -1) {
29                         editor.selectAndReveal(offset, selection.length());
30                 } else {
31                         IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
32                         MessageDialog.openInformation(window.getShell(),
33                                         "CobolEditorエラー",
34                                         selection + "は見つかりませんでした");
35                 }
36                 return null;
37         }
38         
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();
44                 } else {
45                         return getSelectWord(editor);
46                 }
47         }
48         
49         private String getSelectWord(CobolEditor editor) {
50                 IDocument doc = getDocument(editor);
51                 int caretPos = getCaretPos(editor);
52                 int startPos, endPos;
53
54                 try {
55                         int pos = caretPos;
56                         char c;
57
58                         while (pos >= 0) {
59                                 c = doc.getChar(pos);
60                                 if (!Character.isJavaIdentifierPart(c))
61                                         break;
62                                 --pos;
63                         }
64
65                         startPos = pos;
66
67                         pos = caretPos;
68                         int length = doc.getLength();
69
70                         while (pos < length) {
71                                 c = doc.getChar(pos);
72                                 if (!Character.isJavaIdentifierPart(c))
73                                         break;
74                                 ++pos;
75                         }
76
77                         endPos = pos;
78                         int offset = startPos + 1;
79                         int wordLength = endPos - offset;
80                         return doc.get(offset, wordLength);
81                         
82                 } catch (BadLocationException e) {
83                 }
84                 return "";
85         }
86
87         private IDocument getDocument(CobolEditor editor) {
88                 IDocumentProvider provider = editor.getDocumentProvider();
89                 IDocument doc = provider.getDocument(editor.getEditorInput());
90                 return doc;
91         }
92
93         private int getCaretPos(CobolEditor editor) {
94                 ISelectionProvider selectionProvider = editor.getSelectionProvider();
95                 ITextSelection selection = (ITextSelection) selectionProvider.getSelection();
96                 int caretPos = selection.getOffset();
97                 return caretPos;
98         }
99         
100         private int findDefinition(String source, String selection) {
101                 int offset = findSectionDefinition(source, selection);
102                 if(offset == -1) {
103                         offset = findDataDefinition(source, selection);
104                 }
105                 return offset;
106         }
107         
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);
116         }
117         
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);
125         }
126         
127         /**
128          * オフセットを返却する。検索結果が0の場合は-1を返却する。
129          * 
130          * @param source
131          * @param patternString
132          * @return offset
133          */
134         private int find(String source, String patternString, int group) {
135                 Pattern pattern = Pattern.compile(patternString, Pattern.MULTILINE);
136                 Matcher matcher = pattern.matcher(source);
137                 if(matcher.find()) {
138                         return matcher.start(group);
139                 }
140                 return -1;
141         }
142 }