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