System/Docu/ru/Controllers.odc

Controllers

DEFINITION Controllers;

	IMPORT Fonts, Ports, Stores, Views;

	CONST
		frontPath = FALSE; targetPath = TRUE;
		decLine = 0; incLine = 1; decPage = 2; incPage = 3; gotoPos = 4;
		nextPageX = 0; nextPageY = 0; gotoPageX = 2; gotoPageY = 3;
		cut = 0; copy = 1; pasteChar = 2; paste = 4;
		doubleClick = 0; extend = 1; modify = 2;
		noMark = FALSE; mark = TRUE;
		hide = FALSE; show = TRUE;

	TYPE
		Controller = POINTER TO ABSTRACT RECORD (Stores.Store) END;

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

		Forwarder = POINTER TO ABSTRACT RECORD
			(n: Forwarder) Forward (target: BOOLEAN; VAR msg: Message), NEW, ABSTRACT;
			(n: Forwarder) Transfer (VAR msg: TransferMessage), NEW, ABSTRACT
		END;

		Message = Views.CtrlMessage;

		PollFocusMsg = EXTENSIBLE RECORD (Message)
			focus: Views.Frame
		END;

		PollSectionMsg = RECORD (Message)
			focus, vertical: BOOLEAN
			wholeSize, partSize, partPos: LONGINT;
			valid, done: BOOLEAN
		END;

		PollOpsMsg = RECORD (Message)
			type: Stores.TypeName;
			pasteType: Stores.TypeName;
			singleton: Views.View;
			selectable: BOOLEAN;
			valid: SET
		END;

		ScrollMsg = RECORD (Message)
			focus, vertical: BOOLEAN
			op: INTEGER;
			pos: LONGINT;
			done: BOOLEAN
		END;

		PageMsg = RECORD (Message)
			op: INTEGER;
			pageX, pageY: INTEGER;
			done, eox, eoy: BOOLEAN
		END;

		TickMsg = RECORD (Message)
			tick: INTEGER
		END;

		MarkMsg = RECORD (Message)
			show, focus: BOOLEAN
		END;

		SelectMsg = RECORD (Message)
			set: BOOLEAN
		END;

		RequestMessage = ABSTRACT RECORD (Message)
			requestFocus: BOOLEAN
		END;

		EditMsg = RECORD (RequestMessage)
			op: INTEGER;
			modifiers: SET;
			char: CHAR;
			view: Views.View;
			w, h: INTEGER;
			isSingle: BOOLEAN;
			clipboard: BOOLEAN
		END;

		ReplaceViewMsg = RECORD (RequestMessage)
			old, new: Views.View
		END;

		CursorMessage = ABSTRACT RECORD (RequestMessage)
			x, y: INTEGER
		END;

		PollCursorMsg = RECORD (CursorMessage)
			cursor: INTEGER;
			modifiers: SET
		END;

		TrackMsg = RECORD (CursorMessage)
			modifiers: SET
		END;

		WheelMsg = RECORD (CursorMessage)
			done: BOOLEAN;
			op, nofLines: INTEGER
		END;

		TransferMessage = ABSTRACT RECORD (CursorMessage)
			source: Views.Frame;
			sourceX, sourceY: INTEGER
		END;

		PollDropMsg = RECORD (TransferMessage)
			mark: BOOLEAN;
			show: BOOLEAN;
			type: Stores.TypeName;
			isSingle: BOOLEAN;
			w, h: INTEGER;
			rx, ry: INTEGER;
			dest: Views.Frame
 		END;

		DropMsg = RECORD (CursorMessage)
			view: Views.View;
			isSingle: BOOLEAN;
			w, h: INTEGER;
			rx, ry: INTEGER
		END;

	VAR path-: BOOLEAN;

	PROCEDURE Forward (VAR msg: Message);
	PROCEDURE FocusFrame (): Views.Frame;
	PROCEDURE FocusView (): Views.View;
	PROCEDURE FocusModel (): Models.Model;

	PROCEDURE Register (f: Forwarder);
	PROCEDURE Delete (f: Forwarder);
	PROCEDURE ForwardVia (target: BOOLEAN; VAR msg: Message);
	PROCEDURE SetCurrentPath (target: BOOLEAN);
	PROCEDURE PollSection (VAR msg: PollSectionMsg);
	PROCEDURE PollOps (VAR msg: PollOpsMsg);
	PROCEDURE PollCursor (x, y: INTEGER; OUT cursor: INTEGER);
	PROCEDURE Transfer (x, y: INTEGER; source: Views.Frame; sourceX, sourceY: INTEGER;
											VAR msg: TransferMessage);
	PROCEDURE PollDrop (x, y: INTEGER; source: Views.Frame; sourceX, sourceY: INTEGER;
											mark, show: BOOLEAN; type: Stores.TypeName; isSingle: BOOLEAN;
											w, h, rx, ry: INTEGER; OUT dest: Views.Frame; OUT destX, destY: INTEGER);
	PROCEDURE Drop (x, y: INTEGER; source: Views.Frame; sourceX, sourceY: INTEGER;
									view: Views.View; isSingle: BOOLEAN; w, h, rx, ry: INTEGER);
	PROCEDURE PasteView (view: Views.View; w, h: INTEGER; clipboard: BOOLEAN);
	PROCEDURE ResetCurrentPath;
	PROCEDURE SetCurrentPath (target: BOOLEAN);

