Если вы не хотите ничего фантастического, вы можете просто добавить UndoManager . Ваш Document
будет запускать UndoableEdit
каждый раз, когда вы добавляете или удаляете текст. Чтобы отменить и повторить каждое изменение, просто вызовите эти методы в UndoManager.
Недостатком этого является UndoManager, который добавляет новое редактирование каждый раз, когда пользователь вводит что-то, поэтому набрав «яблоко», вы оставите 5 изменений , отменяется по одному. Для моего текстового редактора я написал обертку для редактирования, в которой хранится время, которое было сделано в дополнение к изменению и смещению текста, а также UndoableEditListener
, который объединяет новые изменения в предыдущие, если есть только короткий промежуток времени между (0,5 секунды хорошо работает для меня).
Это хорошо работает для общего редактирования, но вызывает проблемы, когда делается массовая замена. Если у вас был документ с 5000 экземплярами «яблока», и вы хотели заменить его «оранжевым», вы в конечном итоге получили бы 5000 исправлений, сохраняя «яблоко», «оранжевое» и смещение. Чтобы уменьшить объем используемой памяти, я рассматривал это как отдельный случай для обычных изменений и вместо этого хранили «яблоко», «оранжевый» и массив из 5000 смещений. Я еще не успел применить это, но я знаю, что это вызовет некоторые головные боли, когда несколько строк соответствуют условию поиска (например, регистр без учета регистра, поиск по регулярному выражению).