Skip to content

Commit 83c9260

Browse files
committed
Add support for relative line number feature inspired from vim editor
1 parent e484455 commit 83c9260

1 file changed

Lines changed: 27 additions & 5 deletions

File tree

codeview/src/main/java/com/amrdeveloper/codeview/CodeView.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
import android.text.InputFilter;
3838
import android.text.Layout;
39+
import android.text.Selection;
3940
import android.text.Spannable;
4041
import android.text.SpannableStringBuilder;
4142
import android.text.Spanned;
@@ -84,6 +85,7 @@ public class CodeView extends AppCompatMultiAutoCompleteTextView implements Find
8485
private Rect lineNumberRect;
8586
private Paint lineNumberPaint;
8687
private boolean enableLineNumber = false;
88+
private boolean enableRelativeLineNumber = false;
8789

8890
private int currentIndentation = 0;
8991
private boolean enableAutoIndentation = false;
@@ -147,14 +149,17 @@ protected void onDraw(Canvas canvas) {
147149
final Editable fullText = getText();
148150
final Layout layout = getLayout();
149151
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);
152154

153155
for (int i = 0; i < lineCount; ++i) {
154-
baseline = getLineBounds(i, null);
156+
final int baseline = getLineBounds(i, null);
155157
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);
158163
}
159164
}
160165

@@ -554,6 +559,23 @@ public boolean isLineNumberEnabled() {
554559
return enableLineNumber;
555560
}
556561

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+
557579
/**
558580
* Modify the line number text color
559581
* @param color The new color value

0 commit comments

Comments
 (0)