Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Беспроводные выключатели nooLite купить дешевый 
компьютер родом из Dhgate.com

Lines Club

Ищем достойных соперников.

Библиотека сайта или "Мой Linux Documentation Project"

Электронные таблицы 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 к исходному значению.


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


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют