diff --git a/platform/platform-api/src/com/intellij/util/Alarm.java b/platform/platform-api/src/com/intellij/util/Alarm.java index 0c33ef8e85d7..8f0117dd4844 100644 --- a/platform/platform-api/src/com/intellij/util/Alarm.java +++ b/platform/platform-api/src/com/intellij/util/Alarm.java @@ -25,6 +25,7 @@ import com.intellij.openapi.util.Disposer; import com.intellij.util.ui.update.Activatable; import com.intellij.util.ui.update.UiNotifyConnector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -100,7 +101,7 @@ public class Alarm implements Disposable { _addRequest(request, delay, ModalityState.stateForComponent(myActivationComponent)); } - public void addRequest(final Runnable request, int delayMillis, final ModalityState modalityState) { + public void addRequest(final Runnable request, int delayMillis, @Nullable final ModalityState modalityState) { LOG.assertTrue(myThreadToUse == ThreadToUse.SWING_THREAD); _addRequest(request, delayMillis, modalityState); } 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 3221dee9f473..6af57cef00f1 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java @@ -22,6 +22,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.project.ProjectManagerAdapter; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.*; @@ -30,6 +31,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.impl.IdeFrameImpl; +import com.intellij.ui.BalloonImpl; import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.util.ArrayUtil; import com.intellij.util.PairFunction; @@ -179,9 +181,6 @@ public class NotificationsManagerImpl extends NotificationsManager implements No (toolWindowId == null || project == null || !Arrays.asList(ToolWindowManager.getInstance(project).getToolWindowIds()).contains(toolWindowId))) { type = NotificationDisplayType.BALLOON; } - if (type == NotificationDisplayType.BALLOON && ProjectManager.getInstance().getOpenProjects().length == 0) { - type = NotificationDisplayType.STICKY_BALLOON; - } switch (type) { case NONE: @@ -219,10 +218,23 @@ public class NotificationsManagerImpl extends NotificationsManager implements No Window window = findWindowForBalloon(project); if (window instanceof IdeFrameImpl) { - boolean sticky = NotificationDisplayType.STICKY_BALLOON == displayType; - Balloon balloon = createBalloon(notification, false, !sticky, !sticky); + final ProjectManager projectManager = ProjectManager.getInstance(); + boolean noProjects = projectManager.getOpenProjects().length == 0; + boolean sticky = NotificationDisplayType.STICKY_BALLOON == displayType || noProjects; + final Balloon balloon = createBalloon(notification, false, !sticky, !sticky); Disposer.register(project != null ? project : ApplicationManager.getApplication(), balloon); ((IdeFrameImpl)window).getBalloonLayout().add(balloon); + if (noProjects && NotificationDisplayType.BALLOON == displayType) { + projectManager.addProjectManagerListener(new ProjectManagerAdapter() { + @Override + public void projectOpened(Project project) { + projectManager.removeProjectManagerListener(this); + if (!balloon.isDisposed()) { + ((BalloonImpl)balloon).startFadeoutTimer(300); + } + } + }); + } } } diff --git a/platform/platform-impl/src/com/intellij/ui/BalloonImpl.java b/platform/platform-impl/src/com/intellij/ui/BalloonImpl.java index f759b855403f..a93f47537bb2 100644 --- a/platform/platform-impl/src/com/intellij/ui/BalloonImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/BalloonImpl.java @@ -569,7 +569,7 @@ public class BalloonImpl implements Disposable, Balloon, LightweightWindow, Posi myFadedIn = true; - startFadeoutTimer(); + startFadeoutTimer((int)BalloonImpl.this.myFadeoutTime); } else { layeredPane.remove(myComp); @@ -592,14 +592,13 @@ public class BalloonImpl implements Disposable, Balloon, LightweightWindow, Posi myAnimator.resume(); } - private void startFadeoutTimer() { - if (myFadeoutTime > 0) { - Alarm fadeoutAlarm = new Alarm(this); - fadeoutAlarm.addRequest(new Runnable() { + public void startFadeoutTimer(final int fadeoutTime) { + if (fadeoutTime > 0) { + new Alarm(this).addRequest(new Runnable() { public void run() { hide(); } - }, (int)myFadeoutTime, null); + }, fadeoutTime, null); } }