Тема: Элементы форматирования и действия пользователя
Добрый день всем!
Работаю над фирменным форматированием.
1. Для отступов между таблицей и текстом имитирую "абзацный отступ таблицы" путем создания пустого абзаца перед и после таблицы. Специального стиля параграфа.
Для защиты этих абзацев от изменения/удаления пользователем, поместил их вместе с таблицей в КонтентКонтрол, защищенный от изменения/удаления. А саму таблицу - в КонтентКонтрол, вложенный в первый, в нем разрешено изменение/удаление контента. Для удаления такой таблицы требуется программная поддержка, снимающая защиту внешнего КонтентКонтрола. Сделал ее. Но очень не нравится такая реализация с костылем в виде КонтентКонтрола.
Хочется сделать без КонтентКонтролов.
Что бы, если пользователь удалил таблицу, то удалялись бы и пустые абзацы спецстиля, примыкающие к ней.
Что бы пользователь не мог изменить стиль/текст этих абзацев и удалить их при наличии таблицы между ними.
Что бы при помещении новой таблицы, она автоматически обрамлялась моим "абзацный отступом".
2. Для картинок в тексте тоже установил поля. Но картинки, помещенные пользователем будут иметь поля по умолчанию, а не те, которые мне нужно. Значит нужно делать автоматическую постобработку помещенных картинок. А если картинка помещается в ячейку таблицы, то нужны нулевые поля.
3. В ячейке таблицы тоже должны быть установлены разные размеры полей: для текста и для картинки. Значит нужно отслеживать факт изменения контента ячейки и автоматически менять поля. И защитить их от изменений пользователем.
Это три примера проблемы, возникающей при задаче соблюдения фирменного стиля документа. На самом деле - их гораздо больше.
Сводятся они к одной задаче - динамической установке и защите элементов фирменного форматирования.
Над универсальным решением бьюсь давно.
Для динамической защиты склоняюсь к использованию события app_WindowSelectionChange.
По этому событию должен вызываться макрос.
Он должен проверять, что изменил/удалил пользователь.
Если это элемент или свойство, определенное как фирменное, то макрос должен делать Undo.
Для этого макрос должен:
а) располагать списком фирменных установок для разных видов контента.
б) знать, какой контент на последнем шаге был изменен/удален/вставлен.
Вот с этим "б)" - проблема. Макросу нужна информация о контенте в выделенном за шаг до последнего изменения.
Что может быть таким "моментальным снимком", по которому макрос, сравнив его с текущим состоянием, мог бы определить, что было изменено?
Как пример: Пользователь выделяет абзац позади таблицы, имитирующий "абзацный отступ таблицы" и удаляет его или меняет ему кегль или набирает в нем текст или дублирует его.
Макрос запускается по событию app_WindowSelectionChange и имеет текущее выделение.
Но он имеет информацию о выделенном по предыдущему событию app_WindowSelectionChange (как и где ее хранить???). Если предыдущее выделение включает элемент фирменного формата, а в текущем его нет/он изменен, то он делает откат (Undo).
Помогите пожалуйста идеями, как этот механизм реализовать. Может есть какие то мысли?