--- /dev/null
+package org.simantics.help.ui;\r
+\r
+import java.util.function.Supplier;\r
+\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.simantics.Simantics;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.request.ParametrizedRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.request.combinations.Combinators;\r
+import org.simantics.ui.workbench.IResourceEditorInput;\r
+import org.simantics.ui.workbench.ResourceEditorSupport;\r
+import org.simantics.ui.workbench.TitleUpdater;\r
+import org.simantics.ui.workbench.TitleWithParentNameRequest;\r
+import org.simantics.ui.workbench.ToolTipRequest;\r
+import org.simantics.ui.workbench.editor.input.InputValidationCombinators;\r
+\r
+import winterwell.markdown.editors.MarkdownEditor;\r
+\r
+public class HelpFileEditor extends MarkdownEditor {\r
+\r
+ private static final String EDITOR_ID = "org.simantics.help.ui.HelpFileEditor";\r
+\r
+ private boolean disposed;\r
+\r
+ private static final ParametrizedRead<IResourceEditorInput, Boolean> INPUT_VALIDATOR = \r
+ Combinators.compose(InputValidationCombinators.hasURI(), InputValidationCombinators.extractInputResource());\r
+\r
+ private ResourceEditorSupport support;\r
+\r
+ public HelpFileEditor() {\r
+ super();\r
+ setDocumentProvider(new HelpFileDocumentProvider());\r
+ }\r
+\r
+ @Override\r
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {\r
+ super.init(site, input);\r
+\r
+ support = new ResourceEditorSupport(this, INPUT_VALIDATOR);\r
+ support.activateValidation();\r
+ try {\r
+ getResourceInput().init(null);\r
+ } catch (DatabaseException e) {\r
+ throw new PartInitException("Failed to initialize " + input, e);\r
+ }\r
+\r
+ }\r
+\r
+ protected IResourceEditorInput getResourceInput() {\r
+ return (IResourceEditorInput) getEditorInput();\r
+ }\r
+\r
+ @Override\r
+ public void createPartControl(Composite parent) {\r
+ super.createPartControl(parent);\r
+ updatePartName();\r
+ }\r
+\r
+ protected void updatePartName() {\r
+ setPartName(getEditorInput().getName());\r
+\r
+ Session session = Simantics.peekSession();\r
+ if (session != null) {\r
+ Supplier<Boolean> disposedCallback = this::isDisposed;\r
+ session.asyncRequest(new TitleWithParentNameRequest(getResourceInput()),\r
+ new TitleUpdater(getSite().getShell().getDisplay(), this::setPartName, disposedCallback));\r
+ session.asyncRequest(new ToolTipRequest(getSite().getId(), getResourceInput()),\r
+ new TitleUpdater(getSite().getShell().getDisplay(), this::setTitleToolTip, disposedCallback));\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void dispose() {\r
+ disposed = true;\r
+ if (support != null) {\r
+ support.dispose();\r
+ support = null;\r
+ }\r
+ super.dispose();\r
+ }\r
+\r
+ public boolean isDisposed() {\r
+ return disposed;\r
+ }\r
+\r
+ public static String getEditorId() {\r
+ return EDITOR_ID;\r
+ }\r
+}\r