END Controllers.




Рис. 1. Разделение Модель-Отображение-Диспетчер

Диспетчер реализует интерактивное поведение для класса отображений. Это объект, который преобразует диспетчерские сообщения в трансформации модели или отображения.

Сообщение диспетчера - это сообщение, которое посылается вдоль единственного пути в иерархии отображений - пути фокуса. Каждое отображение на таком пути само решает, когда оно является терминалом этого пути, то есть, текущим фокусом, или когда сообщение следует переслать одному из внедренных отображений. BlackBox поддерживает два пути фокуса, называемых целевым и передним фокусом. Оба пути могут слиться в один. Целевой путь указывает, какое отображение является целью команд в диалогах. Передний путь указывает, какое отображение редактируется, с помощью мыши, клавиатуры или меню.



Рис. 2. Упрощенный пример иерархии фокуса.

Важно заметить, что все сообщения диспетчера, которые не важны для конкретного типа отображений, могут просто игнорироваться.


CONST frontPath
Это значение может быть передано параметром target в несколько процедур этого модуля. Оно заставляет сообщение фокуса следовать вдоль переднего пути фокуса.

CONST targetPath
Это значение может быть передано параметром target в несколько процедур этого модуля. Оно заставляет сообщение фокуса следовать вдоль целевого пути фокуса.

CONST decLine, incLine, decPage, incPage
Эти значения могут быть присвоены полю ScrollMsg.op. Это заставит отображение-получатель сделать прокрутку, добавляя или убавляя одну строку или страницу. Получателю предлагается решить, что в его модели соответствует "строке", за исключением того, что это должно быть чем-то меньшим, нежели страница. Страница должна соответствовать ширине/высоте фокусированного кадра.

CONST gotoPos
Это значение может быть присвоено полю ScrollMsg.op. Это заставит отображение-получатель сделать прокрутку к позиции, заданной в ScrollMsg.pos.

CONST nextPageX, nextPageY
Это значения могут быть присвоены полю PageMsg.op. Это заставит отображение-получатель показать следующую страницу в направлении x или y соответственно.

CONST gotoPageX, gotoPageY
Эти значения могут быть присвоены полю PageMsg.op. Это заставит отображение-получатель показать заданную страницу в направлении x или y соответственно.

CONST cut, copy
Эти значения могут быть присвоены полю EditMsg.op. Отображение-получатель должно обработать их следующим образом:

 cut	удалить выделение и присвоить полю EditMsg.view новое отображение, содержащее удаленные
		данные или их копию
 copy	копировать выделение и присвоить полю EditMsg.view новое отображение, содержащее 
			копированные данные

CONST pasteChar
Это значение может быть присвоено полю EditMsg.op. Оно обозначает ввод некоторого символа (из набора Unicode или Latin-1).

CONST paste
Это значение может быть присвоено полю EditMsg.op. Отображение-получатель должно вставить копию данных, которые содержит EditMsg.view. Если оно не может вставить данные непосредственно, поскольку не знает их типа, следует вставить копию целого отображения EditMsg.View в свою модель, если она имеет такую возможность, то есть является контейнером.

