-package org.simantics.scl.ui.editor;\r
-\r
-\r
-import java.util.Iterator;\r
-\r
-import org.eclipse.jface.resource.ImageRegistry;\r
-import org.eclipse.jface.resource.JFaceResources;\r
-import org.eclipse.jface.resource.LocalResourceManager;\r
-import org.eclipse.jface.text.Document;\r
-import org.eclipse.jface.text.IUndoManager;\r
-import org.eclipse.jface.text.Position;\r
-import org.eclipse.jface.text.TextViewerUndoManager;\r
-import org.eclipse.jface.text.source.Annotation;\r
-import org.eclipse.jface.text.source.AnnotationModel;\r
-import org.eclipse.jface.text.source.AnnotationPainter;\r
-import org.eclipse.jface.text.source.IAnnotationModel;\r
-import org.eclipse.jface.text.source.ISharedTextColors;\r
-import org.eclipse.jface.text.source.OverviewRuler;\r
-import org.eclipse.jface.text.source.SourceViewer;\r
-import org.eclipse.jface.text.source.VerticalRuler;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Point;\r
-import org.eclipse.swt.graphics.RGB;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.scl.compiler.errors.CompilationError;\r
-import org.simantics.scl.compiler.errors.Locations;\r
-\r
-public class SCLTextEditorNew extends Composite {\r
-\r
- private static final int DELAY_BEFORE_COMPILATION = 500 /*ms*/;\r
- \r
- public SourceViewer viewer;\r
- ImageRegistry imageRegistry;\r
- SCLAnnotationAccessNew annotationAccess;\r
- ISharedTextColors sharedTextColors;\r
- IAnnotationModel annotationModel; \r
- \r
- public SCLTextEditorNew(Composite parent, int style) {\r
- super(parent, style);\r
- setLayout(new FillLayout());\r
- \r
- imageRegistry = new ImageRegistry(parent.getDisplay());\r
- annotationAccess = new SCLAnnotationAccessNew(imageRegistry);\r
- sharedTextColors = new SharedTextColorsNew(getDisplay());\r
- annotationModel = new AnnotationModel();\r
- \r
- VerticalRuler leftRuler = new VerticalRuler(12, annotationAccess);\r
- leftRuler.setModel(annotationModel);\r
- \r
- OverviewRuler rightRuler = \r
- new OverviewRuler(annotationAccess, 12, sharedTextColors);\r
- rightRuler.setModel(annotationModel);\r
- rightRuler.addAnnotationType("error");\r
- rightRuler.setAnnotationTypeLayer("error", 0);\r
- rightRuler.setAnnotationTypeColor("error", sharedTextColors.getColor(new RGB(255,0,128)));\r
- \r
- viewer = new SourceViewer(this, \r
- leftRuler, rightRuler,\r
- true,\r
- SWT.H_SCROLL | SWT.V_SCROLL);\r
- Document document = new Document();\r
- viewer.showAnnotations(false);\r
- viewer.showAnnotationsOverview(false);\r
- viewer.setDocument(document, annotationModel);\r
- viewer.setEditable(true);\r
- LocalResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources(), viewer.getControl());\r
- SCLSourceViewerConfigurationNew sourceViewerConfiguration = new SCLSourceViewerConfigurationNew(resourceManager);\r
- viewer.configure(sourceViewerConfiguration);\r
- \r
- // Annotations to text area\r
- AnnotationPainter annotationPainter = \r
- new AnnotationPainter(viewer, annotationAccess); \r
- annotationPainter.addAnnotationType("error");\r
- annotationPainter.setAnnotationTypeColor("error", sharedTextColors.getColor(new RGB(255,0,128)));\r
- viewer.addPainter(annotationPainter);\r
- annotationModel.addAnnotationModelListener(annotationPainter);\r
- \r
- IUndoManager undoManager = new TextViewerUndoManager(100);\r
- viewer.setUndoManager(undoManager);\r
- undoManager.connect(viewer);\r
- \r
- // Undo support (maybe not needed in workbench?)\r
- /*viewer.getTextWidget().addKeyListener(new KeyAdapter() {\r
- @Override\r
- public void keyReleased(KeyEvent e) {\r
- }\r
- @Override\r
- public void keyPressed(KeyEvent e) {\r
- if(e.keyCode=='z'&& e.stateMask == SWT.CTRL) {\r
- viewer.getUndoManager().undo();\r
- }\r
- else if(e.keyCode=='y'&& e.stateMask == SWT.CTRL) {\r
- viewer.getUndoManager().redo();\r
- }\r
- }\r
- });*/\r
- }\r
- \r
- public IUndoManager getUndoManager() {\r
- return viewer.getUndoManager();\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- super.dispose();\r
- sharedTextColors.dispose();\r
- } \r
- \r
- @SuppressWarnings("unchecked")\r
- private void removeAnnotations() {\r
- Iterator<Annotation> it = annotationModel.getAnnotationIterator();\r
- while(it.hasNext()) {\r
- Annotation annotation = it.next();\r
- annotationModel.removeAnnotation(annotation);\r
- }\r
- }\r
- \r
- private void setAnnotations(CompilationError[] errors) {\r
- removeAnnotations();\r
- for(CompilationError error : errors) {\r
- int begin = Locations.beginOf(error.location);\r
- int end = Locations.endOf(error.location);\r
- if(begin == end) {\r
- if(begin > 0)\r
- --begin;\r
- else\r
- ++end;\r
- }\r
- annotationModel.addAnnotation(\r
- new Annotation("error", true, error.description), \r
- new Position(begin, end-begin)); \r
- }\r
- }\r
- \r
- public String getContent() {\r
- final String[] result = new String[1];\r
- getDisplay().syncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- result[0] = viewer.getDocument().get();\r
- }\r
- });\r
- return result[0];\r
- }\r
- \r
- public void setContent(final String content, final CompilationError[] errors) {\r
- //getDisplay().asyncExec(new Runnable() {\r
- getDisplay().syncExec(new Runnable() {\r
- \r
- @Override\r
- public void run() {\r
- if (viewer.getTextWidget().isDisposed()) return;\r
- if(content != null)\r
- viewer.getDocument().set(content);\r
- if(errors != null)\r
- setAnnotations(errors);\r
- }\r
- });\r
- }\r
-\r
- private Point storedSelectedRange;\r
-\r
- public void storeSelectedRange() {\r
- storedSelectedRange = viewer.getSelectedRange();\r
- }\r
-\r
- public void restoreSelectedRange() {\r
- if (storedSelectedRange != null) {\r
- viewer.setSelectedRange(storedSelectedRange.x, storedSelectedRange.y);\r
- storedSelectedRange = null;\r
- }\r
- }\r
-\r
-}\r
+package org.simantics.scl.ui.editor;
+
+
+import java.util.Iterator;
+
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IUndoManager;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextViewerUndoManager;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.AnnotationPainter;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISharedTextColors;
+import org.eclipse.jface.text.source.OverviewRuler;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.VerticalRuler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.simantics.scl.compiler.errors.CompilationError;
+import org.simantics.scl.compiler.errors.Locations;
+
+public class SCLTextEditorNew extends Composite {
+
+ private static final int DELAY_BEFORE_COMPILATION = 500 /*ms*/;
+
+ public SourceViewer viewer;
+ ImageRegistry imageRegistry;
+ SCLAnnotationAccessNew annotationAccess;
+ ISharedTextColors sharedTextColors;
+ IAnnotationModel annotationModel;
+
+ public SCLTextEditorNew(Composite parent, int style) {
+ super(parent, style);
+ setLayout(new FillLayout());
+
+ imageRegistry = new ImageRegistry(parent.getDisplay());
+ annotationAccess = new SCLAnnotationAccessNew(imageRegistry);
+ sharedTextColors = new SharedTextColorsNew(getDisplay());
+ annotationModel = new AnnotationModel();
+
+ VerticalRuler leftRuler = new VerticalRuler(12, annotationAccess);
+ leftRuler.setModel(annotationModel);
+
+ OverviewRuler rightRuler =
+ new OverviewRuler(annotationAccess, 12, sharedTextColors);
+ rightRuler.setModel(annotationModel);
+ rightRuler.addAnnotationType("error");
+ rightRuler.setAnnotationTypeLayer("error", 0);
+ rightRuler.setAnnotationTypeColor("error", sharedTextColors.getColor(new RGB(255,0,128)));
+
+ viewer = new SourceViewer(this,
+ leftRuler, rightRuler,
+ true,
+ SWT.H_SCROLL | SWT.V_SCROLL);
+ Document document = new Document();
+ viewer.showAnnotations(false);
+ viewer.showAnnotationsOverview(false);
+ viewer.setDocument(document, annotationModel);
+ viewer.setEditable(true);
+ LocalResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources(), viewer.getControl());
+ SCLSourceViewerConfigurationNew sourceViewerConfiguration = new SCLSourceViewerConfigurationNew(resourceManager);
+ viewer.configure(sourceViewerConfiguration);
+
+ // Annotations to text area
+ AnnotationPainter annotationPainter =
+ new AnnotationPainter(viewer, annotationAccess);
+ annotationPainter.addAnnotationType("error");
+ annotationPainter.setAnnotationTypeColor("error", sharedTextColors.getColor(new RGB(255,0,128)));
+ viewer.addPainter(annotationPainter);
+ annotationModel.addAnnotationModelListener(annotationPainter);
+
+ IUndoManager undoManager = new TextViewerUndoManager(100);
+ viewer.setUndoManager(undoManager);
+ undoManager.connect(viewer);
+
+ // Undo support (maybe not needed in workbench?)
+ /*viewer.getTextWidget().addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ }
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if(e.keyCode=='z'&& e.stateMask == SWT.CTRL) {
+ viewer.getUndoManager().undo();
+ }
+ else if(e.keyCode=='y'&& e.stateMask == SWT.CTRL) {
+ viewer.getUndoManager().redo();
+ }
+ }
+ });*/
+ }
+
+ public IUndoManager getUndoManager() {
+ return viewer.getUndoManager();
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ sharedTextColors.dispose();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void removeAnnotations() {
+ Iterator<Annotation> it = annotationModel.getAnnotationIterator();
+ while(it.hasNext()) {
+ Annotation annotation = it.next();
+ annotationModel.removeAnnotation(annotation);
+ }
+ }
+
+ private void setAnnotations(CompilationError[] errors) {
+ removeAnnotations();
+ for(CompilationError error : errors) {
+ int begin = Locations.beginOf(error.location);
+ int end = Locations.endOf(error.location);
+ if(begin == end) {
+ if(begin > 0)
+ --begin;
+ else
+ ++end;
+ }
+ annotationModel.addAnnotation(
+ new Annotation("error", true, error.description),
+ new Position(begin, end-begin));
+ }
+ }
+
+ public String getContent() {
+ final String[] result = new String[1];
+ getDisplay().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ result[0] = viewer.getDocument().get();
+ }
+ });
+ return result[0];
+ }
+
+ public void setContent(final String content, final CompilationError[] errors) {
+ //getDisplay().asyncExec(new Runnable() {
+ getDisplay().syncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ if (viewer.getTextWidget().isDisposed()) return;
+ if(content != null)
+ viewer.getDocument().set(content);
+ if(errors != null)
+ setAnnotations(errors);
+ }
+ });
+ }
+
+ private Point storedSelectedRange;
+
+ public void storeSelectedRange() {
+ storedSelectedRange = viewer.getSelectedRange();
+ }
+
+ public void restoreSelectedRange() {
+ if (storedSelectedRange != null) {
+ viewer.setSelectedRange(storedSelectedRange.x, storedSelectedRange.y);
+ storedSelectedRange = null;
+ }
+ }
+
+}