Search in sources :

Example 11 with NonOpaquePanel

use of com.intellij.ui.components.panels.NonOpaquePanel in project intellij-community by JetBrains.

the class NotificationsManagerImpl method createBalloon.

@NotNull
public static Balloon createBalloon(@Nullable final JComponent windowComponent, @NotNull final Notification notification, final boolean showCallout, final boolean hideOnClickOutside, @NotNull Ref<BalloonLayoutData> layoutDataRef, @NotNull Disposable parentDisposable) {
    final BalloonLayoutData layoutData = layoutDataRef.isNull() ? new BalloonLayoutData() : layoutDataRef.get();
    if (layoutData.groupId == null) {
        if (NotificationsConfigurationImpl.getSettings(notification.getGroupId()).isShouldLog()) {
            layoutData.groupId = notification.getGroupId();
            layoutData.id = notification.id;
        }
    } else {
        layoutData.groupId = null;
        layoutData.mergeData = null;
    }
    layoutDataRef.set(layoutData);
    if (layoutData.fillColor == null) {
        layoutData.fillColor = FILL_COLOR;
    }
    if (layoutData.borderColor == null) {
        layoutData.borderColor = BORDER_COLOR;
    }
    boolean actions = !notification.getActions().isEmpty();
    boolean showFullContent = layoutData.showFullContent || notification instanceof NotificationActionProvider;
    Color foregroundR = Gray._0;
    Color foregroundD = Gray._191;
    final Color foreground = new JBColor(foregroundR, foregroundD);
    final JEditorPane text = new JEditorPane() {

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (layoutData.showMinSize) {
                Point location = getCollapsedTextEndLocation(this, layoutData);
                if (location != null) {
                    g.setColor(getForeground());
                    g.drawString("...", location.x, location.y + g.getFontMetrics().getAscent());
                }
            }
        }
    };
    text.setEditorKit(new HTMLEditorKit() {

        final HTMLEditorKit kit = UIUtil.getHTMLEditorKit();

        final HTMLFactory factory = new HTMLFactory() {

            public View create(Element e) {
                View view = super.create(e);
                if (view instanceof ParagraphView) {
                    // wrap too long words, for example: ATEST_TABLE_SIGNLE_ROW_UPDATE_AUTOCOMMIT_A_FIK
                    return new ParagraphView(e) {

                        protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) {
                            if (r == null) {
                                r = new SizeRequirements();
                            }
                            r.minimum = (int) layoutPool.getMinimumSpan(axis);
                            r.preferred = Math.max(r.minimum, (int) layoutPool.getPreferredSpan(axis));
                            r.maximum = Integer.MAX_VALUE;
                            r.alignment = 0.5f;
                            return r;
                        }
                    };
                }
                return view;
            }
        };

        @Override
        public StyleSheet getStyleSheet() {
            return kit.getStyleSheet();
        }

        @Override
        public ViewFactory getViewFactory() {
            return factory;
        }
    });
    text.setForeground(foreground);
    final HyperlinkListener listener = NotificationsUtil.wrapListener(notification);
    if (listener != null) {
        text.addHyperlinkListener(listener);
    }
    String fontStyle = NotificationsUtil.getFontStyle();
    int prefSize = new JLabel(NotificationsUtil.buildHtml(notification, null, true, null, fontStyle)).getPreferredSize().width;
    String style = prefSize > BalloonLayoutConfiguration.MaxWidth ? BalloonLayoutConfiguration.MaxWidthStyle : null;
    if (layoutData.showFullContent) {
        style = prefSize > BalloonLayoutConfiguration.MaxFullContentWidth ? BalloonLayoutConfiguration.MaxFullContentWidthStyle : null;
    }
    String textR = NotificationsUtil.buildHtml(notification, style, true, foregroundR, fontStyle);
    String textD = NotificationsUtil.buildHtml(notification, style, true, foregroundD, fontStyle);
    LafHandler lafHandler = new LafHandler(text, textR, textD);
    layoutData.lafHandler = lafHandler;
    text.setEditable(false);
    text.setOpaque(false);
    if (UIUtil.isUnderNimbusLookAndFeel()) {
        text.setBackground(UIUtil.TRANSPARENT_COLOR);
    }
    text.setBorder(null);
    final JPanel content = new NonOpaquePanel(new BorderLayout());
    if (text.getCaret() != null) {
        text.setCaretPosition(0);
    }
    final JScrollPane pane = createBalloonScrollPane(text, false);
    pane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            JScrollBar scrollBar = pane.getVerticalScrollBar();
            if (layoutData.showMinSize && scrollBar.getValue() > 0) {
                scrollBar.removeAdjustmentListener(this);
                scrollBar.setValue(0);
                scrollBar.addAdjustmentListener(this);
            }
        }
    });
    LinkLabel<Void> expandAction = null;
    int lines = 3;
    if (notification.hasTitle()) {
        lines--;
    }
    if (actions) {
        lines--;
    }
    layoutData.fullHeight = text.getPreferredSize().height;
    layoutData.twoLineHeight = calculateContentHeight(lines);
    layoutData.maxScrollHeight = Math.min(layoutData.fullHeight, calculateContentHeight(10));
    layoutData.configuration = BalloonLayoutConfiguration.create(notification, layoutData, actions);
    if (layoutData.welcomeScreen) {
        layoutData.maxScrollHeight = layoutData.fullHeight;
    } else if (!showFullContent && layoutData.maxScrollHeight != layoutData.fullHeight) {
        pane.setViewport(new GradientViewport(text, JBUI.insets(10, 0), true) {

            @Nullable
            @Override
            protected Color getViewColor() {
                return layoutData.fillColor;
            }

            @Override
            protected void paintGradient(Graphics g) {
                if (!layoutData.showMinSize) {
                    super.paintGradient(g);
                }
            }
        });
    }
    configureBalloonScrollPane(pane, layoutData.fillColor);
    if (showFullContent) {
        pane.setPreferredSize(text.getPreferredSize());
    } else if (layoutData.twoLineHeight < layoutData.fullHeight) {
        text.setPreferredSize(null);
        Dimension size = text.getPreferredSize();
        size.height = layoutData.twoLineHeight;
        text.setPreferredSize(size);
        text.setSize(size);
        layoutData.showMinSize = true;
        pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        pane.setPreferredSize(size);
        text.setCaret(new TextCaret(layoutData));
        expandAction = new LinkLabel<>(null, AllIcons.Ide.Notification.Expand, new LinkListener<Void>() {

            @Override
            public void linkSelected(LinkLabel link, Void ignored) {
                layoutData.showMinSize = !layoutData.showMinSize;
                text.setPreferredSize(null);
                Dimension size = text.getPreferredSize();
                if (layoutData.showMinSize) {
                    size.height = layoutData.twoLineHeight;
                    pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
                    link.setIcon(AllIcons.Ide.Notification.Expand);
                    link.setHoveringIcon(AllIcons.Ide.Notification.ExpandHover);
                } else {
                    text.select(0, 0);
                    size.height = layoutData.fullHeight;
                    pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
                    link.setIcon(AllIcons.Ide.Notification.Collapse);
                    link.setHoveringIcon(AllIcons.Ide.Notification.CollapseHover);
                }
                text.setPreferredSize(size);
                text.setSize(size);
                if (!layoutData.showMinSize) {
                    size = new Dimension(size.width, layoutData.maxScrollHeight);
                }
                pane.setPreferredSize(size);
                content.doLayout();
                layoutData.doLayout.run();
            }
        });
        expandAction.setHoveringIcon(AllIcons.Ide.Notification.ExpandHover);
    }
    final CenteredLayoutWithActions layout = new CenteredLayoutWithActions(text, layoutData);
    JPanel centerPanel = new NonOpaquePanel(layout) {

        @Override
        protected void paintChildren(Graphics g) {
            super.paintChildren(g);
            Component title = layout.getTitle();
            if (title != null && layoutData.showActions != null && layoutData.showActions.compute()) {
                int width = layoutData.configuration.allActionsOffset;
                int x = getWidth() - width - JBUI.scale(5);
                int y = layoutData.configuration.topSpaceHeight;
                int height = title instanceof JEditorPane ? getFirstLineHeight((JEditorPane) title) : title.getHeight();
                g.setColor(layoutData.fillColor);
                g.fillRect(x, y, width, height);
                width = layoutData.configuration.beforeGearSpace;
                x -= width;
                ((Graphics2D) g).setPaint(new GradientPaint(x, y, ColorUtil.withAlpha(layoutData.fillColor, 0.2), x + width, y, layoutData.fillColor));
                g.fillRect(x, y, width, height);
            }
        }
    };
    content.add(centerPanel, BorderLayout.CENTER);
    if (notification.hasTitle()) {
        String titleStyle = StringUtil.defaultIfEmpty(fontStyle, "") + "white-space:nowrap;";
        String titleR = NotificationsUtil.buildHtml(notification, titleStyle, false, foregroundR, null);
        String titleD = NotificationsUtil.buildHtml(notification, titleStyle, false, foregroundD, null);
        JLabel title = new JLabel();
        lafHandler.setTitle(title, titleR, titleD);
        title.setOpaque(false);
        if (UIUtil.isUnderNimbusLookAndFeel()) {
            title.setBackground(UIUtil.TRANSPARENT_COLOR);
        }
        title.setForeground(foreground);
        centerPanel.add(title, BorderLayout.NORTH);
    }
    if (expandAction != null) {
        centerPanel.add(expandAction, BorderLayout.EAST);
    }
    if (notification.hasContent()) {
        centerPanel.add(layoutData.welcomeScreen ? text : pane, BorderLayout.CENTER);
    }
    if (!layoutData.welcomeScreen) {
        final Icon icon = NotificationsUtil.getIcon(notification);
        JComponent iconComponent = new JComponent() {

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                icon.paintIcon(this, g, layoutData.configuration.iconOffset.width, layoutData.configuration.iconOffset.height);
            }
        };
        iconComponent.setOpaque(false);
        iconComponent.setPreferredSize(new Dimension(layoutData.configuration.iconPanelWidth, 2 * layoutData.configuration.iconOffset.height + icon.getIconHeight()));
        content.add(iconComponent, BorderLayout.WEST);
    }
    JPanel buttons = createButtons(notification, content, listener);
    if (buttons != null) {
        layoutData.groupId = null;
        layoutData.mergeData = null;
        buttons.setBorder(new EmptyBorder(0, 0, JBUI.scale(5), JBUI.scale(7)));
    }
    HoverAdapter hoverAdapter = new HoverAdapter();
    hoverAdapter.addSource(content);
    hoverAdapter.addSource(centerPanel);
    hoverAdapter.addSource(text);
    hoverAdapter.addSource(pane);
    if (buttons == null && actions) {
        createActionPanel(notification, centerPanel, layoutData.configuration.actionGap, hoverAdapter);
    }
    if (expandAction != null) {
        hoverAdapter.addComponent(expandAction, component -> {
            Rectangle bounds;
            Point location = SwingUtilities.convertPoint(content.getParent(), content.getLocation(), component.getParent());
            if (layoutData.showMinSize) {
                Component centerComponent = layoutData.welcomeScreen ? text : pane;
                Point centerLocation = SwingUtilities.convertPoint(centerComponent.getParent(), centerComponent.getLocation(), component.getParent());
                bounds = new Rectangle(location.x, centerLocation.y, content.getWidth(), centerComponent.getHeight());
            } else {
                bounds = new Rectangle(location.x, component.getY(), content.getWidth(), component.getHeight());
                JBInsets.addTo(bounds, JBUI.insets(5, 0, 7, 0));
            }
            return bounds;
        });
    }
    hoverAdapter.initListeners();
    if (layoutData.mergeData != null) {
        createMergeAction(layoutData, content);
    }
    text.setSize(text.getPreferredSize());
    Dimension paneSize = new Dimension(text.getPreferredSize());
    int maxWidth = JBUI.scale(600);
    if (windowComponent != null) {
        maxWidth = Math.min(maxWidth, windowComponent.getWidth() - 20);
    }
    if (paneSize.width > maxWidth) {
        pane.setPreferredSize(new Dimension(maxWidth, paneSize.height + UIUtil.getScrollBarWidth()));
    }
    final BalloonBuilder builder = JBPopupFactory.getInstance().createBalloonBuilder(content);
    builder.setFillColor(layoutData.fillColor).setCloseButtonEnabled(buttons == null).setShowCallout(showCallout).setShadow(false).setAnimationCycle(200).setHideOnClickOutside(hideOnClickOutside).setHideOnAction(hideOnClickOutside).setHideOnKeyOutside(hideOnClickOutside).setHideOnFrameResize(false).setBorderColor(layoutData.borderColor).setBorderInsets(JBUI.emptyInsets());
    if (layoutData.fadeoutTime != 0) {
        builder.setFadeoutTime(layoutData.fadeoutTime);
    }
    final BalloonImpl balloon = (BalloonImpl) builder.createBalloon();
    balloon.setAnimationEnabled(false);
    notification.setBalloon(balloon);
    balloon.setShadowBorderProvider(new NotificationBalloonShadowBorderProvider(layoutData.fillColor, layoutData.borderColor));
    if (!layoutData.welcomeScreen && buttons == null) {
        balloon.setActionProvider(new NotificationBalloonActionProvider(balloon, layout.getTitle(), layoutData, notification.getGroupId()));
    }
    Disposer.register(parentDisposable, balloon);
    return balloon;
}
Also used : NonOpaquePanel(com.intellij.ui.components.panels.NonOpaquePanel) HyperlinkListener(javax.swing.event.HyperlinkListener) EmptyBorder(javax.swing.border.EmptyBorder) GradientViewport(com.intellij.ui.components.GradientViewport) ParagraphView(javax.swing.text.html.ParagraphView) ParagraphView(javax.swing.text.html.ParagraphView) LinkLabel(com.intellij.ui.components.labels.LinkLabel) NotNull(org.jetbrains.annotations.NotNull)

