123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- ace.define("ace/ext/code_lens",["require","exports","module","ace/line_widgets","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/editor","ace/config"], function(require, exports, module){"use strict";
- var LineWidgets = require("../line_widgets").LineWidgets;
- var event = require("../lib/event");
- var lang = require("../lib/lang");
- var dom = require("../lib/dom");
- function clearLensElements(renderer) {
- var textLayer = renderer.$textLayer;
- var lensElements = textLayer.$lenses;
- if (lensElements)
- lensElements.forEach(function (el) { el.remove(); });
- textLayer.$lenses = null;
- }
- function renderWidgets(changes, renderer) {
- var changed = changes & renderer.CHANGE_LINES
- || changes & renderer.CHANGE_FULL
- || changes & renderer.CHANGE_SCROLL
- || changes & renderer.CHANGE_TEXT;
- if (!changed)
- return;
- var session = renderer.session;
- var lineWidgets = renderer.session.lineWidgets;
- var textLayer = renderer.$textLayer;
- var lensElements = textLayer.$lenses;
- if (!lineWidgets) {
- if (lensElements)
- clearLensElements(renderer);
- return;
- }
- var textCells = renderer.$textLayer.$lines.cells;
- var config = renderer.layerConfig;
- var padding = renderer.$padding;
- if (!lensElements)
- lensElements = textLayer.$lenses = [];
- var index = 0;
- for (var i = 0; i < textCells.length; i++) {
- var row = textCells[i].row;
- var widget = lineWidgets[row];
- var lenses = widget && widget.lenses;
- if (!lenses || !lenses.length)
- continue;
- var lensContainer = lensElements[index];
- if (!lensContainer) {
- lensContainer = lensElements[index]
- = dom.buildDom(["div", { class: "ace_codeLens" }], renderer.container);
- }
- lensContainer.style.height = config.lineHeight + "px";
- index++;
- for (var j = 0; j < lenses.length; j++) {
- var el = lensContainer.childNodes[2 * j];
- if (!el) {
- if (j != 0)
- lensContainer.appendChild(dom.createTextNode("\xa0|\xa0"));
- el = dom.buildDom(["a"], lensContainer);
- }
- el.textContent = lenses[j].title;
- el.lensCommand = lenses[j];
- }
- while (lensContainer.childNodes.length > 2 * j - 1)
- lensContainer.lastChild.remove();
- var top = renderer.$cursorLayer.getPixelPosition({
- row: row,
- column: 0
- }, true).top - config.lineHeight * widget.rowsAbove - config.offset;
- lensContainer.style.top = top + "px";
- var left = renderer.gutterWidth;
- var indent = session.getLine(row).search(/\S|$/);
- if (indent == -1)
- indent = 0;
- left += indent * config.characterWidth;
- lensContainer.style.paddingLeft = padding + left + "px";
- }
- while (index < lensElements.length)
- lensElements.pop().remove();
- }
- function clearCodeLensWidgets(session) {
- if (!session.lineWidgets)
- return;
- var widgetManager = session.widgetManager;
- session.lineWidgets.forEach(function (widget) {
- if (widget && widget.lenses)
- widgetManager.removeLineWidget(widget);
- });
- }
- exports.setLenses = function (session, lenses) {
- var firstRow = Number.MAX_VALUE;
- clearCodeLensWidgets(session);
- lenses && lenses.forEach(function (lens) {
- var row = lens.start.row;
- var column = lens.start.column;
- var widget = session.lineWidgets && session.lineWidgets[row];
- if (!widget || !widget.lenses) {
- widget = session.widgetManager.$registerLineWidget({
- rowCount: 1,
- rowsAbove: 1,
- row: row,
- column: column,
- lenses: []
- });
- }
- widget.lenses.push(lens.command);
- if (row < firstRow)
- firstRow = row;
- });
- session._emit("changeFold", { data: { start: { row: firstRow } } });
- return firstRow;
- };
- function attachToEditor(editor) {
- editor.codeLensProviders = [];
- editor.renderer.on("afterRender", renderWidgets);
- if (!editor.$codeLensClickHandler) {
- editor.$codeLensClickHandler = function (e) {
- var command = e.target.lensCommand;
- if (!command)
- return;
- editor.execCommand(command.id, command.arguments);
- editor._emit("codeLensClick", e);
- };
- event.addListener(editor.container, "click", editor.$codeLensClickHandler, editor);
- }
- editor.$updateLenses = function () {
- var session = editor.session;
- if (!session)
- return;
- if (!session.widgetManager) {
- session.widgetManager = new LineWidgets(session);
- session.widgetManager.attach(editor);
- }
- var providersToWaitNum = editor.codeLensProviders.length;
- var lenses = [];
- editor.codeLensProviders.forEach(function (provider) {
- provider.provideCodeLenses(session, function (err, payload) {
- if (err)
- return;
- payload.forEach(function (lens) {
- lenses.push(lens);
- });
- providersToWaitNum--;
- if (providersToWaitNum == 0) {
- applyLenses();
- }
- });
- });
- function applyLenses() {
- var cursor = session.selection.cursor;
- var oldRow = session.documentToScreenRow(cursor);
- var scrollTop = session.getScrollTop();
- var firstRow = exports.setLenses(session, lenses);
- var lastDelta = session.$undoManager && session.$undoManager.$lastDelta;
- if (lastDelta && lastDelta.action == "remove" && lastDelta.lines.length > 1)
- return;
- var row = session.documentToScreenRow(cursor);
- var lineHeight = editor.renderer.layerConfig.lineHeight;
- var top = session.getScrollTop() + (row - oldRow) * lineHeight;
- if (firstRow == 0 && scrollTop < lineHeight / 4 && scrollTop > -lineHeight / 4) {
- top = -lineHeight;
- }
- session.setScrollTop(top);
- }
- };
- var updateLenses = lang.delayedCall(editor.$updateLenses);
- editor.$updateLensesOnInput = function () {
- updateLenses.delay(250);
- };
- editor.on("input", editor.$updateLensesOnInput);
- }
- function detachFromEditor(editor) {
- editor.off("input", editor.$updateLensesOnInput);
- editor.renderer.off("afterRender", renderWidgets);
- if (editor.$codeLensClickHandler)
- editor.container.removeEventListener("click", editor.$codeLensClickHandler);
- }
- exports.registerCodeLensProvider = function (editor, codeLensProvider) {
- editor.setOption("enableCodeLens", true);
- editor.codeLensProviders.push(codeLensProvider);
- editor.$updateLensesOnInput();
- };
- exports.clear = function (session) {
- exports.setLenses(session, null);
- };
- var Editor = require("../editor").Editor;
- require("../config").defineOptions(Editor.prototype, "editor", {
- enableCodeLens: {
- set: function (val) {
- if (val) {
- attachToEditor(this);
- }
- else {
- detachFromEditor(this);
- }
- }
- }
- });
- dom.importCssString("\n.ace_codeLens {\n position: absolute;\n color: #aaa;\n font-size: 88%;\n background: inherit;\n width: 100%;\n display: flex;\n align-items: flex-end;\n pointer-events: none;\n}\n.ace_codeLens > a {\n cursor: pointer;\n pointer-events: auto;\n}\n.ace_codeLens > a:hover {\n color: #0000ff;\n text-decoration: underline;\n}\n.ace_dark > .ace_codeLens > a:hover {\n color: #4e94ce;\n}\n", "codelense.css", false);
- }); (function() {
- ace.require(["ace/ext/code_lens"], function(m) {
- if (typeof module == "object" && typeof exports == "object" && module) {
- module.exports = m;
- }
- });
- })();
-
|