From 54a2c300c43651f0abfad01e2347cf747acdde1b Mon Sep 17 00:00:00 2001 From: Mino260806 Date: Sat, 29 Jul 2023 16:34:14 +0100 Subject: [PATCH 1/4] added possibility to customize line number --- .../java/org/fife/ui/rtextarea/Gutter.java | 34 ++++++++++ .../ui/rtextarea/LineNumberFormatter.java | 32 ++++++++++ .../org/fife/ui/rtextarea/LineNumberList.java | 63 +++++++++++++++++-- 3 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberFormatter.java 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 a7e47c78f..68243c0a0 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java @@ -102,6 +102,11 @@ public class Gutter extends JPanel { */ private int lineNumberingStartIndex; + /** + * Formats line numbers into a string to be displayed. + */ + private LineNumberFormatter lineNumberFormatter; + /** * The font used to render line numbers. */ @@ -152,6 +157,7 @@ public Gutter(RTextArea textArea) { lineNumberColor = LineNumberList.DEFAULT_LINE_NUMBER_COLOR; lineNumberFont = RTextArea.getDefaultFont(); lineNumberingStartIndex = 1; + lineNumberFormatter = LineNumberList.DEFAULT_LINE_NUMBER_FORMATTER; iconRowHeaderInheritsGutterBackground = false; setTextArea(textArea); @@ -438,6 +444,17 @@ public int getLineNumberingStartIndex() { return lineNumberingStartIndex; } + /** + * Returns the line number formatter. The default value is + * {@link LineNumberList#DEFAULT_LINE_NUMBER_FORMATTER} + * + * @return The formatter + * @see #setLineNumberFormatter(LineNumberFormatter) + */ + public LineNumberFormatter getLineNumberFormatter() { + return lineNumberFormatter; + } + /** * Returns true if the line numbers are enabled and visible. @@ -919,6 +936,21 @@ public void setLineNumberingStartIndex(int index) { } + /** + * Sets a custom line number formatter. Can be called when other number + * formats are needed like arabic-indic numerals. + * + * @param formatter The new line number formatter + * @see #getLineNumberFormatter() + */ + public void setLineNumberFormatter(LineNumberFormatter formatter) { + if (formatter != lineNumberFormatter) { + lineNumberFormatter = formatter; + lineNumberList.setLineNumberFormatter(formatter); + } + } + + /** * Toggles whether line numbers are visible.

* @@ -1004,6 +1036,8 @@ public void setTextArea(RTextArea textArea) { getCurrentLineNumberColor()); lineNumberList.setLineNumberingStartIndex( getLineNumberingStartIndex()); + lineNumberList.setLineNumberFormatter( + getLineNumberFormatter()); } else { lineNumberList.setTextArea(textArea); diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberFormatter.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberFormatter.java new file mode 100644 index 000000000..e98486fff --- /dev/null +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberFormatter.java @@ -0,0 +1,32 @@ +/* + * 29/07/2023 + * + * LineNumber - Format line numbers into a comprehensible String. + * + * This library is distributed under a modified BSD license. See the included + * LICENSE file for details. + */ +package org.fife.ui.rtextarea; + +/** + * Formats line numbers into a comprehensible String to be + * displayed to the user. + * */ +public interface LineNumberFormatter { + /** + * Formats the given line number into a String. + * + * @param lineNumber the line number + * @return the formatted line number + */ + String format(int lineNumber); + + /** + * Returns the maximum number of characters of any string returned + * by {@link #format} provided a certain maximum line number. + * + * @param maxLineNumber the maximum line number + * @return the maximum length + */ + int getMaxLength(int maxLineNumber); +} diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java index 336e00647..daaf2cb08 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java @@ -82,6 +82,11 @@ public class LineNumberList extends AbstractGutterComponent */ private int lineNumberingStartIndex; + /** + * Formats line numbers into a string to be displayed. + */ + private LineNumberFormatter lineNumberFormatter = DEFAULT_LINE_NUMBER_FORMATTER; + /** * The color of current line number. */ @@ -89,6 +94,7 @@ public class LineNumberList extends AbstractGutterComponent public static final Color DEFAULT_LINE_NUMBER_COLOR = Color.GRAY; + public static final LineNumberFormatter DEFAULT_LINE_NUMBER_FORMATTER = new SimpleLineNumberFormatter(); /** * Constructs a new LineNumberList using default values for @@ -197,6 +203,18 @@ public int getLineNumberingStartIndex() { } + /** + * Returns the line number formatter. The default value is + * {@link LineNumberList#DEFAULT_LINE_NUMBER_FORMATTER} + * + * @return The formatter + * @see #setLineNumberFormatter(LineNumberFormatter) + */ + public LineNumberFormatter getLineNumberFormatter() { + return lineNumberFormatter; + } + + @Override public Dimension getPreferredSize() { int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary @@ -392,7 +410,7 @@ protected void paintComponent(Graphics g) { int rhs = getWidth() - rhsBorderWidth; int line = topLine + 1; // TODO: Simplify me while (y= 10); + LineNumberFormatter formatter = getLineNumberFormatter() == null? + DEFAULT_LINE_NUMBER_FORMATTER: getLineNumberFormatter(); + int count = formatter.getMaxLength(lineCount); cellWidth += fontMetrics.charWidth('9')*(count+1) + 3; } } @@ -817,4 +849,23 @@ public void uninstall(RTextArea textArea) { } + private static class SimpleLineNumberFormatter implements LineNumberFormatter { + @Override + public String format(int lineNumber) { + return Integer.toString(lineNumber); + } + + @Override + public int getMaxLength(int maxLineNumber) { + int count = 0; + do { + maxLineNumber = maxLineNumber /10; + count++; + } while (maxLineNumber >= 10); + + return count; + } + } + + } From fd8dd89e47f8d57b381756c630b6e79af8d907f5 Mon Sep 17 00:00:00 2001 From: Mino260806 Date: Sat, 29 Jul 2023 16:55:43 +0100 Subject: [PATCH 2/4] demo: possibility to toggle between normal and hindu-arabic line number format --- .../ui/rsyntaxtextarea/demo/DemoRootPane.java | 65 ++++++++++++++++++- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java b/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java index 0abf1f961..91a6dc301 100755 --- a/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java +++ b/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java @@ -22,9 +22,7 @@ //import javax.swing.text.StyleConstants; import org.fife.ui.rsyntaxtextarea.*; -import org.fife.ui.rtextarea.FoldIndicatorStyle; -import org.fife.ui.rtextarea.Gutter; -import org.fife.ui.rtextarea.RTextScrollPane; +import org.fife.ui.rtextarea.*; /** @@ -140,6 +138,18 @@ private JMenuBar createMenuBar() { foldStyleSubMenu.add(classicStyleItem); foldStyleSubMenu.add(modernStyleItem); menu.add(foldStyleSubMenu); + JMenu lineNumberFormatSubMenu = new JMenu("Line Number Format"); + JRadioButtonMenuItem normalStyleItem = new JRadioButtonMenuItem( + new LineNumberFormatAction("Normal", LineNumberList.DEFAULT_LINE_NUMBER_FORMATTER)); + JRadioButtonMenuItem hinduArabicStyleItem = new JRadioButtonMenuItem( + new LineNumberFormatAction("Hindu-Arabic", new HinduArabicLineNumberFormatter())); + normalStyleItem.setSelected(true); + bg = new ButtonGroup(); + bg.add(normalStyleItem); + bg.add(hinduArabicStyleItem); + lineNumberFormatSubMenu.add(normalStyleItem); + lineNumberFormatSubMenu.add(hinduArabicStyleItem); + menu.add(lineNumberFormatSubMenu); JCheckBoxMenuItem cbItem = new JCheckBoxMenuItem(new CodeFoldingAction()); cbItem.setSelected(true); menu.add(cbItem); @@ -409,6 +419,25 @@ public void actionPerformed(ActionEvent e) { } + /** + * Changes how line numbers are displayed. + */ + private class LineNumberFormatAction extends AbstractAction { + + private final LineNumberFormatter formatter; + + LineNumberFormatAction(String name, LineNumberFormatter formatter) { + this.formatter = formatter; + putValue(NAME, name); + } + + @Override + public void actionPerformed(ActionEvent e) { + scrollPane.getGutter().setLineNumberFormatter(formatter); + } + + } + /** * Changes the look and feel of the demo application. */ @@ -561,5 +590,35 @@ public void actionPerformed(ActionEvent e) { } + /** + * Formats line numbers into Hindu-Arabic numerals. + */ + private static class HinduArabicLineNumberFormatter implements LineNumberFormatter { + private static final String[] NUMERALS = { + "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩" + }; + + @Override + public String format(int lineNumber) { + if (lineNumber == 0) { + return NUMERALS[0]; + } + + StringBuilder sb = new StringBuilder(); + while (lineNumber > 0) { + int digit = lineNumber % 10; + sb.insert(0, NUMERALS[digit]); + lineNumber /= 10; + } + + return sb.toString(); + } + + @Override + public int getMaxLength(int maxLineNumber) { + return String.valueOf(maxLineNumber).length(); + } + } + } From 2787db0810c04422274a36e652a158f7a8a5a676 Mon Sep 17 00:00:00 2001 From: Mino260806 Date: Sat, 29 Jul 2023 16:56:58 +0100 Subject: [PATCH 3/4] typo --- RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java | 2 +- .../src/main/java/org/fife/ui/rtextarea/LineNumberList.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 68243c0a0..5426fb4c8 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/Gutter.java @@ -938,7 +938,7 @@ public void setLineNumberingStartIndex(int index) { /** * Sets a custom line number formatter. Can be called when other number - * formats are needed like arabic-indic numerals. + * formats are needed like hindu-arabic numerals. * * @param formatter The new line number formatter * @see #getLineNumberFormatter() diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java index daaf2cb08..b06815cdf 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/LineNumberList.java @@ -679,7 +679,7 @@ public void setLineNumberingStartIndex(int index) { /** * Sets a custom line number formatter. Can be called when other number - * formats are needed like arabic-indic numerals. + * formats are needed like hindu-arabic numerals. * * @param formatter The new line number formatter * @see #getLineNumberFormatter() From 119799dc4b7d0d6341ab3e47c1a16b8e271ea97d Mon Sep 17 00:00:00 2001 From: Mino260806 Date: Sat, 29 Jul 2023 17:17:14 +0100 Subject: [PATCH 4/4] fixed back unnecessary import in demo file --- .../java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java b/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java index 91a6dc301..80cdecce3 100755 --- a/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java +++ b/RSyntaxTextAreaDemo/src/main/java/org/fife/ui/rsyntaxtextarea/demo/DemoRootPane.java @@ -22,7 +22,11 @@ //import javax.swing.text.StyleConstants; import org.fife.ui.rsyntaxtextarea.*; -import org.fife.ui.rtextarea.*; +import org.fife.ui.rtextarea.FoldIndicatorStyle; +import org.fife.ui.rtextarea.Gutter; +import org.fife.ui.rtextarea.RTextScrollPane; +import org.fife.ui.rtextarea.LineNumberFormatter; +import org.fife.ui.rtextarea.LineNumberList; /**