4dfa0507ba3094f34f2a11540786a47cd5c14273
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / SCLModuleEditor2DocumentProvider.java
1 package org.simantics.scl.ui.editor2;
2
3 import java.io.IOException;
4
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;
20
21 public class SCLModuleEditor2DocumentProvider extends AbstractDocumentProvider {
22
23     private SCLSourceViewerConfigurationNew sourceViewer;
24     protected AnnotationModel annotationModel = new AnnotationModel();
25     
26     public SCLModuleEditor2DocumentProvider(
27             SCLSourceViewerConfigurationNew sourceViewer) {
28         this.sourceViewer = sourceViewer;
29     }
30
31     private static TextualModuleSource toTextualModuleSource(Object input) {
32         if(!(input instanceof SCLModuleEditorInput))
33             return null;
34         ModuleSource source = ((SCLModuleEditorInput)input).getAdapter(ModuleSource.class);
35         if(source == null)
36             return null;
37         if(!(source instanceof TextualModuleSource))
38             return null;
39         return (TextualModuleSource)source;
40     }
41     
42     @Override
43     protected IDocument createDocument(Object element) throws CoreException {
44         TextualModuleSource source = toTextualModuleSource(element);
45         if(source == null)
46             throw new CoreException(
47                     new Status(Status.ERROR, "org.simantics.scl.ui", "Source for the SCL module could not be found.")
48                     );
49         Document document;
50         try {
51             document = new Document(source.getSourceText(null));
52         } catch (IOException e) {
53             throw new CoreException(
54                     new Status(Status.ERROR, "org.simantics.scl.ui", "Reading SCL module failed.", e)
55                     );
56         }
57         IDocumentPartitioner partitioner = new FastPartitioner(new SCLPartitionScanner(), SCLPartitionScanner.PARTITION_TYPES);
58         partitioner.connect(document);
59         document.setDocumentPartitioner(partitioner);
60         sourceViewer.updateCompletionAssistModuleName(source.getModuleName());
61         return document;
62     }
63     
64     @Override
65     public boolean isModifiable(Object element) {
66         TextualModuleSource source = toTextualModuleSource(element);
67         if(source == null)
68             return false;
69         return source.isUpdateable();
70     }
71     
72     @Override
73     public boolean isReadOnly(Object element) {
74         return !isModifiable(element);
75     }
76
77     @Override
78     protected IAnnotationModel createAnnotationModel(Object element)
79             throws CoreException {
80         SCLModuleEditorInput input = (SCLModuleEditorInput)element;
81         return new SCLAnnotationModel(input, SCLOsgi.MODULE_REPOSITORY);
82     }
83
84     @Override
85     protected void doSaveDocument(IProgressMonitor monitor, Object element,
86             IDocument document, boolean overwrite) throws CoreException {
87         TextualModuleSource source = toTextualModuleSource(element);
88         if(source == null)
89             return;
90         source.update(document.get());
91     }
92
93     @Override
94     protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
95         // TODO Auto-generated method stub
96         return null;
97     }
98
99 }