From 04a8009406f95e8b8837134f1da59a217a9b9ba3 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 31 May 2010 17:08:52 +0400 Subject: [PATCH 1/2] fix notifications memleak --- .../intellij/notification/Notification.java | 7 +++++++ .../impl/NotificationsManagerImpl.java | 20 ++++++++----------- .../impl/ProjectNotificationsComponent.java | 8 ++++++++ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/platform/platform-api/src/com/intellij/notification/Notification.java b/platform/platform-api/src/com/intellij/notification/Notification.java index d29f3bc14029..f8e4827da41a 100644 --- a/platform/platform-api/src/com/intellij/notification/Notification.java +++ b/platform/platform-api/src/com/intellij/notification/Notification.java @@ -98,6 +98,13 @@ public class Notification { public void setBalloon(@Nullable final Balloon balloon) { if (balloon != null) { myBalloonRef = new WeakReference(balloon); + } else { + myBalloonRef = null; } } + + @Nullable + public Balloon getBalloon() { + return myBalloonRef == null ? null : myBalloonRef.get(); + } } diff --git a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java index f7f4f6bbbcf3..15506dab5db8 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java @@ -17,15 +17,11 @@ package com.intellij.notification.impl; import com.intellij.notification.*; import com.intellij.notification.impl.ui.NotificationsUtil; -import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.Balloon; -import com.intellij.openapi.ui.popup.BalloonBuilder; -import com.intellij.openapi.ui.popup.JBPopupFactory; -import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.ui.popup.*; import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.impl.IdeFrameImpl; import com.intellij.ui.BalloonLayout; @@ -193,6 +189,13 @@ public class NotificationsManagerImpl extends NotificationsManager implements No } final Balloon balloon = builder.createBalloon(); + balloon.addListener(new JBPopupAdapter() { + @Override + public void onClosed(LightweightWindowEvent event) { + notification.setBalloon(null); + } + }); + notification.setBalloon(balloon); final Runnable show = new Runnable() { @@ -209,13 +212,6 @@ public class NotificationsManagerImpl extends NotificationsManager implements No if (window instanceof IdeFrameImpl) { final BalloonLayout balloonLayout = ((IdeFrameImpl)window).getBalloonLayout(); balloonLayout.add(balloon); - if (project != null) { - Disposer.register(project, new Disposable() { - public void dispose() { - balloon.hide(); - } - }); - } } } }; diff --git a/platform/platform-impl/src/com/intellij/notification/impl/ProjectNotificationsComponent.java b/platform/platform-impl/src/com/intellij/notification/impl/ProjectNotificationsComponent.java index 2b9270b43267..2f3e2062cac5 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/ProjectNotificationsComponent.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/ProjectNotificationsComponent.java @@ -22,10 +22,13 @@ import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.Disposable; import org.jetbrains.annotations.NotNull; +import java.util.Collection; + /** * @author spleaner */ @@ -58,6 +61,11 @@ public class ProjectNotificationsComponent implements Notifications, ProjectComp } public void projectClosed() { + final Collection collection = NotificationsManagerImpl.getNotificationsManagerImpl().getByType(null, myProject); + for (final Notification notification : collection) { + final Balloon balloon = notification.getBalloon(); + if (balloon != null) balloon.hide(); + } } private static boolean isDummyEnvironment() { From fa524f38ebbd8d7b07dedc992402bbf194ccb772 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 31 May 2010 17:26:49 +0400 Subject: [PATCH 2/2] hector inactive icon --- platform/icons/src/ide/hectorNo.png | Bin 0 -> 509 bytes .../wm/impl/status/TogglePopupHintsPanel.java | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 platform/icons/src/ide/hectorNo.png diff --git a/platform/icons/src/ide/hectorNo.png b/platform/icons/src/ide/hectorNo.png new file mode 100644 index 0000000000000000000000000000000000000000..5d364814ed37fe1605f37811e7cd758fb6384782 GIT binary patch literal 509 zcmVGaABe?T zq)o9!ARt-`7K>P0>`!RxpKRd=q}*7GwZayH8gL5{Tea}*<_vo;+4v~-z~oNu%$$2> z?p3bWD*>%mi%zE#O(qlkzWDY|xA^ewyId~wPrKbFRYX)(Wy|OD7K;6qve_)9QYnhZ z;}nfX>6g^%_xqAj66m_lwp=c2nM{U`$0I9(T`m_opU-Cz4iUDr7Th4($o6X>Mee=Q!fM%&wqFgRVp67AT@Tb!$X`049;>f!h zV!d9MEQ`g0s?{n%2>`!XEb@LhUk@qh4hDlJP8tq}v|6oX0DE`~^Z8t~aB~Y_<-TIE z8146aGEI|D$BLUsCX;{i?#%$`;1t`osZc2J23E_m#OWQ!ab&W7hrq literal 0 HcmV?d00001 diff --git a/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java b/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java index 5dc9f6bbdee7..ae5b8ea15d8f 100644 --- a/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java @@ -38,7 +38,6 @@ import com.intellij.psi.PsiManager; import com.intellij.ui.UIBundle; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.Consumer; -import com.intellij.util.ui.EmptyIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,7 +48,7 @@ import java.awt.event.MouseEvent; public class TogglePopupHintsPanel implements StatusBarWidget, StatusBarWidget.IconPresentation { private static final Icon INSPECTIONS_ICON = IconLoader.getIcon("/ide/hectorOn.png"); private static final Icon INSPECTIONS_OFF_ICON = IconLoader.getIcon("/ide/hectorOff.png"); - private static final Icon EMPTY_ICON = new EmptyIcon(INSPECTIONS_ICON.getIconWidth(), INSPECTIONS_ICON.getIconHeight()); + private static final Icon EMPTY_ICON = IconLoader.getIcon("/ide/hectorNo.png"); private Icon myCurrentIcon; private String myToolTipText;