Наши партнеры

UnixForum





Библиотека сайта 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