-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.IDocumentPartitioner;\r
-import org.eclipse.jface.text.rules.FastPartitioner;\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
- IDocumentPartitioner partitioner = new FastPartitioner(new SCLPartitionScanner(), SCLPartitionScanner.PARTITION_TYPES);\r
- partitioner.connect(document);\r
- document.setDocumentPartitioner(partitioner);\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;
+ }
+
+}