System/Docu/ru/Containers.odc

Containers

DEFINITION Containers;

	IMPORT Controllers, Stores, Views, Models, Properties;

	CONST
		noSelection = 0; noFocus = 1; noCaret = 2;
		mask = {noSelection, noCaret}; layout = {noFocus};
		deselect = FALSE; select = TRUE;
		any = FALSE; selection = TRUE;
		hide = FALSE; show = TRUE;

	TYPE
		Model = POINTER TO ABSTRACT RECORD (Models.Model)
			(m: Model) GetEmbeddingLimits (OUT minW, maxW, minH, maxH: INTEGER), NEW, ABSTRACT;
			(m: Model) ReplaceView (old, new: Views.View), NEW, ABSTRACT;
			(m: Model) InitFrom- (source: Model), NEW, EMPTY
		END;

		View = POINTER TO ABSTRACT RECORD (Views.View)
			(v: View) CopyFromModelView2- (source: Views.View; model: Models.Model), NEW, EMPTY;
			(v: View) Externalize2- (VAR rd: Stores.Writer), NEW, EMPTY;
			(v: View) HandleCtrlMsg2- (f: Views.Frame; VAR msg: Views.CtrlMessage;
													VAR focus: Views.View), NEW, EMPTY;
			(v: View) HandleModelMsg2- (VAR msg: Models.Message), NEW, EMPTY;
			(v: View) HandlePropMsg2- (VAR p: Views.PropMessage), NEW, EMPTY;
			(v: View) HandleViewMsg2- (f: Views.Frame; VAR msg: Views.Message), NEW, EMPTY;
			(v: View) Internalize2- (VAR rd: Stores.Reader), NEW, EMPTY;
			(v: View) InitModel (m: Model), NEW;
			(v: View) InitModel2- (m: Model), NEW, EMPTY;
			(v: View) AcceptableModel- (m: Model): BOOLEAN, NEW, ABSTRACT;
			(v: View) GetRect (f: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER), NEW, ABSTRACT;

			(v: View) ThisModel (): Model, EXTENSIBLE;
			(v: View) SetController (c: Controller), NEW;
			(v: View) ThisController (): Controller, NEW, EXTENSIBLE;
			(v: View) GetRect (f: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER), NEW, ABSTRACT;
			(v: View) CatchModelMsg (VAR msg: Models.Message), NEW, EMPTY;
			(v: View) CatchViewMsg (f: Views.Frame; VAR msg: Views.Message), NEW, EMPTY;
			(v: View) CatchCtrlMsg (f: Views.Frame; VAR msg: Views.CtrlMessage;
																		VAR focus: Views.View), NEW, EMPTY;
			(v: View) CatchPropMsg (VAR msg: Views.PropMessage), NEW, EMPTY
		END;

		Controller = POINTER TO ABSTRACT RECORD (Controllers.Controller)
			opts-: SET;
			(c: Controller) ThisView (): View, EXTENSIBLE;
			(c: Controller) SetOpts (opts: SET), NEW, EXTENSIBLE;
			(c: Controller) GetContextType (OUT type: Stores.TypeName), NEW, ABSTRACT;
			(c: Controller) GetValidOps (OUT valid: SET), NEW, ABSTRACT;
			(c: Controller) NativeModel (m: Models.Model): BOOLEAN, NEW, ABSTRACT;
			(c: Controller) NativeView (v: Views.View): BOOLEAN, NEW, ABSTRACT;
			(c: Controller) NativeCursorAt (f: Views.Frame; x, y: INTEGER): INTEGER, NEW, ABSTRACT;
			(c: Controller) PickNativeProp (f: Views.Frame; x, y: INTEGER;
																					VAR p: Properties.Property), NEW, EMPTY;
			(c: Controller) PollNativeProp (selection: BOOLEAN; VAR p: Properties.Property;
														VAR truncated: BOOLEAN), NEW, EMPTY;
			(c: Controller) SetNativeProp (selection: BOOLEAN; old, p: Properties.Property), NEW, EMPTY;
			(c: Controller) MakeViewVisible (v: Views.View), NEW, EMPTY;
			(c: Controller) GetFirstView (selection: BOOLEAN; OUT v: Views.View), NEW, ABSTRACT;
			(c: Controller) GetNextView (selection: BOOLEAN; VAR v: Views.View), NEW, ABSTRACT;
			(c: Controller) GetPrevView (selection: BOOLEAN; VAR v: Views.View), NEW, EXTENSIBLE;
			(c: Controller) CanDrop (f: Views.Frame; x, y: INTEGER): BOOLEAN, NEW, EXTENSIBLE;
			(c: Controller) MarkDropTarget (src, dst: Views.Frame; sx, sy, dx, dy, w, h, rx, ry: INTEGER;
														type: Stores.TypeName; isSingle, show: BOOLEAN), NEW, EMPTY;
			(c: Controller) Drop (src, dst: Views.Frame; sx, sy, dx, dy, w, h, rx, ry: INTEGER;
																	view: Views.View; isSingle: BOOLEAN), NEW, ABSTRACT;
			(c: Controller) MarkPickTarget (src, dst: Views.Frame;
																	sx, sy, dx, dy: INTEGER; show: BOOLEAN), NEW, EMPTY;
			(c: Controller) TrackMarks (f: Views.Frame; x, y: INTEGER;
																	 units, extend, add: BOOLEAN), NEW, ABSTRACT;
			(c: Controller) Resize (view: Views.View; l, t, r, b: INTEGER), NEW, ABSTRACT;
			(c: Controller) GetSelectionBounds (f: Views.Frame;
																	OUT x, y, w, h: INTEGER), NEW, EXTENSIBLE;
			(c: Controller) DeleteSelection, NEW, ABSTRACT;
			(c: Controller) MoveLocalSelection (src, dst: Views.Frame;
																	sx, sy, dx, dy: INTEGER), NEW, ABSTRACT;
			(c: Controller) CopyLocalSelection (src, dst: Views.Frame;
																	sx, sy, dx, dy: INTEGER), NEW, ABSTRACT;
			(c: Controller) SelectionCopy (): Model, NEW, ABSTRACT;
			(c: Controller) NativePaste (m: Models.Model; f: Views.Frame), NEW, ABSTRACT;
			(c: Controller) ArrowChar (f: Views.Frame; ch: CHAR; units, select: BOOLEAN), NEW, ABSTRACT;
			(c: Controller) ControlChar (f: Views.Frame; ch: CHAR), NEW, ABSTRACT;
			(c: Controller) PasteChar (ch: CHAR), NEW, ABSTRACT;
			(c: Controller) PasteView (f: Views.Frame; v: Views.View; w, h: INTEGER), NEW, ABSTRACT;
			(c: Controller) HasSelection (): BOOLEAN, NEW, EXTENSIBLE;
			(c: Controller) Selectable (): BOOLEAN, NEW, ABSTRACT;
			(c: Controller) Singleton (): Views.View, NEW;
			(c: Controller) SetSingleton (s: Views.View), NEW, EXTENSIBLE;
			(c: Controller) SelectAll (select: BOOLEAN), NEW, ABSTRACT;
			(c: Controller) InSelection (f: Views.Frame; x, y: INTEGER): BOOLEAN, NEW, ABSTRACT;
			(c: Controller) MarkSelection (f: Views.Frame; show: BOOLEAN), NEW, EXTENSIBLE;
			(c: Controller) SetFocus (focus: Views.View), NEW;
			(c: Controller) HasCaret (): BOOLEAN, NEW, ABSTRACT;
			(c: Controller) MarkCaret (f: Views.Frame; show: BOOLEAN), NEW, ABSTRACT;
			(c: Controller) Mark (f: Views.Frame; l, t, r, b: INTEGER; show: BOOLEAN), NEW, EXTENSIBLE
		END;

		Directory = POINTER TO ABSTRACT RECORD 
			(d: Directory) New (): Controller, NEW, EXTENSIBLE;
			(d: Directory) NewController (opts: SET): Controller, NEW, ABSTRACT
		END;

		DropPref = RECORD (Properties.Preference)
			mode-: SET;
			okToDrop: BOOLEAN
		END;

		GetOpts = RECORD (Views.PropMessage)
			valid, opts: SET
		END;

		SetOpts = RECORD (Views.PropMessage)
			valid, opts: SET
		END;

	PROCEDURE Focus (): Controller;
	PROCEDURE FocusSingleton (): Views.View;
	PROCEDURE MarkSingleton (c: Controller; f: Views.Frame; show: BOOLEAN);
	PROCEDURE FadeMarks (c: Controller; show: BOOLEAN);

