Библиотека сайта rus-linux.net
Электронные таблицы SocialCalc
Глава 19 из книги "Архитектура приложений с открытым исходным кодом", том 1.
Оригинал: SocialCalc,
глава из книги "The Architecture of Open Source Applications" том 1.
Автор: Audrey Tang, перевод: Н.Ромоданов
19.3. Цикл работы команд
Чтобы улучшить ответную реакцию, SocialCalc выполняет все перерасчеты и обновления DOM в фоновом режиме, так что пользователь может вносить новые изменения в несколько ячеек в то время, как движок выполняет более ранние изменения, записанные в очереди команд.
Рис.19.7: Цикл работы команд SocialCalc
Когда выполняется команда, объект TableEditor
устанавливает свой флаг busy
(занято) в состояние true (истина); затем последующие команды помещаются в очередь deferredCommands
, что обеспечивает последовательный порядок выполнения команд. Как видно на диаграмме цикла событий, показанной на рис.19.7, объект Sheet продолжает посылать события StatusCallback
с тем, чтобы уведомить пользователя о текущем состоянии выполнения команды, которая может находиться одном из следующих четырех состояний:
- ExecuteCommand (выполнение команды): Посылает сигнал
cmdstart
при старте и сигналcmdend
, когда команда завершает выполнение. Если команда косвенно изменила значение ячейки, то переходим к щану Recalc. Иначе, если команда изменила внешний вид одной или нескольких ячеек, отображаемых на экране, то переходим к шагу Render. Если не произошло ни одно из вышеперечисленных условий (например, в случае команды копированияcopy
), то происходит переход к шагу PositionCalculations. - Recalc (при необходимости) (перерасчет): Посылает сигнал
calcstar
t при старте, сигналcalcorder
каждые 100 мс при проверке цепочки зависимостей ячеек, сигналcalccheckdone
когда проверка оканчивается, и сигналcalcfinished
, когда все соответствующие ячейки получат свои перевычисленные значениями. За эти шагом всегда следует шаг Render. - Render (при необходимости) (Отображение): Посылает сигнал
schedrender
и сигналrenderdone
когда элемент<table>
изменяется с изменением формата ячеек. За этим шагом всегда следует шаг PositionCalculations. - PositionCalculations (вычисление положения): Посылает сигнал
schedposcalc
при запуске и сигналdoneposcalc
после обновления полос прокрутки, курсора текущей редактируемой ячейки и других визуальных компонентовTableEditor
.
Поскольку все команды будут сохранены после того, как они будут выполнены, мы естественным образом получаем журнал аудита всех операций. Метод Sheet.CreateAuditString
добавляет в журнал аудита символы новой строки с тем, чтобы каждая команда была в отдельной строке.
ExecuteSheetCommand
также для каждой команды, которую он выполняет, создает команду отмены undo. Например, если в ячейке A1 находится текст «Foo» и пользователь выполняет команду set A1 text Bar
, то в стек команд отмены будет помещена команда set A1 text Foo
. Если пользователь нажимает кнопку Undo, то будет выполнена команда undo, которая восстановит содержимое ячейки A1 к исходному значению.
Далее: Редактор таблиц