package name.graf.emanuel.testfileeditor.ui; import java.util.HashMap; import java.util.Vector; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentListener; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.IVerticalRuler; import org.eclipse.jface.text.source.projection.ProjectionAnnotation; import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel; import org.eclipse.jface.text.source.projection.ProjectionSupport; import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.editors.text.TextEditor; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import name.graf.emanuel.testfileeditor.model.TestFile; import name.graf.emanuel.testfileeditor.ui.support.editor.ColorManager; import name.graf.emanuel.testfileeditor.ui.support.editor.Configuration; import name.graf.emanuel.testfileeditor.ui.support.editor.DocumentProvider; public class Editor extends TextEditor { private final ColorManager colorManager; private OutlinePage fOutlinePage; private ProjectionSupport projectionSupport; private ProjectionAnnotationModel projectionAnnotationModel; private Annotation[] oldAnnotations; private TestFile file; public Editor() { super(); colorManager = new ColorManager(); setSourceViewerConfiguration(new Configuration(colorManager, this)); this.setDocumentProvider(new DocumentProvider()); } public TestFile getTestFile() { return file; } @Override public void dispose() { colorManager.dispose(); super.dispose(); } @Override public void createPartControl(final Composite parent) { super.createPartControl(parent); final ProjectionViewer viewer = (ProjectionViewer) getSourceViewer(); projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors()); projectionSupport.install(); viewer.doOperation(ProjectionViewer.TOGGLE); projectionAnnotationModel = viewer.getProjectionAnnotationModel(); } @Override protected ISourceViewer createSourceViewer(final Composite parent, final IVerticalRuler ruler, final int styles) { final ISourceViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(), styles); getSourceViewerDecorationSupport(viewer); final IEditorInput input = getEditorInput(); final IDocument document = getDocumentProvider().getDocument(input); file = new TestFile((FileEditorInput) input, getDocumentProvider()); file.parse(); document.addDocumentListener(new IDocumentListener() { @Override public void documentChanged(final DocumentEvent event) { file.parse(); } @Override public void documentAboutToBeChanged(final DocumentEvent event) { } }); return viewer; } public void updateFoldingStructure(final Vector<Position> positions) { final Annotation[] annotations = new Annotation[positions.size()]; final HashMap<Annotation, Position> newAnnotations = new HashMap<>(); for (int i = 0; i < positions.size(); ++i) { final ProjectionAnnotation annotation = new ProjectionAnnotation(); newAnnotations.put(annotation, positions.get(i)); annotations[i] = annotation; } projectionAnnotationModel.modifyAnnotations(oldAnnotations, newAnnotations, (Annotation[]) null); oldAnnotations = annotations; } @SuppressWarnings("unchecked") @Override public <T> T getAdapter(final Class<T> adapter) { if (IContentOutlinePage.class.equals(adapter)) { if (fOutlinePage == null) { fOutlinePage = new OutlinePage(getDocumentProvider(), this); if (getEditorInput() == null) { } fOutlinePage.setInput(getEditorInput()); } return (T) fOutlinePage; } else if (TestFile.class.equals(adapter)) { return (T) file; } return super.getAdapter(adapter); } @Override protected void editorSaved() { if (fOutlinePage != null) { fOutlinePage.update(); } if (file != null) { file.parse(); } super.editorSaved(); } public OutlinePage getOutline() { return fOutlinePage; } @Override protected void handleCursorPositionChanged() { super.handleCursorPositionChanged(); } }