END Containers.


Контейнеры - это отображения, которые могут содержать другие (внедренные) отображения. Обычно контейнеры разделяются на две категории. К первой относятся контейнеры с фиксированной структурой и фиксированными типами внедряемых отображений. Например, контейнер электронной почты может состоять лишь из двух отображений: панели инструментов вверху и текстового отображения внизу. Их размещение не может редактироваться. Такие отображения называются статические контейнеры.
Вторая категория контейнеров может внедрять произвольное количество отображений, которые могут иметь произвольные типы. Текстовые отображения и формы могут служить примерами таких динамических отображений-контейнеров. Только эта вторая категория, называемая динамические контейнеры, поддерживается модулем Containers, и к ним относится этот текст.
Динамические контейнеры состоят из переменного числа внедренных отображений, плюс некоторое собственное содержание. Например, текстовые отображения содержат текст в качестве собственного содержания, но также позволяют произвольным отображениям (то есть, не-собственному содержанию), плавать в тексте. Отображения-формы являются деградировавшими в том смысле, что они не имеют собственного содержания.
Различные стандарты составных документов (OLE, OpenDoc) различаются тем, как трактуется выделение и фокус. Фокус - это редактируемое в настоящий момент отображение, отображение, получающее события от клавиатуры, отображение, которое определяет доступные в настоящий момент меню, отображение, которое содержит текущее выделение, каретку или иную метку.
Модуль Containers предоставляет строительные блоки для отображений-контейнеров, включая специальные модели и диспетчеры. В отличие от большинства модулей BlackBox, Containers экспортирует несколько конкретно реализованных типов, не считая чистых типов-интерфейсов. Реализации предоставляются в форме, общей для используемых платформ, то есть, различия в пользовательском интерфейсе скрыты реализацией Containers.
В частности, Containers полностью реализует монолитные выделения, то есть, выделения, которые захватывают точно одно отображение без собственного содержимого контейнера.