Example 12 with NonOpaquePanel

use of com.intellij.ui.components.panels.NonOpaquePanel in project intellij-community by JetBrains.

the class NotificationsManagerImpl method createActionPanel.

private static void createActionPanel(@NotNull final Notification notification, @NotNull JPanel centerPanel, int gap, @NotNull HoverAdapter hoverAdapter) {
    JPanel actionPanel = new NonOpaquePanel(new HorizontalLayout(gap, SwingConstants.CENTER));
    centerPanel.add(BorderLayout.SOUTH, actionPanel);
    List<AnAction> actions = notification.getActions();
    if (actions.size() > 2) {
        DropDownAction action = new DropDownAction(notification.getDropDownText(), new LinkListener<Void>() {

            @Override
            public void linkSelected(LinkLabel link, Void ignored) {
                Container parent = link.getParent();
                int size = parent.getComponentCount();
                DefaultActionGroup group = new DefaultActionGroup();
                for (int i = 1; i < size; i++) {
                    Component component = parent.getComponent(i);
                    if (!component.isVisible()) {
                        group.add(((LinkLabel<AnAction>) component).getLinkData());
                    }
                }
                showPopup(link, group);
            }
        });
        Notification.setDataProvider(notification, action);
        action.setVisible(false);
        actionPanel.add(action);
    }
    for (AnAction action : actions) {
        Presentation presentation = action.getTemplatePresentation();
        actionPanel.add(HorizontalLayout.LEFT, new LinkLabel<>(presentation.getText(), presentation.getIcon(), new LinkListener<AnAction>() {

            @Override
            public void linkSelected(LinkLabel aSource, AnAction action) {
                Notification.fire(notification, action);
            }
        }, action));
    }
    Insets hover = JBUI.insets(8, 5, 8, 7);
    int count = actionPanel.getComponentCount();
    for (int i = 0; i < count; i++) {
        hoverAdapter.addComponent(actionPanel.getComponent(i), hover);
    }
    hoverAdapter.addSource(actionPanel);
}
Also used : JBInsets(com.intellij.util.ui.JBInsets) LinkListener(com.intellij.ui.components.labels.LinkListener) HorizontalLayout(com.intellij.ui.components.panels.HorizontalLayout) NonOpaquePanel(com.intellij.ui.components.panels.NonOpaquePanel) LinkLabel(com.intellij.ui.components.labels.LinkLabel)

