From 04a094dbd8becb5c5a9d38b86bed681ff48bcb14 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Mon, 17 Jan 2022 17:59:18 +0800 Subject: [PATCH] opt inner.js --- frame.js | 78 +++++++++++++++-- lib/user.js | 1 - plugin/input/key.js | 41 +-------- plugin/local/code/inner.js | 135 ++++++++++++++++++++---------- plugin/local/code/inner/search.js | 51 +++++++++-- proto.js | 4 + 6 files changed, 215 insertions(+), 95 deletions(-) diff --git a/frame.js b/frame.js index 50778f20..504074c5 100644 --- a/frame.js +++ b/frame.js @@ -194,7 +194,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.core.ItemCB(input.onaction, function(key, cb) { input._target[key] = function(event) { cb(event, input) } }), skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]); - + can.core.ItemCB(item, function(key, cb) { + input._target[key] = function(event) { cb(event, input) } + }); (item.action||can.core.Value(meta, "feature.inputs")) && can.onappend.figure(input, item, input._target) }) }; can.core.Next(can.base.Obj(meta.inputs, can.core.Value(can, "onimport.list")).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add) @@ -240,7 +242,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, _output: function(can, msg, display, output) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: output, _fields: can._target, - _option: can._option, _action: can._action, _output: can._output, _status: can._status, + _option: can._option, _action: can._action, _output: can._output, _status: can._status, _legend: can._legend, Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, }, [display, chat.PLUGIN_TABLE_JS], function(table) { table.Conf(can.Conf()) table.run = function(event, cmds, cb, silent) { var msg = can.request(event) @@ -274,14 +276,14 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.page.Modify(can, item, {draggable: true, _close: cbs, onmouseenter: function(event) { can.user.carte(event, can, kit.Dict( - cli.CLOSE, function(event) { close(item) }, + "close tab", function(event) { close(item) }, "close other", function(event) { can.page.Select(can, action, chat.DIV_TABS, function(_item) { _item == item || close(_item) }) }, "close all", function(event) { can.page.Select(can, action, chat.DIV_TABS, close) }, - ), [cli.CLOSE, "close other", "close all"]) + ), ["close tab", "close other", "close all"]) }, ondragstart: function(event) { var target = event.target; target.click() action._drop = function(event, before) { action.insertBefore(target, before) } @@ -576,7 +578,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe }) Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, target) { }, - focus: function(can, target) { + focus: function(can, target) { if (!target) { return } target.setSelectionRange(0, -1), target.focus() }, clear: function(can, target) { @@ -759,6 +761,71 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe can.base.isFunc(cb) && cb() }) }, + + selectTable: function(event, can, target, cb) { + if (event.ctrlKey) { + function select(order) { + var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { + if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } + if (!can.page.ClassList.set(can, tr, html.SELECT, order == index++)) { return tr} + can.base.isFunc(cb) && cb(tr) + can.Status("index", index-1) + return tr + }).length + } + switch (event.key) { + case "n": + var total = select(target._index) + select(target._index = ((target._index)+1) % total) + can.onkeypop.prevent(event) + break + case "p": + var total = select(target._index) + select(target._index = (target._index-1) < 0? total-1: (target._index-1)) + can.onkeypop.prevent(event) + break + default: target._index = 0 + } + } + }, + selectTableInput: function(event, can, target, cb) { + if (event.ctrlKey) { + function select(order) { if (order == 0) { target.value = target._value } + var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { + if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } + can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr } + can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) { + target._value = target._value||target.value, index == 0 && (target.value = td.innerText) + }); return tr + }).length + } + switch (event.key) { + case "n": + var total = select(target._index) + select(target._index = ((target._index)+1) % total) + break + case "p": + var total = select(target._index) + select(target._index = (target._index-1) < 0? total-1: (target._index-1)) + break + default: target._index = 0, target._value = "" + } + return + } + + target._index = 0, target._value = "" + can.page.Select(can, can._output, html.TR, function(tr, index) { + var has = false; can.page.Select(can, tr, html.TD, function(td) { + has = has || td.innerText.indexOf(target.value)>-1 + }), can.page.ClassList.set(can, tr, html.HIDDEN, !has && index != 0) + }) + + var total = can.page.Select(can, can._output, html.TR, function(tr) { + if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr} + }).length-1 + total == 0 && can.base.isFunc(cb) && cb() + can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index)) + }, }) Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { document.body.onkeydown = function(event) { var msg = can.request(event) @@ -766,6 +833,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio msg.Option("model", event.ctrlKey? "insert_ctrl": "insert") return } + if (event.metaKey) { return } if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } can.onengine.signal(can, "onkeydown", msg) if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } diff --git a/lib/user.js b/lib/user.js index fe4b2757..a566f3b8 100644 --- a/lib/user.js +++ b/lib/user.js @@ -68,7 +68,6 @@ Volcanos("user", {help: "用户操作", agent: { "list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享", "edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏", "project": "项目", "profile": "详情", "actions": "参数", - "find": "查找", "grep": "搜索", "open": "打开", "close": "关闭", "start": "启动", "stop": "停止", diff --git a/plugin/input/key.js b/plugin/input/key.js index 94aee988..d22d1858 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -18,28 +18,6 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { }) }, - _select: function(event, can, target) { - function select(order) { if (order == 0) { target.value = target._value } - var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { - if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } - can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr } - can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) { - target._value = target._value||target.value, index == 0 && (target.value = td.innerText) - }); return tr - }).length - } - switch (event.key) { - case "n": - var total = select(target._index) - select(target._index = ((target._index)+1) % total) - break - case "p": - var total = select(target._index) - select(target._index = (target._index-1) < 0? total-1: (target._index-1)) - break - default: target._index = 0, target._value = "" - } - }, onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) { target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)}) can.onfigure.key._show(can, meta, cbs, target) @@ -51,26 +29,13 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { }) }, onkeydown: function(event, can, meta, cb, target, last) { if (target._figure) { if (!(can = target._can)) { return } - if (event.ctrlKey) { can.onfigure.key._select(event, can, target) } else { - target._index = 0, target._value = "" - switch (event.key) { case lang.ENTER: can.close(); return } - can.page.Select(can, can._output, html.TR, function(tr, index) { - var has = false; can.page.Select(can, tr, html.TD, function(td) { - has = has || td.innerText.indexOf(target.value)>-1 - }), can.page.ClassList.set(can, tr, html.HIDDEN, !has && index != 0) - }) - } - - var total = can.page.Select(can, can._output, html.TR, function(tr) { - if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr} - }).length-1 - if (total == 0) { + switch (event.key) { case lang.ENTER: can.close(); return } + can.onmotion.selectTableInput(event, can, target, function() { can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) target._msg = msg }) - } - can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index)) + }) } if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) { diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 2782e162..639e58ca 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,6 +1,6 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) { can.tabview = can.tabview||{}, can.tabview[can.Option(nfs.PATH)+ice.DF+can.Option(nfs.FILE)] = msg - can.history = can.history||[], can.toolkit = {}, can.plugins = {} + can.history = can.history||[], can.toolkit = {}, can.extentions = {} can.onmotion.clear(can), can.onlayout.profile(can) can.onimport._project(can, can.ui.project) @@ -48,17 +48,13 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.ui.toolkit = can.onappend.field(can, "toolkit", {}, can._output) }, _session: function(can, msg) { can.onimport.sess(can, "", function() { can.onimport.sess(can, { - tool: can.core.Split(msg.OptionOrSearch("tool")).reverse(), + exts: can.core.Split(msg.OptionOrSearch("exts")).reverse(), plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(), tabs: can.core.Split(msg.OptionOrSearch("tabs")), }) }) }, - _keydown: function(can) { + _keydown: function(can) { can.onkeypop._build(can) can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { - var cb = can.onaction[kit.Dict( - "f", "打开", "t", "添加", "e", "扩展", "p", "插件", - "r", "执行", "v", "展示", "s", "保存", - lang.ESCAPE, "清屏", - )[event.key]]; can.base.isFunc(cb) && cb(event, can) + can._key_list = can.onkeypop._parse(event, can, "normal", can._key_list, can.ui.content) }) }, @@ -72,7 +68,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, true) }, tabview: function(can, path, file, line, cb) { var key = path+ice.DF+file - if (can.tabview[key]) { + if (can.tabview[key]) { can.user.mod.isCmd && can.user.title(file) can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key] can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1}) return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb) @@ -92,7 +88,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target // can.onappend.table(can, msg, null, can.ui.profile_output) can.onappend.board(can, msg.Result(), can.ui.profile_output) } - can.page.style(can, can.ui.profile_output, html.WIDTH, (can.Conf(html.WIDTH)-can.ui.project.offsetWidth)/2) + can.page.style(can, can.ui.profile_output, html.WIDTH, (can.ConfWidth()-can.ui.project.offsetWidth)/2) can.onmotion.hidden(can, can.ui.profile, true), can.onimport.layout(can) }, display: function(can, msg) { @@ -100,15 +96,16 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target // can.onappend.table(can, msg, null, can.ui.display_output) can.onappend.board(can, msg.Result(), can.ui.display_output) } - can.page.style(can, can.ui.display_output, html.HEIGHT, 200) + can.page.style(can, can.ui.display_output, html.HEIGHT, can.ConfHeight()/4) can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can) }, toolkit: function(can, meta, cb) { meta.opts = meta.opts||{repos: can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) } can.onimport.plugin(can, meta, can.ui.toolkit.output, function(sub) { - sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT)-4*html.ACTION_HEIGHT, html.WIDTH, can.Conf(html.WIDTH)) - sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.Conf(html.HEIGHT)) - sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.Conf(html.WIDTH)); + sub.ConfHeight(can.ConfHeight()-4*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth()) + sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight()) + sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth()) + sub.select = function() { return sub._legend.click(), sub } var status = can.user.mod.isCmd? can._status: can.ui.toolkit.status status.appendChild(sub._legend), sub._legend.onclick = function(event) { @@ -119,7 +116,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target } can.onmotion.select(can, status, html.DIV_LEGEND, event.target) can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target) - can.page.Select(can, sub._option, html.OPTION_ARGS)[0].focus() + can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0]) }, can.base.isFunc(cb) && cb(sub) }) }, @@ -130,7 +127,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, can.base.isFunc(cb) && cb(sub) }, target) }, - layout: function(can) { var height = can.Conf(html.HEIGHT), width = can.Conf(html.WIDTH) + layout: function(can) { var height = can.ConfHeight(), width = can.ConfWidth() can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height) if (can.ui.project.style.display != html.NONE) { can.page.style(can, can.ui.project, html.HEIGHT, can.ui.content.offsetHeight) @@ -141,17 +138,15 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.page.style(can, can.ui.content, html.WIDTH, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-25) can.page.style(can, can.ui.profile_output, html.HEIGHT, can.ui.content.offsetHeight-html.ACTION_HEIGHT) }, - plug: function(can, url, cb) { - can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), cb) }) + exts: function(can, url, cb) { + can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), function(sub) { + can.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb) && cb(sub) + }) }) }, sess: function(can, sess, cb) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {}) - can.core.Next(sess.tool, function(item, next) { - can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) - }, function() { - can.core.Next(sess.plug, function(item, next) { can.onimport.plug(can, item, next) }, function() { - can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF) - can.onimport.tabview(can, ls[0], ls[1], ls[2], next) - }, cb) + can.core.Next(sess.exts, function(item, next) { can.onimport.exts(can, item, next) }, function() { + can.core.Next(sess.plug, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) }, function() { + can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1], ls[2], next) }, cb) }) }) }, @@ -164,7 +159,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], can.parse = can.base.Ext(can.file), can.Status("模式", "normal") can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab) msg.Option(ctx.INDEX) && can.core.Timer(100, function() { - var input = can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]; input && input.focus() + can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }) return can.file }, can.ui.content, can.ui.profile_output, can.ui.display_output)) { @@ -174,7 +169,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], if (msg.Option(ctx.INDEX)) { can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { can.core.Timer(100, function() { - var input = can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]; input && input.focus() + can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }), can.base.isFunc(cb) && cb() }) return @@ -217,7 +212,36 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], return line }, }) -Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展", "插件", "保存"], + +Volcanos("onkeypop", {help: "导入数据", _init: function(can, msg, cb, target) { + }, + _mode: { + normal: { + escape: function(event, can, target) { can.onaction["清屏"](event, can) }, + g: function(event, can, target) { can.onaction["搜索"](event, can) }, + f: function(event, can, target) { can.onaction["打开"](event, can) }, + t: function(event, can, target) { can.onaction["添加"](event, can) }, + p: function(event, can, target) { can.onaction["插件"](event, can) }, + e: function(event, can, target) { can.onaction["扩展"](event, can) }, + + q: function(event, can, target) { can.onaction["全屏"](event, can) }, + r: function(event, can, target) { can.onaction["执行"](event, can) }, + v: function(event, can, target) { can.onaction["展示"](event, can) }, + s: function(event, can, target) { can.onaction["保存"](event, can) }, + + j: function(event, can, target) { can.onaction.scrollLine(can, 1) }, + k: function(event, can, target) { can.onaction.scrollLine(can, -1) }, + J: function(event, can, target) { can.onaction.scrollLine(can, 20) }, + K: function(event, can, target) { can.onaction.scrollLine(can, -20) }, + }, + }, _engine: {}, +}) +Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展", "保存"], + "搜索": function(event, can) { + can.user.input(event, can, [[ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE], mdb.NAME], function(event, button, data, list, args) { + can.ui.search.Update({}, [ctx.ACTION, data.action, data.name]) + }) + }, "打开": function(event, can) { can.user.input(event, can, [nfs.FILE], function(event, button, data, list, args) { can.onimport.tabview(can, can.Option(nfs.PATH), data.file) @@ -228,19 +252,16 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展", can.onimport.tabview(can, can.Option(nfs.PATH), data.index, ctx.INDEX) }) }, - "扩展": function(event, can) { + "插件": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { - var sub = can.toolkit[data.index]; if (sub) { sub._legend.click(); return } - can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub - sub._legend.click(), sub.page.Select(sub, sub._target, html.OPTION_ARGS)[0].focus() - }) + var sub = can.toolkit[data.index]; if (sub) { sub.select(); return } + can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub.select() }) }) }, - "插件": function(event, can) { + "扩展": function(event, can) { can.user.input(event, can, ["url"], function(event, button, data, list, args) { - can.onimport.plug(can, data.url, function(sub) { can.plugins[data.url] = sub - sub._legend.click(), sub.page.Select(sub, sub._target, html.OPTION_ARGS)[0].focus() - }) + var sub = can.extentions[data.url]; if (sub) { sub.select(); return } + can.onimport.exts(can, data.url, function(sub) { can.extentions[data.url] = sub.select() }) }) }, "保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) }, @@ -264,16 +285,46 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展", if (can.page.Select(can, can.ui.toolkit.status, "div.select", function(item) { return item.click(), item }).length > 0) { return } + if (can.page.Select(can, can.ui.toolkit.output, "fieldset.select", function(item) { + return can.onmotion.hidden(can, item), item + }).length > 0) { return } can.onmotion.hidden(can, can.ui.profile) can.onmotion.hidden(can, can.ui.display) can.onimport.layout(can) }, + "全屏": function(event, can) { + if (can._action.style.display == html.NONE) { + can.onmotion.hidden(can, can._legend, true) + can.onmotion.hidden(can, can._option, true) + can.onmotion.hidden(can, can._action, true) + can.onmotion.hidden(can, can._status, true) + can.onmotion.hidden(can, can.ui.project, true) + can.ConfHeight(window.innerHeight-2*html.ACTION_HEIGHT) + can.onimport.layout(can) + return + } + can.onaction["清屏"](event, can) + can.onaction["清屏"](event, can) + can.onaction["清屏"](event, can) + can.onaction["清屏"](event, can) + + can.onmotion.hidden(can, can.ui.project) + can.onmotion.hidden(can, can._status) + can.onmotion.hidden(can, can._action) + can.onmotion.hidden(can, can._option) + can.onmotion.hidden(can, can._legend) + can.ConfHeight(window.innerHeight) + can.onimport.layout(can) + }, back: function(event, can) { can.history.pop(); var last = can.history.pop() last && can.onimport.tabview(can, last.path, last.file, last.line) can.Status("跳转数", can.history.length) }, + scrollLine: function(can, count) { var size = 20 + can.current.scroll(0, count*size) + }, appendLine: function(can, value) { var ui = can.page.Append(can, can.ui.content, [{type: html.TR, list: [ {view: ["line unselectable", html.TD, ++can.max], onclick: function(event) { @@ -326,7 +377,7 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展", can.current.scroll(0, pos-can.current.window()/2) } - var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE)} + var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()} can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push) can.Status("跳转数", can.history.length) }) @@ -335,7 +386,7 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展", // can.onkeymap && can.onkeymap.selectLine(can) }, searchLine: function(event, can, value) { if (!can.ui.search) { return } - can.ui.search.Update(event, [ctx.ACTION, nfs.FIND, value.trim()]) + can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()]) }, favorLine: function(can, value) { can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, meta, list) { @@ -349,12 +400,12 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展", Volcanos("onexport", {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"], sess: function(can) { localStorage.setItem("web.code.inner.sess", JSON.stringify({ - "tabs": can.onexport.tabs(can), "tool": can.onexport.tool(can), "plug": can.onexport.plug(can), + "tabs": can.onexport.tabs(can), "plug": can.onexport.plug(can), "exts": can.onexport.exts(can), })) }, tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) }, - tool: function(can) { return can.core.Item(can.toolkit) }, - plug: function(can) { return can.core.Item(can.plugins) }, + plug: function(can) { return can.core.Item(can.toolkit) }, + exts: function(can) { return can.core.Item(can.plugins) }, position: function(can, index, total) { total = total||can.max return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" }, diff --git a/plugin/local/code/inner/search.js b/plugin/local/code/inner/search.js index 19b035ba..9a3fc074 100644 --- a/plugin/local/code/inner/search.js +++ b/plugin/local/code/inner/search.js @@ -1,23 +1,56 @@ -Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = [] +Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = []; const SEARCH = "can.code.inner.search" function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word) sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) { return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) { line.line && can.onimport.tabview(can, can.Option(nfs.PATH), line.file.replace(ice.PWD, ""), parseInt(line.line)) }} - }, sub._output), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length()) + }, sub._output), sub.onappend.board(sub, msg.Result()), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length()) } - can.onengine.plugin(can, "can.code.inner.search", shy("搜索", {}, [ - {type: html.TEXT, name: "word", value: cli.MAIN}, {type: html.BUTTON, name: nfs.FIND}, {type: html.BUTTON, name: "last"}, - ], function(msg, cmds, cb) { can.misc.runAction(can, msg, cmds, cb, kit.Dict( - nfs.FIND, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text")) + can.onengine.plugin(can, SEARCH, shy("搜索", {}, [ + {type: html.TEXT, name: "word", value: cli.MAIN, onkeydown: function(event, can) { + can.onmotion.selectTable(event, can.sup, event.target, function(tr) { + can.page.Select(can, tr, html.TD, function(td, index) { index == 0 && td.click() }) + tr.scrollIntoView(), can._output.scrollTop -= 60 + }) + if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) } + if (event.key == lang.ESCAPE) { event.target.blur() } + }}, + {type: html.TEXT, name: "filter", value: "", onkeydown: function(event, can) { + can.onmotion.selectTableInput(event, can.sup, event.target) + if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) } + if (event.key == lang.ESCAPE) { event.target.blur() } + }}, + {type: html.BUTTON, name: nfs.TAGS}, + {type: html.BUTTON, name: nfs.GREP}, + {type: html.BUTTON, name: cli.MAKE}, + {type: html.BUTTON, name: "history"}, + {type: html.BUTTON, name: "last", _trans: "返回"}, + ], function(msg, cmds, cb) { if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( + "history", function(cmds) { + can.core.List(can.history, function(item) { + msg.Push(nfs.FILE, item.file) + msg.Push(nfs.LINE, item.line) + msg.Push(mdb.TEXT, item.text) + }) + show(msg) + }, + nfs.TAGS, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text")) can.run(msg._event, [ctx.ACTION, mdb.SEARCH, can.parse, cmds[0], can.Option(nfs.PATH)], function(msg) { var sub = msg._can - can.page.style(can, sub._output, html.MAX_HEIGHT, 200), show(msg, msg._word = cmds[0]) + can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0]) can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click() + can.onmotion.focus(can, msg._can._inputs["word"]._target) + }, true) + }, + nfs.GREP, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text", nfs.PATH, can.Option(nfs.PATH))) + can.run(msg._event, [ctx.ACTION, nfs.GREP, cmds[0]], function(msg) { var sub = msg._can + can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0]) + can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click() + can.onmotion.focus(can, msg._can._inputs["word"]._target) }, true) }, "last", function(cmds) { history.pop(), show(history.pop()) }, - )) })) - can.onimport.toolkit(can, {index: "can.code.inner.search"}, function(sub) { + ))) { return } can.run(msg._event, cmds, function(msg) { show(msg) }, true) })) + can.onimport.toolkit(can, {index: SEARCH}, function(sub) { can.ui.search = sub, can.base.isFunc(cb) && cb(sub) }) }}) diff --git a/proto.js b/proto.js index 075ce55e..29b8d70f 100644 --- a/proto.js +++ b/proto.js @@ -64,6 +64,7 @@ var cli = { EXEC: "exec", SHOW: "show", MAIN: "main", + MAKE: "make", RED: "red", GREEN: "green", BLUE: "blue", YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", @@ -104,6 +105,7 @@ var nfs = { DIR_ROOT: "dir_root", FIND: "find", GREP: "grep", SAVE: "save", LOAD: "load", + TAGS: "tags", } var tcp = { HOST: "host", PORT: "port", @@ -333,6 +335,8 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: getActionSize: function(cb) { return can.get("Action", "size", cb) }, search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, + ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) }, + ConfWidth: function(value) { return can.Conf(html.WIDTH, value) }, Conf: function(key, value) { var res = can._conf for (var i = 0; i < arguments.length; i += 2) { res = can.core.Value(can._conf, arguments[i], arguments[i+1])