1 package org.simantics.scl.ui.editor;
4 import java.util.Iterator;
6 import org.eclipse.jface.resource.ImageRegistry;
7 import org.eclipse.jface.resource.JFaceResources;
8 import org.eclipse.jface.resource.LocalResourceManager;
9 import org.eclipse.jface.text.Document;
10 import org.eclipse.jface.text.IUndoManager;
11 import org.eclipse.jface.text.Position;
12 import org.eclipse.jface.text.TextViewerUndoManager;
13 import org.eclipse.jface.text.source.Annotation;
14 import org.eclipse.jface.text.source.AnnotationModel;
15 import org.eclipse.jface.text.source.AnnotationPainter;
16 import org.eclipse.jface.text.source.IAnnotationModel;
17 import org.eclipse.jface.text.source.ISharedTextColors;
18 import org.eclipse.jface.text.source.OverviewRuler;
19 import org.eclipse.jface.text.source.SourceViewer;
20 import org.eclipse.jface.text.source.VerticalRuler;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.graphics.Point;
23 import org.eclipse.swt.graphics.RGB;
24 import org.eclipse.swt.layout.FillLayout;
25 import org.eclipse.swt.widgets.Composite;
26 import org.simantics.scl.compiler.errors.CompilationError;
27 import org.simantics.scl.compiler.errors.Locations;
29 public class SCLTextEditorNew extends Composite {
31 private static final int DELAY_BEFORE_COMPILATION = 500 /*ms*/;
33 public SourceViewer viewer;
34 ImageRegistry imageRegistry;
35 SCLAnnotationAccessNew annotationAccess;
36 ISharedTextColors sharedTextColors;
37 IAnnotationModel annotationModel;
39 public SCLTextEditorNew(Composite parent, int style) {
41 setLayout(new FillLayout());
43 imageRegistry = new ImageRegistry(parent.getDisplay());
44 annotationAccess = new SCLAnnotationAccessNew(imageRegistry);
45 sharedTextColors = new SharedTextColorsNew(getDisplay());
46 annotationModel = new AnnotationModel();
48 VerticalRuler leftRuler = new VerticalRuler(12, annotationAccess);
49 leftRuler.setModel(annotationModel);
51 OverviewRuler rightRuler =
52 new OverviewRuler(annotationAccess, 12, sharedTextColors);
53 rightRuler.setModel(annotationModel);
54 rightRuler.addAnnotationType("error"); //$NON-NLS-1$
55 rightRuler.setAnnotationTypeLayer("error", 0); //$NON-NLS-1$
56 rightRuler.setAnnotationTypeColor("error", sharedTextColors.getColor(new RGB(255,0,128))); //$NON-NLS-1$
58 viewer = new SourceViewer(this,
59 leftRuler, rightRuler,
61 SWT.H_SCROLL | SWT.V_SCROLL);
62 Document document = new Document();
63 viewer.showAnnotations(false);
64 viewer.showAnnotationsOverview(false);
65 viewer.setDocument(document, annotationModel);
66 viewer.setEditable(true);
67 LocalResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources(), viewer.getControl());
68 SCLSourceViewerConfigurationNew sourceViewerConfiguration = new SCLSourceViewerConfigurationNew(resourceManager);
69 viewer.configure(sourceViewerConfiguration);
71 // Annotations to text area
72 AnnotationPainter annotationPainter =
73 new AnnotationPainter(viewer, annotationAccess);
74 annotationPainter.addAnnotationType("error"); //$NON-NLS-1$
75 annotationPainter.setAnnotationTypeColor("error", sharedTextColors.getColor(new RGB(255,0,128))); //$NON-NLS-1$
76 viewer.addPainter(annotationPainter);
77 annotationModel.addAnnotationModelListener(annotationPainter);
79 IUndoManager undoManager = new TextViewerUndoManager(100);
80 viewer.setUndoManager(undoManager);
81 undoManager.connect(viewer);
83 // Undo support (maybe not needed in workbench?)
84 /*viewer.getTextWidget().addKeyListener(new KeyAdapter() {
86 public void keyReleased(KeyEvent e) {
89 public void keyPressed(KeyEvent e) {
90 if(e.keyCode=='z'&& e.stateMask == SWT.CTRL) {
91 viewer.getUndoManager().undo();
93 else if(e.keyCode=='y'&& e.stateMask == SWT.CTRL) {
94 viewer.getUndoManager().redo();
100 public IUndoManager getUndoManager() {
101 return viewer.getUndoManager();
105 public void dispose() {
107 sharedTextColors.dispose();
110 @SuppressWarnings("unchecked")
111 private void removeAnnotations() {
112 Iterator<Annotation> it = annotationModel.getAnnotationIterator();
113 while(it.hasNext()) {
114 Annotation annotation = it.next();
115 annotationModel.removeAnnotation(annotation);
119 private void setAnnotations(CompilationError[] errors) {
121 for(CompilationError error : errors) {
122 int begin = Locations.beginOf(error.location);
123 int end = Locations.endOf(error.location);
130 annotationModel.addAnnotation(
131 new Annotation("error", true, error.description), //$NON-NLS-1$
132 new Position(begin, end-begin));
136 public String getContent() {
137 final String[] result = new String[1];
138 getDisplay().syncExec(new Runnable() {
141 result[0] = viewer.getDocument().get();
147 public void setContent(final String content, final CompilationError[] errors) {
148 //getDisplay().asyncExec(new Runnable() {
149 getDisplay().syncExec(new Runnable() {
153 if (viewer.getTextWidget().isDisposed()) return;
155 viewer.getDocument().set(content);
157 setAnnotations(errors);
162 private Point storedSelectedRange;
164 public void storeSelectedRange() {
165 storedSelectedRange = viewer.getSelectedRange();
168 public void restoreSelectedRange() {
169 if (storedSelectedRange != null) {
170 viewer.setSelectedRange(storedSelectedRange.x, storedSelectedRange.y);
171 storedSelectedRange = null;