mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Fix ProjectImpl leak (after-review refactoring)
This commit is contained in:
@@ -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;
|
||||
|
||||
+1
-9
@@ -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);
|
||||
|
||||
+10
-2
@@ -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<XBreakpoin
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(BreakpointsListener listener, Project project) {
|
||||
public void addListener(final BreakpointsListener listener, Project project, Disposable disposable) {
|
||||
final MyXBreakpointListener listener1 = new MyXBreakpointListener(listener);
|
||||
XDebuggerManager.getInstance(project).getBreakpointManager().addBreakpointListener(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 (MyXBreakpointListener breakpointListener : myListeners) {
|
||||
if (breakpointListener.myListener == listener) {
|
||||
myListeners.remove(breakpointListener);
|
||||
|
||||
+3
-2
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui;
|
||||
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.markup.GutterIconRenderer;
|
||||
@@ -36,9 +37,9 @@ public abstract class BreakpointPanelProvider<B> {
|
||||
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();
|
||||
|
||||
|
||||
+5
-4
@@ -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();
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user