1

Тема: Элементы форматирования и действия пользователя

Добрый день всем!

Работаю над фирменным форматированием.
1. Для отступов между таблицей и текстом имитирую "абзацный отступ таблицы" путем создания пустого абзаца перед и после таблицы. Специального стиля параграфа.

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

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

2. Для картинок в тексте тоже установил поля. Но картинки, помещенные пользователем будут иметь поля по умолчанию, а не те, которые мне нужно. Значит нужно делать автоматическую постобработку помещенных картинок. А если картинка помещается в ячейку таблицы, то нужны нулевые поля.

3. В ячейке таблицы тоже должны быть установлены разные размеры полей: для текста и для картинки. Значит нужно отслеживать факт изменения контента ячейки и автоматически менять поля.  И защитить их от изменений пользователем.

Это три примера проблемы, возникающей при задаче соблюдения фирменного стиля документа. На самом деле - их гораздо больше.
Сводятся они к одной задаче - динамической установке и защите элементов фирменного форматирования.

Над универсальным решением бьюсь давно.
Для динамической защиты склоняюсь к использованию события app_WindowSelectionChange.
По этому событию должен вызываться макрос.
Он должен проверять, что изменил/удалил пользователь.
Если это элемент или свойство, определенное как фирменное, то макрос должен делать Undo.

Для этого макрос должен:
а) располагать списком фирменных установок для разных видов контента.
б) знать, какой контент на последнем шаге был изменен/удален/вставлен.

Вот с этим "б)" - проблема. Макросу нужна информация о контенте в выделенном за шаг до последнего изменения.
Что может быть таким "моментальным снимком", по которому макрос, сравнив его с текущим состоянием, мог бы определить, что было изменено?

Как пример: Пользователь выделяет абзац позади таблицы, имитирующий "абзацный отступ таблицы" и удаляет его или меняет ему кегль или набирает в нем текст или дублирует его.
Макрос запускается по событию app_WindowSelectionChange и имеет текущее выделение.
Но он имеет информацию о выделенном по предыдущему событию app_WindowSelectionChange (как и где ее хранить???). Если предыдущее выделение включает элемент фирменного формата, а в текущем его нет/он изменен, то он делает откат (Undo).

Помогите пожалуйста идеями, как этот механизм реализовать. Может есть какие то мысли?