Пример: КартаподсистемыForm


CONST noSelection, noFocus, noCaret
Возможные элементы Controller.opt. noSelection указывает, что выделение должно быть отключено, noFocus указывает, что никакое из внедренных отображений не имеет фокуса, и noCaret указывает, что каретка (метка вставки) и, следовательно, возможность набора или вставки должны быть отключены.

CONST mask, layout
Два особенно полезных подмножества Controller.opr. mask запрещает редактирование собственного содержания контейнера, но допускает фокусирование и тем самым редактирование внедренных объектов; например, это позволяет использовать форму без ее изменения. layout действует с точностью до наоборот: фокусирование и редактирование внедренных объектов приостанавливаются, но собственное содержимое контейнера может свободно редактироваться; например, это полезно для редактирования форм без реальной активации, скажем, кнопки, когда редактируется ее позиция на форме.

CONST deselect, select
Возможные значения параметра select метода Controller.SelectAll.

CONST any, selection
Возможные значения параметра selection методов Controller.GetFirstView, Controller.GetNextView, Controller.GetPrevView, Controller.PollNativeProp и Controller.SetNativeProp. Указывает, когда сферой действия операции является текущее выделение или содержимое контейнера целиком.

CONST hide, show
Возможные значения параметра show процедур FadeMarks, MarkSingleton, Controller.Mark, Controller.MarkCaret, Controller.MarkDropTarget, Controller.MarkPickTarget и Controller.MarkSelections. Указывает, когда соответствующая метка должна быть скрыта или показана.


TYPE Model (Models.Model)
ABSTRACT
Модели для контейнеров.

PROCEDURE (m: Model) GetEmbeddingLimits (OUT minW, maxW, minH, maxH: INTEGER)
NEW, ABSTRACT
Возвращает минимальные (minW, minH) и максимальные (maxW, maxH) границы размеров отображения, внедряемого в модель m. При попытке внедрить в m отображение с шириной < minW, шириной >= maxW, высотой < minH или высотой >= maxH модели m следует (но не обязательно требуется) изменить размер внедряемого отображения.

Постусловие
0 <= minW <= maxW
0 <= minH <= maxH

PROCEDURE (m: Model) ReplaceView (old, new: Views.View)
NEW, ABSTRACT
Подстановка вместо отображения old, которое должно быть внедренным в m, отображения new, которое не может быть ранее внедренным нигде. В результате new оказывается внедренным в m, но old сохраняет свой контекст, который затем рапространяется вместе с new. Замена отображения допускает обертывание отображений: Новое отображение занимает место старого, добавляет некоторые новые свойства, но также может сохранить ссылку на старое отображение и делегировать к нему запросы. Пока старое отображение сохраняет свой контекст, оно будет продолжать работать, как если бы оно было непосредственно внедрено в m.

Предусловие
old # NIL
old.context.ThisModel() = m
EmbeddedIn(old, m)
new # NIL
new.context = NIL

Постусловие
NotEmbedded(old)
new.context.ThisModel() = m
new.context = old.context

PROCEDURE (m: Model) InitFrom- (source: Model)
NEW, EMPTY
Инициализирует модель m, которая была заново размещена как объект того же типа, что и source. В некоторых (редких) случаях это может быть полезно для разделения некоторых внутренних структур данных между m и source.

Предусловие
source # NIL
Type(m) = Type(source)


TYPE View (Views.View)
ABSTRACT
Отображение для контейнеров.

PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader)
Уточнение унаследованной процедуры
Полностью реализованная загрузка для отображений без собственного перманентного состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если загрузка модели терпит неудачу, отображение переключается в нелегальное состояние и загрузка v отменяется; в противном случае модель присоединяется к v. Если загрузка диспетчера терпит неудачу, дипспетчер хранится для последующей выгрузки, чтобы предотвратить потерю информации, но не подключается к отображению (v.ThisController() = NIL), и отображение загружается нормально (то есть, не становится нелегалом).


PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer)
Уточнение унаследованной процедуры
Полностью реализованная выгрузка для отображений без собственного перманентного состояния, обрабатывающая загрузку модели отображения-контейнера и диспетчера. Если v было ранее загружено с диспетчером-нелегалом, и никакой другой диспетчер установлен не был, то нелегальный диспетчер будет выгружен, хотя v.ThisController() = NIL.
Супервызов в начале обязателен

Предусловие
v.ThisModel() # NIL	20

PROCEDURE (v: View) CopyFrom (source: Stores.Store)
Уточнение унаследованной процедуры
Предполагая, что модель для v уже была установлена, копирует диспетчер и, возможно, состояние другого отображения из source. Если source cодержит скрытый нелегальный диспетчер (см. Internalize выше), ссылка на него также копируется.
Супервызов в начале обязателен

Предусловие
v.ThisModel() # NIL	20

Постусловие
source.ThisController() = NIL
	v.ThisController() = NIL
source.ThisController() # NIL
	v.ThisController() = source.ThisController().Clone().CopyFrom(source.ThisController())

PROCEDURE (v: View) ThisModel (): Model
EXTENSIBLE
Возвращает модель для v.
Ковариантное сужение результата функции.

PROCEDURE (v: View) InitModel (m: Containers.Model)
NEW
Назначить модель для данного отображения.

Предусловие
(v.ThisModel() = NIL) OR (v.ThisModel() = m)	20
m # NIL	21
v.AcceptableModel(m)	22

PROCEDURE (v: View) InitModel2- (m: Containers.Model)
NEW, EMPTY
Перехватчик расширений, вызываемый из InitModel.

PROCEDURE (v: View) SetController (c: Controller)
NEW, EXTENSIBLE, Operation
Устанавливает диспетчер для v. Если v имеет скрытый нелегальный диспетчер, он удаляется.

Предусловие
v.ThisModel() # NIL	20

Постусловие
v.ThisController() = c

PROCEDURE (v: View) ThisController (): Controller
NEW, EXTENSIBLE
Возвращает диспетчер для v.

PROCEDURE (v: View) GetRect (f: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER)
NEW, ABSTRACT
Для показа в кадре f, задает прямоугольную границу отображения view, которое должно быть внедренным в v. Если вычисления для границы будут слишком объемными, дает приемлемое приближение.

Постусловие
l <= r
t<= b

PROCEDURE (v: View) CatchModelMsg (VAR msg: Models.Message)
NEW, EMPTY
Перехватчик расширений для HandleModelMsg, который стал финальным.

PROCEDURE (v: View) CatchViewMsg (f: Views.Frame; VAR msg: Views.Message)
NEW, EMPTY
Перехватчик расширений для HandleViewMsg, который стал финальным.

PROCEDURE (v: View) CatchCtrlMsg
									 (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View)
NEW, EMPTY
Перехватчик расширений для HandleCtrlMsg, который стал финальным.

PROCEDURE (v: View) CatchPropMsg (VAR p: Properties.Message)
NEW, EMPTY
Перехватчик расширений для HandlePropMsg, который стал финальным.

PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame;
	VAR msg: Controllers.Message; VAR focus: Views.View)
Уточнение унаследованной процедуры
Если v имеет установленный диспетчер, вызывает v.ThisController().HandleCtrlMsg(f, msg, focus), затем вызывает v.CatchCtrlMsg(f, msg, focus). То есть, диспетчер видит сообщение msg раньше, чем отображение.
	Дополнительно применяется строгий фильтр, отсеивающий нежелательные сообщения: сообщения делегируются диспетчеру или отображению, только если они удовлетворяют одному из следующих трех критериев:
Первое, что кадр f является целевым или передним кадром. Второе, что сообщение пришло от Controllers.PollOpsMsg, Controllers.PollCursorMsg, Controllers.TransferMessage или Controllers.PageMsg. Третье, что контекст v является нормализованным, то есть, вызывалось v.context.Normalize(), и сообщение пришло от Controllers.PollSectionMsg or Controllers.ScrollMsg. Это стандартные условия фильтрации сообщений, делающие компоненты более устойчивыми против случайных сообщений. 
	Наконец, сообщения прокрутки (приходящие от Controllers.PollSectionMsg или Controllers.ScrollMsg) могут запросить поверхностную обработку (~msg.focus), то есть подавление возможной пересылки сообщения существующим подфокусам. В этих случаях возрат из процедуры сопровождается очисткой focus.

Постусловие
(msg IS Controllers.PollSectionMsg) OR (msg IS Controllers.ScrollMsg)
	~msg.focus
		focus = NIL


