Модуль Containers содержит различные описатели типов и записей, и связанные процедуры для работы с контейнерами. Суть контейнеров состоит в том, что эти объекты могут содержать другие объекты.
Контейнеры делятся на две категории:
Модуль Containers поддерживает только динамические контейнеры. Динамические контейнеры содержат в себе два типа содержимого:
Для построения отображений модуль Containers предоставляет строительные блоки в виде моделей и диспетчеров. Особенностью модуля является то, что в отличии от большинства модулей BlackBox, этот модуль предоставляет к использованию несколько реализованных типов (кроме типов-интерфейсов).
Модуль содержит константы:
(c: Controller) SelectAll (select: BOOLEAN), NEW, ABSTRACT;
Может содержать в качестве параметра select одну из двух констант:
CONST hide, show
Часто используются в контроллерах отображений для скрытия или показа выбранной метки.
TYPE Model (Models.Model), ABSTRACT;
Абстрактная базовая модель для всех контейнеров.
PROCEDURE (модель_ : Model) GetEmbeddingLimits (OUT minW, maxW, minH, maxH: INTEGER), NEW, ABSTRACT;
Возвращает минимальные (minW, minH
) и максимальные (maxW, maxH
) границы размеров отображения, внедряемого в модель модель_
. При попытке внедрить в модель_
отображение с
для модели модель_
следует (но не обязательно требуется) изменить размер внедряемого отображения.
Итоговое условие, которое должно выполняться:
PROCEDURE (модель_ : Model) ReplaceView (стар_ , нов_ : Views.View),nNEW, ABSTRACT;
Подстановка вместо отображения стар_
, которое должно быть внедренным в модель_
, отображения нов_
, которое не может быть ранее внедренным нигде. В результате нов_
оказывается внедренным в модель_
, но стар_
сохраняет свой контекст, который затем распространяется вместе с нов_
. Замена отображения допускает обертывание отображений: Новое отображение занимает место старого, добавляет некоторые новые свойства, но также может сохранить ссылку на старое отображение и делегировать к нему запросы. Пока старое отображение сохраняет свой контекст, оно будет продолжать работать, как если бы оно было непосредственно внедрено в модель_
.
Предусловие
стар_# NIL стар_.context.ThisModel() = модель_ EmbeddedIn(old, модель_) нов_# NIL нов_.context = NIL
Постусловие
NotEmbedded(стар_) нов_.context.ThisModel() = модель_ нов_.context = стар_.context
TYPE View (Views.View), ABSTRACT;
Отображение для контейнеров.
PROCEDURE (вьюшка_ : View) Internalize (VAR rd: Stores.Reader)
Уточнение унаследованной процедуры.
Полностью реализованная загрузка для отображений без собственного сохраняемого состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если загрузка модели терпит неудачу, отображение переключается в нелегальное состояние и загрузка вьюшка_
отменяется; в противном случае модель присоединяется к вьюшка_
. Если загрузка диспетчера терпит неудачу, диcпетчер хранится для последующей выгрузки, чтобы предотвратить потерю информации, но не подключается к отображению (вьюшка_ .ThisController() = NIL
), и отображение загружается нормально (то есть, не становится нелегалом).
PROCEDURE (вьюшка_ : View) Externalize (VAR wr: Stores.Writer)
Уточнение унаследованной процедуры
Полностью реализованная выгрузка для отображений без собственного сохраняемого состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если вьюшка_
было ранее загружено с диспетчером-нелегалом, и никакой другой диспетчер установлен не был, то нелегальный диспетчер будет выгружен, хотя вьюшка_ .ThisController() = NIL
.
Супервызов в начале обязателен
Предусловие
вьюшка_ .ThisModel() # NIL 20
PROCEDURE (вьюшка_ : View) CopyFrom (источник_ : Stores.Store)
Уточнение унаследованной процедуры
Предполагая, что модель для вьюшка_
уже была установлена, копирует диспетчер и, возможно, состояние другого отображения из источник_
. Если источник_
cодержит скрытый нелегальный диспетчер (см. Internalize выше), ссылка на него также копируется.
Супервызов в начале обязателен