Здравствуйте, Marty, Вы писали:
M>Есть таблица, в смысле — структура данных — таблица. Типа HTMLной. Есть rowspan/colspan у её ячеек. У текста в ячейках есть выравнивание — лево/право/по центру/по ширине. Ширина колонок не задаётся (auto), или задаётся в процентах от общего поля вывода. В ячейках лежат абзацы списком. M>Есть ширина канваса для рисования. Есть возможность вычислить реальную длину выводимой строки в юнитах канваса. M>Вопрос: где бы стыбрить/подсмотреть реализацию рисования такой таблицы? Или даже не реализацию, а просто мудрые мысли, как такую таблицу нарисовать? Ну, под рисованием я конечно же понимаю прежде всего вычисление размеров и положений отображаемых блоков с учетом их содержимого
Я лет двадцать назад писал такое и хочу сказать, что в общем виде на больших таблицах (> 1 000 000 000 строк) при нефиксированной ширине (или высоте) ячейки за приемлемое время подсчитать положение не получится.
Смотрите: раз у вас в ячейке многострочный текст, то его высота зависит от ширины ячейки в предположении, что слова переносятся, а не обрезаются.
Допустим
— у нас всего три колонки с фиксированными размерами (по ширине)
— в первой колонке выравнивание по центру по вертикали
— первая колонка — это одна ячейка
— в таблице миллиард строк
Тогда, если высота строки не фиксированная, то, чтобы найти центр по вертикали для первого столбца, придётся подсчитать общую высоту таблицы, а для этого придётся подсчитать высоту для каждой ячейки, но из-за слияния по вертикали этого не достаточно: ещё придётся расчитывать высоту исходя из взаимного расположения ячеек, так, например, если объединить первую и вторую ячейку во втором столбце и вторую и третью ячейки в третьем столбце, то общая высота изменится:
------------------------
| |aaaa | а |
| |bbbbb |----|
| |ccc |aaa |
| this |------|bbb |
| |x | |
| |------|----|
........................
| |------|----|
| | |aa |
| | cc|aaa |
------------------------
Задача усложняется, если для текста используются разные шрифты
Задача усложняется, если ширина колонки должна подбираться автоматически
В результате, если количество ячеек обозримо, то задача решается в три-четыре прохода:
1) расчёт ширины для каждой колонки
2) расчёт минимальной высоты для каждой ячейки
3) расчёт координат (с вертикальными размерами) для каждой ячейки
4) отрисовка видимых ячеек с заданным выравниванием текста.
Алгоритма, который не рассчитывает всю таблицу целиком, а только видимую её часть для строк с автоматическим (исходя из текста) расчётом высоты строк я придумать не смог. Основная проблема — это скроллирование по вертикали.