|
36 | 36 |
|
37 | 37 | import android.text.InputFilter; |
38 | 38 | import android.text.Layout; |
| 39 | +import android.text.Selection; |
39 | 40 | import android.text.Spannable; |
40 | 41 | import android.text.SpannableStringBuilder; |
41 | 42 | import android.text.Spanned; |
@@ -84,6 +85,7 @@ public class CodeView extends AppCompatMultiAutoCompleteTextView implements Find |
84 | 85 | private Rect lineNumberRect; |
85 | 86 | private Paint lineNumberPaint; |
86 | 87 | private boolean enableLineNumber = false; |
| 88 | + private boolean enableRelativeLineNumber = false; |
87 | 89 |
|
88 | 90 | private int currentIndentation = 0; |
89 | 91 | private boolean enableAutoIndentation = false; |
@@ -147,14 +149,17 @@ protected void onDraw(Canvas canvas) { |
147 | 149 | final Editable fullText = getText(); |
148 | 150 | final Layout layout = getLayout(); |
149 | 151 | final int lineCount = getLineCount(); |
150 | | - int baseline; |
151 | | - int currentLineNumber = 1; |
| 152 | + final int selectionStart = Selection.getSelectionStart(fullText); |
| 153 | + final int cursorLine = layout.getLineForOffset(selectionStart); |
152 | 154 |
|
153 | 155 | for (int i = 0; i < lineCount; ++i) { |
154 | | - baseline = getLineBounds(i, null); |
| 156 | + final int baseline = getLineBounds(i, null); |
155 | 157 | if (i == 0 || fullText.charAt(layout.getLineStart(i) - 1) == '\n') { |
156 | | - canvas.drawText(" " + currentLineNumber, lineNumberRect.left, baseline, lineNumberPaint); |
157 | | - ++currentLineNumber; |
| 158 | + // If relative line number is enabled the number should be the absolute value of cursorLine - i) |
| 159 | + // if not it should be just current line number |
| 160 | + // Add 1 to the current line number to make it start from 1 not 0 |
| 161 | + int lineNumber = (i == cursorLine || !enableRelativeLineNumber) ? i + 1 : Math.abs(cursorLine - i); |
| 162 | + canvas.drawText(" " + lineNumber, lineNumberRect.left, baseline, lineNumberPaint); |
158 | 163 | } |
159 | 164 | } |
160 | 165 |
|
@@ -554,6 +559,23 @@ public boolean isLineNumberEnabled() { |
554 | 559 | return enableLineNumber; |
555 | 560 | } |
556 | 561 |
|
| 562 | + /** |
| 563 | + * Enable or disable the relative line number feature |
| 564 | + * @param enableRelativeLineNumber Flag to enable or disable line relative number |
| 565 | + * @since 1.3.6 |
| 566 | + */ |
| 567 | + public void setEnableRelativeLineNumber(boolean enableRelativeLineNumber) { |
| 568 | + this.enableRelativeLineNumber = enableRelativeLineNumber; |
| 569 | + } |
| 570 | + |
| 571 | + /** |
| 572 | + * @return (@code true) if relative line number is enabled |
| 573 | + * @since 1.3.6 |
| 574 | + */ |
| 575 | + public boolean isLineRelativeNumberEnabled() { |
| 576 | + return enableRelativeLineNumber; |
| 577 | + } |
| 578 | + |
557 | 579 | /** |
558 | 580 | * Modify the line number text color |
559 | 581 | * @param color The new color value |
|
0 commit comments