From 1f23970ca2a6017c8f8ebb53164b9b53e29bc448 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 5 Dec 2011 15:01:24 +0400 Subject: [PATCH] [r=kb] memory leak fixes --- .../src/com/intellij/ui/IconDeferrerImpl.java | 9 +++++++++ .../openapi/wm/impl/ToolWindowManagerImpl.java | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java index 51e387171e96..58aa34bdc7f7 100644 --- a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java @@ -20,10 +20,13 @@ package com.intellij.ui; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.impl.ProjectLifecycleListener; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.Function; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.HashMap; @@ -42,6 +45,12 @@ public class IconDeferrerImpl extends IconDeferrer { clear(); } }); + connection.subscribe(ProjectLifecycleListener.TOPIC, new ProjectLifecycleListener.Adapter() { + @Override + public void afterProjectClosed(@NotNull Project project) { + clear(); + } + }); } private void clear() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java index 59028eb5373d..58b53843c80f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java @@ -1183,7 +1183,9 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements button.dispose(); myId2StripeButton.remove(id); // - myId2FocusWatcher.remove(id); + ToolWindowFocusWatcher watcher = (ToolWindowFocusWatcher)myId2FocusWatcher.remove(id); + watcher.deinstall(); + // Destroy decorator final InternalDecorator decorator = getInternalDecorator(id); decorator.dispose(); @@ -1946,11 +1948,17 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements */ private final class ToolWindowFocusWatcher extends FocusWatcher { private final String myId; + private final ToolWindowImpl myToolWindow; private ToolWindowFocusWatcher(final ToolWindowImpl toolWindow) { myId = toolWindow.getId(); install(toolWindow.getComponent()); + myToolWindow = toolWindow; + } + + public void deinstall() { + deinstall(myToolWindow.getComponent()); } protected boolean isFocusedComponentChangeValid(final Component comp, final AWTEvent cause) {