Сегодня я пишу что-то необычное c, потому что мне нравится понимать, как это работает, процесс создания непрерывных разделов в программе обработки текста, как вы знаете это по Microsoft Word, Libre Office или Apple Pages.
В настоящее время я пишу свой собственный текстовый редактор. Это должно быть очень обширным. У меня есть два модуля. Один заботится о данных, другой заботится о представлении данных. Таким образом, второй является средством визуализации для класса данных.
Структура документа данных с отформатированными текстами можно приблизительно описать следующим образом:
Document
+ Section (2 Columns)
+ Paragraph
+ Text
+ Tabstop
+ Text
+ Picture
+ Paragraph
+ Text
+ Section
...
Итак, у нас есть структура данных с один раздел, который в свою очередь содержит два абзаца с различным содержанием. Механизм рендеринга в настоящее время переводит все это следующим образом:
Document
+ Page
+ PageColumn (1. Column)
+ Blocks
+ Paragraph
+ Line
+ Text
+ Tabstop
+ Text
+ Picture
...
+ Paragraph
+ Line
+ Text
...
+ PageColumn (2. Column)
+ Blocks
...
Средство визуализации вычисляет, сколько строк, сгенерированных структурой данных, помещается в абзац. Затем он снова смотрит, сколько блоков (абзац или таблица) помещается в столбце. Если высота превышена, она продолжается в следующем столбце и добавляет новую страницу, если необходимо.
Это означает, что в данный момент я могу отображать «фиксированные» разделы с моей структурой, то есть те, которые начинаются на Even / Odd / NextPage. Для рисования элемента управления это просто означает, что для каждой страницы я вывожу все столбцы слева направо, с содержимым столбцов, затем блоки рисуются сверху вниз.
Внутри Word, Pages et c. однако возможно отображение непрерывных разделов на странице. Пример:
Page
Section (1 Column)
Section (2 Columns)
Section (1 Column)
Как вам нужно изменить структуру, чтобы вы могли это реализовать? В непрерывном разделе с более чем одним столбцом необходимо каким-то образом заранее рассчитать, сколько блоков и строк поместится в каждый столбец, чтобы получить сбалансированный результат отображения.
У кого-нибудь есть предложения?
Большое спасибо.