CONST doubleClick
Это значение указывает, что была нажата клавиша мыши способом, который был опознан пользовательским интерфейсом платформы как "двойной щелчок". Двойной щелчок показывается приложению как модификатор, другими модификаторами являются extend и modify.

CONST extend, modify
BlackBox оперирует двумя виртуальными клавишами модификации. Клавиша extend используется для расширения и сужения выделения (обычно клавиша shift), клавиша modify модифицирует текущее поведение команды (например, превращает перетаскивание-перемещением в перетаскивание-копирование, с помощью клавиши control (Windows) / клавиши option (MacOS)). Поведение возможных дополнительных клавиш модификации специфично для платформы (см. документ о платформенно-зависимых особенностях). Наборы модификаторов используются в Controllers.TrackMsg, Controllers.EditMsg и Ports.Frame.Input.

CONST noMark, mark
Для внутреннего пользования.

CONST hide, show
Эти константы могут использоваться для сообщения PollDropMsg и процедуры PollDrop. Они задают, когда указатель цели при перетаскивании следует нарисовать (show) или стереть (hide).


TYPE Controller (Stores.Store)
ABSTRACT
Диспетчер является третьим компонентом в триаде модель-отображение-диспетчер. Его основная цель - перевести диспетчерские сообщения в преобразования модели или отображения. Простые приложения могут реализовывать функциональность диспетчера в самом отображении, вообще не используя отдельного диспетчерского объекта. Отображения-контейнеры обычно имеют отдельный диспетчер.


