]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.ui/src/org/simantics/ui/workbench/ResourceEditorPart.java
Merge "NPE while recalculating title for CompatibilityPart" into release/1.35.1
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / workbench / ResourceEditorPart.java
index 5689cfa4b7dee2b8a655ad59e6cbe2746f868c27..517ddf39e850a904d949da0c98b6dc36222ad3f6 100644 (file)
@@ -9,6 +9,7 @@
  * Contributors:
  *     VTT Technical Research Centre of Finland - initial API and implementation
  *     Semantum Oy - issue #4384
+ *     Semantum Oy - issue #7737
  *******************************************************************************/
 package org.simantics.ui.workbench;
 
@@ -19,12 +20,14 @@ import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchPartSite;
 import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.internal.PartSite;
+import org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor;
 import org.eclipse.ui.part.EditorPart;
 import org.simantics.db.Resource;
 import org.simantics.db.Session;
 import org.simantics.db.common.request.ParametrizedRead;
-import org.simantics.db.event.ChangeListener;
 import org.simantics.db.management.ISessionContext;
 import org.simantics.ui.SimanticsUI;
 
@@ -41,6 +44,7 @@ import org.simantics.ui.SimanticsUI;
  * </p>
  * 
  * @author Tuukka Lehtonen
+ * @author Jani Simomaa
  */
 public abstract class ResourceEditorPart extends EditorPart implements IResourceEditorPart {
 
@@ -83,10 +87,48 @@ public abstract class ResourceEditorPart extends EditorPart implements IResource
             Supplier<Boolean> disposedCallback = () -> disposed;
             session.asyncRequest(
                     new TitleRequest(site.getId(), getResourceInput()),
-                    new TitleUpdater(site.getShell().getDisplay(), this::setPartName, disposedCallback));
+                    new TitleUpdater(site.getShell().getDisplay(), this::safeSetPartName, disposedCallback));
             session.asyncRequest(
                     new ToolTipRequest(site.getId(), getResourceInput()),
-                    new TitleUpdater(site.getShell().getDisplay(), this::setTitleToolTip, disposedCallback));
+                    new TitleUpdater(site.getShell().getDisplay(), this::safeSetTitleToolTip, disposedCallback));
+        }
+    }
+
+    /**
+     * Safely sets part name for parts whose IEditorInput is not yet disposed (e.g.
+     * removed from database)
+     * 
+     * @param partName
+     */
+    protected void safeSetPartName(String partName) {
+        if (!disposed && checkCompatibilityPartNotBeingDisposed()) { // this is to fix bug https://gitlab.simantics.org/simantics/platform/issues/117
+            setPartName(partName);
+        }
+    }
+
+    @SuppressWarnings("restriction")
+    private boolean checkCompatibilityPartNotBeingDisposed() {
+        IWorkbenchPartSite site = getSite();
+        if (site instanceof PartSite) {
+            PartSite partSite = (PartSite) getSite();
+            Object object = partSite.getModel().getObject();
+            if (object instanceof CompatibilityEditor) {
+                CompatibilityEditor editor = (CompatibilityEditor) object;
+                return !editor.isBeingDisposed();
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Safely sets title tooltip for parts whose IEditorInput is not yet disposed (e.g.
+     * removed from database)
+     * 
+     * @param toolTip
+     */
+    protected void safeSetTitleToolTip(String toolTip) {
+        if (!disposed) {
+            setTitleToolTip(toolTip);
         }
     }