TYPE Controller (Controllers.Controller)
ABSTRACT
Диспетчеры для контейнеров.

opts-: SET
Множество свойств диспетчера; используется для усечения функциональности диспетчера до опредленных подмножеств.

PROCEDURE (c: Controller) ThisView (): View
EXTENSIBLE
Возвращаемый тип сужен.

PROCEDURE (c: Controller) SetOpts (opts: SET)
NEW, EXTENSIBLE, Операция
Устанавливает свойства c. Это является операцией только после установки отображения, то есть, когда c.ThisView() # NIL, иначе это всего лишь простое присваивание opts полю c.opts. Свойства 0..7 используются или зарезервированы для BlackBox, остальные могут использоваться в расширениях.

Постусловие
c.opts = opts

PROCEDURE (c: Controller) GetContextType (OUT type: Stores.TypeName)
NEW, ABSTRACT
Вызывается из c.HandleCtrlMsg для заполнения Controllers.PollOpsMsg.type.

PROCEDURE (c: Controller) GetValidOps (OUT valid: SET)
NEW, ABSTRACT
Вызывается из c.HandleCtrlMsg для заполнения Controllers.PollOpsMsg.ops.

PROCEDURE (c: Controller) NativeModel (m: Models.Model): BOOLEAN
NEW, ABSTRACT
Проверяет, что m является исконной моделью c, то есть, моделью, которая может быть подключена к отображению, годному для подключения к c.

PROCEDURE (c: Controller) NativeView (v: Views.View): BOOLEAN
NEW, ABSTRACT
Проверяет, что v является исконным отображением c, то есть, отображением, которое может быть подключено к c.

PROCEDURE (c: Controller) NativeCursorAt (f: Views.Frame; x, y: INTEGER): INTEGER
NEW, ABSTRACT
Курсор, который c будет отображал бы точке (x, y) кадра f, безотносительно к отображениям, возможно, внедренным на этой позиции.

PROCEDURE (c: Controller) PickNativeProp (f: Views.Frame; x, y: INTEGER;
	VAR p: Properties.Property)
NEW, EMPTY
Свойства исконного содержания c в точке (x, y) кадра f, безотносительно к отображениям, возможно, внедренным на этой позиции.

PROCEDURE (c: Controller) PollNativeProp (selection: BOOLEAN;
	VAR p: Properties.Property; VAR truncated: BOOLEAN);
NEW, EMPTY
Свойства исконного выделенного или полного содержания c, безотносительно к отображениям, возможно, внедренным на этом пространстве.

PROCEDURE (c: Controller) SetNativeProp (selection: BOOLEAN; old, p: Properties.Property)
NEW, EMPTY
Устанавливает свойства исконного выделенного или полного содержания c равными p, безотносительно к отображениям, возможно, внедренным на этом пространстве. Изменяются значения только тех свойств c, старые значения которых совпадают с теми, которые переданы в old. Это делает возможным выборочное изменение свойств. Например, в цветной модели все красные объекты могут быть сделаны зелеными.

PROCEDURE (c: Controller) MakeViewVisible (v: Views.View)
NEW, EMPTY
Делает внедренное отображение v видимым в отображении контроллера.

Предусловие
v внедрено в отображение c	20

PROCEDURE (c: Controller) GetFirstView (selection: BOOLEAN; OUT v: Views.View)
NEW, ABSTRACT
Возвращает первое отображение, внедренное в модель c, относительно начала модели или текущего выделения.

PROCEDURE (c: Controller) GetNextView (selection: BOOLEAN; VAR v: Views.View)
NEW, ABSTRACT
Возвращает следующее отображение в указанном промежутке, который может быть выделением или полным содержанием модели c. Отображение, следующее за последним в указанном промежутке, считается NIL.

PROCEDURE (c: Controller) GetPrevView (selection: BOOLEAN; VAR v: Views.View)
NEW, EXTENSIBLE
Возвращает следующее отображение в указанном промежутке, который может быть выделением или полным содержанием модели c. Обычно использует GetFirstView и GetNextView для поиска предыдущего отображения v.  Отображение, предыдущее к первому в указанном промежутке, считается NIL.


Предусловие
v # NIL	20
EmbeddedIn(v, c.ThisModel())	21

PROCEDURE (c: Controller) CanDrop (f: Views.Frame; x, y: INTEGER): BOOLEAN
NEW, EXTENSIBLE
Возвращает, может ли перетаскиваемый материал быть брошен в кадр f в его локальных координатах (x, y). По умолчанию любой запрос на бросание разрешается, то есть, возвращается TRUE.

PROCEDURE (c: Controller) MarkDropTarget (src, dst: Views.Frame;
																					sx, sy, dx, dy, w, h, rx, ry: INTEGER;
																					type: Stores.TypeName;
																					isSingle, show: BOOLEAN)
