]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLModuleEditor2DocumentProvider.java
Preventing unnecessary ModuleSource compilation in SCL-editor
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / SCLModuleEditor2DocumentProvider.java
index b92818aa5e33f3cc0f8cf256b353e3cd72afd95c..cf6bf9a87c6ade46606a2794453891406d19526e 100644 (file)
-package org.simantics.scl.ui.editor2;\r
-\r
-import java.io.IOException;\r
-\r
-import org.eclipse.core.runtime.CoreException;\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.core.runtime.Status;\r
-import org.eclipse.jface.operation.IRunnableContext;\r
-import org.eclipse.jface.text.Document;\r
-import org.eclipse.jface.text.IDocument;\r
-import org.eclipse.jface.text.source.AnnotationModel;\r
-import org.eclipse.jface.text.source.IAnnotationModel;\r
-import org.eclipse.ui.texteditor.AbstractDocumentProvider;\r
-import org.simantics.scl.compiler.source.ModuleSource;\r
-import org.simantics.scl.compiler.source.TextualModuleSource;\r
-import org.simantics.scl.osgi.SCLOsgi;\r
-import org.simantics.scl.ui.editor.SCLSourceViewerConfigurationNew;\r
-\r
-public class SCLModuleEditor2DocumentProvider extends AbstractDocumentProvider {\r
-\r
-    private SCLSourceViewerConfigurationNew sourceViewer;\r
-    protected AnnotationModel annotationModel = new AnnotationModel();\r
-    \r
-    public SCLModuleEditor2DocumentProvider(\r
-            SCLSourceViewerConfigurationNew sourceViewer) {\r
-        this.sourceViewer = sourceViewer;\r
-    }\r
-\r
-    private static TextualModuleSource toTextualModuleSource(Object input) {\r
-        if(!(input instanceof SCLModuleEditorInput))\r
-            return null;\r
-        ModuleSource source = ((SCLModuleEditorInput)input).getAdapter(ModuleSource.class);\r
-        if(source == null)\r
-            return null;\r
-        if(!(source instanceof TextualModuleSource))\r
-            return null;\r
-        return (TextualModuleSource)source;\r
-    }\r
-    \r
-    @Override\r
-    protected IDocument createDocument(Object element) throws CoreException {\r
-        TextualModuleSource source = toTextualModuleSource(element);\r
-        if(source == null)\r
-            throw new CoreException(\r
-                    new Status(Status.ERROR, "org.simantics.scl.ui", "Source for the SCL module could not be found.")\r
-                    );\r
-        Document document;\r
-        try {\r
-            document = new Document(source.getSourceText(null));\r
-        } catch (IOException e) {\r
-            throw new CoreException(\r
-                    new Status(Status.ERROR, "org.simantics.scl.ui", "Reading SCL module failed.", e)\r
-                    );\r
-        }\r
-        sourceViewer.updateCompletionAssistModuleName(source.getModuleName());\r
-        return document;\r
-    }\r
-    \r
-    @Override\r
-    public boolean isModifiable(Object element) {\r
-        TextualModuleSource source = toTextualModuleSource(element);\r
-        if(source == null)\r
-            return false;\r
-        return source.isUpdateable();\r
-    }\r
-    \r
-    @Override\r
-    public boolean isReadOnly(Object element) {\r
-        return !isModifiable(element);\r
-    }\r
-\r
-    @Override\r
-    protected IAnnotationModel createAnnotationModel(Object element)\r
-            throws CoreException {\r
-        SCLModuleEditorInput input = (SCLModuleEditorInput)element;\r
-        return new SCLAnnotationModel(input, SCLOsgi.MODULE_REPOSITORY);\r
-    }\r
-\r
-    @Override\r
-    protected void doSaveDocument(IProgressMonitor monitor, Object element,\r
-            IDocument document, boolean overwrite) throws CoreException {\r
-        TextualModuleSource source = toTextualModuleSource(element);\r
-        if(source == null)\r
-            return;\r
-        source.update(document.get());\r
-    }\r
-\r
-    @Override\r
-    protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {\r
-        // TODO Auto-generated method stub\r
-        return null;\r
-    }\r
-\r
-}\r
+package org.simantics.scl.ui.editor2;
+
+import java.io.IOException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.rules.FastPartitioner;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.ui.texteditor.AbstractDocumentProvider;
+import org.simantics.scl.compiler.source.ModuleSource;
+import org.simantics.scl.compiler.source.TextualModuleSource;
+import org.simantics.scl.osgi.SCLOsgi;
+import org.simantics.scl.ui.editor.SCLSourceViewerConfigurationNew;
+
+public class SCLModuleEditor2DocumentProvider extends AbstractDocumentProvider {
+
+    private SCLSourceViewerConfigurationNew sourceViewer;
+    protected AnnotationModel annotationModel = new AnnotationModel();
+    
+    private Object currentElement;
+    private TextualModuleSource currentSource;
+    
+    public SCLModuleEditor2DocumentProvider(SCLSourceViewerConfigurationNew sourceViewer) {
+        this.sourceViewer = sourceViewer;
+    }
+
+    private void updateTextualModuleSource(Object input) {
+        if (currentElement != null && currentElement.equals(input))
+            return;
+        currentElement = input;
+        if(!(currentElement instanceof SCLModuleEditorInput))
+            return;
+        
+        ModuleSource source = ((SCLModuleEditorInput)currentElement).getAdapter(ModuleSource.class);
+        if(source == null)
+            return;
+        if(!(source instanceof TextualModuleSource))
+            return;
+        currentSource = (TextualModuleSource)source;
+    }
+    
+    @Override
+    protected IDocument createDocument(Object element) throws CoreException {
+        updateTextualModuleSource(element);
+        if(currentSource == null)
+            throw new CoreException(
+                    new Status(Status.ERROR, "org.simantics.scl.ui", "Source for the SCL module could not be found.")
+                    );
+        Document document;
+        try {
+            document = new Document(currentSource.getSourceText(null));
+        } catch (IOException e) {
+            throw new CoreException(
+                    new Status(Status.ERROR, "org.simantics.scl.ui", "Reading SCL module failed.", e)
+                    );
+        }
+        IDocumentPartitioner partitioner = new FastPartitioner(new SCLPartitionScanner(), SCLPartitionScanner.PARTITION_TYPES);
+        partitioner.connect(document);
+        document.setDocumentPartitioner(partitioner);
+        sourceViewer.updateCompletionAssistModuleName(currentSource.getModuleName());
+        return document;
+    }
+    
+    @Override
+    public void changed(Object element) {
+        updateTextualModuleSource(element);
+    }
+    
+    @Override
+    public void aboutToChange(Object element) {
+        super.aboutToChange(element);
+    }
+    
+    @Override
+    public boolean isModifiable(Object element) {
+        if(currentSource == null)
+            return false;
+        return currentSource.isUpdateable();
+    }
+    
+    @Override
+    public boolean isReadOnly(Object element) {
+        return !isModifiable(element);
+    }
+
+    @Override
+    protected IAnnotationModel createAnnotationModel(Object element)
+            throws CoreException {
+        SCLModuleEditorInput input = (SCLModuleEditorInput)element;
+        return new SCLAnnotationModel(input, SCLOsgi.MODULE_REPOSITORY);
+    }
+
+    @Override
+    protected void doSaveDocument(IProgressMonitor monitor, Object element,
+            IDocument document, boolean overwrite) throws CoreException {
+        if(currentSource == null)
+            return;
+        currentSource.update(document.get());
+    }
+
+    @Override
+    protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}