From a774aa454a8847b0434724e6ebc401c8aac0724b Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Tue, 12 Apr 2011 15:15:43 +0400 Subject: [PATCH] memleak fixed from AbstractPopup --- .../com/intellij/ui/popup/AbstractPopup.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index 6063d5d648c8..2bc0e2b5a3ca 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -144,6 +144,7 @@ public class AbstractPopup implements JBPopup { private boolean myNativePopup; private boolean myMayBeParent; private JLabel myAdCmp; + private AbstractPopup.SpeedSearchKeyListener mySearchKeyListener; AbstractPopup() { @@ -786,19 +787,8 @@ public class AbstractPopup implements JBPopup { }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); - myContent.addKeyListener(new KeyListener() { - public void keyTyped(final KeyEvent e) { - mySpeedSearch.process(e); - } - - public void keyPressed(final KeyEvent e) { - mySpeedSearch.process(e); - } - - public void keyReleased(final KeyEvent e) { - mySpeedSearch.process(e); - } - }); + mySearchKeyListener = new SpeedSearchKeyListener(); + myContent.addKeyListener(mySearchKeyListener); if (myCancelOnMouseOutCallback != null || myCancelOnWindow) { myMouseOutCanceller = new Canceller(); @@ -975,8 +965,10 @@ public class AbstractPopup implements JBPopup { if (myContent != null) { myContent.removeAll(); + myContent.removeKeyListener(mySearchKeyListener); } myContent = null; + myPreferredFocusedComponent = null; myComponent = null; myFocusTrackback = null; myCallBack = null; @@ -1349,4 +1341,18 @@ public class AbstractPopup implements JBPopup { public void setOk(boolean ok) { myOk = ok; } + + private class SpeedSearchKeyListener implements KeyListener { + public void keyTyped(final KeyEvent e) { + mySpeedSearch.process(e); + } + + public void keyPressed(final KeyEvent e) { + mySpeedSearch.process(e); + } + + public void keyReleased(final KeyEvent e) { + mySpeedSearch.process(e); + } + } }