]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/SCLEditorBase.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / componentTypeEditor / SCLEditorBase.java
1 package org.simantics.modeling.ui.componentTypeEditor;\r
2 \r
3 import org.eclipse.core.runtime.IExecutableExtension;\r
4 import org.eclipse.core.runtime.IProgressMonitor;\r
5 import org.eclipse.jface.text.ITextListener;\r
6 import org.eclipse.jface.text.TextEvent;\r
7 import org.eclipse.swt.widgets.Composite;\r
8 import org.eclipse.ui.IEditorInput;\r
9 import org.eclipse.ui.IEditorSite;\r
10 import org.eclipse.ui.PartInitException;\r
11 import org.eclipse.ui.part.EditorPart;\r
12 import org.simantics.Simantics;\r
13 import org.simantics.databoard.Bindings;\r
14 import org.simantics.db.ReadGraph;\r
15 import org.simantics.db.Resource;\r
16 import org.simantics.db.WriteGraph;\r
17 import org.simantics.db.common.request.ResourceRead;\r
18 import org.simantics.db.common.request.UniqueRead;\r
19 import org.simantics.db.common.request.WriteRequest;\r
20 import org.simantics.db.exception.DatabaseException;\r
21 import org.simantics.db.layer0.util.Layer0Utils;\r
22 import org.simantics.db.procedure.Listener;\r
23 import org.simantics.layer0.Layer0;\r
24 import org.simantics.scl.compiler.errors.CompilationError;\r
25 import org.simantics.scl.ui.editor.SCLTextEditorNew;\r
26 import org.simantics.scl.ui.editor.TextAndErrors;\r
27 import org.simantics.structural2.scl.procedural.CompileProceduralComponentTypeRequest;\r
28 import org.simantics.structural2.scl.procedural.ProceduralComponentTypeCompilationException;\r
29 import org.simantics.ui.workbench.IResourceEditorInput;\r
30 import org.simantics.ui.workbench.TitleUpdater;\r
31 import org.simantics.utils.ui.ErrorLogger;\r
32 import org.simantics.utils.ui.SWTUtils;\r
33 \r
34 public class SCLEditorBase extends EditorPart implements IExecutableExtension {\r
35     Resource inputResource;\r
36     SCLTextEditorNew editor;\r
37     String originalText;\r
38 \r
39     protected TextAndErrors getTextAndErrors(ReadGraph graph, Resource resource) throws DatabaseException {\r
40         Layer0 L0 = Layer0.getInstance(graph);\r
41         String text = graph.getValue(resource, Bindings.STRING);\r
42         Resource componentType = graph.getPossibleObject(inputResource, L0.PropertyOf);\r
43         CompilationError[] errors = CompilationError.EMPTY_ARRAY;\r
44         if(componentType != null) {\r
45             try { \r
46                 graph.syncRequest(new CompileProceduralComponentTypeRequest(componentType));\r
47             } catch(ProceduralComponentTypeCompilationException e) {\r
48                 errors = e.errors;\r
49             }\r
50         }\r
51         return new TextAndErrors(text, errors);\r
52     }\r
53     \r
54     @Override\r
55     public void createPartControl(Composite parent) {\r
56         editor = new SCLTextEditorNew(parent, 0);\r
57         \r
58         Simantics.getSession().asyncRequest(new ResourceRead<TextAndErrors>(inputResource) {\r
59             @Override\r
60             public TextAndErrors perform(ReadGraph graph) throws DatabaseException {\r
61                 return getTextAndErrors(graph, inputResource);\r
62             }\r
63         }, new Listener<TextAndErrors>() {\r
64             @Override\r
65             public void execute(final TextAndErrors textAndErrors) {\r
66                 SWTUtils.asyncExec(editor, new Runnable() {\r
67                     @Override\r
68                     public void run() {\r
69                         \r
70                         if (editor.isDisposed())\r
71                             return;\r
72                         \r
73                         // FIXME Every graph change new overrides user's current modifications  \r
74                         \r
75                         originalText = textAndErrors.text;\r
76                         boolean textDiffers = !originalText.equals(editor.getContent());\r
77                         editor.setContent(textDiffers ? originalText : null, textAndErrors.errors);\r
78                         firePropertyChange(PROP_DIRTY);\r
79                         \r
80                         // This condition is only true for the first time when the editor is initialized\r
81                         // This fixes platform issue #5192 https://www.simantics.org/redmine/issues/5192\r
82                         if (textDiffers)\r
83                             editor.getUndoManager().reset();\r
84                     }\r
85                 });\r
86             }\r
87 \r
88             @Override\r
89             public void exception(Throwable t) {\r
90                 ErrorLogger.defaultLogError(t);\r
91             }\r
92 \r
93             @Override\r
94             public boolean isDisposed() {\r
95                 return editor.isDisposed();\r
96             }\r
97 \r
98         });\r
99 \r
100         editor.viewer.addTextListener(new ITextListener() {\r
101             @Override\r
102             public void textChanged(TextEvent event) {\r
103                 firePropertyChange(PROP_DIRTY);\r
104             }\r
105         });\r
106     }\r
107     \r
108     @Override\r
109     public void setFocus() {\r
110         editor.setFocus();\r
111     }\r
112 \r
113     protected void save(WriteGraph graph, Resource resource, String text) throws DatabaseException {\r
114         graph.claimValue(resource, text);\r
115     }\r
116     \r
117     @Override\r
118     public void doSave(IProgressMonitor monitor) {\r
119         this.originalText = editor.getContent();\r
120         firePropertyChange(PROP_DIRTY);\r
121         try {\r
122             Simantics.getSession().syncRequest(new WriteRequest() {\r
123                 @Override\r
124                 public void perform(WriteGraph graph) throws DatabaseException {\r
125                     graph.markUndoPoint();\r
126                         save(graph, inputResource, originalText);\r
127                         Layer0Utils.addCommentMetadata(graph, "Saved SCL Module " + graph.getRelatedValue2(inputResource, Layer0.getInstance(graph).HasName, Bindings.STRING));\r
128                 }\r
129             });\r
130         } catch (DatabaseException e) {\r
131             e.printStackTrace();\r
132         }\r
133     }\r
134 \r
135     @Override\r
136     public void doSaveAs() {\r
137     }\r
138 \r
139     protected String computeTitle(ReadGraph graph, Resource inputResource) throws DatabaseException {\r
140         Layer0 L0 = Layer0.getInstance(graph);\r
141         Resource parent = graph.getPossibleObject(inputResource, L0.PropertyOf);\r
142         if(parent == null)\r
143             return "No parent";\r
144         return graph.getPossibleRelatedValue(parent, L0.HasName) + " (Code)";\r
145     }\r
146     \r
147     @Override\r
148     public void init(IEditorSite site, final IEditorInput input)\r
149             throws PartInitException {\r
150         setSite(site);\r
151         setInput(input);\r
152         this.inputResource = ((IResourceEditorInput)input).getResource();\r
153         \r
154         Simantics.getSession().asyncRequest(\r
155                 new UniqueRead<String>() {\r
156                     @Override\r
157                     public String perform(ReadGraph graph) throws DatabaseException {\r
158                         return computeTitle(graph, inputResource);\r
159                     }\r
160                 },\r
161                 new TitleUpdater(site.getShell().getDisplay(), partName -> {\r
162                     setPartName(partName);\r
163                     setTitleToolTip(partName);\r
164                 }, () -> editor != null && editor.isDisposed()));\r
165     }\r
166 \r
167     @Override\r
168     public boolean isDirty() {\r
169         return !editor.getContent().equals(originalText);\r
170     }\r
171 \r
172     @Override\r
173     public boolean isSaveAsAllowed() {\r
174         return false;\r
175     }\r
176 \r
177 }