mirror of
https://github.com/antos-rde/antosdk-apps.git
synced 2024-11-18 03:08:24 +01:00
276 lines
8.3 KiB
JavaScript
276 lines
8.3 KiB
JavaScript
|
(function() {
|
||
|
var DiffEditor;
|
||
|
|
||
|
DiffEditor = class DiffEditor extends this.OS.application.BaseApplication {
|
||
|
constructor(args) {
|
||
|
super("DiffEditor", args);
|
||
|
}
|
||
|
|
||
|
main() {
|
||
|
var j, len, list, opts, ref, v;
|
||
|
this.editor_cnt = this.find("diffeditor");
|
||
|
this.fileview = this.find("fileview");
|
||
|
this.fileview.fetch = (path) => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
return path.asFileHandle().read().then((d) => {
|
||
|
if (d.error) {
|
||
|
return reject(d.error);
|
||
|
}
|
||
|
return resolve(d.result);
|
||
|
}).catch((e) => {
|
||
|
return reject(__e(e));
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
this.fileview.onfileopen = (e) => {
|
||
|
if (!(e.data && e.data.path)) {
|
||
|
return;
|
||
|
}
|
||
|
if (e.data.type === "dir") {
|
||
|
return;
|
||
|
}
|
||
|
return this.openFile(e.data.path.asFileHandle());
|
||
|
};
|
||
|
this.currdir = void 0;
|
||
|
ace.config.set('basePath', "scripts/ace");
|
||
|
ace.require("ace/ext/language_tools");
|
||
|
this.modelist = ace.require("ace/ext/modelist");
|
||
|
list = [];
|
||
|
ref = this.modelist.modes;
|
||
|
for (j = 0, len = ref.length; j < len; j++) {
|
||
|
v = ref[j];
|
||
|
list.push({
|
||
|
text: v.caption,
|
||
|
mode: v.mode
|
||
|
});
|
||
|
}
|
||
|
this.langlist = this.find("langmode");
|
||
|
this.langlist.data = list;
|
||
|
this.langlist.onlistselect = (e) => {
|
||
|
this.editors.left.getSession().setMode(e.data.item.data.mode);
|
||
|
return this.editors.right.getSession().setMode(e.data.item.data.mode);
|
||
|
};
|
||
|
this.differ = new AceDiff({
|
||
|
// ace: window.ace,
|
||
|
element: this.editor_cnt,
|
||
|
theme: "ace/theme/monokai",
|
||
|
left: {
|
||
|
content: ''
|
||
|
},
|
||
|
right: {
|
||
|
content: ''
|
||
|
}
|
||
|
});
|
||
|
this.editors = this.differ.getEditors();
|
||
|
opts = {
|
||
|
enableBasicAutocompletion: true,
|
||
|
enableSnippets: true,
|
||
|
enableLiveAutocompletion: true,
|
||
|
highlightActiveLine: true,
|
||
|
highlightSelectedWord: true,
|
||
|
behavioursEnabled: true,
|
||
|
//wrap: true,
|
||
|
fontSize: "10pt",
|
||
|
showInvisibles: true
|
||
|
};
|
||
|
this.editors.left.setOptions(opts);
|
||
|
this.editors.right.setOptions(opts);
|
||
|
this.editors.left.current_file = void 0;
|
||
|
this.editors.right.current_file = void 0;
|
||
|
this.editors.left.afx_label = this.find("left-file");
|
||
|
this.editors.right.afx_label = this.find("right-file");
|
||
|
this.editors.left.mux = false;
|
||
|
this.editors.right.mux = false;
|
||
|
this.on("resize", () => {
|
||
|
this.editors = this.differ.getEditors();
|
||
|
this.editors.left.resize();
|
||
|
return this.editors.right.resize();
|
||
|
});
|
||
|
$('.acediff__left .ace_scrollbar-v', this.editor_cnt).scroll(() => {
|
||
|
return this.editors.right.session.setScrollTop(this.editors.left.session.getScrollTop());
|
||
|
});
|
||
|
$('.acediff__right .ace_scrollbar-v', this.editor_cnt).scroll(() => {
|
||
|
return this.editors.left.session.setScrollTop(this.editors.right.session.getScrollTop());
|
||
|
});
|
||
|
this.editors.left.on("focus", (e) => {
|
||
|
return this.current_editor = this.editors.left;
|
||
|
});
|
||
|
this.editors.right.on("focus", (e) => {
|
||
|
return this.current_editor = this.editors.right;
|
||
|
});
|
||
|
this.editors.left.on("input", (e) => {
|
||
|
if (this.editors.left.mux) {
|
||
|
return this.editors.left.mux = false;
|
||
|
}
|
||
|
if (!this.editors.left.current_file) {
|
||
|
return this.editors.left.afx_label.text = __("Temporary file");
|
||
|
}
|
||
|
if (this.editors.left.current_file.dirty) {
|
||
|
return;
|
||
|
}
|
||
|
this.editors.left.current_file.dirty = true;
|
||
|
return this.editors.left.afx_label.text += "*";
|
||
|
});
|
||
|
this.editors.right.on("input", (e) => {
|
||
|
if (this.editors.right.mux) {
|
||
|
return this.editors.right.mux = false;
|
||
|
}
|
||
|
if (!this.editors.right.current_file) {
|
||
|
return this.editors.right.afx_label.text = __("Temporary file");
|
||
|
}
|
||
|
if (this.editors.right.current_file.dirty) {
|
||
|
return;
|
||
|
}
|
||
|
this.editors.right.current_file.dirty = true;
|
||
|
return this.editors.right.afx_label.text += "*";
|
||
|
});
|
||
|
this.current_editor = this.editors.left;
|
||
|
this.current_editor.focus();
|
||
|
this.bindKey("ALT-O", () => {
|
||
|
return this.menuAction("open");
|
||
|
});
|
||
|
this.bindKey("ALT-F", () => {
|
||
|
return this.menuAction("opendir");
|
||
|
});
|
||
|
this.bindKey("CTRL-S", () => {
|
||
|
return this.menuAction("save");
|
||
|
});
|
||
|
return this.toggleSideBar();
|
||
|
}
|
||
|
|
||
|
toggleSideBar() {
|
||
|
if (this.currdir) {
|
||
|
$(this.fileview).show();
|
||
|
this.fileview.path = this.currdir.path;
|
||
|
} else {
|
||
|
$(this.fileview).hide();
|
||
|
}
|
||
|
return this.trigger("resize");
|
||
|
}
|
||
|
|
||
|
menu() {
|
||
|
return [
|
||
|
{
|
||
|
text: __("File"),
|
||
|
nodes: [
|
||
|
{
|
||
|
text: __("Open"),
|
||
|
dataid: "open",
|
||
|
shortcut: "A-O"
|
||
|
},
|
||
|
{
|
||
|
text: __("Open Folder"),
|
||
|
dataid: "opendir",
|
||
|
shortcut: "A-F"
|
||
|
},
|
||
|
{
|
||
|
text: __("Save"),
|
||
|
dataid: "save",
|
||
|
shortcut: "C-S"
|
||
|
}
|
||
|
],
|
||
|
onchildselect: (e) => {
|
||
|
return this.menuAction(e.data.item.data.dataid);
|
||
|
}
|
||
|
}
|
||
|
];
|
||
|
}
|
||
|
|
||
|
openFile(file) {
|
||
|
this.current_editor.mux = true;
|
||
|
return file.read().then((d) => {
|
||
|
var i, item, j, len, m, ref, v;
|
||
|
file.cache = d;
|
||
|
this.current_editor.current_file = file;
|
||
|
this.current_editor.afx_label.text = file.path;
|
||
|
this.current_editor.setValue(d, -1);
|
||
|
// select current mode
|
||
|
m = this.modelist.getModeForPath(file.path);
|
||
|
ref = this.langlist.data;
|
||
|
for (i = j = 0, len = ref.length; j < len; i = ++j) {
|
||
|
v = ref[i];
|
||
|
if (v.mode === m.mode) {
|
||
|
item = i;
|
||
|
}
|
||
|
}
|
||
|
if (item === void 0) {
|
||
|
return;
|
||
|
}
|
||
|
return this.langlist.selected = item;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
menuAction(dataid) {
|
||
|
var fn;
|
||
|
switch (dataid) {
|
||
|
case "open":
|
||
|
return this.openDialog("FileDialog", {
|
||
|
title: __("Open file"),
|
||
|
mimes: ["text/.*", "application/json", "application/javascript"]
|
||
|
}).then((f) => {
|
||
|
return this.openFile(f.file.path.asFileHandle());
|
||
|
});
|
||
|
case "opendir":
|
||
|
return this.openDialog("FileDialog", {
|
||
|
title: __("Open folder"),
|
||
|
mimes: ["dir"]
|
||
|
}).then((f) => {
|
||
|
this.currdir = f.file.path.asFileHandle();
|
||
|
return this.toggleSideBar();
|
||
|
});
|
||
|
case "save":
|
||
|
fn = (ed) => {
|
||
|
if (!(ed.current_file && ed.current_file.dirty)) {
|
||
|
return;
|
||
|
}
|
||
|
ed.current_file.cache = ed.getValue();
|
||
|
return ed.current_file.write("text/plain").then((r) => {
|
||
|
ed.current_file.dirty = false;
|
||
|
ed.afx_label.text = ed.current_file.path;
|
||
|
return this.notify(__("File {0} saved", ed.current_file.path));
|
||
|
}).catch((e) => {
|
||
|
return this.error(__("Unable to save to: {0}", ed.current_file.path), e);
|
||
|
});
|
||
|
};
|
||
|
fn(this.editors.left);
|
||
|
return fn(this.editors.right);
|
||
|
default:
|
||
|
return console.log(dataid);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cleanup(evt) {
|
||
|
var dirty;
|
||
|
dirty = false;
|
||
|
if (this.editors.left.current_file && this.editors.left.current_file.dirty) {
|
||
|
dirty = true;
|
||
|
}
|
||
|
if (this.editors.right.current_file && this.editors.right.current_file.dirty) {
|
||
|
dirty = true;
|
||
|
}
|
||
|
if (dirty) {
|
||
|
evt.preventDefault();
|
||
|
return this.ask({
|
||
|
title: __("Unsaved changes"),
|
||
|
text: __("Ignore modification ?")
|
||
|
}).then((d) => {
|
||
|
if (!d) {
|
||
|
return;
|
||
|
}
|
||
|
this.editors.left.current_file.dirty = false;
|
||
|
this.editors.right.current_file.dirty = false;
|
||
|
return this.quit();
|
||
|
});
|
||
|
} else {
|
||
|
return this.differ.destroy();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
DiffEditor.dependencies = ["os://scripts/ace/ace.js", "pkg://AceDiff/main.js", "pkg://AceDiff/main.css"];
|
||
|
|
||
|
this.OS.register("DiffEditor", DiffEditor);
|
||
|
|
||
|
}).call(this);
|