diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java index dc6cbd46e207..17f7c7d686ba 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java @@ -21,6 +21,7 @@ import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.settings.*; import com.intellij.debugger.ui.breakpoints.*; import com.intellij.ide.DataManager; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; @@ -31,16 +32,17 @@ import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.AbstractDebuggerSession; -import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroupingRule; import com.intellij.xdebugger.impl.DebuggerSupport; import com.intellij.xdebugger.impl.actions.DebuggerActionHandler; import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler; import com.intellij.xdebugger.impl.actions.EditBreakpointActionHandler; import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler; +import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler; import com.intellij.xdebugger.impl.settings.DebuggerSettingsPanelProvider; @@ -212,15 +214,21 @@ public class JavaDebuggerSupport extends DebuggerSupport { } @Override - public void addListener(final BreakpointsListener listener, Project project) { - BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(getCurrentProject()).getBreakpointManager(); + public void addListener(final BreakpointsListener listener, Project project, Disposable disposable) { + BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager(); final MyBreakpointManagerListener listener1 = new MyBreakpointManagerListener(listener, breakpointManager); breakpointManager.addBreakpointManagerListener(listener1); myListeners.add(listener1); + Disposer.register(disposable, new Disposable() { + @Override + public void dispose() { + removeListener(listener); + } + }); } @Override - public void removeListener(BreakpointsListener listener) { + protected void removeListener(BreakpointsListener listener) { for (MyBreakpointManagerListener managerListener : myListeners) { if (managerListener.myListener == listener) { BreakpointManager manager = managerListener.myBreakpointManager; diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointsFavoriteListProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointsFavoriteListProvider.java index 6cf8a8c03024..086b96dd403c 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointsFavoriteListProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/BreakpointsFavoriteListProvider.java @@ -20,9 +20,7 @@ import com.intellij.ide.favoritesTreeView.AbstractFavoritesListProvider; import com.intellij.ide.favoritesTreeView.FavoritesManager; import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.util.treeView.AbstractTreeNode; -import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Disposer; import com.intellij.pom.Navigatable; import com.intellij.ui.CheckedTreeNode; import com.intellij.ui.ColoredTreeCellRenderer; @@ -68,14 +66,8 @@ public class BreakpointsFavoriteListProvider extends AbstractFavoritesListProvid super(project, "Breakpoints"); myBreakpointPanelProviders = XBreakpointUtil.collectPanelProviders(); for (final BreakpointPanelProvider provider : myBreakpointPanelProviders) { - provider.addListener(this, myProject); + provider.addListener(this, myProject, myProject); provider.createBreakpointsGroupingRules(myRulesAvailable); - Disposer.register(project, new Disposable() { - @Override - public void dispose() { - provider.removeListener(BreakpointsFavoriteListProvider.this); - } - }); } myTreeController = new BreakpointItemsTreeController(myRulesAvailable); myTree = new BreakpointsSimpleTree(myProject, myTreeController); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java index c3f153f23063..3f080772e758 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java @@ -15,6 +15,7 @@ */ package com.intellij.xdebugger.impl.breakpoints; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.editor.Document; @@ -22,6 +23,7 @@ import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.XDebuggerManager; @@ -53,14 +55,20 @@ public class XBreakpointPanelProvider extends BreakpointPanelProvider { void breakpointsChanged(); } - public abstract void addListener(BreakpointsListener listener, Project project); + public abstract void addListener(BreakpointsListener listener, Project project, Disposable disposable); - public abstract void removeListener(BreakpointsListener listener); + protected abstract void removeListener(BreakpointsListener listener); public abstract int getPriority(); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointMasterDetailPopupBuilder.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointMasterDetailPopupBuilder.java index 939dc2a2595a..47516e84c979 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointMasterDetailPopupBuilder.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/tree/BreakpointMasterDetailPopupBuilder.java @@ -15,6 +15,7 @@ */ package com.intellij.xdebugger.impl.breakpoints.ui.tree; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.CheckboxAction; import com.intellij.openapi.project.Project; @@ -23,6 +24,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.JBPopupListener; import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.popup.util.DetailView; import com.intellij.ui.popup.util.DetailViewImpl; @@ -177,8 +179,9 @@ public class BreakpointMasterDetailPopupBuilder { } }; + final Disposable listenerDisposable = Disposer.newDisposable(); for (BreakpointPanelProvider provider : myBreakpointsPanelProviders) { - provider.addListener(listener, myProject); + provider.addListener(listener, myProject, listenerDisposable); } final MasterDetailPopupBuilder.Delegate delegate = new MasterDetailPopupBuilder.Delegate() { @@ -247,9 +250,7 @@ public class BreakpointMasterDetailPopupBuilder { @Override public void onClosed(LightweightWindowEvent event) { - for (BreakpointPanelProvider provider : myBreakpointsPanelProviders) { - provider.removeListener(listener); - } + Disposer.dispose(listenerDisposable); saveBreakpointsDialogState(); } });