From 4c7ba9378670abefe4a2dd0d970317970e01d106 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Fri, 8 Jul 2016 13:30:06 +0300 Subject: [PATCH 1/3] fold data uri in html #WEB-21768 fixed --- .../src/com/intellij/xml/XmlFoldingTest.java | 2 ++ xml/tests/testData/folding/dataUri.html | 2 ++ .../intellij/lang/XmlCodeFoldingBuilder.java | 17 +++++++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 xml/tests/testData/folding/dataUri.html diff --git a/xml/tests/src/com/intellij/xml/XmlFoldingTest.java b/xml/tests/src/com/intellij/xml/XmlFoldingTest.java index 8e0d14015869..6edd92831436 100644 --- a/xml/tests/src/com/intellij/xml/XmlFoldingTest.java +++ b/xml/tests/src/com/intellij/xml/XmlFoldingTest.java @@ -33,6 +33,8 @@ public class XmlFoldingTest extends LightPlatformCodeInsightFixtureTestCase { public void testEntities() throws Throwable { doTest(); } + public void testDataUri() throws Throwable { doTest(); } + private void doTest() throws Throwable { doTest(".html"); } diff --git a/xml/tests/testData/folding/dataUri.html b/xml/tests/testData/folding/dataUri.html new file mode 100644 index 000000000000..afb269b2de2b --- /dev/null +++ b/xml/tests/testData/folding/dataUri.html @@ -0,0 +1,2 @@ + +Red dot diff --git a/xml/xml-psi-impl/src/com/intellij/lang/XmlCodeFoldingBuilder.java b/xml/xml-psi-impl/src/com/intellij/lang/XmlCodeFoldingBuilder.java index eac4396847da..74d8e91c1eaa 100644 --- a/xml/xml-psi-impl/src/com/intellij/lang/XmlCodeFoldingBuilder.java +++ b/xml/xml-psi-impl/src/com/intellij/lang/XmlCodeFoldingBuilder.java @@ -34,6 +34,7 @@ import com.intellij.psi.tree.TokenSet; import com.intellij.psi.util.PsiUtilCore; import com.intellij.psi.xml.*; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.io.URLUtil; import com.intellij.xml.util.HtmlUtil; import com.intellij.xml.util.XmlTagUtil; import org.jetbrains.annotations.NotNull; @@ -225,6 +226,9 @@ public abstract class XmlCodeFoldingBuilder implements FoldingBuilder, DumbAware @Override public String getPlaceholderText(@NotNull ASTNode node) { final PsiElement psi = node.getPsi(); + if (psi instanceof XmlAttribute && "src".equalsIgnoreCase(((XmlAttribute)psi).getName())) { + return "data:"; + } if (psi instanceof XmlTag || psi instanceof XmlComment || psi instanceof XmlAttribute || @@ -255,10 +259,18 @@ public abstract class XmlCodeFoldingBuilder implements FoldingBuilder, DumbAware final PsiElement psi = node.getPsi(); final XmlCodeFoldingSettings foldingSettings = getFoldingSettings(); return (psi instanceof XmlTag && foldingSettings.isCollapseXmlTags()) - || (psi instanceof XmlAttribute && foldingSettings.isCollapseHtmlStyleAttribute()) + || (psi instanceof XmlAttribute && (foldStyle((XmlAttribute)psi, foldingSettings) || foldSrc((XmlAttribute)psi, foldingSettings))) || isEntity(psi) && foldingSettings.isCollapseEntities(); } + private static boolean foldSrc(XmlAttribute psi, XmlCodeFoldingSettings settings) { + return settings.isCollapseDataUri() && "src".equals(psi.getName()); + } + + private static boolean foldStyle(XmlAttribute psi, XmlCodeFoldingSettings settings) { + return settings.isCollapseHtmlStyleAttribute() && HtmlUtil.STYLE_ATTRIBUTE_NAME.equalsIgnoreCase(psi.getName()); + } + protected boolean isEntity(PsiElement psi) { return psi instanceof XmlEntityRef || (psi instanceof XmlTokenImpl && ((XmlTokenImpl)psi).getElementType() == XmlTokenType.XML_CHAR_ENTITY_REF); @@ -266,7 +278,8 @@ public abstract class XmlCodeFoldingBuilder implements FoldingBuilder, DumbAware private static boolean isAttributeShouldBeFolded(XmlAttribute child) { return HtmlUtil.isHtmlFile(child.getContainingFile()) && - HtmlUtil.STYLE_ATTRIBUTE_NAME.equalsIgnoreCase(child.getName()); + (HtmlUtil.STYLE_ATTRIBUTE_NAME.equalsIgnoreCase(child.getName()) || + "src".equals(child.getName()) && child.getValue() != null && URLUtil.isDataUri(child.getValue())); } protected abstract XmlCodeFoldingSettings getFoldingSettings(); From d48f1c0b096c26fa339a99e9814264610a7e3ad1 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Fri, 8 Jul 2016 12:55:07 +0300 Subject: [PATCH 2/3] IDEA-97406 update scaling algorithm --- .../src/com/intellij/ui/EffectPainter.java | 13 +++++++++---- .../src/com/intellij/ui/SimpleColoredComponent.java | 2 +- .../intellij/openapi/editor/impl/EditorImpl.java | 4 ++-- .../openapi/editor/impl/view/EditorPainter.java | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/EffectPainter.java b/platform/platform-api/src/com/intellij/ui/EffectPainter.java index c984f8621a36..d954390700c3 100644 --- a/platform/platform-api/src/com/intellij/ui/EffectPainter.java +++ b/platform/platform-api/src/com/intellij/ui/EffectPainter.java @@ -26,19 +26,24 @@ import java.awt.geom.*; * @author Sergey.Malenkov */ public enum EffectPainter implements RegionPainter { - WAVE { + /** + * @see com.intellij.openapi.editor.markup.EffectType#WAVE_UNDERSCORE + */ + WAVE_UNDERSCORE { private final BasicStroke STROKE = new BasicStroke(.7f); @Override public void paint(Graphics2D g, int x, int y, int width, int height, Paint paint) { + // we assume here that Y is a baseline of a text if (!Registry.is("ide.text.effect.wave.new")) { g.setPaint(paint); WavePainter.forColor(g.getColor()).paint(g, x, x + width, y + height); } else if (paint != null && width > 0 && height > 0) { - if (!Registry.is("ide.text.effect.wave.new.scale")) { - y += height - 3; - height = 3; + int h = height < 4 ? 2 : Registry.is("ide.text.effect.wave.new.scale") ? height >> 1 : 3; + if (h != height) { + y += height - h; + height = h; } g = (Graphics2D)g.create(x, y, width, height); g.clipRect(0, 0, width, height); diff --git a/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java b/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java index 528777222c2c..4897f413f98e 100644 --- a/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java +++ b/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java @@ -833,7 +833,7 @@ public class SimpleColoredComponent extends JComponent implements Accessible, Co } // 2. Waved effect if (attributes.isWaved()) { - EffectPainter.WAVE.paint(g, offset, textBaseline + 1, fragmentWidth, Math.max(2, metrics.getDescent()), attributes.getWaveColor()); + EffectPainter.WAVE_UNDERSCORE.paint(g, offset, textBaseline + 1, fragmentWidth, Math.max(2, metrics.getDescent()), attributes.getWaveColor()); } // 3. Underline if (attributes.isUnderline()) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index d7a95257196c..99b3439ba71c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -2413,7 +2413,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int y = visibleLineToY(visibleStartLine) + getAscent() + 1; g.setColor(attributes.getEffectColor()); if (attributes.getEffectType() == EffectType.WAVE_UNDERSCORE) { - EffectPainter.WAVE.paint((Graphics2D)g, end.x, y, charWidth - 1, getDescent() - 1, attributes.getEffectColor()); + EffectPainter.WAVE_UNDERSCORE.paint((Graphics2D)g, end.x, y - 1, charWidth - 1, getDescent(), attributes.getEffectColor()); } else if (attributes.getEffectType() == EffectType.BOLD_DOTTED_LINE) { final int dottedAt = SystemInfo.isMac ? y - 1 : y; @@ -3562,7 +3562,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi g.setColor(savedColor); } else if (effectType == EffectType.WAVE_UNDERSCORE) { - EffectPainter.WAVE.paint((Graphics2D)g, xStart, y + 1, xEnd - xStart, getDescent() - 1, effectColor); + EffectPainter.WAVE_UNDERSCORE.paint((Graphics2D)g, xStart, y, xEnd - xStart, getDescent(), effectColor); g.setColor(savedColor); } else if (effectType == EffectType.BOLD_DOTTED_LINE) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java index e5f9a207003d..d22724fc0624 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java @@ -440,7 +440,7 @@ class EditorPainter implements TextDrawingCallback { UIUtil.drawLine(g, xStart, y1, xEnd, y1); } else if (effectType == EffectType.WAVE_UNDERSCORE) { - EffectPainter.WAVE.paint(g, xStart, y + 1, xEnd - xStart, myView.getDescent() - 1, effectColor); + EffectPainter.WAVE_UNDERSCORE.paint(g, xStart, y, xEnd - xStart, myView.getDescent(), effectColor); } else if (effectType == EffectType.BOLD_DOTTED_LINE) { UIUtil.drawBoldDottedLine(g, xStart, xEnd, SystemInfo.isMac ? y : y + 1, myEditor.getBackgroundColor(), g.getColor(), false); From 9c8989701400d4a7fdc5e57dcb46b927de5a8508 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Fri, 8 Jul 2016 13:40:49 +0300 Subject: [PATCH 3/3] IDEA-97406 support LINE_UNDERSCORE as well as WAVE_UNDERSCORE --- .../src/com/intellij/ui/EffectPainter.java | 21 +++++++++++++++++++ .../intellij/ui/SimpleColoredComponent.java | 3 +-- .../openapi/editor/impl/EditorImpl.java | 5 ++--- .../editor/impl/view/EditorPainter.java | 2 +- .../util/resources/misc/registry.properties | 4 ++++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/EffectPainter.java b/platform/platform-api/src/com/intellij/ui/EffectPainter.java index d954390700c3..8df85aa43c10 100644 --- a/platform/platform-api/src/com/intellij/ui/EffectPainter.java +++ b/platform/platform-api/src/com/intellij/ui/EffectPainter.java @@ -26,6 +26,27 @@ import java.awt.geom.*; * @author Sergey.Malenkov */ public enum EffectPainter implements RegionPainter { + /** + * @see com.intellij.openapi.editor.markup.EffectType#LINE_UNDERSCORE + */ + LINE_UNDERSCORE { + @Override + public void paint(Graphics2D g, int x, int y, int width, int height, Paint paint) { + // we assume here that Y is a baseline of a text + if (!Registry.is("ide.text.effect.line.new")) { + g.setPaint(paint); + g.drawLine(x, y + 1, x + width, y + 1); + } + else if (paint != null && width > 0 && height > 0) { + g.setPaint(paint); + int h = height < 4 ? 2 : height >> 1; + double pos = Registry.doubleValue("ide.text.effect.line.new.pos"); + y += (int)((double)height - h * pos); + g.setPaint(paint); + g.drawLine(x, y, x + width, y); + } + } + }, /** * @see com.intellij.openapi.editor.markup.EffectType#WAVE_UNDERSCORE */ diff --git a/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java b/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java index 4897f413f98e..a99c1a9b0817 100644 --- a/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java +++ b/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java @@ -837,8 +837,7 @@ public class SimpleColoredComponent extends JComponent implements Accessible, Co } // 3. Underline if (attributes.isUnderline()) { - final int underlineAt = textBaseline + 1; - UIUtil.drawLine(g, offset, underlineAt, offset + fragmentWidth, underlineAt); + EffectPainter.LINE_UNDERSCORE.paint(g, offset, textBaseline, fragmentWidth, metrics.getDescent(), g.getColor()); } // 4. Bold Dotted Line if (attributes.isBoldDottedLine()) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 99b3439ba71c..b48b34ab9e4e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -2428,7 +2428,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi drawBoldLineUnderScore(g, end.x, y - 1, charWidth - 1); } else if (attributes.getEffectType() != EffectType.BOXED) { - UIUtil.drawLine(g, end.x, y, end.x + charWidth - 1, y); + EffectPainter.LINE_UNDERSCORE.paint((Graphics2D)g, end.x, y - 1, charWidth - 1, getDescent(), attributes.getEffectColor()); } } } @@ -3546,8 +3546,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } if (effectType == EffectType.LINE_UNDERSCORE) { - g.setColor(effectColor); - UIUtil.drawLine(g, xStart, y + 1, xEnd, y + 1); + EffectPainter.LINE_UNDERSCORE.paint((Graphics2D)g, xStart, y, xEnd - xStart, getDescent(), effectColor); g.setColor(savedColor); } else if (effectType == EffectType.BOLD_LINE_UNDERSCORE) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java index d22724fc0624..12a31baa617e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java @@ -429,7 +429,7 @@ class EditorPainter implements TextDrawingCallback { int xEnd = (int)xTo; g.setColor(effectColor); if (effectType == EffectType.LINE_UNDERSCORE) { - UIUtil.drawLine(g, xStart, y + 1, xEnd, y + 1); + EffectPainter.LINE_UNDERSCORE.paint(g, xStart, y, xEnd - xStart, myView.getDescent(), effectColor); } else if (effectType == EffectType.BOLD_LINE_UNDERSCORE) { int height = JBUI.scale(Registry.intValue("editor.bold.underline.height", 2)); diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 34fa2644cf99..0f6d3bff37d2 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -761,6 +761,10 @@ cidr.xcode.derived.data.override.description=Ignore Xcode DerivedData location s editor.rainbow.identifiers=false editor.rainbow.identifiers.description=Rainbow identifiers in editor +ide.text.effect.line.new=false +ide.text.effect.line.new.description=Enables new line painter for text +ide.text.effect.line.new.pos=0.5 +ide.text.effect.line.new.pos.description=Changes a line position ide.text.effect.wave.new=false ide.text.effect.wave.new.description=Enables new wave painter for text ide.text.effect.wave.new.scale=false