Scintilla - встраеваемый текстовый редактор

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

На github лежит класс и шаблон для подключения известной открытой сишной библиотеки scintilla. Библиотека была разработана в начале нулевых, враппер примерно тогда же, после вносились изменения, вплоть до 2017 года. Обратил на нее внимание, когда смотрел вебинар на ютубе, где она используется в приложении Classify.It.
https://github.com/Devuna/Devuna-Scinti ... 3738054478
Взаимодействие с библиотекой обеспечивается через отправку и получение событий Windows. Соответственно, внутри класса сабклассинг окна. Методы виртуальные. Шаблон только для abc, но функционала там особого нет, просто текстовое поле, инициализация класса и точки вставки для размещения данных и виртуальных методов. Пример работает, но, к сожалению, там только открытие файла с базовым функционалом для редактирования. В самом враппере набор методов большой, похоже, что накрывали все функции согласно документации.

Сама по себе Scintilla обеспечивает функционал редакторов для программирования - подсветка синтаксиса, завершение кода (code completed), всплывающие подсказки, свертывание блоков кода, работа с закладками, поиск/замену и т.д. В работе можно увидеть в notepad++. Погуглил, оказалось, что существуют порты на c# и pyton. Там их используют для встраивания редакторов всяких скриптовых языков. В отличии от кларионовского класса, в сети немало статей с описание использования и обсуждения этих портов, с примерами кода. Вполне вероятно, что текстовый редактор в с11 использует порт scintilla.

Это скриншот примера с github.

scintilla.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

В догонку. Сама библиотека это одна dll размером менее 1мб.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7323
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Scintilla - встраеваемый текстовый редактор

Сообщение Игорь Столяров »

Уже не первый раз вижу это название DEVUNA.
Это какой-то интегратор или крематорий для Clarion проектов ?
Мой любимый (в прошлом) iQXML там тоже доживает ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Ага, там действительно разные прилады лежат под mit лицензией.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Сегодня немного поэкспериментировал. Отсоединил враппер от abc, подключил пример в проекте на ШВС, включил кириллицу, подменил стандартное меню на русифицированное. В принципе, работает.

scintilla2.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Посмотрел, как подключается подсветка синтаксиса. Смысл такой, что для каждого языка программирования (или семейства языков) в библиотеке создается так называемый лексер, который определяет правила синтаксического контроля. Ему присваивается определенное числовое значение (идентификатор). Для clarion один, для pyton другой, для sql третий и т.д. Для каждого лексера задается набор стилей, которым также присваиваются числовые индентификаторы. Далее, уже в своей настройке для каждого лексера мы можем задать до 9 списков ключевых слов. Как я понял, их номера библиотека тоже должна знать. Для каждого из стилей лексера мы можем задать цвет, цвет фона, шрифт, размер шрифта.
То есть таким образом, внешний вид мы можем настроить из класса враппера, а если надо изменить правила синтаксического контроля, то корректировать и компилить сырцы библиотеки, написанной на с++. Например, я попробовал на кларионоском синтаксисе, списки ключевых слов распознаются с учетом регистра. Я пока продублировал в списках ключевых слов слава uppercase и lowercase. В принципе, в большинстве случаев это будет работать корректно, хотя правильнее было бы в сырцах библиотеки сделать регистронезависимо.

scintilla3.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Приделал поиск/замену строк, переход на строку, подсветку парных скобок, автоматическое добавление закрывающихся скобок, вывод индикации о текущем положении курсора, вывод номеров строк, переключателя ins/over, работу с маркерами. Клавиши средствами библиотеки переназначит не получилось (вроде там прозрачно, но почему-то обычные коды клавиш не воспринимает), поэтому через alert.
В принципе, понятно, как делается вставка каких-то значений извне, например, полей базы данных. Или как делают "полосатый редактор" (добавление спецсимвола в начало строки, изменение фона при его наличии, переключение признака readonly по мере работы). Это несложно.
Само сложное осталось это подключить auto completed и свертывание блоков кодов с аннотациями. Примеры гуглятся практически только на с++, вникать в код на нем без комментариев башка отъезжает. Может, вернусь к этим вопросам позже.

scintilla4.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

