From dbf909641692ced2e01acb2247bc234222d144ca Mon Sep 17 00:00:00 2001 From: bobbylight Date: Sun, 25 Sep 2022 18:15:13 -0400 Subject: [PATCH] Fix #460: Support different foreground color for armed fold icons --- .../org/fife/ui/rsyntaxtextarea/Theme.java | 15 ++++++++- .../fife/ui/rtextarea/ChevronFoldIcon.java | 8 ++++- .../org/fife/ui/rtextarea/FoldIndicator.java | 32 +++++++++++++++++++ .../java/org/fife/ui/rtextarea/Gutter.java | 28 ++++++++++++++++ .../fife/ui/rtextarea/PlusMinusFoldIcon.java | 15 +++++++-- .../fife/ui/rsyntaxtextarea/themes/dark.xml | 2 +- .../ui/rsyntaxtextarea/themes/default-alt.xml | 2 +- .../ui/rsyntaxtextarea/themes/default.xml | 2 +- .../fife/ui/rsyntaxtextarea/themes/druid.xml | 2 +- .../ui/rsyntaxtextarea/themes/eclipse.xml | 4 +-- .../fife/ui/rsyntaxtextarea/themes/idea.xml | 2 +- .../ui/rsyntaxtextarea/themes/monokai.xml | 2 +- .../fife/ui/rsyntaxtextarea/themes/theme.dtd | 1 + .../org/fife/ui/rsyntaxtextarea/themes/vs.xml | 2 +- .../fife/ui/rsyntaxtextarea/ThemeTest.java | 1 + .../fife/ui/rtextarea/FoldIndicatorTest.java | 22 +++++++++++++ .../org/fife/ui/rtextarea/GutterTest.java | 22 +++++++++++++ 17 files changed, 148 insertions(+), 14 deletions(-) diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/Theme.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/Theme.java index 725596ccd..d2861ceb5 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/Theme.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rsyntaxtextarea/Theme.java @@ -105,6 +105,7 @@ public class Theme { public String lineNumberFont; public int lineNumberFontSize; public Color foldIndicatorFG; + public Color foldIndicatorArmedFG; public Color foldBG; public Color armedFoldBG; @@ -171,6 +172,7 @@ public Theme(RSyntaxTextArea textArea) { lineNumberFont = gutter.getLineNumberFont().getFamily(); lineNumberFontSize = gutter.getLineNumberFont().getSize(); foldIndicatorFG = gutter.getFoldIndicatorForeground(); + foldIndicatorArmedFG = gutter.getFoldIndicatorArmedForeground(); foldBG = gutter.getFoldBackground(); armedFoldBG = gutter.getArmedFoldBackground(); } @@ -227,6 +229,7 @@ public void apply(RSyntaxTextArea textArea) { Font font = getFont(fontName, Font.PLAIN, fontSize); gutter.setLineNumberFont(font); gutter.setFoldIndicatorForeground(foldIndicatorFG); + gutter.setFoldIndicatorArmedForeground(foldIndicatorArmedFG); gutter.setFoldBackground(foldBG); gutter.setArmedFoldBackground(armedFoldBG); } @@ -473,8 +476,13 @@ public void save(OutputStream out) throws IOException { elem = doc.createElement("foldIndicator"); elem.setAttribute("fg", colorToString(foldIndicatorFG)); + if (foldIndicatorArmedFG != null) { + elem.setAttribute("armedFg", colorToString(foldIndicatorArmedFG)); + } elem.setAttribute("iconBg", colorToString(foldBG)); - elem.setAttribute("iconArmedBg", colorToString(armedFoldBG)); + if (armedFoldBG != null) { + elem.setAttribute("iconArmedBg", colorToString(armedFoldBG)); + } root.appendChild(elem); elem = doc.createElement("iconRowHeader"); @@ -714,6 +722,11 @@ else if ("tabLine".equals(qName)) { else if ("foldIndicator".equals(qName)) { String color = attrs.getValue("fg"); theme.foldIndicatorFG = stringToColor(color); + color = attrs.getValue("armedFg"); + // This field must have a value for downstream consumers to + // function properly, so default to regular FG if not armed + // variant isn't specified + theme.foldIndicatorArmedFG = stringToColor(color); color = attrs.getValue("iconBg"); theme.foldBG = stringToColor(color); color = attrs.getValue("iconArmedBg"); diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/ChevronFoldIcon.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/ChevronFoldIcon.java index 8fd11b34a..57d0a15c4 100644 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/ChevronFoldIcon.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/ChevronFoldIcon.java @@ -47,6 +47,12 @@ public int getIconWidth() { @Override public void paintIcon(Component c, Graphics g, int x, int y) { + FoldIndicator fi = (FoldIndicator)c; + Color fg = c.getForeground(); + if (isArmed() && fi.getArmedForeground() != null) { + fg = fi.getArmedForeground(); + } + int width = getIconWidth(); int height = getIconHeight(); Graphics2D g2d = (Graphics2D)g.create(); @@ -55,7 +61,7 @@ public void paintIcon(Component c, Graphics g, int x, int y) { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setColor(c.getForeground()); + g2d.setColor(fg); g2d.translate(x, y); if (!isCollapsed()) { g2d.rotate(Math.toRadians(90), width / 2f, height / 2f); diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/FoldIndicator.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/FoldIndicator.java index c5c84e013..ba4bf22ec 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/FoldIndicator.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/FoldIndicator.java @@ -57,6 +57,13 @@ public class FoldIndicator extends AbstractGutterComponent { */ private Fold foldWithOutlineShowing; + + /** + * The color used for the foreground of armed folds. + */ + private Color armedForeground; + + /** * The color to use for fold icon backgrounds, if the default icons * are used. @@ -213,6 +220,17 @@ private Fold findOpenFoldClosestTo(Point p) { } + /** + * Returns the foreground color used for armed folds. + * + * @return The foreground color used for armed folds. + * @see #setArmedForeground(Color) + */ + public Color getArmedForeground() { + return armedForeground; + } + + /** * Returns the strategy to use for rendering expanded folds. * @@ -727,6 +745,20 @@ public void setAdditionalLeftMargin(int leftMargin) { } + /** + * Sets the foreground color used for armed folds. + * + * @param fg The new armed fold foreground. + * @see #getArmedForeground() + */ + public void setArmedForeground(Color fg) { + if (fg==null) { + fg = FoldIndicator.DEFAULT_FOREGROUND; + } + armedForeground = fg; + } + + private void setCollapsedFoldIconAlpha(float collapsedFoldIconAlpha) { collapsedFoldIconAlpha = Math.max(0, Math.min(collapsedFoldIconAlpha, 1)); if (collapsedFoldIconAlpha != this.collapsedFoldIconAlpha) { diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java index 862d6498c..6ae548c3e 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java @@ -369,6 +369,19 @@ public Color getFoldBackground() { } + /** + * Returns the foreground color of the fold indicator for armed + * folds. + * + * @return The foreground color of the fold indicator for armed + * folds. + * @see #setFoldIndicatorArmedForeground(Color) + */ + public Color getFoldIndicatorArmedForeground() { + return foldIndicator.getArmedForeground(); + } + + /** * Returns the foreground color of the fold indicator. * @@ -781,6 +794,21 @@ public void setFoldBackground(Color bg) { } + /** + * Sets the foreground color used by the fold indicator for + * armed folds. + * + * @param fg The new armed fold indicator foreground. + * @see #getFoldIndicatorArmedForeground() + */ + public void setFoldIndicatorArmedForeground(Color fg) { + if (fg==null) { + fg = FoldIndicator.DEFAULT_FOREGROUND; + } + foldIndicator.setArmedForeground(fg); + } + + /** * Sets the foreground color used by the fold indicator. * diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/PlusMinusFoldIcon.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/PlusMinusFoldIcon.java index 04c8b5c69..1a3fb320b 100644 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/PlusMinusFoldIcon.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/PlusMinusFoldIcon.java @@ -31,14 +31,23 @@ public int getIconWidth() { @Override public void paintIcon(Component c, Graphics g, int x, int y) { + FoldIndicator fi = (FoldIndicator)c; + Color fg = fi.getForeground(); Color bg = fi.getFoldIconBackground(); - if (isArmed() && fi.getFoldIconArmedBackground() != null) { - bg = fi.getFoldIconArmedBackground(); + if (isArmed()) { + if (fi.getArmedForeground() != null) { + fg = fi.getArmedForeground(); + } + if (fi.getFoldIconArmedBackground() != null) { + bg = fi.getFoldIconArmedBackground(); + } } + g.setColor(bg); g.fillRect(x, y, 8, 8); - g.setColor(fi.getForeground()); + + g.setColor(fg); g.drawRect(x, y, 8, 8); g.drawLine(x + 2, y + 4, x + 2 + 4, y + 4); if (isCollapsed()) { diff --git a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/dark.xml b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/dark.xml index 589b4381c..d66748d2a 100755 --- a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/dark.xml +++ b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/dark.xml @@ -30,7 +30,7 @@ - + diff --git a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default-alt.xml b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default-alt.xml index 2fc3640cd..73d56ce7a 100755 --- a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default-alt.xml +++ b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default-alt.xml @@ -29,7 +29,7 @@ - + diff --git a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default.xml b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default.xml index fbecba9dc..e1775eac7 100755 --- a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default.xml +++ b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/default.xml @@ -29,7 +29,7 @@ - + diff --git a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/druid.xml b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/druid.xml index 808b84db8..8a59b98df 100644 --- a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/druid.xml +++ b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/druid.xml @@ -29,7 +29,7 @@ - + diff --git a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/eclipse.xml b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/eclipse.xml index 6590da824..9b86fc941 100755 --- a/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/eclipse.xml +++ b/RSyntaxTextArea/src/main/resources/org/fife/ui/rsyntaxtextarea/themes/eclipse.xml @@ -29,9 +29,9 @@ - + - +