|
Home - Old Man Programmer
| Displaying webapps/medit/edit.js
var _ignoredelta = false;
/**
* uuidv4() from: "broofa":
* https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
*/
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
var uuid = uuidv4();
var _conn = new WebSocket("ws://oldmanprogrammer.net:60002/", "test");
var _editor = new ace.edit("editor");
_editor.setTheme("ace/theme/tomorrow");
_editor.session.setMode("ace/mode/c_cpp");
_editor.$blockScrolling = Infinity;
var _edoc = _editor.env.document.getDocument();
_editor.env.document.getDocument().on("change", function(e) {
if (_ignoredelta) {
_ignoredelta = false;
return;
}
_conn.send(JSON.stringify({uuid: uuid, type: 1, delta: e}));
});
/**
* Dynamic marker code from "a user":
* https://stackoverflow.com/questions/24807066/multiple-cursors-in-ace-editor
*/
var marker = {}
marker.cursors = [{row: 0, column: 0}];
marker.update = function(html, markerLayer, session, config) {
var start = config.firstRow, end = config.lastRow;
var cursors = this.cursors
for (var i = 0; i < cursors.length; i++) {
var pos = this.cursors[i];
if (pos.row < start) {
continue
} else if (pos.row > end) {
break
} else {
// compute cursor position on screen
// this code is based on ace/layer/marker.js
var screenPos = session.documentToScreenPosition(pos)
var height = config.lineHeight;
var width = config.characterWidth;
var top = markerLayer.$getTop(screenPos.row, config);
var left = markerLayer.$padding + screenPos.column * width;
// can add any html here
html.push(
"<div class='MyCursorClass' style='",
"height:", height, "px;",
"top:", top, "px;",
"left:", left, "px; width:", width, "px'></div>"
);
}
}
}
marker.redraw = function() {
this.session._signal("changeFrontMarker");
}
marker.addCursor = function() {
// add to this cursors
// ....
// trigger redraw
marker.redraw()
}
marker.session = _editor.session;
marker.session.addDynamicMarker(marker, true)
// call marker.session.removeMarker(marker.id) to remove it
// call marker.redraw after changing one of cursors
_conn.onmessage = function(mev) {
var data = JSON.parse(mev.data);
if (data.uuid == uuid) return;
switch(data.type) {
case 1:
_ignoredelta = true;
_edoc.applyDelta(data.delta);
break;
case 2:
marker.cursors[0] = data.cpos;
marker.redraw();
break;
case 3:
console.log("Type 3 request");
var value = _editor.getValue();
_conn.send(JSON.stringify({uuid: uuid, type: 4, value: value}));
break;
case 4:
console.log("Type 4 received");
_editor.setValue(data.value,{row:0, column:0});
break;
}
}
var _prevcp = null;
setInterval(function() {
var pos = _editor.getCursorPosition();
if (_prevcp == null) _prevcp = pos;
if (pos != _prevcp) _conn.send(JSON.stringify({uuid: uuid, type: 2, cpos: pos}));
_prevcp = pos;
}, 10);
|