after a project is opened, schedule hiding of all non-sticky balloons

This commit is contained in:
peter
2011-10-21 13:41:34 +02:00
parent cf1436f0b7
commit e245c5a2c4
3 changed files with 24 additions and 12 deletions
@@ -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);
}
@@ -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);
}
}
});
}
}
}
@@ -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);
}
}