TYPE Directory
ABSTRACT
Обычно директория диспетчеров находится в модуле отображения подсистемы. так как директория отображений должна иметь возможность разместить подходящий диспетчер. Такие директории устанавливаются соответствующим модулем диспетчера при загрузке. Чтобы гарантировать загрузку соответствующего модуля диспетчера, тело модуля отображения обычно содержит инструкцию вида Dialog.Call("XYZControllers.Install, "", res).

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

Постусловие
result # NIL
result.ThisView() = NIL


TYPE Forwarder
ABSTRACT
Для внутреннего пользования.

PROCEDURE (n: Forwarder) Forward (target: BOOLEAN; VAR msg: Message)
NEW, ABSTRACT
Для внутреннего пользования.

PROCEDURE (n: Forwarder) Transfer (VAR msg: TransferMsg)
NEW, ABSTRACT
Для внутреннего пользования.


TYPE Message
ABSTRACT
Базовый тип диспетчерских сообщений. В отличие от сообщений модели или отображения, сообщения диспетчера никогда не передаются. Вместо этого они проходят вдоль пути фокуса. Целевой и передний пути фокуса предопределены.


TYPE PollFocusMsg (Message)
EXTENSIBLE
Это сообщение посылается для обнаружения листового отображения на пути фокуса. Сообщение обрабатывается средой самостоятельно. Если ваше отображение не желает обнаруживать себя, когда оно имеет фокус, установите focus в NIL при получении сообщения. В противном случае проигнорируйте сообщение.

focus: Views.Frame
После того, как сообщение вернется из путешествия по пути фокуса, оно должно содержать кадр листового отображения этого пути.


TYPE PollSectionMsg (Message)
Это сообщение посылается для запроса у фокусированного отображения его текущего состояния прокрутки. BlackBox содержит общий механизм прокрутки, который осуществляет ее, просто изменяя начальную точку прокручиваемого кадра. Явная обработка прокрутки необходима только для отображений, которые могут стать огромными, и для эффективной реализации которых критически важно сохранение кадров небольшими.

focus: BOOLEAN
Этот флаг говорит, слеудует ли контейнеру передать сообщение своему фокусу или нет. Очевидно, не-контейнеры не могут этого делать.

vertical: BOOLEAN
Указывает, какое направление опрашивается - вертикальное или горизонтальное.

wholeSize: INTEGER	wholeSize >= 1
Это значение соответствует ширине или высоте фокусированного отображения, в координатах, которые отображение может свободно выбирать, то есть, это не обязательно универсальные единицы.

partSize: INTEGER	0 <= partSize <= wholeSize
Это значение соответствует ширине или высоте кадра фокусированного отображения (о координатах см. выше). Если partSize не может быть легко определено, его следует установить в 0.

partPos: INTEGER	0 <= partPos <= wholeSize - partSize
Это значение соответствует начальной точке фокусированного отображения.

valid: BOOLEAN
Отображение-получатель должно установить этот флаг, если оно поддерживает прокрутку в заданном направлении. valid говорит о том, что wholeSize, partSize и partPos определены и указывают позицию прокрутки для отображения.

done: BOOLEAN
Этот флаг следует установить, если сообщение было обработано, то есть, выходные поля, приведенные выше, были заполнены. Для некоторых диспетчеров это может зависеть от vertical, то есть, диспетчер поддерживает только одно направление прокрутки.


TYPE PollOpsMsg (Message)
Это сообщение посылается для запроса о том, какие операции редактирования поддерживает фокусированное отображение, в зависимости от его текущего выделения.

type: Stores.TypeName
Это поле задает контекст для фокусированного отображения. Этот контекст используется для задания того, какие меню важны для фокусированного отображения. По соглашению, отображение присваивает имя типа абстрактного указателя на свой тип, например, "TextViews.View". Это соглашение гарантирует глобальную уникальность для имен контекста, так как имена модулей считаются глобально уникальными. Если отображение не поддерживает такого контекста, оно игнорирует это поле.

pasteType: Stores.TypeName	определено, если и только если type = paste
Тип отображения, копия которого должна быть вставлена, если происходит операция вставки.

singleton: Views.View
Отображение-контейнер, которое поддерживает выделение, должно установить это поле равным выделенному отображению, если это отображение является единственным выделенным содержимым.

selectable: BOOLEAN
Это поле должно быть установлено в TRUE, если фокусируемое отображение содержит выделимые элементы, независимо от того, выделены ли они в настоящий момент или нет.

valid: SET	valid IN {cut, copy, paste}
Это множество задает, какие операции редактирования возможны в настоящий момент, из набора {cut, copy, paste}. Это используется средой для включения или отключения соответствующих пунктов меню. Однако не гарантируется, что среда не пошлет сообщение о редактировании для вырезать/копировать/вставить, даже если отображение вернуло в valid пустое множество. Такие сообщения можно просто игнорировать.


TYPE ScrollMsg (Message)
Это сообщение посылается в целях прокрутки фокусированного отображения на другую позицию. Оно используется только в совокупности с PollSectionMsg (см. выше).

focus: BOOLEAN
Этот флаг говорит, слеудует ли контейнеру передать сообщение своему фокусу или нет. Очевидно, не-контейнеры не могут этого делать.

vertical: BOOLEAN
Указывает, должна прокрутка происходить в вертикальном или горизонтальном направлении.

op: INTEGER	op IN {decLine..gotoPos}
Операция прокрутки, которую требуется выполнить.

pos: INTEGER	определено если op = gotoPos	pos >= 0
Означает позицию, в которую происходит прокрутка, в тех же координатах, какие использует PollSectionMsg.

done: BOOLEAN
Этот флаг следует установить, если сообщение было обработано; для некоторых диспетчеров это может зависеть от op.


TYPE PageMsg (Message)
Страничное сообщение похоже на сообщение прокрутки, только его единицами измерения являются страницы. Оно может быть обработано, если отображение должно вести себя по-разному в зависимости от того, идет печать или нет. Это делается, например, в TextViews для того, чтобы избежать отрывания последней строки на странице, что вполне допустимо на экране.
Если это сообщение не обрабатывается для отображения, которое нельзя напечатать на одной странице, будет использована стратегия печати по умолчанию, которая разделит отображение на куски, подходящие для печати.

op: INTEGER	op IN {nextPageX, nextPageY, gotoPageX, gotoPageY}
Куда сделать прокрутку.

pageX, pageY: INTEGER
Текущая страница в направлении x и y.

done: BOOLEAN
Этот флаг следует установить, если сообщение было обработано; для некоторых диспетчеров это может зависеть от op.

eox, eoy: BOOLEAN
Эти флаги следует установить при попытке перейти через последнюю страницу в направлении x или y соответственно.


TYPE TickMsg (Message)
Это сообщение посылается переднему фокусированному отображению периодически. Это может быть использовано для реализации эффектов, подобных мерцанию каретки.

tick: INTEGER
Количество тактов. Промежуток между двумя тактами доступен через глобальную переменную resolution.


TYPE MarkMsg (Message)
Это сообщение посылается при изменении целевого или переднего фокусного пути. Перед изменением сообщение посылается вдоль пути фокуса с show=FALSE, так что фокусированное отображение может отключить визуальные метки, подобные выделению или каретке. После изменения (например, другое окно вышло наверх), MarkMsg посылается вдоль фокусного пути с show=TRUE, так что фокусированное отображение может снова включить метки, если они есть.
Поведение может быть различным в зависимости от того, произошло ли изменение пути фокуса из-за переупорядочивания окон или из-за взаимодействия с пользователем (пользователь щелкнул на каком-то другом внедренном отображении).
В первом случае фокусированное отображение может все-таки задержать свое фокусное состояние (выделение, каретку), даже когда его окно временно не имеет фокуса. Когда окно получит фокус снова, старое фокусированное отображение станет фокусом снова. В этом случае ему следует снова показать то же самое состояние выделения/каретки.
В последнем случае отображение, которое становится заново сфокусированным, может вести себя особым образом. В частности, элемент управления может фокусировать свое содержимое (например, текстовое поле может выделить текстовую строку, которую оно содержит). Для распознавания такой ситуации MarkMsg имеет поле focus.
Отображения-обертки и специальные контейнерные отображения (например, контейнеры, не наследующие от типов модуля Containers) должны пересылать MarkMsg своим внедренным отображениям.

show: BOOLEAN
Говорит, когда метки в фокусированном отображении должны быть включены или выключены.

focus: BOOLEAN
Говорит, когда отображение получает или теряет фокус.
Отображение может использовать эту информацию, например, для выделения себя при получении фокуса (это делается элементами управления - текстовыми полями). Это делается следующим образом:

	IF msg.focus THEN
		IF msg.show THEN	(* установка выделения при получении фокуса *)
			... выделить содержимое отображения ...
		ELSE	(* снятие выделения при потере фокуса *)
			... снять выделение ...
		END
	END


TYPE SelectMsg (Message)
Это сообщение посылается, когда фокусированное отображение должно выделить все выделяемые элементы, или когда оно должно снять выделение со всех выделенных элементов. Выделение происходит, например, при выполнении команды Edit->SelectAll.

set: BOOLEAN
Задает, когда все должно быть выделено (set=TRUE) или когда все выделение должно быть снято (set=FALSE).


TYPE RequestMessage (Message)
ABSTRACT
Отображение (или его диспетчер) при получении сообщения могут показать, устанавливая requestFocus в TRUE, что они хотят впоследствии получить фокус, если пока его не имеют.

requestFocus: BOOLEAN
Установите этот флаг в TRUE, если получателю нужно получить/сохранить фокус после обработки сообщения.


TYPE EditMsg (RequestMessage)
Это сообщение посылается при нажатии клавиши или запуске операции вырезания/копирования/вставки. Следующие операции могут поддерживаться (для каждой поддерживаемой операции за исключением вставки символов слудует установить соответствующий флаг в PollOpsMsg.valid при получении PollOpsMsg):

 cut
Создать клон фокусированного отображения, с копией его выделения в качестве содержимого. Присвойте этот клон полю EditMsg.view и удалите выделение фокуса. Есть одно исключение: если выделение состоит лишь из одного отображения (монолита),  в EditMsg.view должен быть копирован клон этого отображения, а не клон его контейнера.

 copy
Создать клон фокусированного отображения, с копией его выделения в качестве содержимого. Присвойте этот клон полю EditMsg.view. Если выделение состоит лишь из одного отображения (монолита),  в EditMsg.view должен быть копирован клон этого отображения.

 pasteChar
Обработать EditMsg.char, например вставить его в текстовую модель.
char может быть управляющим символом. Для управляющих символов также проверьте поле modifiers.

 paste
Вставить отображение EditMsg.view в содержимое фокусированного отображения.
Если получатель является контейнером:
	Если EditMsg.isSingle:
		Следует вставить отображение как целое отображение, независимо от его типа.
		Это значит, что слияние содержимого не допускается, даже если это возможно.
	Если ~EditMsg.isSingle:
		Если содержимое EditMsg.view известно, следует вставить его, иначе - отображение целиком.
Если получатель не является контейнером:
	Если содержимое EditMsg.view известно, следует вставить его, иначе - не делать ничего.

op: INTEGER	op IN {cut .. paste}
Операция, которую следует выполнить.

modifiers: SET	допустимо, только если op= pasteChar
Клавиши модификации.

char: CHAR	допустимо, только если op = pasteChar
Символ для вставки, или обработки в случае управляющих символов.

view: Views.View	определено если и только если 
								op IN {paste, cut, copy}  &  view # NIL  &  view.context = NIL
Если op = paste:	(входной параметр)
Отображение, которое следует вставить.
Если op IN {cut, copy}:	(выходной параметр)
Отображение, которое должно быть присвоено обработчиком сообщения.

w, h: INTEGER	допустимо, только если op IN {paste, cut, copy}
								w >= Views.undefined  &  h >= Views.undefined	[units]
Если op = paste:	(входной параметр)
Требуемые ширина и высота вставляемого отображения. Эти значения могут трактоваться как намеки. Если они не подходят, будут использованы другие. Значение Views.undefined должно также обрабатываться.
Если op IN {cut, copy}:	(выходной параметр)
Текущая ширина и высота отображения.

isSingle: BOOLEAN	допустимо, только если op IN {paste, cut, copy}
Если op = paste:	(входной параметр)
Говорит о том, что отображение следует вставить как монолит, но не сливать, даже если это возможно.
Если op IN {cut, copy}:	(выходной параметр)
Обработчик сообщения должен установить этот флан, если вырезанное/копированное отображение выделено как монолит.

clipboard: BOOLEAN	допустимо, только если op IN {cut, copy, paste}
Этот входной параметр говорит, что вырезаемое/копируемое отображение будет передано в системный буфер обмена, или что вставляемое отображение будет получено из системного буфера обмена.


TYPE ReplaceViewMsg (RequestMessage)
Контейнер должен проверять, содержит ли он old. Если да, он должен заменять old на new, без изменения каким-либо образом содержимого отображения.

old, new: Views.View	old # NIL & new # NIL
old должен быть заменен на new.


TYPE CursorMessage (RequestMessage)
ABSTRACT
Базовый тип всех сообщений, который задает какое-либо взаимодействие, зависящее от текущей позиции курсора. Позиция курсора всегда отсчитывается в точках относительно верхнего-левого угла отображения.

x, y: INTEGER	[точка]
Текущая позиция курсора.


TYPE PollCursorMsg (CursorMessage)
Это сообщение посылается регулярно для опроса, какой курсор необходим фокусированному отображению.

cursor: INTEGER	cursor IN {Ports.arrowCursor .. Ports.refCursor}
Это поле может быть установлено в курсор, подходящий для фокусированного отображения.

modifiers: SET
Это входной поле, которое дает текущее состояние модификаторов для мыши.


TYPE TrackMsg (CursorMessage)
Расширение
Это сообщение посылается, когда нажимается кнопка мыши.

modifiers: SET
Определяет, какие клавиши модификации были нажаты вместе с кнопкой мыши.


TYPE WheelMsg (CursorMessage)
Расширение
Это сообщение посылается, когда колесо на мыши с колесом поворачивается.

done: BOOLEAN
Если отображение обрабатывает это сообщение, оно должно установить флаг done в TRUE.

op: INTEGER
Показывает, какой тип события колеса мыши произошел. Используются те же константы, что и для прокрутки, но допустимы только следующие из них: incPage, decPage, incLine and decLine.

nofLines: INTEGER	nofLines >= 1
Если op или icnLine, или decLine, то nofLines показывает, сколько строк должно быть прокручено. Для incPage и decPage это значение не определено.


TYPE TransferMessage (CursorMessage)
ABSTRACT
Это базовый тип для всех сообщений, которые описывают взаимодействие между несколькими отображениями, например, для перетаскивания.

source: Views.Frame
Кадр, из которого идет взаимодействие, например, где кнопка мыши была нажата для перетаскивания.

sourceX, sourceY: INTEGER
Позиция кадра-источника, где была нажата кнопка мыши, например, в начале перетаскивания.


TYPE PollDropMsg (TransferMessage)
Пока элемент перетаскивается наружу, PollDropMsg посыдается для активизации обратной связи с целевым местом.

mark: BOOLEAN
Контейнер, который поддерживает обратную связь, должен показать (скрыть) метку обратной связи, когда mark установлен (снят). Вам не нужно иметь дела с границей отображения (прямоугольной рамкой отображения, которая рисуется, когда вы перетаскиваете через отображение), это обрабатывается BlackBox самостоятельно.

show: BOOLEAN	 допустимо, только если mark
Показывает, когда метка должна быть показана или скрыта.

type: Stores.TypeName
Тип перетаскиваемого отображения. Используется то же соглашение об имени, что и для PollOpsMsg. Опираясь на type, обработчик сообщений может определить, когда перетаскиваемое отображение может быть принято. Заметим, что если перетаскивание происходит полностью через BlackBox, унаследованное поле source может быть также использовано для такой проверки. Однако source может быть NIL, если перетаскивание идет через OLE.

isSingle: BOOLEAN
Говорит, что отображение должно быть брошено как монолит.

w, h: INTEGER
Размер бросаемого отображения. Может быть эквивалентно Views.undefined.

rx, ry: INTEGER	rx >= 0  &  ry >= 0
Точка привязки внутри выделения, где началось перетаскивание.

dest: Views.Frame	(OUT parameter)
Получатель должен установить dest в свой кадр, если он будет принимать бросаемое.


TYPE DropMsg (CursorMessage)
Это сообщение используется, если отображение следует перетащить в расположение курсора.

view: Views.View	view # NIL
Отображение, которое перетаскивается. Это копия оригинала, готовая для вставки в точку назначения.

isSingle: BOOLEAN
Говорит, что отображение должно быть брошено как монолит.

w, h: INTEGER	[units]
Размер бросаемого отображения. Один или оба размера могут иметь значение Views.undefined.

rx, ry: INTEGER
Точка привязки внутри выделения, где перетаскивание началось.


VAR path-: BOOLEAN
Для внутреннего использования.


PROCEDURE Forward (VAR msg: Message)
Послать msg текущему фокусу.

PROCEDURE FocusFrame (): Views.Frame
Возвращает кадр текущего фокуса, если такой есть.

PROCEDURE FocusView (): Views.View
Возвращает текущее фокусированное отображение, если такое есть.

PROCEDURE FocusModel (): Models.Model
Возвращает модель текущего фокусированного отображения, если такая есть.


Следующие процедуры используются внутренне:

PROCEDURE Register (f: Forwarder)
Добавляет передатчик f к списку передатчиков. Если f уже зарегистрирован, Register(f) ничего не делает.

Предусловие
f # NIL	20

PROCEDURE Delete (f: Forwarder)
Удаляет передатчик f из списка передатчиков. Если f незарегистрирован, то ничего не делает.
 
Предусловие
f # NIL	20

PROCEDURE ForwardVia (target: BOOLEAN; VAR msg: FocusMessage)
Посылает msg или target, тлт переднему фокусу.

PROCEDURE SetCurrentPath (target: BOOLEAN)
Устанавливает path в target. Должна быть сбалансирована вызовом ResetCurrentPath, иначе  произойдет исключение (в Controllers.BalanceCheckActions.Do).

PROCEDURE PollSection (VAR msg: PollSectionMsg)
Возвращает состояние прокрутки текущего фокусированного отображения.

PROCEDURE PollOps (VAR msg: PollOpsMsg)
Возвращает текущие допустимые операции редактирования для текущего фокусированного отображения.

PROCEDURE PollCursor (x, y: INTEGER; OUT cursor: INTEGER)
Возвращает требуемый курсор текущего фокусированного отображения.

PROCEDURE Transfer (x, y: INTEGER; source: Views.Frame; sourceX, sourceY: INTEGER;
											VAR msg: TransferMessage)

PROCEDURE PollDrop (x, y: INTEGER; source: Views.Frame; sourceX, sourceY: INTEGER;
												mark, show: BOOLEAN; type: Stores.TypeName;
												isSingle: BOOLEAN; w, h, rx, ry: INTEGER;
												OUT dest: Views.Frame; OUT destX, destY: INTEGER)

PROCEDURE Drop (x, y: INTEGER; source: Views.Frame; sourceX, sourceY: INTEGER;
										view: Views.View; isSingle: BOOLEAN; w, h, rx, ry: INTEGER)

PROCEDURE PasteView (view: Views.View; w, h: INTEGER; clipboard: BOOLEAN)

PROCEDURE ResetCurrentPath

PROCEDURE SetCurrentPath (target: BOOLEAN)