NEW, EMPTY
Помечает цель перетаскивания в принимающем кадре dst в точке (dx, dy) для потенциального бросания материала с позиции (sx, sy) кадра-источника src. show указывает, должна ли метка быть поставлена или удалена. isSingle указывает, является ли бросаемое выделение монолитом. (rx, ry) - точка привязки внутри выделения, в которой началась операция перетаскивания. См. также Controllers.PollDropMsg.

PROCEDURE (c: Controller) Drop (src, dst: Views.Frame; sx, sy, dx, dy, w, h, rx, ry: INTEGER;
																view: Views.View; isSingle: BOOLEAN)
NEW, ABSTRACT
Бросает материал, перетаскиваемый с позиции (sx, sy) кадра-источника src и инкапсулированный в отображении view под контролем c, в точку (dx, dy) кадра-приемника dst. По умолчанию бросание игнорируется. isSingle указывает, является ли бросаемое выделение монолитом. (rx, ry) - точка привязки внутри выделения, в которой началась операция перетаскивания. См. также Controllers.DropMsg.

PROCEDURE (c: Controller) MarkPickTarget (src, dst: Views.Frame; sx, sy, dx, dy: INTEGER; show: BOOLEAN)
NEW, EMPTY
Помечает цель перетаскивания в принимающем кадре dst в точке (dx, dy) для потенциального бросания материала с позиции (sx, sy) кадра-источника src. show указывает, должна ли метка быть поставлена или удалена. По умолчанию метка не ставится вообще.

PROCEDURE (c: Controller) TrackMarks (f: Views.Frame; x, y: INTEGER; units, extend, add: BOOLEAN)
NEW, ABSTRACT
Протягивает метки в кадре f, начиная с точке (x, y), как задано параметрами units, extend и add. Метки являются общими выделениями и точками вставки (каретками). Протяжка крупных логических единиц (например, слов вместо символов) запрашивается параметром units. Непрерывное расширение существующего выделения запрашивается параметром extend. Дискретное добавление к существующему выделению запрашивается параметром add.
	Некоторые диспетчеры могут игнорировать тот или иной запрос, то есть могут не различать единицы различной гранулярности, могут не поддерживать выделение нескольких объектов или дискретные выделения.

PROCEDURE (c: Controller) Resize (view: Views.View; l, t, r, b: INTEGER)
NEW, ABSTRACT
Запрос на изменение размера view, которое должно быть внедрено в модель c, на размер, заданный прямоугольником (l, t, r, b). (Обычно диспетчер делегирует этот запрос к своей модели, которая обрабатывает запрос, используя Properties.PreferredSize для согласования нового размера с отображением view).

PROCEDURE (c: Controller) GetSelectionBounds (f: Views.Frame; OUT x, y, w, h: INTEGER)
NEW, ABSTRACT
Возвращает прямоугольную границу выделения, заданную верхней левой точкой привязки, шириной и высотой. Граница используется для обеспечения обратной связи при перетаскивании.

PROCEDURE (c: Controller) DeleteSelection
NEW, ABSTRACT
Удаляет все объекты в текущем выделении.

PROCEDURE (c: Controller) MoveLocalSelection (src, dst: Views.Frame; sx, sy, dx, dy: INTEGER)
NEW, ABSTRACT
Передвигает выделенные объекты в пределах модели c c начальной точки (sx, sy) кадра src в целевую точку (dx, dy) кадра dst. Так как перемещение происходит в рамках единственной модели, нет необходимости в преобразованиях, и может быть предоставлена наиболее естественная семантика перемещения.

PROCEDURE (c: Controller) CopyLocalSelection (src, dst: Views.Frame; sx, sy, dx, dy: INTEGER)
NEW, ABSTRACT
Копирует выделенные объекты в пределах модели c c начальной точки (sx, sy) кадра src в целевую точку (dx, dy) кадра dst. Так как копирование происходит в рамках единственной модели, нет необходимости в преобразованиях, и может быть предоставлена наиболее естественная семантика перемещения.

PROCEDURE (c: Controller) SelectionCopy (): Model
NEW, ABSTRACT
Возвращает копию выделенных объектов, инкапсулированную в возвращаемой модели.

PROCEDURE (c: Controller) NativePaste (m: Models.Model; f: Views.Frame)
NEW, ABSTRACT
Вставляет исконную модель в модель c как показано в кадре f. Поскольку модель является исконной, она сливается с моделью c вместо того, чтобы оборачиваться в отображение и внедряться. 

