OSDN Git Service

アウトラインを実装
[coboled/CobolEditor.git] / src / coboled / editors / CobolOutlinePage.java
diff --git a/src/coboled/editors/CobolOutlinePage.java b/src/coboled/editors/CobolOutlinePage.java
new file mode 100644 (file)
index 0000000..68cebe8
--- /dev/null
@@ -0,0 +1,67 @@
+package coboled.editors;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+public class CobolOutlinePage extends ContentOutlinePage {
+
+       private CobolEditor editor;
+       
+       private CobolElement root;
+       
+       private CobolSelectionChangedListener selectionChangedListener;
+
+       public CobolOutlinePage(CobolEditor cobolEditor) {
+               this.editor = cobolEditor;
+       }
+
+       @Override
+       public void createControl(Composite parent) {
+               super.createControl(parent);
+               TreeViewer viewer = getTreeViewer();
+               viewer.setContentProvider(new CobolContentProvider());
+               viewer.setLabelProvider(new CobolLabelProvider());
+               
+               selectionChangedListener = new CobolSelectionChangedListener();
+               viewer.addSelectionChangedListener(selectionChangedListener);
+               refresh();
+       }
+
+       public void refresh() {
+               IDocumentProvider provider = editor.getDocumentProvider();
+               IDocument document = provider.getDocument(editor.getEditorInput());
+               String source = document.get();
+               TreeViewer viewer = getTreeViewer();
+               this.root = new CobolParser().parse(source);
+               viewer.setInput(this.root);
+               viewer.refresh();
+       }
+
+       public void setSelection(int offset) {
+               if(root != null) {
+                       CobolElement element = root.getElementByOffset(offset);
+                       getTreeViewer().removeSelectionChangedListener(selectionChangedListener);
+                       setSelection(new StructuredSelection(element)); 
+                       getTreeViewer().addSelectionChangedListener(selectionChangedListener);
+               }
+       }
+       
+       private class CobolSelectionChangedListener implements ISelectionChangedListener {
+
+               public void selectionChanged(SelectionChangedEvent event) {
+                       IStructuredSelection sel = (IStructuredSelection) event.getSelection();
+                       Object element = sel.getFirstElement();
+                       if (element instanceof CobolElement) {
+                               int offset = ((CobolElement) element).getOffset();
+                               editor.selectAndReveal(offset, 0);
+                       }
+               }
+       }
+}