diff options
author | rschnekenbu | 2010-07-23 13:35:12 +0000 |
---|---|---|
committer | rschnekenbu | 2010-07-23 13:35:12 +0000 |
commit | a8c658f4e821ca24bdc083a9a2016042bc71295d (patch) | |
tree | d42750fc0d2c00c49ed3fecc52db0995143e21e8 /plugins/core/org.eclipse.xtext.gmf.glue/src/org/eclipse/xtext/gmf/glue/partialEditing/PartialModelEditor.java | |
parent | f27e36dcf7b8efa4d1f084de5722f7b6d6211fef (diff) | |
download | org.eclipse.papyrus-a8c658f4e821ca24bdc083a9a2016042bc71295d.tar.gz org.eclipse.papyrus-a8c658f4e821ca24bdc083a9a2016042bc71295d.tar.xz org.eclipse.papyrus-a8c658f4e821ca24bdc083a9a2016042bc71295d.zip |
Updated the xtext editors not to have an intermediate file for the editing.
Diffstat (limited to 'plugins/core/org.eclipse.xtext.gmf.glue/src/org/eclipse/xtext/gmf/glue/partialEditing/PartialModelEditor.java')
-rw-r--r-- | plugins/core/org.eclipse.xtext.gmf.glue/src/org/eclipse/xtext/gmf/glue/partialEditing/PartialModelEditor.java | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/plugins/core/org.eclipse.xtext.gmf.glue/src/org/eclipse/xtext/gmf/glue/partialEditing/PartialModelEditor.java b/plugins/core/org.eclipse.xtext.gmf.glue/src/org/eclipse/xtext/gmf/glue/partialEditing/PartialModelEditor.java new file mode 100644 index 00000000000..0499773fd0a --- /dev/null +++ b/plugins/core/org.eclipse.xtext.gmf.glue/src/org/eclipse/xtext/gmf/glue/partialEditing/PartialModelEditor.java @@ -0,0 +1,151 @@ +package org.eclipse.xtext.gmf.glue.partialEditing; + +import java.util.Collections; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ISynchronizable; +import org.eclipse.jface.text.source.AnnotationModel; +import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.xtext.resource.XtextResource; +import org.eclipse.xtext.ui.editor.model.XtextDocument; +import org.eclipse.xtext.util.StringInputStream; + +/** + * + */ +public class PartialModelEditor { + + private final SourceViewer viewer; + private final boolean insertLineBreaks; + private final ISyntheticResourceProvider resourceProvider; + //private final Injector xtextInjector ; + + /** + * @param viewer + * @param resourceProvider + * @param insertLineBreaks + * + */ + public PartialModelEditor(SourceViewer viewer, ISyntheticResourceProvider resourceProvider, boolean insertLineBreaks) { + //this.xtextInjector = xtextInjector ; + this.viewer = viewer; + this.resourceProvider = resourceProvider; + this.insertLineBreaks = insertLineBreaks; + } + + /** + * @param document + * @param prefix + * @param editablePart + * @param suffix + * + */ + public void setModel(XtextDocument document, String prefix, String editablePart, String suffix) { + if (insertLineBreaks) { + String delimiter = document.getLegalLineDelimiters()[0]; + prefix = prefix + delimiter; + suffix = delimiter + suffix; + } + String model = prefix + editablePart + suffix; + document.set(model); + XtextResource resource = createResource(model); + document.setInput(resource); + AnnotationModel annotationModel = new AnnotationModel(); + if (document instanceof ISynchronizable) { + Object lock= ((ISynchronizable)document).getLockObject(); + if (lock == null) { + lock= new Object(); + ((ISynchronizable)document).setLockObject(lock); + } + ((ISynchronizable) annotationModel).setLockObject(lock); + } + viewer.setDocument(document, annotationModel, prefix.length(), editablePart.length()); + viewer.getUndoManager().reset(); + } + + /** + * @param content + * @return XtextResource + * + */ + public XtextResource createResource(String content) { + XtextResource result = resourceProvider.createResource(); + try { + result.load(new StringInputStream(content, result.getEncoding()), Collections.emptyMap()); + } catch (Exception e) { + throw new RuntimeException(e); + } + return result; + } + + /** + * @param prefix + * @param editablePart + * @param suffix + * + */ + public void updateModel(String prefix, String editablePart, String suffix) { + IDocument document= viewer.getDocument(); + if (insertLineBreaks) { + String delimiter = document.getLegalLineDelimiters()[0]; + prefix = prefix + delimiter; + suffix = delimiter + suffix; + } + String model = prefix + editablePart + suffix; + viewer.setRedraw(false); + viewer.getUndoManager().disconnect(); + document.set(model); + viewer.setVisibleRegion(prefix.length(), editablePart.length()); + viewer.getUndoManager().connect(viewer); + viewer.setRedraw(true); + } + + /** + * @param prefix + * + */ + public void updatePrefix(String prefix) { + try { + IDocument document= viewer.getDocument(); + IRegion visibleRegion = viewer.getVisibleRegion(); + String editablePart = document.get(visibleRegion.getOffset(), visibleRegion.getLength()); + int suffixOffset = visibleRegion.getOffset() + visibleRegion.getLength(); + String suffix = ""; + if (document.getLength() - suffixOffset > 0) { + suffix = document.get(suffixOffset, document.getLength() - suffixOffset); + if (insertLineBreaks) { + String delimiter = document.getLegalLineDelimiters()[0]; + suffix = suffix.substring(delimiter.length()); + } + } + updateModel(prefix, editablePart, suffix); + } catch(BadLocationException e) { + throw new RuntimeException(e); + } + } + + /** + * @return String + * + */ + public String getEditablePart() { + IDocument doc= viewer.getDocument(); + IRegion visible= viewer.getVisibleRegion(); + try { + return doc.get(visible.getOffset(), visible.getLength()); + } catch (BadLocationException e) { + return ""; //$NON-NLS-1$ + } + } + + /** + * @return String + * + */ + public String getSerializedModel() { + return viewer.getDocument().get(); + } + +} |