diff --git a/platform/platform-impl/src/com/intellij/notification/EventLog.java b/platform/platform-impl/src/com/intellij/notification/EventLog.java
index 89e8189e62e0..7a33e1205234 100644
--- a/platform/platform-impl/src/com/intellij/notification/EventLog.java
+++ b/platform/platform-impl/src/com/intellij/notification/EventLog.java
@@ -41,9 +41,7 @@ import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.wm.ToolWindow;
-import com.intellij.openapi.wm.ToolWindowFactory;
-import com.intellij.openapi.wm.ToolWindowManager;
+import com.intellij.openapi.wm.*;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
@@ -532,7 +530,9 @@ public class EventLog implements Notifications {
RelativePoint target = EventLog.getProjectComponent(project).myConsole.getHyperlinkLocation(this);
if (target != null) {
- Balloon balloon = NotificationsManagerImpl.createBalloon(myNotification, true, true);
+ IdeFrame frame = WindowManager.getInstance().getIdeFrame(project);
+ assert frame != null;
+ Balloon balloon = NotificationsManagerImpl.createBalloon(frame, myNotification, true, true);
Disposer.register(project, balloon);
balloon.show(target, Balloon.Position.above);
}
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 6f666d2e8a9c..6e17b411238e 100644
--- a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java
+++ b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java
@@ -28,10 +28,12 @@ import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.popup.*;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.wm.IdeFrame;
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.ScrollPaneFactory;
import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ui.UIUtil;
@@ -203,7 +205,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements No
final ProjectManager projectManager = ProjectManager.getInstance();
final boolean noProjects = projectManager.getOpenProjects().length == 0;
final boolean sticky = NotificationDisplayType.STICKY_BALLOON == displayType || noProjects;
- final Balloon balloon = createBalloon(notification, false, false);
+ final Balloon balloon = createBalloon((IdeFrameImpl)window, notification, false, false);
Disposer.register(project != null ? project : ApplicationManager.getApplication(), balloon);
if (notification.isExpired()) {
@@ -251,7 +253,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements No
return frame;
}
- public static Balloon createBalloon(final Notification notification, final boolean showCallout, final boolean hideOnClickOutside) {
+ public static Balloon createBalloon(@NotNull final IdeFrame window, final Notification notification, final boolean showCallout, final boolean hideOnClickOutside) {
final JEditorPane text = new JEditorPane();
text.setEditorKit(UIUtil.getHTMLEditorKit());
@@ -273,9 +275,14 @@ public class NotificationsManagerImpl extends NotificationsManager implements No
final JPanel content = new NonOpaquePanel(new BorderLayout((int)(label.getIconTextGap() * 1.5), (int)(label.getIconTextGap() * 1.5)));
- final NonOpaquePanel textWrapper = new NonOpaquePanel(new GridBagLayout());
- textWrapper.add(text);
- content.add(textWrapper, BorderLayout.CENTER);
+ text.setCaretPosition(0);
+ JScrollPane pane = ScrollPaneFactory.createScrollPane(text,
+ ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+ ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+ pane.setBorder(null);
+ pane.setOpaque(false);
+ pane.getViewport().setOpaque(false);
+ content.add(pane, BorderLayout.CENTER);
final NonOpaquePanel north = new NonOpaquePanel(new BorderLayout());
north.add(new JLabel(NotificationsUtil.getIcon(notification)), BorderLayout.NORTH);
@@ -283,6 +290,12 @@ public class NotificationsManagerImpl extends NotificationsManager implements No
content.setBorder(new EmptyBorder(2, 4, 2, 4));
+ Dimension preferredSize = pane.getPreferredSize();
+ int maxHeight = Math.min(400, window.getComponent().getHeight() - 20);
+ if (preferredSize.height > maxHeight) {
+ pane.setPreferredSize(new Dimension(preferredSize.width, maxHeight));
+ }
+
final BalloonBuilder builder = JBPopupFactory.getInstance().createBalloonBuilder(content);
builder.setFillColor(NotificationsUtil.getBackground(notification)).setCloseButtonEnabled(true).setShowCallout(showCallout)
.setHideOnClickOutside(hideOnClickOutside)
diff --git a/platform/platform-impl/src/com/intellij/notification/impl/actions/NotificationTestAction.java b/platform/platform-impl/src/com/intellij/notification/impl/actions/NotificationTestAction.java
index a8a6054a8898..4c11dc165a05 100644
--- a/platform/platform-impl/src/com/intellij/notification/impl/actions/NotificationTestAction.java
+++ b/platform/platform-impl/src/com/intellij/notification/impl/actions/NotificationTestAction.java
@@ -25,6 +25,7 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.messages.MessageBus;
import javax.swing.event.HyperlinkEvent;
@@ -61,7 +62,9 @@ public class NotificationTestAction extends AnAction implements DumbAware {
};
final Notification notification = new Notification(TEST_GROUP_ID, "This is a test notification", //"a",
- "You can
close this very
very very very long notification by clicking this link. Long long long long. It should be long. Very long. Too long. And even longer.",
+ "You can
close this very
very very very long notification by clicking this link. Long long long long. It should be long. Very long. Too long." +
+ StringUtil.repeat("
line", 100) +
+ " And even longer.",
type, listener);
ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {