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

UnixForum





Библиотека сайта rus-linux.net

Электронные таблицы SocialCalc

Глава 19 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: SocialCalc, глава из книги "The Architecture of Open Source Applications" том 1.
Автор: Audrey Tang, перевод: Н.Ромоданов

19.2. SocialCalc

Рис.19.5. Интерфейс SocialCalc

На рис.19.5 и рис.19.6 показаны интерфейс и классы SocialCalc, соответственно. В сравнении с WikiCalc, роль сервера была значительно сокращена. Его единственной обязанностью осталось отвечать на запросы HTTP GET и обслуживать все электронные таблицы, сериализуя их в формате save, позволяющим их сохранять; как только браузер получал данные, все расчеты, отслеживание изменений и взаимодействия пользователем теперь осуществлялись на языке Javascript.

Рис.19.6: Диаграмма классов SocialCalc

Компоненты Javascript были разработаны в стиле послойной модели MVC (Model/View/Controller — Модель/Внешний вид/Контроллер), причем задача каждого класса фокусировалась на одном аспекте:

  • Класс Sheet является моделью данных, представляющих структуру электронной таблицы, размещенную в памяти. В ней хранится словарь из координат для объектов Cell (Ячейка),Он содержит словарь из координат сотовых объектов, каждый из которых представляет одну ячейку. В пустых ячейках нет записей и, поэтому, для них вообще память не тратится.
  • Класс Cell представляет собой содержимое и формат ячейки. Некоторые обычные свойства приведены в таблице 19.1.
  • Класс RenderContext реализует компонент отображения, на него возложена обязанность отображать лист в объекты DOM.
  • Класс TableControl является основным контроллером, принимающим события мыши и клавиатуры. Как только он получит событие, связанное с отображением, например, прокруткой и изменением размеров, он обновляет связанный с ними объект RenderContext. Как только он получит обновления события, которые влияют на содержимое листа, он создает новые команды, которые помещаются в очередь команд листа.
  • Класс SpreadSheetControl является пользовательским интерфейсом верхнего уровня с панелями инструментов, строками состояний, диалоговыми окнами и палитрами для выбора цвета.
  • Класс SpreadSheetViewer является альтернативным пользовательским интерфейсом верхнего уровня, который предназначен только для интерактивного просмотра.

Таблица 19.1: Содержимое и форматы ячеек

datatypet
datavalue1Q84
colorblack
bgcolorwhite
fontitalic bold 12pt Ubuntu
commentIchi-Kyu-Hachi-Yon

Мы взяли на вооружение систему объектов с минимальным количеством классов и простыми механизмами композиции/делегирования и не использовали наследование или прототипы объектов. Все символы помещаются в пространство имен SocialCalc.* с тем, чтобы избежать конфликта имен.

Каждое обновление на листе проходит через метод ScheduleSheetCommands, который принимает строку, представляющую собой команду редактирования. Некоторые обычные команды показаны в таблице 19.2. В приложении, в которое встроен SocialCalc, можно самостоятельно определять дополнительные команды при помощи добавления именованных обратных вызовов в объект SocialCalc.SheetCommandInfo.CmdExtensionCallbacks и использования команды startcmdextension для обращения к ним.

Таблица 19.2: Команды SocialCalc

    set     sheet defaultcolor blue
    set     A width 100
    set     A1 value n 42
    set     A2 text t Hello
    set     A3 formula A1*2
    set     A4 empty
    set     A5 bgcolor green
    merge   A1:B2
    unmerge A1
    erase   A2
    cut     A3
    paste   A4
    copy    A5
    sort    A1:B9 A up B down
    name    define Foo A1:A5
    name    desc   Foo Used in formulas like SUM(Foo)
    name    delete Foo
    startcmdextension UserDefined args


Далее: Цикл работы команд