diff options
| author | pguilet | 2016-10-21 13:25:20 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2016-10-21 15:06:25 +0000 |
| commit | bb18387550e27d3e0f5d41c94d35fc03730b517c (patch) | |
| tree | 95c53ef6a7afe108600ef8968f419b45db68e159 | |
| parent | b47ea4f4ef7be97ec083c661626c320f40bca9f8 (diff) | |
| download | org.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>
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. |
