Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpguilet2016-10-21 13:25:20 +0000
committerPierre-Charles David2016-10-21 15:06:25 +0000
commitbb18387550e27d3e0f5d41c94d35fc03730b517c (patch)
tree95c53ef6a7afe108600ef8968f419b45db68e159
parentb47ea4f4ef7be97ec083c661626c320f40bca9f8 (diff)
downloadorg.eclipse.sirius-bb18387550e27d3e0f5d41c94d35fc03730b517c.tar.gz
org.eclipse.sirius-bb18387550e27d3e0f5d41c94d35fc03730b517c.tar.xz
org.eclipse.sirius-bb18387550e27d3e0f5d41c94d35fc03730b517c.zip
[501263] Fix reference to editor after closing
-Fix remaining reference to AbstractDTreeEditor from contained SessionManagerListener when closing it causing a leak because the listener is still referenced by Eclipse ContextService. -Fix disposing of the AbstractDTreeEditor' adapter factory done before disposing the adapter factory causing the adapter factory already existing to be not disposed. Bug: 501263 Change-Id: Id18c7a53a33fd03670844767793fdf59da487bd5 Signed-off-by: pguilet <pierre.guilet@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.table.ui/src/org/eclipse/sirius/table/ui/tools/internal/editor/AbstractDTableEditor.java2
-rw-r--r--plugins/org.eclipse.sirius.tree.ui/src/org/eclipse/sirius/tree/ui/tools/internal/editor/DTreeEditor.java2
-rw-r--r--plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/editor/AbstractDTreeEditor.java50
3 files changed, 37 insertions, 17 deletions
diff --git a/plugins/org.eclipse.sirius.table.ui/src/org/eclipse/sirius/table/ui/tools/internal/editor/AbstractDTableEditor.java b/plugins/org.eclipse.sirius.table.ui/src/org/eclipse/sirius/table/ui/tools/internal/editor/AbstractDTableEditor.java
index 60d9e6ac01..ca7e6fafaa 100644
--- a/plugins/org.eclipse.sirius.table.ui/src/org/eclipse/sirius/table/ui/tools/internal/editor/AbstractDTableEditor.java
+++ b/plugins/org.eclipse.sirius.table.ui/src/org/eclipse/sirius/table/ui/tools/internal/editor/AbstractDTableEditor.java
@@ -489,10 +489,10 @@ public abstract class AbstractDTableEditor extends AbstractDTreeEditor implement
@Override
public void dispose() {
- super.dispose();
if (getAdapterFactory() instanceof IDisposable) {
((IDisposable) getAdapterFactory()).dispose();
}
+ super.dispose();
if (refreshAtOpeningActivator != null) {
getSite().getPage().removePartListener(refreshAtOpeningActivator);
refreshAtOpeningActivator = null;
diff --git a/plugins/org.eclipse.sirius.tree.ui/src/org/eclipse/sirius/tree/ui/tools/internal/editor/DTreeEditor.java b/plugins/org.eclipse.sirius.tree.ui/src/org/eclipse/sirius/tree/ui/tools/internal/editor/DTreeEditor.java
index 82b4dc1412..7e3ac42d5b 100644
--- a/plugins/org.eclipse.sirius.tree.ui/src/org/eclipse/sirius/tree/ui/tools/internal/editor/DTreeEditor.java
+++ b/plugins/org.eclipse.sirius.tree.ui/src/org/eclipse/sirius/tree/ui/tools/internal/editor/DTreeEditor.java
@@ -463,10 +463,10 @@ public class DTreeEditor extends AbstractDTreeEditor implements org.eclipse.siri
getSite().getPage().removePartListener(refreshAtOpeningActivator);
}
refreshAtOpeningActivator = null;
- super.dispose();
if (getAdapterFactory() instanceof IDisposable) {
((IDisposable) getAdapterFactory()).dispose();
}
+ super.dispose();
treeModel = null;
}
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/editor/AbstractDTreeEditor.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/editor/AbstractDTreeEditor.java
index 88d5644465..7a931ac18d 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/editor/AbstractDTreeEditor.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/editor/AbstractDTreeEditor.java
@@ -94,6 +94,40 @@ import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributo
public abstract class AbstractDTreeEditor extends EditorPart
implements DialectEditor, IViewerProvider, ITabbedPropertySheetPageContributor, IEditingDomainProvider, IReusableEditor, SessionListener, ISaveablesSource, IPageListener {
+ /**
+ * This class has the responsibility to open the editing session
+ * corresponding to a session added to the session manager and attaching to
+ * it the current editor so it can be handled correctly.
+ *
+ * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+ *
+ */
+ private static final class SessionHandlingForEditor extends SessionManagerListener.Stub {
+ private AbstractDTreeEditor editor;
+
+ public SessionHandlingForEditor(AbstractDTreeEditor editor) {
+ this.editor = editor;
+ }
+
+ @Override
+ public void notifyAddSession(final Session newSession) {
+
+ /* we want to be notified only once */
+ final IEditingSession editingSession = SessionUIManager.INSTANCE.getOrCreateUISession(newSession);
+ if (!editingSession.isOpen()) {
+ editingSession.open();
+ editingSession.attachEditor(editor);
+ // important to remove the reference to the editor because this
+ // listener is still referenced by Eclipse ContextService when
+ // the editor is closed causing a leak.
+ editor = null;
+ /* remove this listener */
+ SessionManager.INSTANCE.removeSessionsListener(this);
+ }
+
+ }
+ }
+
/** The PERMISSION_GRANTED_TO_CURRENT_USER_EXCLUSIVELY icon descriptor. */
private static final ImageDescriptor LOCK_BY_ME_IMAGE_DESCRIPTOR = SiriusEditPlugin.Implementation
.getBundledImageDescriptor("icons/full/decorator/permission_granted_to_current_user_exclusively.gif"); //$NON-NLS-1$
@@ -148,21 +182,7 @@ public abstract class AbstractDTreeEditor extends EditorPart
/**
* SessionManagerListener.
*/
- protected final SessionManagerListener sessionManagerListener = new SessionManagerListener.Stub() {
- @Override
- public void notifyAddSession(final Session newSession) {
-
- /* we want to be notified only once */
- final IEditingSession editingSession = SessionUIManager.INSTANCE.getOrCreateUISession(newSession);
- if (!editingSession.isOpen()) {
- editingSession.open();
- editingSession.attachEditor(AbstractDTreeEditor.this);
- /* remove this listener */
- SessionManager.INSTANCE.removeSessionsListener(this);
- }
-
- }
- };
+ protected final SessionManagerListener sessionManagerListener = new SessionHandlingForEditor(this);
/**
* The DialectEditorDialogFactory.

Back to the top