1 package org.simantics.scl.ui.editor2;
3 import java.io.IOException;
5 import org.eclipse.core.runtime.CoreException;
6 import org.eclipse.core.runtime.IProgressMonitor;
7 import org.eclipse.core.runtime.Status;
8 import org.eclipse.jface.operation.IRunnableContext;
9 import org.eclipse.jface.text.Document;
10 import org.eclipse.jface.text.IDocument;
11 import org.eclipse.jface.text.IDocumentPartitioner;
12 import org.eclipse.jface.text.rules.FastPartitioner;
13 import org.eclipse.jface.text.source.AnnotationModel;
14 import org.eclipse.jface.text.source.IAnnotationModel;
15 import org.eclipse.ui.texteditor.AbstractDocumentProvider;
16 import org.simantics.scl.compiler.source.ModuleSource;
17 import org.simantics.scl.compiler.source.TextualModuleSource;
18 import org.simantics.scl.osgi.SCLOsgi;
19 import org.simantics.scl.ui.editor.SCLSourceViewerConfigurationNew;
21 public class SCLModuleEditor2DocumentProvider extends AbstractDocumentProvider {
23 private SCLSourceViewerConfigurationNew sourceViewer;
24 protected AnnotationModel annotationModel = new AnnotationModel();
26 private Object currentElement;
27 private TextualModuleSource currentSource;
29 public SCLModuleEditor2DocumentProvider(SCLSourceViewerConfigurationNew sourceViewer) {
30 this.sourceViewer = sourceViewer;
33 private void updateTextualModuleSource(Object input) {
34 if (currentElement != null && currentElement.equals(input))
36 currentElement = input;
37 if(!(currentElement instanceof SCLModuleEditorInput))
40 ModuleSource source = ((SCLModuleEditorInput)currentElement).getAdapter(ModuleSource.class);
43 if(!(source instanceof TextualModuleSource))
45 currentSource = (TextualModuleSource)source;
49 protected IDocument createDocument(Object element) throws CoreException {
50 updateTextualModuleSource(element);
51 if(currentSource == null)
52 throw new CoreException(
53 new Status(Status.ERROR, "org.simantics.scl.ui", "Source for the SCL module could not be found.")
57 document = new Document(currentSource.getSourceText(null));
58 } catch (IOException e) {
59 throw new CoreException(
60 new Status(Status.ERROR, "org.simantics.scl.ui", "Reading SCL module failed.", e)
63 IDocumentPartitioner partitioner = new FastPartitioner(new SCLPartitionScanner(), SCLPartitionScanner.PARTITION_TYPES);
64 partitioner.connect(document);
65 document.setDocumentPartitioner(partitioner);
66 sourceViewer.updateCompletionAssistModuleName(currentSource.getModuleName());
71 public void changed(Object element) {
72 updateTextualModuleSource(element);
76 public void aboutToChange(Object element) {
77 super.aboutToChange(element);
81 public boolean isModifiable(Object element) {
82 if(currentSource == null)
84 return currentSource.isUpdateable();
88 public boolean isReadOnly(Object element) {
89 return !isModifiable(element);
93 protected IAnnotationModel createAnnotationModel(Object element)
94 throws CoreException {
95 SCLModuleEditorInput input = (SCLModuleEditorInput)element;
96 return new SCLAnnotationModel(input, SCLOsgi.MODULE_REPOSITORY);
100 protected void doSaveDocument(IProgressMonitor monitor, Object element,
101 IDocument document, boolean overwrite) throws CoreException {
102 if(currentSource == null)
104 currentSource.update(document.get());
108 protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
109 // TODO Auto-generated method stub