From 43e3a75676b7d8484a1a1197ae0f95e3f1ec7885 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Mon, 26 Feb 2018 20:35:06 +0800 Subject: [PATCH] feat: any words' completion --- .../autocomplete/AnyWordsCompletion.java | 50 +++++++++++++++++++ .../model/autocomplete/AutoCompletion.java | 23 +++++++-- .../scriptdroid/ui/edit/EditorView.java | 2 +- .../ui/edit/completion/CodeCompletionBar.java | 6 ++- .../ui/edit/editor/CodeEditText.java | 4 +- 5 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AnyWordsCompletion.java diff --git a/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AnyWordsCompletion.java b/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AnyWordsCompletion.java new file mode 100644 index 00000000..a6dce3ff --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AnyWordsCompletion.java @@ -0,0 +1,50 @@ +package com.stardust.scriptdroid.model.autocomplete; + +import android.text.Editable; + +import com.stardust.scriptdroid.model.indices.Property; +import com.stardust.scriptdroid.ui.widget.SimpleTextWatcher; + +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.regex.Pattern; + +/** + * Created by Stardust on 2018/2/26. + */ + +public class AnyWordsCompletion implements SimpleTextWatcher.AfterTextChangedListener { + + + private static final String PATTERN = "[\\W]"; + private ExecutorService mExecutorService; + private volatile DictionaryTree mDictionaryTree; + + public AnyWordsCompletion(ExecutorService executorService) { + mExecutorService = executorService; + } + + @Override + public void afterTextChanged(Editable s) { + mExecutorService.execute(() -> splitWords(s.toString())); + } + + private void splitWords(String s) { + DictionaryTree tree = new DictionaryTree<>(); + String[] words = s.split(PATTERN); + for (String word : words) { + tree.putWord(word, word); + } + mDictionaryTree = tree; + } + + public void findCodeCompletion(List completions, String wordPrefill) { + if (mDictionaryTree == null) + return; + List> result = mDictionaryTree.searchByPrefill(wordPrefill); + for (DictionaryTree.Entry entry : result) { + completions.add(new CodeCompletion(entry.tag, null, wordPrefill.length())); + } + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AutoCompletion.java b/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AutoCompletion.java index dc69b41a..d8d60be6 100644 --- a/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AutoCompletion.java +++ b/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AutoCompletion.java @@ -1,14 +1,18 @@ package com.stardust.scriptdroid.model.autocomplete; import android.content.Context; +import android.widget.EditText; import com.stardust.scriptdroid.model.indices.Module; import com.stardust.scriptdroid.model.indices.Modules; import com.stardust.scriptdroid.model.indices.Property; +import com.stardust.scriptdroid.ui.widget.SimpleTextWatcher; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,9 +37,13 @@ public class AutoCompletion { private List mModules; private DictionaryTree mGlobalPropertyTree = new DictionaryTree<>(); private AutoCompleteCallback mAutoCompleteCallback; + private ExecutorService mExecutorService = Executors.newSingleThreadExecutor(); + private AnyWordsCompletion mAnyWordsCompletion; - public AutoCompletion(Context context) { + public AutoCompletion(Context context, EditText editText) { buildDictionaryTree(context); + mAnyWordsCompletion = new AnyWordsCompletion(mExecutorService); + editText.addTextChangedListener(new SimpleTextWatcher(mAnyWordsCompletion)); } public void setAutoCompleteCallback(AutoCompleteCallback autoCompleteCallback) { @@ -71,9 +79,13 @@ public class AutoCompletion { Module module = getModule(mModuleName); if (mPropertyPrefill == null && module == null) return; - List completions = findCodeCompletion(module, mPropertyPrefill); - CodeCompletions codeCompletions = new CodeCompletions(cursor, completions); - mAutoCompleteCallback.updateCodeCompletion(codeCompletions); + String prefill = mPropertyPrefill; + mExecutorService.execute(() -> { + List completions = findCodeCompletion(module, prefill); + CodeCompletions codeCompletions = new CodeCompletions(cursor, completions); + mAutoCompleteCallback.updateCodeCompletion(codeCompletions); + }); + } private Module getModule(String moduleName) { @@ -123,12 +135,13 @@ public class AutoCompletion { private List findCodeCompletionForGlobal(String propertyPrefill) { if (propertyPrefill == null) return Collections.emptyList(); - List> result = mGlobalPropertyTree.searchByPrefill(propertyPrefill); List completions = new ArrayList<>(); + List> result = mGlobalPropertyTree.searchByPrefill(propertyPrefill); for (DictionaryTree.Entry entry : result) { Property property = entry.tag; completions.add(new CodeCompletion(property.getKey(), property.getUrl(), propertyPrefill.length())); } + mAnyWordsCompletion.findCodeCompletion(completions, propertyPrefill); return completions; } 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 8c477bec..c9ef5d4f 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 @@ -246,7 +246,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC mSymbolBar.setCodeCompletions(Symbols.getSymbols()); mCodeCompletionBar.setOnHintClickListener(this); mSymbolBar.setOnHintClickListener(this); - mAutoCompletion = new AutoCompletion(getContext()); + mAutoCompletion = new AutoCompletion(getContext(), mEditor.getCodeEditText()); mAutoCompletion.setAutoCompleteCallback(mCodeCompletionBar::setCodeCompletions); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletionBar.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletionBar.java index e0d0b102..288c49dd 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletionBar.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletionBar.java @@ -1,6 +1,7 @@ package com.stardust.scriptdroid.ui.edit.completion; import android.content.Context; +import android.os.Looper; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; @@ -74,6 +75,10 @@ public class CodeCompletionBar extends RecyclerView { } public void setCodeCompletions(CodeCompletions codeCompletions) { + if (Looper.getMainLooper() != Looper.myLooper()) { + post(() -> setCodeCompletions(codeCompletions)); + return; + } mCodeCompletions = codeCompletions; getAdapter().notifyDataSetChanged(); } @@ -125,5 +130,4 @@ public class CodeCompletionBar extends RecyclerView { } - } 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 ef93ed86..0090c2b2 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 @@ -309,12 +309,12 @@ public class CodeEditText extends AppCompatEditText { } private void callCursorChangeCallback(CharSequence text, int sel) { - if (getText().length() == 0) { + if (text.length() == 0) { return; } if (mCallback == null) return; - int lineStart = TextUtils.lastIndexOf(text, '\n', sel) + 1; + int lineStart = TextUtils.lastIndexOf(text, '\n', sel - 1) + 1; if (lineStart < 0) { lineStart = 0; }