Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,12 @@ public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) {
case R.id.action_enable_highlighting: {
final boolean newState = !_hlEditor.getHighlightingEnabled();
_hlEditor.setHighlightingEnabled(newState);
if (_lineNumbersView.isLineNumbersEnabled()) {
// The line height may be changed, so need to refresh line numbers
final int delay = newState ? 1000 : 200;
_hlEditor.postDelayed(() -> _lineNumbersView.refresh(), delay);
_hlEditor.postDelayed(() -> _lineNumbersView.refresh(), delay + 1000);
}
_appSettings.setDocumentHighlightState(_document.path, newState);
updateMenuToggleStates(0);
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@
import androidx.annotation.NonNull;

public class LineNumbersView extends View {

private EditText editText;
private LineNumbersDrawer lineNumbersDrawer;
private boolean lineNumbersEnabled;
private static final int INIT_WIDTH = 1;

public LineNumbersView(Context context) {
super(context);
Expand All @@ -34,7 +36,7 @@ public LineNumbersView(Context context, AttributeSet attrs, int defStyleAttr) {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
setWidth(0); // Initial width
setWidth(INIT_WIDTH);
}

@Override
Expand All @@ -58,7 +60,7 @@ protected void onDraw(@NonNull Canvas canvas) {
*/
public void refresh() {
invalidate();
if (getWidth() == 0) {
if (getWidth() == INIT_WIDTH) {
lineNumbersDrawer.getEditText().postInvalidate();
}
}
Expand Down Expand Up @@ -88,9 +90,9 @@ public void setLineNumbersEnabled(final boolean enabled) {
if (lineNumbersDrawer == null) {
return;
}
lineNumbersDrawer.cleanup();
lineNumbersDrawer.reset();
}
refresh();
postDelayed(this::refresh, 300);
}

public boolean isLineNumbersEnabled() {
Expand All @@ -106,7 +108,8 @@ static class LineNumbersDrawer {
private static final int NUMBER_PADDING_LEFT = 18;
private static final int NUMBER_PADDING_RIGHT = 14;
private static final int EDITOR_PADDING_LEFT = 8;
private final int ORIGINAL_PADDING_LEFT;
private final int originalPaddingLeft;
private final int originalPaddingTop;

private final Rect visibleRect = new Rect();
private final Rect lineNumbersRect = new Rect();
Expand All @@ -118,9 +121,10 @@ static class LineNumbersDrawer {
private int lastMaxNumber;
private int lastLayoutLineCount;
private float lastTextSize;

private final int[] startLine = {0, 1}; // {line index, actual line number}

private CharSequence text;

private final TextWatcher lineTrackingWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Expand All @@ -135,6 +139,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {
@Override
public void afterTextChanged(Editable editable) {
if (isLayoutLineCountChanged() || isMaxNumberChanged()) {
notifyTextChanged(editable);
lineNumbersView.refresh();
}
}
Expand All @@ -156,7 +161,9 @@ public void onScrollChanged() {
public LineNumbersDrawer(final @NonNull EditText editText, final @NonNull LineNumbersView lineNumbersView) {
this.editText = editText;
this.lineNumbersView = lineNumbersView;
ORIGINAL_PADDING_LEFT = editText.getPaddingLeft();
text = editText.getText();
originalPaddingLeft = editText.getPaddingLeft();
originalPaddingTop = editText.getPaddingTop();
paint.setColor(0xFF999999);
paint.setTextAlign(Paint.Align.RIGHT);
}
Expand Down Expand Up @@ -274,11 +281,15 @@ private void setRefreshOnScrollChanged(final boolean enabled) {
public void prepare() {
setLineTracking(true);
setRefreshOnScrollChanged(true);
lineNumbersView.setWidth(0);
lineNumbersView.setWidth(INIT_WIDTH);
lineNumbersView.setVisibility(VISIBLE);
editText.setPadding(EDITOR_PADDING_LEFT, editText.getPaddingTop(), editText.getPaddingRight(), editText.getPaddingBottom());
}

private void notifyTextChanged(CharSequence text) {
this.text = text == null ? "" : text;
}

/**
* Draw line numbers.
*
Expand All @@ -289,9 +300,8 @@ public void draw(final Canvas canvas) {
return;
}

final CharSequence text = editText.getText();
final Layout layout = editText.getLayout();
if (text == null || layout == null) {
if (layout == null) {
return;
}

Expand Down Expand Up @@ -319,15 +329,14 @@ public void draw(final Canvas canvas) {
int number = startLine[1];
int y = layout.getLineBaseline(i);
final int count = layout.getLineCount();
final int offsetY = editText.getPaddingTop();

if (y > lineNumbersRect.top) {
if (invalid) {
invalid = false;
startLine[0] = i;
startLine[1] = number;
}
canvas.drawText(String.valueOf(number), numberX, layout.getLineBaseline(i) + offsetY, paint);
canvas.drawText(String.valueOf(number), numberX, layout.getLineBaseline(i) + originalPaddingTop, paint);
}
i++;
number++;
Expand All @@ -341,7 +350,7 @@ public void draw(final Canvas canvas) {
startLine[0] = i;
startLine[1] = number;
}
canvas.drawText(String.valueOf(number), numberX, y + offsetY, paint);
canvas.drawText(String.valueOf(number), numberX, y + originalPaddingTop, paint);
if (y > lineNumbersRect.bottom) {
break;
}
Expand All @@ -354,12 +363,12 @@ public void draw(final Canvas canvas) {
/**
* Reset some states related line numbers.
*/
public void cleanup() {
public void reset() {
setLineTracking(false);
setRefreshOnScrollChanged(false);
maxNumberDigits = 0;
lineNumbersView.setVisibility(GONE);
editText.setPadding(ORIGINAL_PADDING_LEFT, editText.getPaddingTop(), editText.getPaddingRight(), editText.getPaddingBottom());
editText.setPadding(originalPaddingLeft, editText.getPaddingTop(), editText.getPaddingRight(), editText.getPaddingBottom());
}
}
}
Loading