--- /dev/null
+package org.simantics.modeling.ui.documents;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+\r
+import org.eclipse.core.runtime.IPath;\r
+import org.eclipse.core.runtime.Platform;\r
+import org.eclipse.ui.IEditorPart;\r
+import org.eclipse.ui.IPartListener;\r
+import org.eclipse.ui.IWorkbenchPage;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.eclipse.ui.editors.text.EditorsUI;\r
+import org.eclipse.ui.ide.IDE;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.PossibleTypedParent;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.document.DocumentResource;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.ui.Activator;\r
+import org.simantics.simulation.ontology.SimulationResource;\r
+import org.simantics.ui.SimanticsUI;\r
+import org.simantics.ui.workbench.editor.AbstractResourceEditorAdapter;\r
+import org.simantics.utils.FileUtils;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class OpenPlainTextDocumentAdapter extends AbstractResourceEditorAdapter {\r
+\r
+ public OpenPlainTextDocumentAdapter() {\r
+ super("Text Editor", Activator.COMPOSITE_ICON);\r
+ }\r
+\r
+ @Override\r
+ public boolean canHandle(ReadGraph g, Resource r) throws DatabaseException {\r
+ DocumentResource DOC = DocumentResource.getInstance(g);\r
+ return g.isInstanceOf(r, DOC.PlainTextDocument);\r
+ }\r
+\r
+ @Override\r
+ public void openEditor(final Resource r) throws Exception {\r
+ SimanticsUI.getSession().asyncRequest(new ReadRequest() {\r
+ @Override\r
+ public void run(ReadGraph g) throws DatabaseException {\r
+ Layer0 L0 = Layer0.getInstance(g);\r
+ DocumentResource DOC = DocumentResource.getInstance(g);\r
+ String documentName = g.getPossibleRelatedValue(r, L0.HasName);\r
+ if (documentName == null)\r
+ documentName = "";\r
+ final String text = g.getPossibleRelatedValue(r, DOC.PlainTextDocument_text, Bindings.STRING);\r
+ if (text == null)\r
+ return;\r
+\r
+ try {\r
+ final Resource model = g.syncRequest(new PossibleTypedParent(r, SimulationResource.getInstance(g).Model));\r
+ final String dir = model == null ? "" + r.getResourceId() : (String)(g.getRelatedValue(model, L0.HasName));\r
+ IPath state = Platform.getStateLocation(Platform.getBundle(Activator.PLUGIN_ID));\r
+ final File stateDir = new File(state.toFile(), dir);\r
+ stateDir.mkdirs();\r
+ final File tempFile = new File(stateDir, FileUtils.escapeFileName(documentName) + ".txt");\r
+ FileUtils.writeFile(tempFile, text.getBytes("US-ASCII"));\r
+\r
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();\r
+ final IEditorPart editor = IDE.openEditor(page, tempFile.toURI(), EditorsUI.DEFAULT_TEXT_EDITOR_ID, true);\r
+ page.addPartListener(new IPartListener() {\r
+ @Override\r
+ public void partOpened(IWorkbenchPart part) {\r
+ }\r
+ @Override\r
+ public void partDeactivated(IWorkbenchPart part) {\r
+ }\r
+ @Override\r
+ public void partClosed(IWorkbenchPart part) {\r
+ if (part == editor) {\r
+ page.removePartListener(this);\r
+ if (!PlatformUI.getWorkbench().isClosing()) {\r
+ try {\r
+ FileUtils.deleteAll(stateDir);\r
+ } catch (IOException e) {\r
+ ErrorLogger.defaultLogError(e);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ @Override\r
+ public void partBroughtToTop(IWorkbenchPart part) {\r
+ }\r
+ @Override\r
+ public void partActivated(IWorkbenchPart part) {\r
+ }\r
+ });\r
+ } catch (Exception e) {\r
+ ErrorLogger.defaultLogError(e);\r
+ }\r
+ }\r
+ });\r
+ } catch (IOException e1) {\r
+ ErrorLogger.defaultLogError(e1);\r
+ }\r
+ }\r
+ });\r
+ }\r
+\r
+}\r