В догонку. На github вместе с враппером подложена dll scintilla, которая, видимо, не обновлялась. В ней поддерживаются обычные аннотации, которые размещаются под заданными строками. Но нет так называемых аннотаций конца строки. Как я понимаю, это как раз те прямоугольники с многоточием, которые мы видим в среде с11, когда сворачиваем блоки кода. Стандартная сборка scintilla не поддерживает кларионовский лексер, поэтому самостоятельно обновить с оффсайта не получится.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Работа с фолдерами (свертыванием блоков кода) в лексере происходит некорректно. Понимает только завершающее слово "end", точку не распознает. Не сворачивает процедуры и рутинки. В принципе, данный механизм реализуем и поверх лексера, можно пробежать по строкам и присвоить уровни. Конечно, это придется выполнять после каждого изменения, что требует ресурсов. На современных компьютерах особо не должно быть заметно. В версии scintilla, которая подложена к врапперу, не реализованы функции свернуть или развернуть все фолдеры (по файлу или в рамках подчинения). Видимо, это появилось позже. Можно, конечно, сделать самостоятельно, пробежавшись по строкам. На скриншоте фолдеры и аннотация.

scintilla5.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Разобрался с auto completed. Смысл там такой, что ему надо подсунуть строку слов, разделенную пробелами, в которой искать. Вначале можно сделать базовый список, в которой включить все ключевые слова, заданные во враппере для лексера. Затем ловится сообщение вставки символа, в обработке которого определяем слово в строке ввода (от ближайшего левого пробела до текущей позиции), если окно auto complete открыто, то закрываем. Затем проверяем длину слова на минимальную (например, хотим выводить список слов, начиная с 2 введенных символов), если подходит, то формируем список слов, среди которых искать, по совпадению первых символов. Этот список формируем на основании базового списка ключевых слов, туда же можно подсунуть еще что-то. Если список не пустой, открываем его для выбора.
Есть набор функций оформления окна и дополнительные условия для auto completed.

scintilla6.jpg

Есть в scintilla функция индикации. Это типа подчеркивание определенных мест, как в с11 подсвечиваются ошибки. У меня уже практически нет сомнений, что в с11 используется порт scintilla на c#.

Подытожу эту эпопею с scintilla. Библиотека очень мощная, на ней построены многие ide, ей уже 20+ лет. Компактная, только одна dll менее 1мб, которую подгружаем динамически. Написана на c++, имеет порты на ряд языков, в том числе на c# и pyton. Сделана достаточно хорошо, реализованы все функции современных редакторов кода. Автор у дел, библиотека продолжает развиваться. Выложенный на github враппер включает скомпилированную dll scintilla. В этой сборке имеется написанный кем-то лексер для клариона, с неплохой подсветкой синтаксиса. К сожалению, эта сборка сделана давно и не содержит некоторые важные возможности актуальной версии библиотеки. Самостоятельно скомпилить сырцы с оффсайта не получится, так как там отсутствует кларионовский лексер. Сделать это может только тот, кто этот лексер писал, перенеся его код в актуальную версию. По правильному было бы задонатить лексер разработчику scintilla, чтобы включил в основную сборку.
Основная сложность работы с библиотекой в том, чтобы разобраться в имеющихся возможностях. Их очень много, а описание достаточно краткое. Разработчик в качестве образца предлагает сырцы редактора, сделанного с ее использованием. Сырцы на с++ и понять, что в них написано, не так просто. Больше помогают сторонние примеры. C# и pyton гораздо проще на восприятие, но они содержат дополнительные специфические функции, реализованные в порте. Некоторые примеры, размещенные в интернете, имеют ошибки. Поэтому вхождение в тему достаточно трудное. Когда логика работы становится понятной, то уже дальше все гораздо проще. Взаимодействие с библиотекой через виндовые сообщения, сложные структуры и прототипы данных, как в некоторых других сишных библиотеках, отсутствуют

Для чего можем использовать scintilla в реальных проектах. В принципе, как встроенный, быстрый, полнофункциональный текстовый редактор везде, где надо редактировать текст. Например, редактирование описаний товаров, рецептур, хранящихся в базе данных. Можно встроить редактор html, если управляем сайтом из своего приложения. Если не нужны все навороты для редактирования кода, то практически все работает из коробки, подключить не сложно.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
morkovin
Ветеран
Сообщения: 908
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Scintilla - встраеваемый текстовый редактор

Сообщение morkovin »

Например, редактирование описаний товаров, рецептур, хранящихся в базе данных. Можно встроить редактор htm
Ещё бы utf-8 поддерживал...
WBR, morkovin
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Поддерживает.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Кстати, хорошая мысль. Можно использовать scintilla для просмотра и, при необходимости, редактирования информации в юникоде в кларионовских приложениях. Для просмотра просто переключаемся в read only. Сейчас попробовал открыть текст в юникоде, все нормально.

scintilla7.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4553
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Scintilla - встраеваемый текстовый редактор

Сообщение finsoftrz »

Попалось на githab. Наверно, это и есть сырцы того самого кларионовского лексера для scintilla. Оставлю тут ссылку.
https://github.com/Konctantin/scintilla ... 9283982049
C6/C11, ШВС, tps/btrieve.
Ответить