diff --git a/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java b/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java index 4e31122e8..5b4d8433e 100644 --- a/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java +++ b/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java @@ -348,6 +348,9 @@ private Pair getTemplateContent(final Spinner templateSpinner, final int startingIndex = t.indexOf(HighlightingEditor.PLACE_CURSOR_HERE_TOKEN); t = t.replace(HighlightingEditor.PLACE_CURSOR_HERE_TOKEN, ""); + // Has no utility in a new file + t = t.replace(HighlightingEditor.INSERT_SELECTION_HERE_TOKEN, ""); + final byte[] bytes; if (encrypt && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { final char[] pass = ApplicationObject.settings().getDefaultPassword(); diff --git a/app/src/main/java/net/gsantner/markor/frontend/textview/HighlightingEditor.java b/app/src/main/java/net/gsantner/markor/frontend/textview/HighlightingEditor.java index 10a3efc44..3199aea05 100644 --- a/app/src/main/java/net/gsantner/markor/frontend/textview/HighlightingEditor.java +++ b/app/src/main/java/net/gsantner/markor/frontend/textview/HighlightingEditor.java @@ -39,6 +39,7 @@ public class HighlightingEditor extends AppCompatEditText { final static float HIGHLIGHT_REGION_SIZE = 0.75f; // Minimum extra screens to highlight (should be > 0.5 to cover screen) public final static String PLACE_CURSOR_HERE_TOKEN = "%%PLACE_CURSOR_HERE%%"; + public final static String INSERT_SELECTION_HERE_TOKEN = "%%INSERT_SELECTION_HERE%%"; private boolean _accessibilityEnabled = true; private final boolean _isSpellingRedUnderline; @@ -190,6 +191,11 @@ private int[] hlRegion(final Rect rect) { } } + @Override + public boolean bringPointIntoView(int i) { + return super.bringPointIntoView(i); + } + private int rowStart(final int y) { final Layout layout = getLayout(); final int line = layout.getLineForVertical(y); @@ -360,13 +366,30 @@ public void simulateKeyPress(int keyEvent_KEYCODE_SOMETHING) { public void insertOrReplaceTextOnCursor(final String newText) { final Editable edit = getText(); if (edit != null && newText != null) { - final int newCursorPos = newText.indexOf(PLACE_CURSOR_HERE_TOKEN); - final String finalText = newText.replace(PLACE_CURSOR_HERE_TOKEN, ""); + + // TODO - should consider moving any snippet specific logic out of here + // Fill in any instances of selection final int[] sel = TextViewUtils.getSelection(this); + final CharSequence selected = TextViewUtils.toString(edit, sel[0], sel[1]); + String expanded = newText.replace(INSERT_SELECTION_HERE_TOKEN, selected); + + // Determine where to place the cursor + final int newCursorPos = expanded.indexOf(PLACE_CURSOR_HERE_TOKEN); + final String finalText = expanded.replace(PLACE_CURSOR_HERE_TOKEN, ""); + sel[0] = Math.max(sel[0], 0); + + // Needed to prevent selection of whole of inserted text after replace + // if we want a cursor position instead + if (newCursorPos >= 0) { + setSelection(sel[0]); + } + withAutoFormatDisabled(() -> edit.replace(sel[0], sel[1], finalText)); + if (newCursorPos >= 0) { setSelection(sel[0] + newCursorPos); + TextViewUtils.showSelection(this); } } }