-package org.simantics.modeling.ui.componentTypeEditor;\r
-\r
-import org.eclipse.core.runtime.IExecutableExtension;\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.jface.text.ITextListener;\r
-import org.eclipse.jface.text.TextEvent;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.ui.IEditorInput;\r
-import org.eclipse.ui.IEditorSite;\r
-import org.eclipse.ui.PartInitException;\r
-import org.eclipse.ui.part.EditorPart;\r
-import org.simantics.Simantics;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.common.request.ResourceRead;\r
-import org.simantics.db.common.request.UniqueRead;\r
-import org.simantics.db.common.request.WriteRequest;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.util.Layer0Utils;\r
-import org.simantics.db.procedure.Listener;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.scl.compiler.errors.CompilationError;\r
-import org.simantics.scl.ui.editor.SCLTextEditorNew;\r
-import org.simantics.scl.ui.editor.TextAndErrors;\r
-import org.simantics.structural2.scl.procedural.CompileProceduralComponentTypeRequest;\r
-import org.simantics.structural2.scl.procedural.ProceduralComponentTypeCompilationException;\r
-import org.simantics.ui.workbench.IResourceEditorInput;\r
-import org.simantics.ui.workbench.TitleUpdater;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-import org.simantics.utils.ui.SWTUtils;\r
-\r
-public class SCLEditorBase extends EditorPart implements IExecutableExtension {\r
- Resource inputResource;\r
- SCLTextEditorNew editor;\r
- String originalText;\r
-\r
- protected TextAndErrors getTextAndErrors(ReadGraph graph, Resource resource) throws DatabaseException {\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- String text = graph.getValue(resource, Bindings.STRING);\r
- Resource componentType = graph.getPossibleObject(inputResource, L0.PropertyOf);\r
- CompilationError[] errors = CompilationError.EMPTY_ARRAY;\r
- if(componentType != null) {\r
- try { \r
- graph.syncRequest(new CompileProceduralComponentTypeRequest(componentType));\r
- } catch(ProceduralComponentTypeCompilationException e) {\r
- errors = e.errors;\r
- }\r
- }\r
- return new TextAndErrors(text, errors);\r
- }\r
- \r
- @Override\r
- public void createPartControl(Composite parent) {\r
- editor = new SCLTextEditorNew(parent, 0);\r
- \r
- Simantics.getSession().asyncRequest(new ResourceRead<TextAndErrors>(inputResource) {\r
- @Override\r
- public TextAndErrors perform(ReadGraph graph) throws DatabaseException {\r
- return getTextAndErrors(graph, inputResource);\r
- }\r
- }, new Listener<TextAndErrors>() {\r
- @Override\r
- public void execute(final TextAndErrors textAndErrors) {\r
- SWTUtils.asyncExec(editor, new Runnable() {\r
- @Override\r
- public void run() {\r
- \r
- if (editor.isDisposed())\r
- return;\r
- \r
- // FIXME Every graph change new overrides user's current modifications \r
- \r
- originalText = textAndErrors.text;\r
- boolean textDiffers = !originalText.equals(editor.getContent());\r
- editor.setContent(textDiffers ? originalText : null, textAndErrors.errors);\r
- firePropertyChange(PROP_DIRTY);\r
- \r
- // This condition is only true for the first time when the editor is initialized\r
- // This fixes platform issue #5192 https://www.simantics.org/redmine/issues/5192\r
- if (textDiffers)\r
- editor.getUndoManager().reset();\r
- }\r
- });\r
- }\r
-\r
- @Override\r
- public void exception(Throwable t) {\r
- ErrorLogger.defaultLogError(t);\r
- }\r
-\r
- @Override\r
- public boolean isDisposed() {\r
- return editor.isDisposed();\r
- }\r
-\r
- });\r
-\r
- editor.viewer.addTextListener(new ITextListener() {\r
- @Override\r
- public void textChanged(TextEvent event) {\r
- firePropertyChange(PROP_DIRTY);\r
- }\r
- });\r
- }\r
- \r
- @Override\r
- public void setFocus() {\r
- editor.setFocus();\r
- }\r
-\r
- protected void save(WriteGraph graph, Resource resource, String text) throws DatabaseException {\r
- graph.claimValue(resource, text);\r
- }\r
- \r
- @Override\r
- public void doSave(IProgressMonitor monitor) {\r
- this.originalText = editor.getContent();\r
- firePropertyChange(PROP_DIRTY);\r
- try {\r
- Simantics.getSession().syncRequest(new WriteRequest() {\r
- @Override\r
- public void perform(WriteGraph graph) throws DatabaseException {\r
- graph.markUndoPoint();\r
- save(graph, inputResource, originalText);\r
- Layer0Utils.addCommentMetadata(graph, "Saved SCL Module " + graph.getRelatedValue2(inputResource, Layer0.getInstance(graph).HasName, Bindings.STRING));\r
- }\r
- });\r
- } catch (DatabaseException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
-\r
- @Override\r
- public void doSaveAs() {\r
- }\r
-\r
- protected String computeTitle(ReadGraph graph, Resource inputResource) throws DatabaseException {\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- Resource parent = graph.getPossibleObject(inputResource, L0.PropertyOf);\r
- if(parent == null)\r
- return "No parent";\r
- return graph.getPossibleRelatedValue(parent, L0.HasName) + " (Code)";\r
- }\r
- \r
- @Override\r
- public void init(IEditorSite site, final IEditorInput input)\r
- throws PartInitException {\r
- setSite(site);\r
- setInput(input);\r
- this.inputResource = ((IResourceEditorInput)input).getResource();\r
- \r
- Simantics.getSession().asyncRequest(\r
- new UniqueRead<String>() {\r
- @Override\r
- public String perform(ReadGraph graph) throws DatabaseException {\r
- return computeTitle(graph, inputResource);\r
- }\r
- },\r
- new TitleUpdater(site.getShell().getDisplay(), partName -> {\r
- setPartName(partName);\r
- setTitleToolTip(partName);\r
- }, () -> editor != null && editor.isDisposed()));\r
- }\r
-\r
- @Override\r
- public boolean isDirty() {\r
- return !editor.getContent().equals(originalText);\r
- }\r
-\r
- @Override\r
- public boolean isSaveAsAllowed() {\r
- return false;\r
- }\r
-\r
+package org.simantics.modeling.ui.componentTypeEditor;
+
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.EditorPart;
+import org.simantics.Simantics;
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.ResourceRead;
+import org.simantics.db.common.request.UniqueRead;
+import org.simantics.db.common.request.WriteRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.util.Layer0Utils;
+import org.simantics.db.procedure.Listener;
+import org.simantics.layer0.Layer0;
+import org.simantics.scl.compiler.errors.CompilationError;
+import org.simantics.scl.ui.editor.SCLTextEditorNew;
+import org.simantics.scl.ui.editor.TextAndErrors;
+import org.simantics.structural2.scl.procedural.CompileProceduralComponentTypeRequest;
+import org.simantics.structural2.scl.procedural.ProceduralComponentTypeCompilationException;
+import org.simantics.ui.workbench.IResourceEditorInput;
+import org.simantics.ui.workbench.TitleUpdater;
+import org.simantics.utils.ui.ErrorLogger;
+import org.simantics.utils.ui.SWTUtils;
+
+public class SCLEditorBase extends EditorPart implements IExecutableExtension {
+ Resource inputResource;
+ SCLTextEditorNew editor;
+ String originalText;
+
+ protected TextAndErrors getTextAndErrors(ReadGraph graph, Resource resource) throws DatabaseException {
+ Layer0 L0 = Layer0.getInstance(graph);
+ String text = graph.getValue(resource, Bindings.STRING);
+ Resource componentType = graph.getPossibleObject(inputResource, L0.PropertyOf);
+ CompilationError[] errors = CompilationError.EMPTY_ARRAY;
+ if(componentType != null) {
+ try {
+ graph.syncRequest(new CompileProceduralComponentTypeRequest(componentType));
+ } catch(ProceduralComponentTypeCompilationException e) {
+ errors = e.errors;
+ }
+ }
+ return new TextAndErrors(text, errors);
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ editor = new SCLTextEditorNew(parent, 0);
+
+ Simantics.getSession().asyncRequest(new ResourceRead<TextAndErrors>(inputResource) {
+ @Override
+ public TextAndErrors perform(ReadGraph graph) throws DatabaseException {
+ return getTextAndErrors(graph, inputResource);
+ }
+ }, new Listener<TextAndErrors>() {
+ @Override
+ public void execute(final TextAndErrors textAndErrors) {
+ SWTUtils.asyncExec(editor, new Runnable() {
+ @Override
+ public void run() {
+
+ if (editor.isDisposed())
+ return;
+
+ // FIXME Every graph change new overrides user's current modifications
+
+ originalText = textAndErrors.text;
+ boolean textDiffers = !originalText.equals(editor.getContent());
+ editor.setContent(textDiffers ? originalText : null, textAndErrors.errors);
+ firePropertyChange(PROP_DIRTY);
+
+ // This condition is only true for the first time when the editor is initialized
+ // This fixes platform issue #5192 https://www.simantics.org/redmine/issues/5192
+ if (textDiffers)
+ editor.getUndoManager().reset();
+ }
+ });
+ }
+
+ @Override
+ public void exception(Throwable t) {
+ ErrorLogger.defaultLogError(t);
+ }
+
+ @Override
+ public boolean isDisposed() {
+ return editor.isDisposed();
+ }
+
+ });
+
+ editor.viewer.addTextListener(new ITextListener() {
+ @Override
+ public void textChanged(TextEvent event) {
+ firePropertyChange(PROP_DIRTY);
+ }
+ });
+ }
+
+ @Override
+ public void setFocus() {
+ editor.setFocus();
+ }
+
+ protected void save(WriteGraph graph, Resource resource, String text) throws DatabaseException {
+ graph.claimValue(resource, text);
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ this.originalText = editor.getContent();
+ firePropertyChange(PROP_DIRTY);
+ try {
+ Simantics.getSession().syncRequest(new WriteRequest() {
+ @Override
+ public void perform(WriteGraph graph) throws DatabaseException {
+ graph.markUndoPoint();
+ save(graph, inputResource, originalText);
+ Layer0Utils.addCommentMetadata(graph, "Saved SCL Module " + graph.getRelatedValue2(inputResource, Layer0.getInstance(graph).HasName, Bindings.STRING));
+ }
+ });
+ } catch (DatabaseException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void doSaveAs() {
+ }
+
+ protected String computeTitle(ReadGraph graph, Resource inputResource) throws DatabaseException {
+ Layer0 L0 = Layer0.getInstance(graph);
+ Resource parent = graph.getPossibleObject(inputResource, L0.PropertyOf);
+ if(parent == null)
+ return "No parent";
+ return graph.getPossibleRelatedValue(parent, L0.HasName) + " (Code)";
+ }
+
+ @Override
+ public void init(IEditorSite site, final IEditorInput input)
+ throws PartInitException {
+ setSite(site);
+ setInput(input);
+ this.inputResource = ((IResourceEditorInput)input).getResource();
+
+ Simantics.getSession().asyncRequest(
+ new UniqueRead<String>() {
+ @Override
+ public String perform(ReadGraph graph) throws DatabaseException {
+ return computeTitle(graph, inputResource);
+ }
+ },
+ new TitleUpdater(site.getShell().getDisplay(), partName -> {
+ setPartName(partName);
+ setTitleToolTip(partName);
+ }, () -> editor != null && editor.isDisposed()));
+ }
+
+ @Override
+ public boolean isDirty() {
+ return !editor.getContent().equals(originalText);
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
}
\ No newline at end of file