2014-08-19 13:07:35 +04:00
|
|
|
var editors = {
|
|
|
|
data: [],
|
|
|
|
init: function() {
|
|
|
|
editors._initAutocomplete();
|
2014-08-29 13:24:08 +04:00
|
|
|
editors.tabs = new Tabs({
|
|
|
|
id: ".edit-panel",
|
|
|
|
clickAfter: function(id) {
|
|
|
|
// set tree node selected
|
|
|
|
var node = tree.fileTree.getNodeByTId(id);
|
|
|
|
tree.fileTree.selectNode(node);
|
|
|
|
wide.curNode = node;
|
|
|
|
|
|
|
|
for (var i = 0, ii = editors.data.length; i < ii; i++) {
|
|
|
|
if (editors.data[i].id === id) {
|
|
|
|
wide.curEditor = editors.data[i].editor;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
removeAfter: function(id, nextId) {
|
|
|
|
for (var i = 0, ii = editors.data.length; i < ii; i++) {
|
|
|
|
if (editors.data[i].id === id) {
|
|
|
|
editors.data.splice(i, 1);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!nextId) {
|
|
|
|
// 不存在打开的编辑器
|
|
|
|
// remove selected tree node
|
|
|
|
tree.fileTree.cancelSelectedNode();
|
|
|
|
wide.curNode = undefined;
|
|
|
|
|
|
|
|
wide.curEditor = undefined;
|
2014-08-30 08:54:46 +04:00
|
|
|
$(".ico-fullscreen").hide();
|
2014-08-29 13:24:08 +04:00
|
|
|
return false;
|
|
|
|
}
|
2014-08-30 08:54:46 +04:00
|
|
|
|
2014-08-29 13:24:08 +04:00
|
|
|
if (nextId === editors.tabs.getCurrentId()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// set tree node selected
|
|
|
|
var node = tree.fileTree.getNodeByTId(nextId);
|
|
|
|
tree.fileTree.selectNode(node);
|
|
|
|
wide.curNode = node;
|
|
|
|
|
|
|
|
for (var i = 0, ii = editors.data.length; i < ii; i++) {
|
|
|
|
if (editors.data[i].id === nextId) {
|
|
|
|
wide.curEditor = editors.data[i].editor;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2014-09-03 13:23:42 +04:00
|
|
|
|
|
|
|
|
|
|
|
$(".edit-header .tabs").on("dblclick", "div", function () {
|
|
|
|
editors.fullscreen();
|
|
|
|
});
|
2014-08-19 13:07:35 +04:00
|
|
|
},
|
2014-08-30 08:54:46 +04:00
|
|
|
fullscreen: function() {
|
|
|
|
wide.curEditor.setOption("fullScreen", true);
|
|
|
|
},
|
2014-08-19 13:07:35 +04:00
|
|
|
_initAutocomplete: function() {
|
2014-08-27 14:10:12 +04:00
|
|
|
CodeMirror.registerHelper("hint", "go", function(editor) {
|
|
|
|
var word = /[\w$]+/;
|
|
|
|
|
2014-08-22 05:44:41 +04:00
|
|
|
var cur = editor.getCursor(), curLine = editor.getLine(cur.line);
|
2014-08-27 14:10:12 +04:00
|
|
|
|
|
|
|
var start = cur.ch, end = start;
|
2014-08-31 17:49:27 +04:00
|
|
|
while (end < curLine.length && word.test(curLine.charAt(end))) {
|
2014-08-27 14:10:12 +04:00
|
|
|
++end;
|
2014-09-02 20:05:05 +04:00
|
|
|
}
|
2014-08-31 17:49:27 +04:00
|
|
|
while (start && word.test(curLine.charAt(start - 1))) {
|
2014-08-27 14:10:12 +04:00
|
|
|
--start;
|
2014-09-02 20:05:05 +04:00
|
|
|
}
|
2014-08-19 13:07:35 +04:00
|
|
|
var request = {
|
|
|
|
code: editor.getValue(),
|
2014-08-31 17:49:27 +04:00
|
|
|
cursorLine: cur.line,
|
|
|
|
cursorCh: cur.ch
|
2014-08-19 13:07:35 +04:00
|
|
|
};
|
2014-08-18 17:45:43 +04:00
|
|
|
|
2014-08-19 13:07:35 +04:00
|
|
|
var autocompleteHints = [];
|
2014-08-18 17:45:43 +04:00
|
|
|
|
2014-08-19 13:07:35 +04:00
|
|
|
$.ajax({
|
|
|
|
async: false, // 同步执行
|
|
|
|
type: 'POST',
|
|
|
|
url: '/autocomplete',
|
|
|
|
data: JSON.stringify(request),
|
|
|
|
dataType: "json",
|
|
|
|
success: function(data) {
|
|
|
|
var autocompleteArray = data[1];
|
2014-08-27 14:10:12 +04:00
|
|
|
|
|
|
|
if (autocompleteArray) {
|
|
|
|
for (var i = 0; i < autocompleteArray.length; i++) {
|
|
|
|
autocompleteHints[i] = autocompleteArray[i].name;
|
|
|
|
}
|
|
|
|
}
|
2014-08-18 17:45:43 +04:00
|
|
|
}
|
2014-08-19 13:07:35 +04:00
|
|
|
});
|
|
|
|
|
2014-08-22 05:44:41 +04:00
|
|
|
return {list: autocompleteHints, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};
|
|
|
|
});
|
2014-08-27 14:10:12 +04:00
|
|
|
|
|
|
|
CodeMirror.commands.autocompleteAfterDot = function(cm) {
|
|
|
|
setTimeout(function() {
|
|
|
|
if (!cm.state.completionActive) {
|
|
|
|
cm.showHint({hint: CodeMirror.hint.go, completeSingle: false});
|
|
|
|
}
|
|
|
|
}, 50);
|
|
|
|
|
|
|
|
return CodeMirror.Pass;
|
|
|
|
};
|
|
|
|
|
|
|
|
CodeMirror.commands.autocompleteAnyWord = function(cm) {
|
|
|
|
cm.showHint({hint: CodeMirror.hint.auto});
|
|
|
|
};
|
2014-09-02 20:05:05 +04:00
|
|
|
|
|
|
|
CodeMirror.commands.autocompleteRightPart = function(cm) {
|
|
|
|
setTimeout(function() {
|
|
|
|
var cur = cm.getCursor();
|
|
|
|
var curLine = cm.getLine(cur.line);
|
|
|
|
var curChar = curLine.charAt(cur.ch - 1);
|
|
|
|
|
|
|
|
replacement = '';
|
|
|
|
|
|
|
|
switch (curChar) {
|
|
|
|
case '(':
|
|
|
|
replacement = ')';
|
|
|
|
break;
|
|
|
|
case '[':
|
|
|
|
replacement = ']';
|
|
|
|
break;
|
|
|
|
case '{':
|
|
|
|
replacement = '}';
|
|
|
|
break;
|
|
|
|
default: // " or '
|
|
|
|
replacement = curChar;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
cm.replaceRange(replacement, CodeMirror.Pos(cur.line, cur.ch));
|
|
|
|
cm.setCursor(CodeMirror.Pos(cur.line, cur.ch));
|
|
|
|
}, 50);
|
|
|
|
|
|
|
|
return CodeMirror.Pass;
|
|
|
|
};
|
|
|
|
|
|
|
|
CodeMirror.commands.gotoLine = function(cm) {
|
|
|
|
var line = prompt("Go To Line: ", "0");
|
|
|
|
|
2014-08-31 18:45:19 +04:00
|
|
|
cm.setCursor(CodeMirror.Pos(line - 1, 0));
|
|
|
|
};
|
2014-09-02 20:05:05 +04:00
|
|
|
|
|
|
|
CodeMirror.commands.doNothing = function(cm) {
|
|
|
|
};
|
2014-08-19 13:07:35 +04:00
|
|
|
},
|
|
|
|
newEditor: function(data) {
|
2014-08-30 08:54:46 +04:00
|
|
|
$(".ico-fullscreen").show();
|
2014-08-19 13:07:35 +04:00
|
|
|
var id = wide.curNode.tId;
|
|
|
|
for (var i = 0, ii = editors.data.length; i < ii; i++) {
|
|
|
|
if (editors.data[i].id === id) {
|
2014-08-29 13:24:08 +04:00
|
|
|
editors.tabs.setCurrent(id);
|
2014-09-03 13:23:42 +04:00
|
|
|
wide.curEditor = editors.data[i].editor;
|
2014-08-19 13:07:35 +04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-29 13:24:08 +04:00
|
|
|
editors.tabs.add({
|
|
|
|
id: id,
|
|
|
|
title: '<span title="' + wide.curNode.path + '">' + wide.curNode.name + '</span>',
|
|
|
|
content: '<textarea id="editor' + id + '"></textarea>'
|
|
|
|
});
|
2014-08-18 17:45:43 +04:00
|
|
|
|
2014-08-19 13:07:35 +04:00
|
|
|
var editor = CodeMirror.fromTextArea(document.getElementById("editor" + id), {
|
|
|
|
lineNumbers: true,
|
2014-09-02 20:05:05 +04:00
|
|
|
styleActiveLine: true,
|
2014-08-19 13:07:35 +04:00
|
|
|
theme: 'lesser-dark',
|
2014-08-27 14:10:12 +04:00
|
|
|
indentUnit: 4,
|
2014-08-19 13:07:35 +04:00
|
|
|
extraKeys: {
|
2014-08-22 08:29:54 +04:00
|
|
|
"Ctrl-\\": "autocompleteAnyWord",
|
2014-08-30 08:54:46 +04:00
|
|
|
".": "autocompleteAfterDot",
|
|
|
|
"Esc": function(cm) {
|
|
|
|
if (cm.getOption("fullScreen")) {
|
|
|
|
cm.setOption("fullScreen", false);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"F11": function(cm) {
|
|
|
|
cm.setOption("fullScreen", !cm.getOption("fullScreen"));
|
2014-08-31 17:49:27 +04:00
|
|
|
},
|
2014-09-02 20:05:05 +04:00
|
|
|
"'('": "autocompleteRightPart",
|
|
|
|
"'['": "autocompleteRightPart",
|
|
|
|
"'{'": "autocompleteRightPart",
|
|
|
|
"'\"'": "autocompleteRightPart",
|
|
|
|
"'''": "autocompleteRightPart",
|
|
|
|
"Ctrl-G": "gotoLine",
|
|
|
|
"Ctrl-E": "deleteLine",
|
|
|
|
"Ctrl-D": "doNothing" // 取消默认的 deleteLine
|
2014-08-19 13:07:35 +04:00
|
|
|
}
|
|
|
|
});
|
2014-09-02 14:09:01 +04:00
|
|
|
editor.setSize('100%', $(".edit-panel").height() - $(".edit-header").height());
|
2014-08-19 13:07:35 +04:00
|
|
|
editor.setValue(data.content);
|
|
|
|
editor.setOption("mode", data.mode);
|
2014-08-18 17:45:43 +04:00
|
|
|
|
2014-08-19 13:07:35 +04:00
|
|
|
wide.curEditor = editor;
|
|
|
|
editors.data.push({
|
|
|
|
"editor": editor,
|
|
|
|
"id": id
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
2014-08-18 17:45:43 +04:00
|
|
|
|
2014-08-19 13:07:35 +04:00
|
|
|
editors.init();
|