JComponent (@NotNull @Nls String linkText, @NotNull SimpleMessageBusConnection busConnection) { SelectablePanel selectablePanel = new SelectablePanel(); ActionLink actionLink = new ActionLink(linkText, getNotificationIcon(Collections.emptyList(), null), new DumbAwareAction() { private boolean hideListenerInstalled = false; @Override public void actionPerformed(@NotNull AnActionEvent e) { BalloonLayout balloonLayout = WelcomeFrame.getInstance().getBalloonLayout(); if (balloonLayout instanceof WelcomeBalloonLayoutImpl welcomeBalloonLayout) { if (!hideListenerInstalled) { welcomeBalloonLayout.setHideListener(() -> selectablePanel.setSelectionColor(null)); hideListenerInstalled = true; } selectablePanel.setSelectionColor(JBUI.CurrentTheme.ActionButton.pressedBackground()); welcomeBalloonLayout.showPopup(); } } }); JComponent panel = wrapActionLink(actionLink); selectablePanel.setLayout(new BorderLayout()); selectablePanel.add(panel); selectablePanel.setOpaque(false); selectablePanel.setBorder(panel.getBorder()); selectablePanel.setSelectionArc(JBUIScale.scale(6)); panel.setBorder(null); selectablePanel.setVisible(false); busConnection.subscribe(WelcomeBalloonLayoutImpl.BALLOON_NOTIFICATION_TOPIC, types -> { BalloonLayout balloonLayout = WelcomeFrame.getInstance().getBalloonLayout(); if (balloonLayout instanceof WelcomeBalloonLayoutImpl welcomeBalloonLayout) { if (welcomeBalloonLayout.getLocationComponent() == null) { welcomeBalloonLayout.setLocationComponent(actionLink); } } if (!types.isEmpty()) { actionLink.setIcon(getNotificationIcon(types, selectablePanel)); } selectablePanel.setVisible(!types.isEmpty()); }); return selectablePanel; }