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