Содержание

Containers

Модуль Containers содержит различные описатели типов и записей, и связанные процедуры для работы с контейнерами. Суть контейнеров состоит в том, что эти объекты могут содержать другие объекты.

Контейнеры делятся на две категории:

Модуль Containers поддерживает только динамические контейнеры. Динамические контейнеры содержат в себе два типа содержимого:

Для построения отображений модуль Containers предоставляет строительные блоки в виде моделей и диспетчеров. Особенностью модуля является то, что в отличии от большинства модулей BlackBox, этот модуль предоставляет к использованию несколько реализованных типов (кроме типов-интерфейсов).

Фокус и выделение

Модуль содержит константы:

  1. noSelection - указывает на то, что выделение должно быть отключено;
  2. noFocus - никакое из внедрённых отображений не имеет фокуса;
  3. noCaret - каретка ввода/выбора должна быть отключена;

SelectAll

(c: Controller) SelectAll (select: BOOLEAN), NEW, ABSTRACT;

Может содержать в качестве параметра select одну из двух констант:

  1. select – выбирать;
  2. deselect – не выбирать;

hide, show

CONST hide, show

Часто используются в контроллерах отображений для скрытия или показа выбранной метки.

TYPE Model

TYPE Model (Models.Model), ABSTRACT;

Абстрактная базовая модель для всех контейнеров.

PROCEDURE GetEmbeddingLimits

PROCEDURE (модель_ : Model) GetEmbeddingLimits (OUT minW, maxW, minH, maxH: INTEGER), NEW, ABSTRACT;

Возвращает минимальные (minW, minH) и максимальные (maxW, maxH) границы размеров отображения, внедряемого в модель модель_ . При попытке внедрить в модель_ отображение с

  1. minW > шириной >= maxW
  2. minH > высотой >= maxH

для модели модель_ следует (но не обязательно требуется) изменить размер внедряемого отображения.

Итоговое условие, которое должно выполняться:

  1. 0 <= minW <= maxW
  2. 0 <= minH <= maxH

PROCEDURE ReplaceView

PROCEDURE (модель_ : Model) ReplaceView (стар_ , нов_ : Views.View),nNEW, ABSTRACT;

Подстановка вместо отображения стар_ , которое должно быть внедренным в модель_ , отображения нов_ , которое не может быть ранее внедренным нигде. В результате нов_ оказывается внедренным в модель_ , но стар_ сохраняет свой контекст, который затем распространяется вместе с нов_ . Замена отображения допускает обертывание отображений: Новое отображение занимает место старого, добавляет некоторые новые свойства, но также может сохранить ссылку на старое отображение и делегировать к нему запросы. Пока старое отображение сохраняет свой контекст, оно будет продолжать работать, как если бы оно было непосредственно внедрено в модель_ .

Предусловие

  стар_# NIL
  стар_.context.ThisModel() = модель_
  EmbeddedIn(old, модель_)
  нов_# NIL
  нов_.context = NIL

Постусловие

  NotEmbedded(стар_)
  нов_.context.ThisModel() = модель_
  нов_.context = стар_.context

TYPE View

TYPE View (Views.View), ABSTRACT;

Отображение для контейнеров.

PROCEDURE Internalize

PROCEDURE (вьюшка_ : View) Internalize (VAR rd: Stores.Reader)

Уточнение унаследованной процедуры.

Полностью реализованная загрузка для отображений без собственного сохраняемого состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если загрузка модели терпит неудачу, отображение переключается в нелегальное состояние и загрузка вьюшка_ отменяется; в противном случае модель присоединяется к вьюшка_ . Если загрузка диспетчера терпит неудачу, диcпетчер хранится для последующей выгрузки, чтобы предотвратить потерю информации, но не подключается к отображению (вьюшка_ .ThisController() = NIL), и отображение загружается нормально (то есть, не становится нелегалом).

PROCEDURE Externalize

PROCEDURE (вьюшка_ : View) Externalize (VAR wr: Stores.Writer)

Уточнение унаследованной процедуры

Полностью реализованная выгрузка для отображений без собственного сохраняемого состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если вьюшка_ было ранее загружено с диспетчером-нелегалом, и никакой другой диспетчер установлен не был, то нелегальный диспетчер будет выгружен, хотя вьюшка_ .ThisController() = NIL.

Супервызов в начале обязателен

Предусловие

  вьюшка_ .ThisModel() # NIL	20

PROCEDURE CopyFrom

PROCEDURE (вьюшка_ : View) CopyFrom (источник_ : Stores.Store)

Уточнение унаследованной процедуры

Предполагая, что модель для вьюшка_ уже была установлена, копирует диспетчер и, возможно, состояние другого отображения из источник_ . Если источник_ cодержит скрытый нелегальный диспетчер (см. Internalize выше), ссылка на него также копируется.

Супервызов в начале обязателен