From 451960008a82c0351b04f059b0293e4cb9fb05a9 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 24 Feb 2018 23:11:54 +0800 Subject: [PATCH] chore --- .../scriptdroid/ui/edit/EditorView.java | 3 -- .../ui/edit/editor/CodeEditText.java | 23 ++++++++--- .../ui/edit/editor/CodeEditor.java | 2 +- .../ui/edit/editor/JavaScriptHighlighter.java | 2 +- .../ui/edit/editor/TextViewRedoUndo.java | 18 ++++++--- .../java/com/stardust/util/TextUtils.java | 38 ++++++++++++++++++- 6 files changed, 68 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java index dda41454..8c477bec 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java @@ -320,9 +320,6 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC .doOnNext(s -> { mEditor.markTextAsSaved(); setMenuItemStatus(R.id.save, false); - setMenuItemStatus(R.id.undo, false); - setMenuItemStatus(R.id.redo, false); - }); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java index bffd7910..9ef20aae 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java @@ -31,6 +31,7 @@ import android.view.Gravity; import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.ui.edit.theme.Theme; +import com.stardust.util.TextUtils; import java.lang.reflect.Array; import java.util.Arrays; @@ -261,25 +262,35 @@ public class CodeEditText extends AppCompatEditText { if (mCallback == null || selStart != selEnd) { return; } - String text = getText().toString(); - if (text.isEmpty()) { + callCursorChangeCallback(getText(), selStart); + checkParenthesesPairs(getText(), selStart); + } + + private void checkParenthesesPairs(CharSequence text, int sel) { + // TODO: 2018/2/24 + } + + private void callCursorChangeCallback(CharSequence text, int sel) { + if (getText().length() == 0) { return; } - int lineStart = text.lastIndexOf("\n", selStart) + 1; + if (mCallback == null) + return; + int lineStart = TextUtils.lastIndexOf(text, '\n', sel) + 1; if (lineStart < 0) { lineStart = 0; } if (lineStart > text.length() - 1) { lineStart = text.length() - 1; } - int lineEnd = text.indexOf("\n", selStart); + int lineEnd = TextUtils.indexOf(text, '\n', sel); if (lineEnd < 0) { lineEnd = text.length(); } if (lineEnd < lineStart || lineStart < 0 || lineEnd > text.length()) return; - String line = text.substring(lineStart, lineEnd); - int cursor = selStart - lineStart; + String line = text.subSequence(lineStart, lineEnd).toString(); + int cursor = sel - lineStart; mCallback.onCursorChange(line, cursor); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java index f807be42..8e5a7d84 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java @@ -297,7 +297,7 @@ public class CodeEditor extends HVScrollView { public void markTextAsSaved() { - mTextViewRedoUndo.clearHistory(); + mTextViewRedoUndo.markTextAsUnchanged(); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/JavaScriptHighlighter.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/JavaScriptHighlighter.java index 77cca0fc..272d11c3 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/JavaScriptHighlighter.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/JavaScriptHighlighter.java @@ -23,7 +23,7 @@ public class JavaScriptHighlighter implements SimpleTextWatcher.AfterTextChanged public static class HighlightTokens { - private int[] mColors; + private final int[] mColors; private String mText; private int mCount; diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/TextViewRedoUndo.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/TextViewRedoUndo.java index e234dd23..c19f1cee 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/TextViewRedoUndo.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/TextViewRedoUndo.java @@ -21,6 +21,7 @@ import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; +import java.util.Objects; import java.util.Stack; /** @@ -40,8 +41,9 @@ public class TextViewRedoUndo { //自动操作标志,防止重复回调,导致无限撤销 private boolean flag = false; + private int mInitialHistoryStackSize; + public TextViewRedoUndo(@NonNull EditText editText) { - CheckNull(editText, "EditText不能为空"); this.editable = editText.getText(); this.editText = editText; editText.addTextChangedListener(new Watcher()); @@ -52,7 +54,9 @@ public class TextViewRedoUndo { } protected void onTextChanged(Editable s) { - + if (history.size() < mInitialHistoryStackSize) { + mInitialHistoryStackSize = 0; + } } @@ -63,6 +67,7 @@ public class TextViewRedoUndo { public final void clearHistory() { history.clear(); historyBack.clear(); + mInitialHistoryStackSize = 0; } public boolean canUndo() { @@ -144,7 +149,11 @@ public class TextViewRedoUndo { } public boolean isTextChanged() { - return !history.empty(); + return history.size() != mInitialHistoryStackSize; + } + + public void markTextAsUnchanged() { + mInitialHistoryStackSize = history.size(); } private class Watcher implements TextWatcher { @@ -261,7 +270,4 @@ public class TextViewRedoUndo { } - private static void CheckNull(Object o, String message) { - if (o == null) throw new IllegalStateException(message); - } } \ No newline at end of file diff --git a/common/src/main/java/com/stardust/util/TextUtils.java b/common/src/main/java/com/stardust/util/TextUtils.java index f695db30..644f085d 100644 --- a/common/src/main/java/com/stardust/util/TextUtils.java +++ b/common/src/main/java/com/stardust/util/TextUtils.java @@ -19,4 +19,40 @@ public class TextUtils { return ""; return message; } -} + + public static int lastIndexOf(CharSequence text, char ch, int fromIndex) { + if (text instanceof String) { + return ((String) text).lastIndexOf(ch, fromIndex); + } + int i = Math.min(fromIndex, text.length() - 1); + for (; i >= 0; i--) { + if (text.charAt(i) == ch) { + return i; + } + } + return -1; + + } + + public static int indexOf(CharSequence text, char ch, int fromIndex) { + if (text instanceof String) { + return ((String) text).indexOf(ch, fromIndex); + } + final int max = text.length(); + if (fromIndex < 0) { + fromIndex = 0; + } else if (fromIndex >= max) { + // Note: fromIndex might be near -1>>>1. + return -1; + } + + // handle most cases here (ch is a BMP code point or a + // negative value (invalid code point)) + for (int i = fromIndex; i < max; i++) { + if (text.charAt(i) == ch) { + return i; + } + } + return -1; + } +} \ No newline at end of file