X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Feditor2%2FSCLModuleEditor2DocumentProvider.java;h=cf6bf9a87c6ade46606a2794453891406d19526e;hp=f1bb9b54f2a41904b3983c754e9726cac3d54d41;hb=22fc89ea8f464540eab16db50e271b89c16c2842;hpb=cb5fc8d606d8b322563e9345c441eecfa7f01753 diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLModuleEditor2DocumentProvider.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLModuleEditor2DocumentProvider.java index f1bb9b54f..cf6bf9a87 100644 --- a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLModuleEditor2DocumentProvider.java +++ b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLModuleEditor2DocumentProvider.java @@ -1,99 +1,113 @@ -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(); - - public SCLModuleEditor2DocumentProvider( - SCLSourceViewerConfigurationNew sourceViewer) { - this.sourceViewer = sourceViewer; - } - - private static TextualModuleSource toTextualModuleSource(Object input) { - if(!(input instanceof SCLModuleEditorInput)) - return null; - ModuleSource source = ((SCLModuleEditorInput)input).getAdapter(ModuleSource.class); - if(source == null) - return null; - if(!(source instanceof TextualModuleSource)) - return null; - return (TextualModuleSource)source; - } - - @Override - protected IDocument createDocument(Object element) throws CoreException { - TextualModuleSource source = toTextualModuleSource(element); - if(source == 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(source.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(source.getModuleName()); - return document; - } - - @Override - public boolean isModifiable(Object element) { - TextualModuleSource source = toTextualModuleSource(element); - if(source == null) - return false; - return source.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 { - TextualModuleSource source = toTextualModuleSource(element); - if(source == null) - return; - source.update(document.get()); - } - - @Override - protected IRunnableContext getOperationRunner(IProgressMonitor monitor) { - // TODO Auto-generated method stub - return null; - } - -} +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; + } + +}