Отменить изменения текста полей в Scintilla

Я пишу текстовый редактор с помощью Scintilla (на самом деле ScintillaNET, но информация о ванильном Scintilla также может быть полезна). В этом редакторе мы хотим отобразить информацию об изменениях с полями (например, если я изменю строку текста, эта строка будет отображать мое имя на полях). Мне удалось изменить маржу при изменении строки, но я не могу найти хороший способ отменить изменение маржи, если кто-то отменит их изменение.

Я пытался вызвать BeginUndoAction в событии BeforeTextInsert и EndUndoAction в конце события TextInserted, но, похоже, это не рассматривает изменения полей как отменяемые. Есть ли достойный способ отменить изменения маржи? Я думаю, что мне может понадобиться реализовать мой собственный небольшой стек отмены полей (или изменить стек отмены Scintilla) и просто обработать его таким образом, но если что-то встроено, я бы предпочел пойти с этим.

1 ответ

Решение

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

Кажется, работает нормально, хотя это немного страшнее, чем хотелось бы. Я действительно переживаю, что стек каким-то образом выйдет из синхронизации со стеком отмены Scintilla, но я не очень хочу изменять исходный код Scintilla.

Другие вопросы по тегам