PROCEDURE (c: Controller) ArrowChar (f: Views.Frame; ch: CHAR; units, select: BOOLEAN)
NEW, ABSTRACT
Обрабатывает символ стрелки ch - один из списка нижа. Обработка изменяется в зависимости от параметров units и select. Стандартная обработка символов стрелки - это изменение текущего выделения или перемещение точки вставки. Параметр units запрашивает изменение или перемещение в крупных единицах (например, словах вместо символов). Начало выделения запрашивается параметром select.
	Некоторые диспетчеры могут игнорировать тот или иной запрос, например, могут не различать единицы различной гранулярности или не поддерживать выделения.

Таблица символов стрелок:
	имя	код	значение
aL	1CX	стрелка влево
aR	1DX	стрелка вправо
aU	1EX	стрелка вверх
aD	1FX	стрелка вниз
pL	10X	страница влево
pR	11X	страница вправо
pU	12X	страница вверх
pD	13X	страница вниз
dL	14X	документ влево
dR	15X	документ вправо
dU	16X	документ вверх
dD	17X	документ вниз

Намерением является изменение или перемещение в указанном направлении на наименьшую поддерживаемую гранулярность ("стрелку"), на основе "страниц", которые определяются размером кадра f, или на основе целого "документа", то есть, крайних точек модели c. Точная трактовка направлений и единиц оставлена конкретному диспетчеру.

PROCEDURE (c: Controller) ControlChar (f: Views.Frame; ch: CHAR)
NEW, ABSTRACT
Вход обработчика управляющего символа ch относительно модели и отображения c в кадре f.

Таблица управляющих символов:
	имя	код	значение
enter	3X	ввод
rdel	7X	правое удаление
del	8X	левое удаление
tab	09X	табуляция
ltab	0AX	обратная табуляция
line	0DX	строка
para	0EX	абзац
esc	1BX	escape


PROCEDURE (c: Controller) PasteChar (ch: CHAR)
NEW, ABSTRACT
Вставить символ ch в модель c.

PROCEDURE (c: Controller) PasteView (f: Views.Frame; v: Views.View; w, h: INTEGER)
NEW, ABSTRACT
Вставить отображение v с заданными размерами (w, h) в модель c.
(Обычно диспетчер делегирует этот запрос к своей модели, которая обрабатывает его, используя Properties.PreferredSize для согласования нового размера с v.)

PROCEDURE (c: Controller) HasSelection (): BOOLEAN
NEW, EXTENSIBLE
Возвращает, имеет ли диспетчер текущее выделение. По умолчанию поддерживаются только выделения-монолиты. Следует расширить для поддержки полных выделений.

Предусловие
c.ThisModel() # NIL	20

PROCEDURE (c: Controller) Selectable (): BOOLEAN
NEW, ABSTRACT
Возвращает, сможет ли диспетчер начать непустое выделение. Если что-либо уже выделено, выделение считается возможным.

PROCEDURE (c: Controller) Singleton (): Views.View
NEW
Если диспетчер имеет текущее выделение-монолит, то возвращается выделенное отображение, иначе NIL.

PROCEDURE (c: Controller) SetSingleton (s: Views.View)
NEW, EXTENSIBLE
Устанавливает выделение для диспетчера равным монолиту, покрывающему отображение s. Если s = NIL, текущее выделение снимается. Метод следует расширить для соответствующей поддержки полного выделения.

Предусловие
c.ThisModel() # NIL	20
~(noSelection IN c.opts)	21
s # NIL
	s.context # NIL	22
	s.context.ThisModel() = c.ThisModel()	23

Постусловие
c.Singleton() = s

PROCEDURE (c: Controller) SelectAll (select: BOOLEAN)
NEW, ABSTRACT
Устанавливает выделение максимально возможной протяженности, то есть, выделяет все собственное содержание модели контейнера плюс все внедренные отображения. Для пустой модели не будет видимого результата; для модели с только одним внедренным отображением и без собственного содержания будет выделен монолит.

PROCEDURE (c: Controller) InSelection (f: Views.Frame; x, y: INTEGER): BOOLEAN
NEW, ABSTRACT
Проверяет, лежит ли точка (x, y) кадра f в пределах текущего выделения.

PROCEDURE (c: Controller) MarkSelection (f: Views.Frame; show: BOOLEAN)
NEW, EXTENSIBLE
В зависимости от show, показывает или скрывает визуальный показ выделения. По умолчанию работает только для выделений-монолитов. Метод следует переопределить для поддержки полных выделений.

PROCEDURE (c: Controller) SetFocus (focus: Views.View)
NEW
Устанавливает текущий подфокус равным focus; если focus = NIL, текущий подфокус снимается.

Предусловие
c.ThisModel() # NIL	20
focus # NIL
	focus.context # NIL	21
	focus.context.ThisModel() = c.ThisModel()	22

Постусловие
c.ThisFocus() = focus

PROCEDURE (c: Controller) HasCaret (): BOOLEAN
NEW, ABSTRACT
Возвращает, имеет ли диспетчер правильную каретку (точку вставки).

