void (@NotNull BalloonImpl balloon, @NotNull BalloonLayoutData layoutData) { layoutData.doLayout = this::layoutPopup; int i = myPopupBalloon == null ? 7 : 5; layoutData.configuration = layoutData.configuration.replace(JBUIScale.scale(i), JBUIScale.scale(12)); if (myPopupBalloon == null) { final JScrollPane pane = NotificationsManagerImpl.createBalloonScrollPane(myBalloonPanel, true); pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); pane.getVerticalScrollBar().addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { int top = SystemInfo.isMac ? 2 : 1; pane.setBorder(JBUI.Borders.empty(top, 0, 1, 1)); } @Override public void componentHidden(ComponentEvent e) { pane.setBorder(JBUI.Borders.empty()); } }); myPopupBalloon = new BalloonImpl(pane, BORDER_COLOR, JBInsets.emptyInsets(), FILL_COLOR, true, false, false, true, false, true, 0, false, false, null, false, 0, 0, 0, 0, false, null, null, false, false, true, null, false, null, -1); myPopupBalloon.setAnimationEnabled(false); myPopupBalloon.setShadowBorderProvider(new NotificationBalloonRoundShadowBorderProvider(FILL_COLOR, BORDER_COLOR)); myPopupBalloon.setHideListener(() -> { if (hideListener != null) { hideListener.run(); } myPopupBalloon.getComponent().setVisible(false); }); myPopupBalloon.setActionProvider(new BalloonImpl.ActionProvider() { private BalloonImpl.ActionButton myAction; @Override public @NotNull List<BalloonImpl.ActionButton> createActions() { myAction = myPopupBalloon.new ActionButton(AllIcons.Ide.Notification.Close, null, null, EmptyConsumer.getInstance()); return Collections.singletonList(myAction); } @Override public void layout(@NotNull Rectangle bounds) { myAction.setBounds(0, 0, 0, 0); } }); } myBalloonPanel.add(balloon.getContent()); balloon.getContent().putClientProperty(TYPE_KEY, layoutData.type); Disposer.register(balloon, new Disposable() { @Override public void dispose() { balloons.remove(balloon); myBalloonPanel.remove(balloon.getContent()); updatePopup(); } }); balloons.add(balloon); updatePopup(); }