| |
| — | cp:containers [2020/07/24 06:22] (текущий) – создано iadenisov |
|---|
| | =====Containers===== |
| | Модуль **Containers** содержит различные описатели типов и записей, и связанные процедуры для работы с //контейнерами//. Суть контейнеров состоит в том, что эти объекты могут содержать другие объекты. |
| |
| | Контейнеры делятся на две категории: |
| | * Контейнеры с фиксированной структурой и фиксированными типами внедряемых //отображений// (статические контейнеры); |
| | * Контейнеры, позволяющие внедрять произвольное количество //отображений// с различными их типами (динамические контейнеры). |
| | |
| | Модуль **Containers** поддерживает только динамические контейнеры. Динамические контейнеры содержат в себе два типа содержимого: |
| | * собственное содержание (для текстового редактора -- это текст); |
| | * внедрённое содержание (для текстового редактора -- это картинки) |
| | |
| | Для построения //отображений// модуль **Containers** предоставляет строительные блоки в виде моделей и диспетчеров. Особенностью модуля является то, что в отличии от большинства модулей BlackBox, этот модуль предоставляет к использованию несколько реализованных типов (кроме типов-интерфейсов). |
| | |
| | ====Фокус и выделение==== |
| | Модуль содержит константы: |
| | - noSelection - указывает на то, что выделение должно быть отключено; |
| | - noFocus - никакое из внедрённых отображений не имеет фокуса; |
| | - noCaret - каретка ввода/выбора должна быть отключена; |
| | |
| | ====SelectAll==== |
| | '' (c: Controller) **SelectAll** (select: BOOLEAN), NEW, ABSTRACT;'' |
| | |
| | Может содержать в качестве параметра //select// одну из двух констант: |
| | - select -- выбирать; |
| | - 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'') границы размеров отображения, внедряемого в модель ''модель_ ''. При попытке внедрить в ''модель_ '' отображение с |
| | - minW > шириной >= maxW |
| | - minH > высотой >= maxH |
| | для модели ''модель_ '' следует (но не обязательно требуется) изменить размер внедряемого отображения. |
| | |
| | Итоговое условие, которое должно выполняться: |
| | - 0 <= minW <= maxW |
| | - 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** выше), ссылка на него также копируется. |
| | |
| | Супервызов в начале обязателен |