PROCEDURE (c: Controller) MarkCaret (f: Views.Frame; show: BOOLEAN)
NEW, ABSTRACT
В зависимости от show, показывает или скрывает визуальный показ текущей каретки.

PROCEDURE (c: Controller) Mark (f: Views.Frame; l, t, r, b: INTEGER; show: BOOLEAN)
NEW, EXTENSIBLE
За исключением быстродействия, эквивалентно:
	MarkFocus(c, f, show); c.MarkSelection(f, show); c.MarkCaret(f, show)
Метод следует расширить для поддержки расширенной полной пометки.

PROCEDURE (c: Controller) RestoreMarks (f: Views.Frame; l, t, r, b: INTEGER)
Уточнение унаследованной процедуры
Вызывает Mark для показа всех меток в прямоугольнике (l, t, r, b), затем, если нет подфокуса и c.opts задает режим маски, пытается включить подфокус: его получает первое внедренное отображение, которое претендует на фокус (Properties.FocusPref.setFocus). Если новый подфокус желает быть запущенным с выделенным содержанием (Properties.FocusPref.selectOnFocus), оно целиком выделяется.

PROCEDURE (c: Controller) Neutralize
Уточнение унаследованной процедуры
Снимает все модальные пометки, включая фокус, выделение и каретку. По умолчанию обрабатываются фокус и выделение. Для обработки каретки и, возможно, позже введенных пометок, метод следует расширить.
За исключением быстродействия, по умолчанию эквивалентно:
	c.SetFocus(NIL); c.SelectAll(deselect)

PROCEDURE (c: Controller) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message;
							VAR focus: Views.View)
Уточнение унаследованной процедуры
Обрабатывает Controllers.PollCursorMsg, Controllers.PollOpsMsg, Controllers.TrackMsg, Controllers.EditMsg, Controllers.TransferMessage, Controllers.SelectMsg, Controllers.MarkMsg, Controllers.ReplaceViewMsg, Properties.CollectMsg, и Properties.EmitMsg.

PROCEDURE (c: Controller) HandlePropMsg (VAR p: Properties.Message)
Уточнение унаследованной процедуры
По умолчанию предназначено для обработки Properties.SetMsg и Properties.PollMsg, разделяя обработку собственных и внедренных свойств и устанавливая или возвращая совмещенный список свойств. Также, если в c.opts установлены noSelection, noFocus, и noCaret, то устанавливается поле Properties.FocusPref.setFocus.

Предусловие
c.ThisModel() # NIL	20


TYPE Directory
ABSTRACT
Директория для диспетчеров

PROCEDURE (d: Directory) New (): Controller
NEW, EXTENSIBLE
За исключением быстродействия, эквивалентно:
	RETURN d.NewController({})

PROCEDURE (d: Directory) NewController (opts: SET): Controller
NEW, ABSTRACT
Возвращает новый диспетчер со свойствами opts.


TYPE DropPref = RECORD (Properties.Preference)
Это сообщение посылается внедренному отображению, когда контейнеру необходимо принять решение, бросать ли что-либо в отображение или в контейнер. Это сообщение может быть перехвачено также для поддержки перетаскивания, когда контейнер должен сам нормально ловить сообщения бросания, то есть, когда он находится в режиме разметки.

mode-: SET
Текущий режим контейнера.

okToDrop: BOOLEAN
Установлено в TRUE, если отображение может получать сообщения о бросании также в режиме, заданном в mode.


TYPE GetOpts = RECORD (Views.PropMessage)
Это сообщение посылается выделенному отображению для запроса режима контейнера этого отображения. Если отображение ответило на это сообщение, оно должно установить valid равным свойствам, примененным к отображению, и opts равным текущим значениям этих свойств. Всякий раз, когда возможен ответ на GetOpts, также должен быть возможен ответ на сообщение SetOpts.

valid: SET
Должно быть установлено равным свойствам, которые примененяются к отображению.

opts: SET
Текущие значения свойств.



TYPE SetOpts = RECORD (Views.PropMessage)
Посылается отображению для указания, что свойства должны быть изменены на значения, заданные valid и opts.

valid: SET
Маска, указывающая, какие значения должны быть установлены.

opts: SET
Значения свойств, указанных в valid.


PROCEDURE Focus (): Controller
Возвращает диспетчер текущего фокусированного отображения, если это возможно.

PROCEDURE FocusSingleton (): Views.View
Возвращает выделение-монолит текущего фокусированного отображения, если это возможно.

PROCEDURE MarkSingleton (c: Controller; f: Views.Frame; show: BOOLEAN)
Для внутреннего пользования.

PROCEDURE FadeMarks (c: Controller; show: BOOLEAN)
Для внутреннего пользования.