remove unnessary files of editor; add 'delete line' and 'copy line' options to editor context menu
This commit is contained in:
@@ -5,10 +5,15 @@ import android.content.DialogInterface;
|
||||
import android.graphics.Color;
|
||||
import android.os.Build;
|
||||
import android.support.annotation.RequiresApi;
|
||||
import android.support.design.widget.Snackbar;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.util.TypedValue;
|
||||
import android.view.ActionMode;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.webkit.ConsoleMessage;
|
||||
import android.webkit.JavascriptInterface;
|
||||
import android.webkit.JsPromptResult;
|
||||
import android.webkit.JsResult;
|
||||
@@ -24,6 +29,7 @@ import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import com.stardust.pio.PFiles;
|
||||
import com.stardust.scriptdroid.R;
|
||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||
import com.stardust.util.ClipboardUtil;
|
||||
|
||||
import org.jdeferred.Deferred;
|
||||
import org.jdeferred.DoneCallback;
|
||||
@@ -52,6 +58,7 @@ public class CodeMirrorEditor extends FrameLayout {
|
||||
|
||||
private static final String LOG_TAG = "CodeMirrorEditor";
|
||||
|
||||
|
||||
public interface Callback {
|
||||
void onChange();
|
||||
|
||||
@@ -92,12 +99,16 @@ public class CodeMirrorEditor extends FrameLayout {
|
||||
init();
|
||||
}
|
||||
|
||||
public WebView getWebView() {
|
||||
return mWebView;
|
||||
}
|
||||
|
||||
public void setCallback(Callback callback) {
|
||||
mCallback = callback;
|
||||
}
|
||||
|
||||
public void beautifyCode() {
|
||||
evalJavaScript("editor.setValue(js_beautify(editor.getValue()));");
|
||||
evalJavaScript("editor.setValue(js_beautify(editor.getValue(), {indent_size: 2}));");
|
||||
}
|
||||
|
||||
public String[] getAvailableThemes() {
|
||||
@@ -173,6 +184,17 @@ public class CodeMirrorEditor extends FrameLayout {
|
||||
mWebView.setWebChromeClient(new MyWebChromeClient());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
|
||||
return super.startActionModeForChild(originalView, new EditorActionModeCallback(callback, this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback, int type) {
|
||||
return super.startActionModeForChild(originalView, new EditorActionModeCallback(callback, this), type);
|
||||
}
|
||||
|
||||
public void setReadOnly(boolean readOnly) {
|
||||
evalJavaScript(String.format("editor.setOption('readOnly', %b);", readOnly));
|
||||
}
|
||||
@@ -191,6 +213,7 @@ public class CodeMirrorEditor extends FrameLayout {
|
||||
mPageFinished.promise().done(result -> evalJavaScript("editor.replaceSelection(__bridge__.getStringFromAndroid());"));
|
||||
}
|
||||
|
||||
|
||||
public void loadFile(final File file) {
|
||||
setProgress(true);
|
||||
Observable.fromCallable(() -> PFiles.read(file))
|
||||
@@ -223,6 +246,42 @@ public class CodeMirrorEditor extends FrameLayout {
|
||||
" {line: editor.getCursor().line + 1, ch: 0});");
|
||||
}
|
||||
|
||||
public void copyLine() {
|
||||
getLine()
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(s -> {
|
||||
ClipboardUtil.setClip(getContext(), s);
|
||||
Snackbar.make(mWebView, R.string.text_already_copy_to_clip, Snackbar.LENGTH_SHORT).show();
|
||||
});
|
||||
}
|
||||
|
||||
public void cut() {
|
||||
getSelection().observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(s -> {
|
||||
ClipboardUtil.setClip(getContext(), s);
|
||||
evalJavaScript("editor.replaceSelection('');");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public void copy() {
|
||||
getSelection().observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(s -> ClipboardUtil.setClip(getContext(), s));
|
||||
}
|
||||
|
||||
public void paste() {
|
||||
CharSequence clip = ClipboardUtil.getClip(getContext());
|
||||
if (clip == null) {
|
||||
return;
|
||||
}
|
||||
evalJavaScript(String.format("editor.replaceSelection('%s');", clip.toString().replace("'", "\\'")));
|
||||
}
|
||||
|
||||
|
||||
public void selectAll() {
|
||||
evalJavaScript("editor.execCommand('selectAll');");
|
||||
}
|
||||
|
||||
public Observable<Integer> getLineCount() {
|
||||
mIntFromJs = PublishSubject.create();
|
||||
evalJavaScript("__bridge__.setIntFromJs(editor.lineCount())");
|
||||
@@ -438,18 +497,8 @@ public class CodeMirrorEditor extends FrameLayout {
|
||||
new ThemeColorMaterialDialogBuilder(getContext())
|
||||
.title(R.string.text_alert)
|
||||
.content(message)
|
||||
.onPositive(new MaterialDialog.SingleButtonCallback() {
|
||||
@Override
|
||||
public void onClick(@android.support.annotation.NonNull MaterialDialog dialog, @android.support.annotation.NonNull DialogAction which) {
|
||||
result.confirm();
|
||||
}
|
||||
})
|
||||
.cancelListener(new DialogInterface.OnCancelListener() {
|
||||
@Override
|
||||
public void onCancel(DialogInterface dialog) {
|
||||
result.cancel();
|
||||
}
|
||||
})
|
||||
.onPositive((dialog, which) -> result.confirm())
|
||||
.cancelListener(dialog -> result.cancel())
|
||||
.positiveText(R.string.ok)
|
||||
.show();
|
||||
return true;
|
||||
@@ -459,5 +508,27 @@ public class CodeMirrorEditor extends FrameLayout {
|
||||
public void onProgressChanged(WebView view, int newProgress) {
|
||||
setProgress(newProgress != 100);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onConsoleMessage(ConsoleMessage m) {
|
||||
switch (m.messageLevel()) {
|
||||
case LOG:
|
||||
Log.i(LOG_TAG, String.format("%s (%s:%d)", m.message(), m.sourceId(), m.lineNumber()));
|
||||
return true;
|
||||
case TIP:
|
||||
Log.v(LOG_TAG, String.format("%s (%s:%d)", m.message(), m.sourceId(), m.lineNumber()));
|
||||
return true;
|
||||
case DEBUG:
|
||||
Log.d(LOG_TAG, String.format("%s (%s:%d)", m.message(), m.sourceId(), m.lineNumber()));
|
||||
return true;
|
||||
case WARNING:
|
||||
Log.w(LOG_TAG, String.format("%s (%s:%d)", m.message(), m.sourceId(), m.lineNumber()));
|
||||
return true;
|
||||
case ERROR:
|
||||
Log.e(LOG_TAG, String.format("%s (%s:%d)", m.message(), m.sourceId(), m.lineNumber()));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,10 @@ package com.stardust.scriptdroid.ui.edit;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.view.ActionMode;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import com.stardust.scriptdroid.R;
|
||||
import com.stardust.scriptdroid.model.script.ScriptFile;
|
||||
@@ -25,7 +27,6 @@ import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_READ_ONLY;
|
||||
@EActivity(R.layout.activity_edit)
|
||||
public class EditActivity extends BaseActivity {
|
||||
|
||||
|
||||
@ViewById(R.id.editor_view)
|
||||
EditorView mEditor;
|
||||
|
||||
@@ -73,6 +74,16 @@ public class EditActivity extends BaseActivity {
|
||||
return mEditorMenu.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onActionModeStarted(ActionMode mode) {
|
||||
Menu menu = mode.getMenu();
|
||||
MenuItem item = menu.getItem(menu.size() - 1);
|
||||
menu.add(item.getGroupId(), R.id.action_delete_line, 10000, R.string.text_delete_line);
|
||||
menu.add(item.getGroupId(), R.id.action_copy_line, 20000, R.string.text_copy_line);
|
||||
super.onActionModeStarted(mode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finish() {
|
||||
if (mEditor.isTextChanged()) {
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.stardust.scriptdroid.ui.edit;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.support.v7.view.menu.MenuBuilder;
|
||||
import android.support.v7.view.menu.MenuItemImpl;
|
||||
import android.util.Log;
|
||||
import android.view.ActionMode;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import com.stardust.scriptdroid.R;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/11/2.
|
||||
*/
|
||||
|
||||
public class EditorActionModeCallback implements ActionMode.Callback {
|
||||
|
||||
|
||||
private static final int ID_SELECT_ALL = 34275489;
|
||||
|
||||
private ActionMode.Callback mCallback;
|
||||
private CodeMirrorEditor mEditor;
|
||||
|
||||
public EditorActionModeCallback(ActionMode.Callback callback, CodeMirrorEditor editor) {
|
||||
mCallback = callback;
|
||||
mEditor = editor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
||||
return mCallback.onCreateActionMode(mode, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
||||
return mCallback.onPrepareActionMode(mode, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.action_delete_line:
|
||||
mEditor.deleteLine();
|
||||
return true;
|
||||
case R.id.action_copy_line:
|
||||
mEditor.copyLine();
|
||||
mode.finish();
|
||||
return true;
|
||||
}
|
||||
return mCallback.onActionItemClicked(mode, item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyActionMode(ActionMode mode) {
|
||||
mCallback.onDestroyActionMode(mode);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -213,15 +213,7 @@ public class EditorMenu {
|
||||
}
|
||||
|
||||
private void copyLine() {
|
||||
mEditor.getLine()
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<String>() {
|
||||
@Override
|
||||
public void accept(@NonNull String s) throws Exception {
|
||||
ClipboardUtil.setClip(mContext, s);
|
||||
Snackbar.make(mEditorView, R.string.text_already_copy_to_clip, Snackbar.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
mEditor.copyLine();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user