Я предполагаю, что вы хотите регистрировать отмены / повторы команд вашего расширения редактора.Если это не так ... приведенное ниже описание не будет полезным.: -)
Сначала вы хотите создать небольшой класс, производный от ITextUndoPrimitive
, представляющий небольшую «операцию», которая включена в часть транзакции отмены.Это имеет два важных метода: Undo()
, который вызывается, когда пользователь отменяет транзакцию, и Do()
, который вызывается, если пользователь отменяет транзакцию, а затем нажимает кнопку Повторить.Для остальных методов просто выполните тривиальную реализацию: CanUndo
/ CanRedo
всегда должно возвращать true и сделать Parent простым свойством чтения / записи.CanMerge
всегда должен возвращать false, и вы можете оставить Merge()
не реализованным.Конечно, вы можете хранить любое дополнительное состояние в ITextUndoPrimitive.
Что касается того, что вы делаете в Do / Undo, это ваше дело.Так что если ваше расширение, скажем, изменяет текстовый буфер, а также записывает в какой-то другой файл в проекте пользователя, вы можете отменить запись файла.Я чувствую, что вы просто пытаетесь отследить, какие операции отменил пользователь (возможно, в статистических целях?), И поэтому вы можете просто обновить бит «пользователь отменил это» в своем журнале и покончить с этим.
Когда вы выполняете свое действие, вызовите CreateTransaction
, чтобы начать новую транзакцию, а затем в этой транзакции вызовите AddUndo (), передав новый экземпляр вашего примитива отмены.Затем редактор будет вызывать Do / Undo, как описано соответствующим образом.
Последнее замечание: редактор автоматически избавится от отмененных транзакций, когда либо история транзакций становится слишком длинной, либо в некоторых случаях, когда историяуничтожен и его надо сбросить.Поэтому ожидайте, что в какой-то момент ваши отмененные примитивы уйдут и будут GC'ed.Самое главное: не держите их в каком-то другом месте, которое может привести к утечке.