From 63a990847a72faadebde2527dc175c483593d3c2 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Wed, 3 Dec 2014 22:02:09 +0300 Subject: [PATCH] IDEA-133657 Settings: artefacts on search when page does not fit dialog size --- .../openapi/options/ex/GlassPanel.java | 53 ++++++++----------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java index c80a222ffd96..fdfeaaf29afa 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java @@ -17,10 +17,9 @@ package com.intellij.openapi.options.ex; import com.intellij.ide.ui.search.SearchUtil; -import com.intellij.openapi.ui.GraphicsConfig; import com.intellij.ui.ColorUtil; +import com.intellij.ui.JBColor; import com.intellij.ui.components.JBTabbedPane; -import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; @@ -30,7 +29,6 @@ import java.awt.geom.Area; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.Kernel; -import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -60,19 +58,15 @@ public class GlassPanel extends JComponent { public void paintSpotlight(final Graphics g, final JComponent surfaceComponent) { Dimension size = surfaceComponent.getSize(); if (myLightComponents.size() > 0) { - int width = size.width - 1; - int height = size.height - 1; + int stroke = 2; - Rectangle2D screen = new Rectangle2D.Double(0, 0, width, height); final Rectangle visibleRect = myPanel.getVisibleRect(); final Point leftPoint = SwingUtilities.convertPoint(myPanel, new Point(visibleRect.x, visibleRect.y), surfaceComponent); Area innerPanel = new Area(new Rectangle2D.Double(leftPoint.x, leftPoint.y, visibleRect.width, visibleRect.height)); - Area mask = new Area(screen); - ArrayList components = new ArrayList(); + Area mask = new Area(new Rectangle(-stroke, -stroke, 2 * stroke + size.width, 2 * stroke + size.height)); for (JComponent lightComponent : myLightComponents) { final Area area = getComponentArea(surfaceComponent, lightComponent, 1); if (area == null) continue; - components.add(lightComponent); if (lightComponent instanceof JLabel) { final JLabel label = (JLabel)lightComponent; @@ -80,7 +74,6 @@ public class GlassPanel extends JComponent { if (labelFor instanceof JComponent) { final Area labelForArea = getComponentArea(surfaceComponent, (JComponent)labelFor, 1); if (labelForArea != null) { - components.add((JComponent)labelFor); area.add(labelForArea); } } @@ -89,35 +82,28 @@ public class GlassPanel extends JComponent { area.intersect(innerPanel); mask.subtract(area); } + Graphics clip = g.create(0, 0, size.width, size.height); + try { + Graphics2D g2 = (Graphics2D)clip; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); - Graphics2D g2 = (Graphics2D)g; + Color background = surfaceComponent.getBackground(); + g2.setColor(ColorUtil.toAlpha(background == null ? null : background.darker(), 100)); + g2.fill(mask); - Color shieldColor = new Color(0.0f, 0.0f, 0.0f, 0.20f); - Color boundsColor = Color.gray; - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setColor(shieldColor); - g2.fill(mask); - - g2.setColor(ColorUtil.toAlpha(Color.orange, 25)); - GraphicsConfig config = GraphicsUtil.setupAAPainting(g2); - for (int i = 2; i > 0; i--) { - g2.setStroke(new BasicStroke(i)); - Area arrr = new Area(); - for (JComponent component : components) { - Area area = getComponentArea(surfaceComponent, component, i-1); - if (area != null) { - arrr.add(area); - } - } - g2.draw(arrr); + g2.setStroke(new BasicStroke(stroke)); + g2.setColor(ColorUtil.toAlpha(JBColor.ORANGE, 100)); + g2.draw(mask); + } + finally { + clip.dispose(); } - - config.restore(); } } @Nullable - private Area getComponentArea(final JComponent surfaceComponent, final JComponent lightComponent, int offset) { + private static Area getComponentArea(final JComponent surfaceComponent, final JComponent lightComponent, int offset) { if (!lightComponent.isShowing()) return null; final Point panelPoint = SwingUtilities.convertPoint(lightComponent, new Point(0, 0), surfaceComponent); @@ -173,6 +159,9 @@ public class GlassPanel extends JComponent { public void removeSpotlight(final JComponent component){ myLightComponents.remove(component); + if (myLightComponents.isEmpty()) { + setVisible(false); + } } public void clear() {