diff --git a/app/src/main/java/net/gsantner/markor/activity/DocumentEditAndViewFragment.java b/app/src/main/java/net/gsantner/markor/activity/DocumentEditAndViewFragment.java index f48576e375..5b821b513f 100644 --- a/app/src/main/java/net/gsantner/markor/activity/DocumentEditAndViewFragment.java +++ b/app/src/main/java/net/gsantner/markor/activity/DocumentEditAndViewFragment.java @@ -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; diff --git a/app/src/main/java/net/gsantner/markor/frontend/textview/LineNumbersView.java b/app/src/main/java/net/gsantner/markor/frontend/textview/LineNumbersView.java index 16550bead0..d9826a77fb 100644 --- a/app/src/main/java/net/gsantner/markor/frontend/textview/LineNumbersView.java +++ b/app/src/main/java/net/gsantner/markor/frontend/textview/LineNumbersView.java @@ -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); @@ -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 @@ -58,7 +60,7 @@ protected void onDraw(@NonNull Canvas canvas) { */ public void refresh() { invalidate(); - if (getWidth() == 0) { + if (getWidth() == INIT_WIDTH) { lineNumbersDrawer.getEditText().postInvalidate(); } } @@ -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() { @@ -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(); @@ -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) { @@ -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(); } } @@ -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); } @@ -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. * @@ -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; } @@ -319,7 +329,6 @@ 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) { @@ -327,7 +336,7 @@ public void draw(final Canvas canvas) { 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++; @@ -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; } @@ -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()); } } }