Example 13 with NonOpaquePanel

use of com.intellij.ui.components.panels.NonOpaquePanel in project intellij-community by JetBrains.

the class InternalDecorator method init.

private void init(boolean dumbAware) {
    enableEvents(AWTEvent.COMPONENT_EVENT_MASK);
    final JPanel contentPane = new JPanel(new BorderLayout());
    contentPane.add(myHeader, BorderLayout.NORTH);
    JPanel innerPanel = new JPanel(new BorderLayout());
    JComponent toolWindowComponent = myToolWindow.getComponent();
    if (!dumbAware) {
        toolWindowComponent = DumbService.getInstance(myProject).wrapGently(toolWindowComponent, myProject);
    }
    innerPanel.add(toolWindowComponent, BorderLayout.CENTER);
    final NonOpaquePanel inner = new NonOpaquePanel(innerPanel);
    contentPane.add(inner, BorderLayout.CENTER);
    add(contentPane, BorderLayout.CENTER);
    if (SystemInfo.isMac) {
        setBackground(new JBColor(Gray._200, Gray._90));
    }
    // Add listeners
    registerKeyboardAction(new ActionListener() {

        @Override
        public void actionPerformed(final ActionEvent e) {
            ToolWindowManager.getInstance(myProject).activateEditorComponent();
        }
    }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
}
Also used : NonOpaquePanel(com.intellij.ui.components.panels.NonOpaquePanel) JBColor(com.intellij.ui.JBColor)

Example 14 with NonOpaquePanel

use of com.intellij.ui.components.panels.NonOpaquePanel in project intellij-community by JetBrains.

the class ContentManagerImpl method getComponent.

@NotNull
@Override
public JComponent getComponent() {
    if (myComponent == null) {
        myComponent = new MyNonOpaquePanel();
        NonOpaquePanel contentComponent = new NonOpaquePanel();
        contentComponent.setContent(myUI.getComponent());
        contentComponent.setFocusCycleRoot(true);
        myComponent.add(contentComponent, BorderLayout.CENTER);
    }
    return myComponent;
}
Also used : NonOpaquePanel(com.intellij.ui.components.panels.NonOpaquePanel) NotNull(org.jetbrains.annotations.NotNull)

Example 15 with NonOpaquePanel

use of com.intellij.ui.components.panels.NonOpaquePanel in project intellij-community by JetBrains.

the class PopupFactoryImpl method createHtmlTextBalloonBuilder.

@NotNull
@Override
public BalloonBuilder createHtmlTextBalloonBuilder(@NotNull final String htmlContent, @Nullable final Icon icon, final Color fillColor, @Nullable final HyperlinkListener listener) {
    JEditorPane text = IdeTooltipManager.initPane(htmlContent, new HintHint().setAwtTooltip(true), null);
    if (listener != null) {
        text.addHyperlinkListener(listener);
    }
    text.setEditable(false);
    NonOpaquePanel.setTransparent(text);
    text.setBorder(null);
    JLabel label = new JLabel();
    final JPanel content = new NonOpaquePanel(new BorderLayout((int) (label.getIconTextGap() * 1.5), (int) (label.getIconTextGap() * 1.5)));
    final NonOpaquePanel textWrapper = new NonOpaquePanel(new GridBagLayout());
    JScrollPane scrolledText = new JScrollPane(text);
    scrolledText.setBackground(fillColor);
    scrolledText.getViewport().setBackground(fillColor);
    scrolledText.getViewport().setBorder(null);
    scrolledText.setBorder(null);
    textWrapper.add(scrolledText);
    content.add(textWrapper, BorderLayout.CENTER);
    final NonOpaquePanel north = new NonOpaquePanel(new BorderLayout());
    north.add(new JLabel(icon), BorderLayout.NORTH);
    content.add(north, BorderLayout.WEST);
    content.setBorder(new EmptyBorder(2, 4, 2, 4));
    final BalloonBuilder builder = createBalloonBuilder(content);
    builder.setFillColor(fillColor);
    return builder;
}
Also used : NonOpaquePanel(com.intellij.ui.components.panels.NonOpaquePanel) HintHint(com.intellij.ui.HintHint) EmptyBorder(javax.swing.border.EmptyBorder) NotNull(org.jetbrains.annotations.NotNull)

Aggregations

NonOpaquePanel (com.intellij.ui.components.panels.NonOpaquePanel)20 NotNull (org.jetbrains.annotations.NotNull)5 RelativePoint (com.intellij.ui.awt.RelativePoint)4 EmptyBorder (javax.swing.border.EmptyBorder)4 Project (com.intellij.openapi.project.Project)3 JBColor (com.intellij.ui.JBColor)3 LinkLabel (com.intellij.ui.components.labels.LinkLabel)3 HintHint (com.intellij.ui.HintHint)2 TabInfo (com.intellij.ui.tabs.TabInfo)2 VmStatsTreeTableModel (com.android.tools.idea.editors.vmtrace.treemodel.VmStatsTreeTableModel)1 Executor (com.intellij.execution.Executor)1 KillableProcess (com.intellij.execution.KillableProcess)1 ExecutionManagerImpl (com.intellij.execution.impl.ExecutionManagerImpl)1 ProcessHandler (com.intellij.execution.process.ProcessHandler)1 RunContentDescriptor (com.intellij.execution.ui.RunContentDescriptor)1 PropertiesComponent (com.intellij.ide.util.PropertiesComponent)1 ActionToolbar (com.intellij.openapi.actionSystem.ActionToolbar)1 AnAction (com.intellij.openapi.actionSystem.AnAction)1 Document (com.intellij.openapi.editor.Document)1 Editor (com.intellij.openapi.editor.Editor)1