diff --git a/README.md b/README.md index 4d4037b..b69d36d 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ | `enableQuickSuggestions` | Включает/выключает режим быстрых подсказок | | `minimap` | Включает/выключает отображение карты кода | | [`enableModificationEvent`](docs/modification_event.md) | Включает/выключает генерацию события, возникающего при изменении содержимого редактора| +| [`enableSuggestActivationEvent`](docs/activation_event.md) | Включает/выключает генерацию события, возникающего активации пункта в списке подсказок| | [`switchQueryMode`](docs/switch_query.md) | Переключение между режимом запроса и режимом редактирования кода | | [`compare`](docs/compare.md) | Включает/выключает режим сравнения текстов | | `nextDiff` | Переход с следующему изменению в режиме сравнения | @@ -100,6 +101,7 @@ | `EVENT_CONTENT_CHANGED` | При любом изменении содержимого редактора. Вкл/откл через *enableModificationEvent* | | `EVENT_GET_METADATA` | Генерируется при отсутствии метаданных. В параметрах передается имя запрашиваемых метаданных | | `EVENT_XXX` | При выборе пользовательского пункта меню. *addContextMenuItem('Мой пункт', 'EVENT_MY')* | +| `EVENT_ON_ACTIVATE_SUGGEST_ROW`| При активации пункта в текущем списке подсказок | *Перед началом работы с редактором из 1С Предпрития желательно вызвать функцию инициализации и передать в нее текущую версию платформы.* Пример: diff --git a/docs/activation_event.md b/docs/activation_event.md new file mode 100644 index 0000000..0e3a61d --- /dev/null +++ b/docs/activation_event.md @@ -0,0 +1,39 @@ +# Функция *enableSuggestActivationEvent* +## Назначение функции +Функция включает/выключает генерацию события *EVENT_ON_ACTIVATE_SUGGEST_ROW*, которое возникает при активации пункта в текущем списке подсказок + +## Параметры функции +* **enabled** - *boolean*, активность события + +## Пример вызова +```javascript +// Включение генерации события +enableSuggestActivationEvent(true); + +// Отключение генерации события +enableSuggestActivationEvent(false); +``` + +## Пример генерируемого события +```json +{ + "current_word": "", + "last_word": "авансовыйотчет", + "last_expression": "документы.авансовыйотчет.", + "focused": "Выбрать", + "rows": [ + "Выбрать", + "НайтиПоНомеру", + "НайтиПоРеквизиту", + "ПолучитьДанныеВыбора", + "ПолучитьМакет", + "ПолучитьСсылку", + "ПолучитьФорму", + "ПолучитьФормуВыбора", + "ПолучитьФормуНовогоДокумента", + "ПолучитьФормуСписка", + "ПустаяСсылка", + "СоздатьДокумент" + ] +} +``` \ No newline at end of file diff --git a/src/editor.js b/src/editor.js index cb48589..fda7fcc 100644 --- a/src/editor.js +++ b/src/editor.js @@ -18,6 +18,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit customSuggestions = []; contextMenuEnabled = false; err_tid = 0; + suggestObserver = null; reserMark = function() { @@ -651,6 +652,71 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit } + function getSuggestWidgetRows(element) { + + let rows = []; + + for (let i = 0; i < element.parentElement.childNodes.length; i++) { + + let row = element.parentElement.childNodes[i]; + + if (row.classList.contains('monaco-list-row')) + rows.push(row.getAttribute('aria-label')); + + } + + return rows; + + } + + enableSuggestActivationEvent = function (enabled) { + + if (suggestObserver != null) { + suggestObserver.disconnect(); + suggestObserver = null; + } + + if (enabled) { + + suggestObserver = new MutationObserver(function (mutations) { + + mutations.forEach(function (mutation) { + + if (mutation.target.classList.contains('monaco-list-rows') && mutation.addedNodes.length) { + + let element = mutation.addedNodes[0]; + + if (element.classList.contains('monaco-list-row') && element.classList.contains('focused')) { + + let bsl = new bslHelper(editor.getModel(), editor.getPosition()); + + eventParams = { + current_word: bsl.word, + last_word: bsl.lastRawExpression, + last_expression: bsl.lastExpression, + focused: element.getAttribute('aria-label'), + rows: getSuggestWidgetRows(element) + } + + sendEvent('EVENT_ON_ACTIVATE_SUGGEST_ROW', eventParams); + + } + + + } + }) + + }); + + suggestObserver.observe(document, { + childList: true, + subtree: true, + }); + + } + + } + editor = undefined; // Register languages @@ -685,7 +751,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit theme: "bsl-white", value: getCode(), language: language.id, - contextmenu: true, + contextmenu: false, wordBasedSuggestions: false, customOptions: true }); @@ -739,5 +805,5 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit } }); - + }); \ No newline at end of file