From 5f5db1e8b2dd9061ca909e0f77b4be19da11e056 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 19 Apr 2012 16:28:18 +0200 Subject: [PATCH] IDEA-84027 Balloons should fit window despite long textual content --- .../com/intellij/notification/EventLog.java | 8 +++---- .../impl/NotificationsManagerImpl.java | 23 +++++++++++++++---- .../impl/actions/NotificationTestAction.java | 5 +++- 3 files changed, 26 insertions(+), 10 deletions(-) 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() {