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

UnixForum





Библиотека сайта 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 (при необходимости) (перерасчет): Посылает сигнал calcstart при старте, сигнал 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 к исходному значению.


Далее: Редактор таблиц