From d6707d7dd69107000acf38088f56811ca4da3415 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 3 Feb 2018 20:39:15 +0800 Subject: [PATCH] opt: use my code completion implement instead CodeMirror's --- app/release/output.json | 2 +- .../addon/autojs/autojs-global-scope.js | 306 ------------------ .../codemirror/addon/autojs/autojs-hint.js | 171 ---------- app/src/main/assets/editor/index.html | 8 - app/src/main/assets/editor/index.js | 80 +---- .../model/autocomplete/AutoCompletion.java | 132 ++++++++ .../model/autocomplete/CodeCompletion.java | 44 +++ .../model/autocomplete/CodeCompletions.java | 48 +++ .../model/autocomplete/DictionaryTree.java | 83 +++++ .../autocomplete}/Symbols.java | 2 +- .../scriptdroid/model/indices/Module.java | 5 +- .../scriptdroid/model/indices/Property.java | 10 + .../scriptdroid/ui/edit/CodeMirrorEditor.java | 59 +--- .../scriptdroid/ui/edit/EditorView.java | 51 ++- .../ui/edit/completion/CodeCompletionBar.java | 29 +- .../ui/edit/completion/CodeCompletions.java | 60 ---- 16 files changed, 369 insertions(+), 721 deletions(-) delete mode 100644 app/src/main/assets/editor/codemirror/addon/autojs/autojs-global-scope.js delete mode 100644 app/src/main/assets/editor/codemirror/addon/autojs/autojs-hint.js create mode 100644 app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AutoCompletion.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/model/autocomplete/CodeCompletion.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/model/autocomplete/CodeCompletions.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/model/autocomplete/DictionaryTree.java rename app/src/main/java/com/stardust/scriptdroid/{ui/edit/completion => model/autocomplete}/Symbols.java (88%) delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletions.java diff --git a/app/release/output.json b/app/release/output.json index 26b720ac..62185ad7 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":246},"path":"release-3.0.0 Alpha46.apk","properties":{"packageId":"com.stardust.scriptdroid","split":"","minSdkVersion":"17"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":246},"path":"release-3.0.0 Beta.apk","properties":{"packageId":"com.stardust.scriptdroid","split":"","minSdkVersion":"17"}}] \ No newline at end of file diff --git a/app/src/main/assets/editor/codemirror/addon/autojs/autojs-global-scope.js b/app/src/main/assets/editor/codemirror/addon/autojs/autojs-global-scope.js deleted file mode 100644 index 647d2ad5..00000000 --- a/app/src/main/assets/editor/codemirror/addon/autojs/autojs-global-scope.js +++ /dev/null @@ -1,306 +0,0 @@ -function autoJsGlobalScope(){ - function FUNCTION(url){ - var f = function(){}; - f.__url__ = url; - return f; - } - function VARIABLE(url){ - return { - __url__: url - } - } - var app = { - "uninstall": FUNCTION("app.html#app_app_uninstall_packagename"), - "viewFile": FUNCTION("app.html#app_app_viewfile_path"), - "editFile": FUNCTION("app.html#app_app_editfile_path"), - "openUrl": FUNCTION("app.html#app_app_openurl_url"), - "launchPackage": FUNCTION("app.html#app_app_takephoto_path"), - "launch": FUNCTION("globals.html#globals_launchpackage_packagename"), - "launchApp": FUNCTION("globals.html#globals_launchapp_appname"), - "getPackageName": FUNCTION("globals.html#globals_getpackagename_appname"), - "openAppSetting": FUNCTION("globals.html#globals_getappname_packagename"), - __url__: "app.html" - }; - var automator = { - "click": FUNCTION("widgets-based-automation.html#widgets_based_automation_click_text_i"), - "longClick": FUNCTION("widgets-based-automation.html#widgets_based_automation_longclick_text_i"), - "press": FUNCTION(), - "swipe": FUNCTION(), - "gesture": FUNCTION(), - "gestures": FUNCTION(), - "gestureAsync": FUNCTION(), - "gesturesAsync": FUNCTION(), - "scrollDown": FUNCTION("widgets-based-automation.html#widgets_based_automation_scrollup_i"), - "scrollUp": FUNCTION("widgets-based-automation.html#widgets_based_automation_scrollup_i"), - "input": FUNCTION("widgets-based-automation.html#widgets_based_automation_input_i_text"), - "setText": FUNCTION("widgets-based-automation.html#widgets_based_automation_settext_i_text"), - __url__: "widgets-based-automation.html" - }; - var console = { - "show": FUNCTION("console.html#console_console_show"), - "hide": FUNCTION(), - "clear": FUNCTION("console.html#console_console_clear"), - "verbose": FUNCTION("console.html#console_console_verbose_data_args"), - "info": FUNCTION("console.html#console_console_info_data_args"), - "log": FUNCTION("console.html#console_console_log_data_args"), - "warn": FUNCTION("console.html#console_console_warn_data_args"), - "error": FUNCTION("console.html#console_console_error_data_args"), - "assert": FUNCTION("console.html#console_console_assert_value_message"), - __url__: "console.html" - }; - var dialogs = { - "select": FUNCTION(), - "singleChoice": FUNCTION(), - "multiChoice": FUNCTION(), - "rawInput": FUNCTION(), - "input": FUNCTION(), - "alert": FUNCTION(), - "confirm": FUNCTION(), - "prompt": FUNCTION() - }; - var images = { - "saveImage": FUNCTION("images.html#images_images_saveimage_image_path"), - "pixel": FUNCTION("images.html#images_images_pixel_image_x_y"), - "read": FUNCTION(), - "requestScreenCapture": FUNCTION("images.html#images_requestscreencapture_width_height"), - "captureScreen": FUNCTION("images.html#images_capturescreen"), - "findColor": FUNCTION("images.html#images_images_findcolor_image_color_options"), - "findColorInRegion": FUNCTION("images.html#images_images_findcolorinregion_img_color_x_y_width_height_threads_algorithm_threshold"), - "findColorEquals": FUNCTION("images.html#images_images_findcolorequals_img_color_x_y_width_height_threads"), - __url__: "images.html" - }; - var colors = { - "red": FUNCTION("images.html#images_colors_red_color"), - "green": FUNCTION("images.html#images_colors_green_color"), - "blue": FUNCTION("images.html#images_colors_blue_color"), - "alpha": FUNCTION("images.html#images_colors_alpha_color"), - "toString": FUNCTION("images.html#images_colors_tostring_color"), - "rgb": FUNCTION("images.html#images_colors_rgb_red_green_blue"), - "argb": FUNCTION("images.html#images_colors_argb_alpha_red_green_blue"), - __url__: "images.html#images_colors" - }; - var events = { - "emitter": FUNCTION("events.html#events_events_emitter"), - "observeKey": FUNCTION("events.html#events_events_observekey"), - "observeTouch": FUNCTION("events.html#events_events_observetouch"), - "observeNotification": FUNCTION("events.html#events_obversenotification"), - "onKeyDown": FUNCTION("events.html#events_events_onkeydown_keyname_listener"), - "onKeyUp": FUNCTION("events.html#events_events_onkeyup_keyname_listener"), - "onceKeyDown": FUNCTION("events.html#events_events_oncekeydown_keyname_listener"), - "onceKeyUp": FUNCTION("events.html#events_events_oncekeyup_keyname_listener"), - "onToast": FUNCTION("events.html#events_toast"), - "onNotification": FUNCTION("events.html#events_notification"), - "removeAllKeyDownListeners": FUNCTION("events.html#events_events_removeallkeydownlisteners_keyname"), - "removeAllKeyUpListeners": FUNCTION("events.html#events_events_removeallkeyuplisteners_keyname"), - "onTouch": FUNCTION("events.html#events_events_ontouch_listener"), - "removeAllTouchListeners": FUNCTION("events.html#events_events_removealltouchlisteners"), - "getTouchEventTimeout": FUNCTION("events.html#events_events_gettoucheventtimeout"), - "setTouchEventTimeout": FUNCTION("events.html#events_events_settoucheventtimeout_timeout"), - "on": FUNCTION("events.html#events_eventemitter_on_eventname_listener"), - "once": FUNCTION("events.html#events_eventemitter_once_eventname_listener"), - "emit": FUNCTION("events.html#events_eventemitter_emit_eventname_args"), - "getListeners": FUNCTION(), - "addListener": FUNCTION("events.html#events_eventemitter_addlistener_eventname_listener"), - "eventNames": FUNCTION("events.html#events_eventemitter_eventnames"), - "listenerCount": FUNCTION("events.html#events_eventemitter_listenercount_eventname"), - "listeners": FUNCTION("events.html#events_eventemitter_listeners_eventname"), - "prependListener": FUNCTION("events.html#events_eventemitter_prependlistener_eventname_listener"), - "prependOnceListener": FUNCTION("events.html#events_eventemitter_prependoncelistener_eventname_listener"), - "removeAllListeners": FUNCTION("events.html#events_eventemitter_removealllisteners_eventname"), - "removeListener": FUNCTION("events.html#events_eventemitter_removelistener_eventname_listener"), - "setMaxListeners": FUNCTION("events.html#events_eventemitter_setmaxlisteners_n"), - "getMaxListeners": FUNCTION("events.html#events_eventemitter_getmaxlisteners"), - "defaultMaxListeners": FUNCTION("events.html#events_eventemitter_defaultmaxlisteners"), - __url__: "events.html" - }; - var files = { - "open": FUNCTION(), - "isFile": FUNCTION("files.html#files_files_isfile_path"), - "isDir": FUNCTION("files.html#files_files_isdir_path"), - "isEmptyDir": FUNCTION("files.html#files_files_isemptydir_path"), - "join": FUNCTION("files.html#files_files_join_parent_child"), - "create": FUNCTION("files.html#files_files_create_path"), - "createIfNotExists": FUNCTION("files.html#files_files_createifnotexists_path"), - "exists": FUNCTION("files.html#files_files_exists_path"), - "ensureDir": FUNCTION("files.html#files_files_ensuredir_path"), - "read": FUNCTION("files.html#files_files_read_path_encoding_utf_8"), - "write": FUNCTION("files.html#files_files_write_path_text_encoding_utf_8"), - "copy": FUNCTION("files.html#files_files_copy_frompath_topath"), - "move": FUNCTION("files.html#files_files_move_frompath_topath"), - "rename": FUNCTION("files.html#files_files_rename_path_newname"), - "renameWithoutExtension": FUNCTION("files.html#files_files_renamewithoutextension_path_newname"), - "getName": FUNCTION("files.html#files_files_getname_path"), - "getExtension": FUNCTION("files.html#files_files_getextension_path"), - "getNameWithoutExtension": FUNCTION("files.html#files_files_getnamewithoutextension_path"), - "remove": FUNCTION("files.html#files_files_remove_path"), - "removeDir": FUNCTION("files.html#files_files_removedir_path"), - "getSdcardPath": FUNCTION("files.html#files_files_getsdcardpath"), - "listDir": FUNCTION("files.html#files_files_listdir_path_filter"), - __url__: "files.html" - }; - var timers = { - "setTimeout": FUNCTION("timers.html#timers_settimeout_callback_delay_args"), - "clearTimeout": FUNCTION("timers.html#timers_cleartimeout_id"), - "setInterval": FUNCTION("timers.html#timers_setinterval_callback_delay_args"), - "clearInterval": FUNCTION("timers.html#timers_clearinterval_id"), - "setImmediate": FUNCTION("timers.html#timers_setimmediate_callback_args"), - "clearImmediate": FUNCTION("timers.html#timers_clearimmediate_id") - }; - var globals = { - "app": app, - "automator": automator, - "console": console, - "dialogs": dialogs, - "events": events, - "images": images, - "files": files, - "timers": timers, - "ui": {}, - - "click": FUNCTION(), - "longClick": FUNCTION(), - "press": FUNCTION(), - "swipe": FUNCTION(), - "gesture": FUNCTION(), - "gestures": FUNCTION(), - "gestureAsync": FUNCTION(), - "gesturesAsync": FUNCTION(), - "scrollDown": FUNCTION(), - "scrollUp": FUNCTION(), - "input": FUNCTION(), - "setText": FUNCTION(), - - "print": FUNCTION(), - "log": FUNCTION(), - "err": FUNCTION(), - "openConsole": FUNCTION(), - "clearConsole": FUNCTION(), - - "rawInput": FUNCTION(), - "input": FUNCTION(), - "alert": FUNCTION(), - "confirm": FUNCTION(), - "prompt": FUNCTION(), - - "requestScreenCapture": FUNCTION(), - "captureScreen": FUNCTION(), - "findColor": FUNCTION(), - "findColorInRegion": FUNCTION(), - "findColorEquals": FUNCTION(), - - "open": FUNCTION(), - - "id": FUNCTION(), - "idContains": FUNCTION(), - "idStartsWith": FUNCTION(), - "idEndsWith": FUNCTION(), - "idMatches": FUNCTION(), - "text": FUNCTION(), - "textContains": FUNCTION(), - "textStartsWith": FUNCTION(), - "textEndsWith": FUNCTION(), - "textMatches": FUNCTION(), - "desc": FUNCTION(), - "descContains": FUNCTION(), - "descStartsWith": FUNCTION(), - "descEndsWith": FUNCTION(), - "descMatches": FUNCTION(), - "className": FUNCTION(), - "classNameContains": FUNCTION(), - "classNameStartsWith": FUNCTION(), - "classNameEndsWith": FUNCTION(), - "classNameMatches": FUNCTION(), - "packageName": FUNCTION(), - "packageNameContains": FUNCTION(), - "packageNameStartsWith": FUNCTION(), - "packageNameEndsWith": FUNCTION(), - "packageNameMatches": FUNCTION(), - "bounds": FUNCTION(), - "boundsInside": FUNCTION(), - "boundsContains": FUNCTION(), - "drawingOrder": FUNCTION(), - "checkable": FUNCTION(), - "checked": FUNCTION(), - "focusable": FUNCTION(), - "focused": FUNCTION(), - "visibleToUser": FUNCTION(), - "accessibilityFocused": FUNCTION(), - "selected": FUNCTION(), - "clickable": FUNCTION(), - "longClickable": FUNCTION(), - "enabled": FUNCTION(), - "password": FUNCTION(), - "scrollable": FUNCTION(), - "editable": FUNCTION(), - "contentInvalid": FUNCTION(), - "contextClickable": FUNCTION(), - "multiLine": FUNCTION(), - "dismissable": FUNCTION(), - "checkable": FUNCTION(), - "checked": FUNCTION(), - "focusable": FUNCTION(), - "focused": FUNCTION(), - "visibleToUser": FUNCTION(), - "accessibilityFocused": FUNCTION(), - "selected": FUNCTION(), - "clickable": FUNCTION(), - "longClickable": FUNCTION(), - "enabled": FUNCTION(), - "password": FUNCTION(), - "scrollable": FUNCTION(), - "editable": FUNCTION(), - "contentInvalid": FUNCTION(), - "contextClickable": FUNCTION(), - "multiLine": FUNCTION(), - "dismissable": FUNCTION(), - - "SetScreenMetrics": FUNCTION(), - "Tap": FUNCTION(), - "Swipe": FUNCTION(), - "Screencap": FUNCTION(), - "KeyCode": FUNCTION(), - "Home": FUNCTION(), - "Back": FUNCTION(), - "Power": FUNCTION(), - "Up": FUNCTION(), - "Down": FUNCTION(), - "Left": FUNCTION(), - "Right": FUNCTION(), - "OK": FUNCTION(), - "VolumeUp": FUNCTION(), - "VolumeDown": FUNCTION(), - "Menu": FUNCTION(), - "Camera": FUNCTION(), - "Text": FUNCTION(), - - "loop": FUNCTION(), - "setTimeout": FUNCTION(), - "clearTimeout": FUNCTION(), - "setInterval": FUNCTION(), - "clearInterval": FUNCTION(), - "setImmediate": FUNCTION(), - "clearImmediate": FUNCTION(), - - "newInjectableWebClient": FUNCTION(), - "newInjectableWebView": FUNCTION(), - - "toast": FUNCTION(), - "toastLog": FUNCTION(), - "sleep": FUNCTION(), - "isStopped": FUNCTION(), - "notStopped": FUNCTION(), - "exit": FUNCTION(), - "setClip": FUNCTION(), - "getClip": FUNCTION(), - "currentPackage": FUNCTION(), - "currentActivity": FUNCTION(), - "waitForActivity": FUNCTION(), - "waitForPackage": FUNCTION(), - "setScreenMetrics": FUNCTION(), - - "context": {}, - "activity": {} - }; - return globals; - } - diff --git a/app/src/main/assets/editor/codemirror/addon/autojs/autojs-hint.js b/app/src/main/assets/editor/codemirror/addon/autojs/autojs-hint.js deleted file mode 100644 index 293db28b..00000000 --- a/app/src/main/assets/editor/codemirror/addon/autojs/autojs-hint.js +++ /dev/null @@ -1,171 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - var Pos = CodeMirror.Pos; - - function forEach(arr, f) { - for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); - } - - function arrayContains(arr, item) { - if (!Array.prototype.indexOf) { - var i = arr.length; - while (i--) { - if (arr[i] === item) { - return true; - } - } - return false; - } - return arr.indexOf(item) != -1; - } - - function scriptHint(editor, keywords, getToken, options) { - // Find the token at the cursor - var cur = editor.getCursor(), token = getToken(editor, cur); - if (/\b(?:string|comment)\b/.test(token.type)) return; - token.state = CodeMirror.innerMode(editor.getMode(), token.state).state; - - // If it's not a 'word-style' token, ignore the token. - if (!/^[\w$_]*$/.test(token.string)) { - token = {start: cur.ch, end: cur.ch, string: "", state: token.state, - type: token.string == "." ? "property" : null}; - } else if (token.end > cur.ch) { - token.end = cur.ch; - token.string = token.string.slice(0, cur.ch - token.start); - } - - var tprop = token; - // If it is a property, find out what it is a property of. - while (tprop.type == "property") { - tprop = getToken(editor, Pos(cur.line, tprop.start)); - if (tprop.string != ".") return; - tprop = getToken(editor, Pos(cur.line, tprop.start)); - if (!context) var context = []; - context.push(tprop); - } - var c = getCompletions(token, context, keywords, options); - return {list: c.list, - urls: c.urls, - from: Pos(cur.line, token.start), - to: Pos(cur.line, token.end)}; - } - - function javascriptHint(editor, options) { - return scriptHint(editor, javascriptKeywords, - function (e, cur) {return e.getTokenAt(cur);}, - options); - }; - CodeMirror.registerHelper("hint", "javascript", javascriptHint); - - function getCoffeeScriptToken(editor, cur) { - // This getToken, it is for coffeescript, imitates the behavior of - // getTokenAt method in javascript.js, that is, returning "property" - // type and treat "." as indepenent token. - var token = editor.getTokenAt(cur); - if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { - token.end = token.start; - token.string = '.'; - token.type = "property"; - } - else if (/^\.[\w$_]*$/.test(token.string)) { - token.type = "property"; - token.start++; - token.string = token.string.replace(/\./, ''); - } - return token; - } - - function coffeescriptHint(editor, options) { - return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); - } - CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); - - var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + - "toUpperCase toLowerCase split concat match replace search").split(" "); - var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + - "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); - var funcProps = "prototype apply call bind".split(" "); - var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + - "if in instanceof new null return switch throw true try typeof var void while with").split(" "); - var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + - "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); - - function forAllProps(obj, callback) { - for (var name in obj) { - var value = obj[name]; - callback(name, value.__url__); - } - return; - //unreachable - if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) { - for (var name in obj) callback(name) - } else { - for (var o = obj; o; o = Object.getPrototypeOf(o)) - Object.getOwnPropertyNames(o).forEach(callback) - } - } - - function getCompletions(token, context, keywords, options) { - var found = [], start = token.string, global = options && options.globalScope || window; - var urls = []; - function maybeAdd(str, url) { - if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) { - found.push(str); - urls.push(url); - } - } - function gatherCompletions(obj) { - if (typeof obj == "string") forEach(stringProps, maybeAdd); - else if (obj instanceof Array) forEach(arrayProps, maybeAdd); - else if (obj instanceof Function) forEach(funcProps, maybeAdd); - forAllProps(obj, maybeAdd) - } - - if (context && context.length) { - // If this is a property, see if it belongs to some object we can - // find in the current environment. - var obj = context.pop(), base; - if (obj.type && obj.type.indexOf("variable") === 0) { - if (options && options.additionalContext) - base = options.additionalContext[obj.string]; - if (!options || options.useGlobalScope !== false) - base = base || global[obj.string]; - } else if (obj.type == "string") { - base = ""; - } else if (obj.type == "atom") { - base = 1; - } else if (obj.type == "function") { - if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && - (typeof global.jQuery == 'function')) - base = global.jQuery(); - else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function')) - base = global._(); - } - while (base != null && context.length) - base = base[context.pop().string]; - if (base != null) gatherCompletions(base); - } else { - // If not, just look in the global object and any local scope - // (reading into JS mode internals to get at the local and global variables) - for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); - for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name); - if (!options || options.useGlobalScope !== false) - gatherCompletions(global); - forEach(keywords, maybeAdd); - } - return { - list: found, - urls: urls - } - } - -}); diff --git a/app/src/main/assets/editor/index.html b/app/src/main/assets/editor/index.html index 5a072df4..ba653635 100644 --- a/app/src/main/assets/editor/index.html +++ b/app/src/main/assets/editor/index.html @@ -28,13 +28,6 @@ - - - - - - - @@ -43,7 +36,6 @@ -
diff --git a/app/src/main/assets/editor/index.js b/app/src/main/assets/editor/index.js index 79020446..0bd5833d 100644 --- a/app/src/main/assets/editor/index.js +++ b/app/src/main/assets/editor/index.js @@ -1,56 +1,4 @@ -var ExcludedIntelliSenseTriggerKeys = -{ - "8": "backspace", - "9": "tab", - "13": "enter", - "16": "shift", - "17": "ctrl", - "18": "alt", - "19": "pause", - "20": "capslock", - "27": "escape", - "32": "space", - "33": "pageup", - "34": "pagedown", - "35": "end", - "36": "home", - "37": "left", - "38": "up", - "39": "right", - "40": "down", - "45": "insert", - "46": "delete", - "91": "left window key", - "92": "right window key", - "93": "select", - "107": "add", - "109": "subtract", - "110": "decimal point", - "111": "divide", - "112": "f1", - "113": "f2", - "114": "f3", - "115": "f4", - "116": "f5", - "117": "f6", - "118": "f7", - "119": "f8", - "120": "f9", - "121": "f10", - "122": "f11", - "123": "f12", - "144": "numlock", - "145": "scrolllock", - "186": "semicolon", - "187": "equalsign", - "188": "comma", - "189": "dash", - "190": "period", - "191": "slash", - "192": "graveaccent", - "220": "backslash", - "222": "quote" -}; + var editor = CodeMirror(document.body, { lineNumbers: true, // 显示行数 indentUnit: 4, // 缩进单位为4 @@ -63,26 +11,16 @@ var editor = CodeMirror(document.body, { theme: 'neo' // 使用neo主题 }); editor.setOption("fullScreen", true); -editor.setOption("hintOptions", { - completeSingle: false, - globalScope: autoJsGlobalScope() -}); -var id = null; -editor.on("keyup", function(editor, event) -{ - if (!ExcludedIntelliSenseTriggerKeys[(event.keyCode || event.which).toString()] ) - { - if(id != null){ - clearTimeout(id); - } - id = setTimeout(function(){ - editor.showHint({ - completeSingle: false - }) - }, 100); + +editor.setCursor({line: 0, ch: 0}); +editor.on('change', function(){ + var c = editor.getCursor(); + if(typeof(__bridge__) != 'undefined'){ + __bridge__.onKeyUp(editor.getLine(c.line), c.ch); + }else{ + console.log(editor.getLine(c.line), c.ch); } }); -editor.setCursor({line: 0, ch: 0}); window.onload = function(){ autojs(editor); 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 new file mode 100644 index 00000000..c6e1aa4b --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/model/autocomplete/AutoCompletion.java @@ -0,0 +1,132 @@ +package com.stardust.scriptdroid.model.autocomplete; + +import android.content.Context; + +import com.stardust.scriptdroid.model.indices.Module; +import com.stardust.scriptdroid.model.indices.Modules; +import com.stardust.scriptdroid.model.indices.Property; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by Stardust on 2018/2/3. + */ + +public class AutoCompletion { + + public interface AutoCompleteCallback { + + void updateCodeCompletion(CodeCompletions codeCompletions); + } + + private static final Pattern STATEMENT = Pattern.compile("([A-Za-z]+\\.)?([a-zA-Z][a-zA-Z0-9_]*)?$"); + + private String mModuleName; + private String mPropertyPrefill; + private List