]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor/SCLTextEditorNew.java
Externalize strings in org.simantics.scl.ui
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor / SCLTextEditorNew.java
1 package org.simantics.scl.ui.editor;
2
3
4 import java.util.Iterator;
5
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;
28
29 public class SCLTextEditorNew extends Composite {
30
31     private static final int DELAY_BEFORE_COMPILATION = 500 /*ms*/;
32     
33     public SourceViewer viewer;
34     ImageRegistry imageRegistry;
35     SCLAnnotationAccessNew annotationAccess;
36     ISharedTextColors sharedTextColors;
37     IAnnotationModel annotationModel;    
38     
39     public SCLTextEditorNew(Composite parent, int style) {
40         super(parent, style);
41         setLayout(new FillLayout());
42         
43         imageRegistry = new ImageRegistry(parent.getDisplay());
44         annotationAccess = new SCLAnnotationAccessNew(imageRegistry);
45         sharedTextColors = new SharedTextColorsNew(getDisplay());
46         annotationModel = new AnnotationModel();
47         
48         VerticalRuler leftRuler = new VerticalRuler(12, annotationAccess);
49         leftRuler.setModel(annotationModel);
50         
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$
57         
58         viewer = new SourceViewer(this, 
59                 leftRuler, rightRuler,
60                 true,
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);
70         
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);
78         
79         IUndoManager undoManager = new TextViewerUndoManager(100);
80         viewer.setUndoManager(undoManager);
81         undoManager.connect(viewer);
82         
83         // Undo support (maybe not needed in workbench?)
84         /*viewer.getTextWidget().addKeyListener(new KeyAdapter() {
85             @Override
86             public void keyReleased(KeyEvent e) {
87             }
88             @Override
89             public void keyPressed(KeyEvent e) {
90                 if(e.keyCode=='z'&& e.stateMask == SWT.CTRL) {
91                     viewer.getUndoManager().undo();
92                 }
93                 else if(e.keyCode=='y'&& e.stateMask == SWT.CTRL) {
94                     viewer.getUndoManager().redo();
95                 }
96             }
97         });*/
98     }
99     
100     public IUndoManager getUndoManager() {
101         return viewer.getUndoManager();
102     }
103     
104     @Override
105     public void dispose() {
106         super.dispose();
107         sharedTextColors.dispose();
108     }    
109     
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);
116         }
117     }
118     
119     private void setAnnotations(CompilationError[] errors) {
120         removeAnnotations();
121         for(CompilationError error : errors) {
122             int begin = Locations.beginOf(error.location);
123             int end = Locations.endOf(error.location);
124             if(begin == end) {
125                 if(begin > 0)
126                     --begin;
127                 else
128                     ++end;
129             }
130             annotationModel.addAnnotation(
131                     new Annotation("error", true, error.description),  //$NON-NLS-1$
132                     new Position(begin, end-begin));   
133         }
134     }
135     
136     public String getContent() {
137         final String[] result = new String[1];
138         getDisplay().syncExec(new Runnable() {
139             @Override
140             public void run() {
141                 result[0] = viewer.getDocument().get();
142             }
143         });
144         return result[0];
145     }
146     
147     public void setContent(final String content, final CompilationError[] errors) {
148         //getDisplay().asyncExec(new Runnable() {
149         getDisplay().syncExec(new Runnable() {
150             
151             @Override
152             public void run() {
153                 if (viewer.getTextWidget().isDisposed()) return;
154                 if(content != null)
155                     viewer.getDocument().set(content);
156                 if(errors != null)
157                     setAnnotations(errors);
158             }
159         });
160     }
161
162     private Point storedSelectedRange;
163
164     public void storeSelectedRange() {
165         storedSelectedRange = viewer.getSelectedRange();
166     }
167
168     public void restoreSelectedRange() {
169         if (storedSelectedRange != null) {
170             viewer.setSelectedRange(storedSelectedRange.x, storedSelectedRange.y);
171             storedSelectedRange = null;
172         }
173     }
174
175 }