wide/static/js/hotkeys.js

168 lines
6.2 KiB
JavaScript

var hotkeys = {
defaultKeyMap: {
// Ctrl+1 焦点切换到文件树
goFileTree: {
ctrlKey: true,
altKey: false,
shiftKey: false,
which: 49
},
// Ctrl+4 焦点切换到输出窗口
goOutPut: {
ctrlKey: true,
altKey: false,
shiftKey: false,
which: 52
},
// F6 构建并运行
buildRun: {
ctrlKey: false,
altKey: false,
shiftKey: false,
which: 117
}
},
_bindFileTree: function() {
// TODO: 滚动处理
$("#files").keydown(function(event) {
switch (event.which) {
case 46: // 删除
tree.removeIt();
break;
case 13: // 回车
if (!wide.curNode) {
return false;
}
if (wide.curNode.iconSkin === "ico-ztree-dir ") { // 选中节点是目录
// 不做任何处理
return false;
}
// 模拟点击:打开文件
tree._onClick(wide.curNode);
break;
case 38: // 上
var node = {};
if (!wide.curNode) { // 没有选中节点时,默认选中第一个
node = tree.fileTree.getNodeByTId("files_1");
} else {
if (wide.curNode && wide.curNode.isFirstNode && wide.curNode.level === 0) {
// 当前节点为顶部第一个节点
return false;
}
node = wide.curNode.getPreNode();
if (wide.curNode.isFirstNode && wide.curNode.getParentNode()) {
// 当前节点为第一个节点且有父亲
node = wide.curNode.getParentNode();
}
var preNode = wide.curNode.getPreNode();
if (preNode && preNode.iconSkin === "ico-ztree-dir "
&& preNode.open) {
// 当前节点的上一个节点是目录且打开时,获取打开节点中的最后一个节点
node = tree.getCurrentNodeLastNode(preNode);
}
}
wide.curNode = node;
tree.fileTree.selectNode(node);
$("#files").focus();
break;
case 40: // 下
var node = {};
if (!wide.curNode) { // 没有选中节点时,默认选中第一个
node = tree.fileTree.getNodeByTId("files_1");
} else {
if (wide.curNode && tree.isBottomNode(wide.curNode)) {
// 当前节点为最底部的节点
return false;
}
node = wide.curNode.getNextNode();
if (wide.curNode.iconSkin === "ico-ztree-dir " && wide.curNode.open) {
// 当前节点是目录且打开时
node = wide.curNode.children[0];
}
var nextShowNode = tree.getNextShowNode(wide.curNode);
if (wide.curNode.isLastNode && wide.curNode.level !== 0 && !wide.curNode.open
&& nextShowNode) {
// 当前节点为最后一个叶子节点,但其父或祖先节点还有下一个节点
node = nextShowNode;
}
}
wide.curNode = node;
tree.fileTree.selectNode(node);
$("#files").focus();
break;
case 37: // 左
if (!wide.curNode) {
wide.curNode = tree.fileTree.getNodeByTId("files_1");
tree.fileTree.selectNode(wide.curNode);
$("#files").focus();
return false;
}
if (wide.curNode.iconSkin !== "ico-ztree-dir " || !wide.curNode.open) {
return false;
}
tree.fileTree.expandNode(wide.curNode, false, false, true);
$("#files").focus();
break;
case 39: // 右
if (!wide.curNode) {
wide.curNode = tree.fileTree.getNodeByTId("files_1");
tree.fileTree.selectNode(wide.curNode);
$("#files").focus();
return false;
}
if (wide.curNode.iconSkin !== "ico-ztree-dir " || wide.curNode.open) {
return false;
}
tree.fileTree.expandNode(wide.curNode, true, false, true);
$("#files").focus();
break;
}
});
},
init: function() {
this._bindFileTree();
var hotKeys = this.defaultKeyMap;
$(document).keydown(function(event) {
if (event.ctrlKey === hotKeys.goFileTree.ctrlKey
&& event.which === hotKeys.goFileTree.which) { // Ctrl+1 焦点切换到文件树
// 有些元素需设置 tabindex 为 -1 时才可以 focus
$("#files").focus();
event.preventDefault();
return;
}
if (event.ctrlKey === hotKeys.goOutPut.ctrlKey
&& event.which === hotKeys.goOutPut.which) { // Ctrl+4 焦点切换到输出窗口
$("#output").focus();
event.preventDefault();
return;
}
if (event.which === hotKeys.buildRun.which) { // F6 构建并运行
wide.run();
event.preventDefault();
return;
}
});
}
};