Библиотека сайта rus-linux.net
Электронные таблицы SocialCalc
Глава 19 из книги "Архитектура приложений с открытым исходным кодом", том 1.
Оригинал: SocialCalc,
глава из книги "The Architecture of Open Source Applications" том 1.
Автор: Audrey Tang, перевод: Н.Ромоданов
19.4. Редактор таблиц
Теперь давайте посмотрим на слой TableEditor
. Он с помощью своего метода RenderContext рассчитывает экранные координаты и с помощью двух экземпляров метода TableControl
управляет горизонтальной/вертикальной прокруткой.
Управление прокруткой с помощью экземпляров метода TableControl
Слой отображения, обрабатываемый классом RenderContext
, также отличается от конструкции WikiCalc. Вместо отображения каждой ячейки в элемент <td>
, мы теперь просто создаем элемент <table>
фиксированного размер, который соответствует видимой области браузера и заранее заполняем ее элементами <td>
.
Когда пользователь выполняет прокрутку с помощью наших полос прокрутки, мы динамически обновляем innerHTML
предварительного нарисованными элементами <td>
. Это означает, что нам не нужно в большинство случаев создавать или уничтожать какие-либо элементы <tr>
и <td>
, что существенно ускоряет время отклика.
Поскольку RenderContext
отрисовывает только видимую область, размер объекта Sheet (Лист) может быть сколь угодно большой, что не влияет на производительность.
В TableEditor
также есть объект CellHandles
, в котором реализовано круговое меню fill/move/slide (заполнение/перемещение/сдвиг), прикрепленное к правому нижнему углу ячейки, редактируемой в текущий момент, которая известна как Ecell и которая показана на рис.19.9.
Рис.19.9: Ячейка, редактируемая в текущий момент и называющаяся Ecell
Управление полем ввода осуществляется двумя классами: InputBox
и InputEcho
. Первый из них управляет строкой редактирования, расположенной над сеткой, а второй, который показан как слой просмотра, обновляемый по мере того, как вы вводите текст, выполняет наложение содержимого ECell (рис.19.10).
Рис.19.10: Поле ввода, управляемое двумя классами
Обычно движок SocialCalc нужен только для связи с сервером в случае, когда электронная таблица открывается для редактирования и когда отправляет сохраняемые данные на сервер. Для этой цели используется метод Sheet.ParseSheetSave
, который анализирует формат save, используемый для сохранения данных, и преобразует данные в объект Sheet
, и метод Sheet.CreateSheetSave
, сериализующий объект Sheet
обратно в формат save.
В формулах можно с помощью адресов URL делать ссылки на значения в любой таблице, расположенной удаленно. Команда recalc
пересчитывает электронные таблицы, в которых есть внешние ссылки, затем анализирует их с помощью метода Sheet.ParseSheetSave
и сохраняет их в кэше, так что пользователь может делать ссылки на другие ячейки в той же самой таблице, расположенной удаленно, без повторного извлечения ее содержимого.
Далее: Формат сохранения save