salexdv / bsl_console

Консоль кода для 1С 8.3 (Управляемые и обычные формы)
MIT License
297 stars 55 forks source link

При выборе кликом мышки слова из списка автодополнения после обработки события стирается весь текст строки правее каретки #159

Closed tormozit closed 3 years ago

tormozit commented 3 years ago

Допустим каретка стоит перед скобкой и я вызываю список автодополнения. В нем я кликом выбираю элемент.

изображение

При этом вызывается событие EVENT_ON_SELECT_SUGGEST_ROW и выполняется мой обработчик:

    РедакторHTML = ПолеТекста.ЭлементФормы.Документ.defaultView;
    РедакторHTML.hideSuggestionsList();
    КончитьОбработкуКоманды();
    РазобратьТекущийКонтекст();
    СтрокаТаблицыСлов = ТаблицаСлов.Найти(ЧистоеСловоСпискаПодсказкиHTML(ВыбранноеСлово), "Слово");
    Если СтрокаТаблицыСлов = Неопределено Тогда
        Возврат;
    КонецЕсли; 
    Если ирОбщий.СтрНачинаетсяСЛкс(Триггер, "force-") Тогда
        ПараметрЗакрытия = Прав(Триггер, 1);
    Иначе
        ПараметрЗакрытия = Истина;
    КонецЕсли; 
    ВставитьВыбранноеСловоАвтодополнения(СтрокаТаблицыСлов, мКонкретныйТипКонтекста, мСтруктураТипаКонтекста,, ПараметрЗакрытия);
    УстановитьГраницыВыделения();
    Если ПараметрЗакрытия = "." Тогда
        РедакторHTML.triggerSuggestions();
    КонецЕсли; 
    Если мОткрытьСправкуПоПараметру = Истина Тогда
        #Если ТолстыйКлиентОбычноеПриложение Тогда
            ОткрытьСправкуПоПараметру(, Ложь); 
        #Иначе
            РедакторHTML.triggerSigHelp();
        #КонецЕсли
    КонецЕсли; 

Он вставляет правильный текст (это становится понятно после нажатия CTRL+Z). Но сразу после этого редактор затирает его вставку и все окончание строки - даже тот текст, который был до этого (на картинке ";").

изображение

Вероятность что это делает мой код - очень мала, т.к. все вставки у меня идут через одно место в коде.

salexdv commented 3 years ago

Почему ты сразу не передаешь правильный текст, который надо вставить, ведь контекст, я так понимаю, тебе полностью известен?

tormozit commented 3 years ago

Я передаю сразу правильный текст и он вставляется. Но потом редактор его стирает и пишет выбранное слово из списка автодополнения.

salexdv commented 3 years ago

Я передаю сразу правильный текст и он вставляется. Но потом редактор его стирает и пишет выбранное слово из списка автодополнения.

Я не про тот текст, который ты вставляешь при возникновении события EVENT_ON_SELECT_SUGGEST_ROW. Почему ты не передаешь правильный текст для вставки в showCustomSuggestions, чтобы редактор сам вставил сразу то, что нужно?

tormozit commented 3 years ago

Потому что мне нужно смещать каретку после вставки (например вставить "()" и сместить каретку в позицию между ними), т.е. нужно не просто вставлять текст, но и проводить более сложные операции. Причем этот механизм поддерживает не только твой редактор, но и стандартный с моим списком автодополнения. Поэтому хотелось бы из списка автодополнения получать именно чистое слово, чтобы не переделывать сразу много связанных сценариев работы.

salexdv commented 3 years ago

Потому что мне нужно смещать каретку после вставки, т.е. нужно не просто вставлять текст, но и проводить более сложные операции.

Смещение каретки будет попроще вставки текста, как мне кажется

tormozit commented 3 years ago

Также анализ "Нужно ли добавлять скобки и сколько скобок и нужно ли смещать каретку и т.д." также требует вычислений, зависящих от типа каждого слова. Делать это перед отображением списка - неоправданное ожидание для пользователя. Ведь он может и не воспользоваться списком автодополнения.

salexdv commented 3 years ago

Также анализ "Нужно ли добавлять скобки и сколько скобок и нужно ли смещать каретку и т.д." также требует вычислений, зависящих от типа каждого слова.

Я так понимаю, ты всё равно так или иначе делаешь эти вычисления, чтобы указать поле kind для передачи в showCustomSuggestions

salexdv commented 3 years ago

Если всё оставить, как есть, то единственное, что пока приходит на ум - это формировать событие EVENT_ON_SELECT_SUGGEST_ROW с некоторой задержкой, чтобы редактор успел вставить текст, до того, как ты будешь что-то менять из 1С

salexdv commented 3 years ago

Еще можно передавать пустое поле text, тогда вставки вообще не будет.

tormozit commented 3 years ago

можно передавать пустое поле text, тогда вставки вообще не будет.

В моем случае это допустимо, т.к. я всегда вставляю выбранное слово сам. Убрал заполнение атрибута text при подготовке данных списка автодополнения. Проблема ушла.

Однако в редакторе для случая стандартной обработки выбора элемента списка автодополнения она осталась.

salexdv commented 3 years ago

Нет в редакторе такой проблемы, или мы говорим о разном. Ar0V235Qw9 Редактор вставляет ровно то, что ему передано для вставки, ничего он при этом не стирает. Тут проблема асинхронного взаимодействия т.к. нет возможности из 1С прервать вставку. Событие EVENT_ON_SELECT_SUGGEST_ROW прилетает в 1С, ты вставляешь свой текст, но сразу после этого отрабатывает родное событие вставки выбранного значения. Видимо, оно происходит с некоторой задержкой, и ты в этот момент успеваешь вставить текст.

tormozit commented 3 years ago

Нет в редакторе такой проблемы

Согласен. Я некорректно указал, что проблема осталась "для случая стандартной обработки". Она осталась только для случая собственной вставки и заполненного атрибута text у слов списка автодполнения. А совместное использование этих операций, как ты справедливо заметил, избыточно.

salexdv commented 3 years ago

Я согласен, было бы классно при получении события подавлять сразу родную обработку, что-то вроде preventDefault(), но к сожалению, такой возможности нет.

tormozit commented 3 years ago

В общем резюмирую для остальных читателей. Нужно либо не заполнять атрибут text в собственных элементах списка автодополнения, либо не вставлять выбранное слово в событии EVENT_ON_SELECT_SUGGEST_ROW. А при выполнении собственной вставки для родного элемента списка проблема остается, но такое маловероятно что понадобится кому то.