System/Docu/ru/Properties.odc

Properties

DEFINITION Properties;

	IMPORT Fonts, Ports, Views, Controllers, Dialog;

	CONST
		color = 0; typeface = 1; size = 2; style = 3; weight = 4;
		width = 0; height = 1;
		maxVerbs = 16;
		noMark = FALSE; mark = TRUE;
		hide = FALSE; show = TRUE;

	TYPE
		Property = POINTER TO ABSTRACT RECORD
			next-: Property;
			known: SET;
			readOnly: SET;
			valid: SET;
			(p: Property) IntersectWith (q: Property; OUT equal: BOOLEAN)
		END;

		StdProp = POINTER TO RECORD (Property)
			color: Dialog.Color;
			typeface: Fonts.Typeface;
			size: INTEGER;
			style: RECORD
						val, mask: SET
					END;
			weight: INTEGER
		END;

		SizeProp = POINTER TO RECORD (Property)
			width, height: INTEGER
		END;


		Message = Views.PropMessage;

		PollMsg = RECORD (Message)
			prop: Property
		END;

		SetMsg = RECORD (Message)
			old, prop: Property
		END;


		Preference = ABSTRACT RECORD (Message) END;

		ResizePref = RECORD (Preference)
			fixed: BOOLEAN;
			horFitToPage: BOOLEAN;
			verFitToPage: BOOLEAN;
			horFitToWin: BOOLEAN;
			verFitToWin: BOOLEAN;
		END;

		SizePref = RECORD (Preference)
			w, h: INTEGER;
			fixedH, fixedW: BOOLEAN
		END;

		BoundsPref = RECORD (Preference)
			w, h: INTEGER
		END;

		FocusPref = RECORD (Preference)
			atLocation: BOOLEAN;
			x, y: INTEGER;
			hotFocus: BOOLEAN;
			setFocus: BOOLEAN
		END;

		ControlPref = RECORD (Preference)
			char: CHAR;
			focus: Views.View;
			getFocus: BOOLEAN;
			accepts: BOOLEAN
		END;

		PollVerbMsg = RECORD (Message)
			verb: INTEGER;
			label: ARRAY 64 OF CHAR;
			disabled, checked: BOOLEAN
		END;

		DoVerbMsg = RECORD (Message)
			verb: INTEGER;
			frame: Views.Frame
		END;

		CollectMsg = RECORD (Controllers.Message)
			poll: PollMsg
		END;

		EmitMsg = RECORD (Controllers.RequestMessage)
			set: SetMsg
		END;

		PollPickMsg = RECORD (Controllers.TransferMessage)
			mark: BOOLEAN;
			show: BOOLEAN;
			dest: Views.Frame
		END;

		PickMsg = RECORD (Controllers.TransferMessage)
			prop: Property
		END;

	VAR era-: INTEGER;

	PROCEDURE IncEra;
	PROCEDURE CollectProp (OUT prop: Property);
	PROCEDURE CollectStdProp (OUT prop: StdProp);
	PROCEDURE EmitProp (old, prop: Property);
	PROCEDURE PollPick (x, y: INTEGER; source: Views.Frame;
										sourceX, sourceY: INTEGER; mark, show: BOOLEAN;
										OUT dest: Views.Frame; OUT destX, destY: INTEGER);
	PROCEDURE Pick (x, y: INTEGER; source: Views.Frame; sourceX, sourceY: INTEGER;
									OUT prop: Property);
	PROCEDURE Insert (VAR list: Property; x: Property);
	PROCEDURE CopyOf (p: Property): Property;
	PROCEDURE CopyOfList (p: Property): Property;
	PROCEDURE Merge (VAR base, override: Property);
	PROCEDURE Intersect (VAR list: Property; x: Property; OUT equal: BOOLEAN);
	PROCEDURE IntersectSelections (a, aMask, b, bMask: SET; OUT c, cMask: SET;
															OUT equal: BOOLEAN);
	PROCEDURE PreferredSize (v: Views.View; minW, maxW, minH, maxH,
												defW, defH: INTEGER; VAR w, h: INTEGER);
	PROCEDURE ProportionalConstraint (scaleW, scaleH: INTEGER; 
												fixedW, fixedH: BOOLEAN; VAR w, h: INTEGER);
	PROCEDURE GridConstraint (gridX, gridY: INTEGER; VAR x, y: INTEGER);
	PROCEDURE ThisType (view: Views.View; type: Stores.TypeName): Views.View;

END Properties.


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

Более экономичным для большинства программистов и пользователей было бы иметь общий и расширяемый подход к управлению состояниями. Свойства предусмотрены именно для этих целей, чтобы обеспечить связь от внутреннего состояния к пользователю и обратную связь, передающую все необходимые изменения. Они являются основой для общего редактора свойств, который будет предоставлен компанией Oberon Microsystems в будущем.

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

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

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


CONST color, typeface, size, style, weight
Когда фокусированное отображение возвращает свойство StdProp в CollectMsg, множества StdProp.known, StdProp.readOnly и StdProp.valid могут содержать один или несколько перечисленных выше элементов. Если один из этих элементов включен в StdProp.known, фокусированное отображение знает о соответствующем свойстве. Если один из этих элементов включен в оба множества StdProp.valid и StdProp.known, то фокусированное отображение в настоящий момент имеет мнение по поводу того, каким является текущее значение этого свойства. Эти текущие значения возвращаются в других полях StdProp. Если один из этих элементов включен в оба множества StdProp.valid и StdProp.readOnly, то фокусированное отображение в настоящий момент не позволяет изменять это свойство.

CONST width, height
Когда фокусированное отображение возвращает свойство SizeProp в CollectMsg, множества SizeProp.known, SizeProp.readOnly и SizeProp.valid могут содержать один или несколько перечисленных выше элементов. Если один из этих элементов включен в оба множества SizeProp.valid и SizeProp.known, свойство SizeProp содержит текущую ширину и высоту отображения в полях width и height.

CONST noMark, mark
Эти значения могут быть переданы параметром mark в процедуру PollPick. Они указывают, должна ли изображаться метка цели при перетаскивании с указанием.

CONST maxVerbs
Максимальное количество команд в контекстном меню.

CONST hide, show
Эти значения могут быть переданы параметром show в процедуру PollPick. Они указывают, когда метка цели при перетаскивании с указанием должна быть показана или скрыта. Этот параметр учитывается только, если установлен mark.


TYPE Property
ABSTRACT
Свойства являются общим механизмом получения и установки атрибутов отображения от его окружения. Отображение может знать о таких атрибутах, как шрифт, цвет, размер и любые другие. Свойства могут быть расширены только один раз.

next-: Property
Свойства связываются в список, реализованный через поле next.

known: SET
Каждая запись свойств может описывать до 32 различных атрибутов. Эти атрибуты нумеруются от 0 до 31. Поле known говорит, какие из этих атрибутов известны отображению, которое отвечает на CollectMsg.

readOnly: SET	readOnly - known = {}
Каждый известный атрибут может быть в настоящий момент доступен только для чтения, то есть, быть неизменяемым. Поле readOnly указывает, какие из атрибутов в настоящий момент доступны только для чтения.
Множество readOnly должно быть подмножеством множества known, то есть, никакой атрибут не может быть одновременно неизвестным и доступным только для чтения.

valid: SET	valid - known = {}
Каждый известный атрибут может быть в настоящий момент неопределенным. Это случается, например, в том случае, когда свойства многих объектов собираются вместе, и некоторые атрибуты отличаются от объекта к объекту (свойство со смешанными значениями). Поле valid указывает, какие из атрибутов в настоящий момент определены. Эти текущие значения должны быть представлены в остальных полях конкретной записи свойств, например, поле color в StdProp соответствует элементу 0 множества valid, поле typeface - элементу 1, и т.д.
Множество valid должно быть подмножеством множества known; то есть, никакой атрибут не может быть одновременно определен и неизвестен.
Дополнительно valid используется для указания того, какие атрибуты следует изменить в случае, когда запись свойств посылается объекту.

PROCEDURE (p: Property) IntersectWith (q: Property; OUT equal: BOOLEAN)
Запись свойств p должна быть доступна сравнения с другой записью свойств q. Если все атрибуты p имеют те же значения, что и q, то equal должно быть установлено в TRUE. Иначе p должно быть установлено пересечением p и q, и equal должно быть установлено в FALSE. Пересечение строится путем исключения всех отличающихся атрибутов из множества valid. Можно допускать, что тип p точно такой же, как тип q.
IntersectWith должно соблюдать инвариант, что valid является подмножеством known; в остальном known его не интересует.
Как пример, см. ниже реализацию StdProp.IntersectWith.


TYPE StdProp (Property)
Это стандартные атрибуты, известные любой реализации BlackBox. Они касаются как цвета, так и атрибутов шрифта.

color: Dialog.Color	определено, если и только если константа color IN StdProp.valid
Текущий цвет.

typeface: Fonts.Typeface	определено, если и только если константа typeface IN StdProp.valid
Текущий тип шрифта.

size: INTEGER	определено, если и только если константа size IN StdProp.valid
Текущий размер. Это обычно, но необязательно, относится к размеру шрифта.

style: RECORD	определено, если и только если константа style IN StdProp.valid
								style IN StdProp.valid => StdProp.style.mask # {}
								StdProp.style.val - StdProp.style.mask = {}	(* val является подмножеством mask *)
Текущий стиль. Поле style.mask указывает, какие флаги стиля определены, style.val определяет, какие из определенных флагов в настоящий момент установлены.

weight: INTEGER	определено, если и только если константа weight IN StdProp.valid
Текущая толщина шрифта.

	PROCEDURE (p: StdProp) IntersectWith* (q: Property; OUT equal: BOOLEAN);
		VAR valid: SET; c, m: SET; eq: BOOLEAN;
	BEGIN
		WITH q: StdProp DO
			equal := TRUE;
			valid := p.valid * q.valid;
			 IF p.color.val # q.color.val THEN EXCL(valid, color) END;
			 IF p.typeface # q.typeface THEN EXCL(valid, typeface) END;
			 IF p.size # q.size THEN EXCL(valid, size) END;
			 IntersectSelections(p.style.val, p.style.mask, q.style.val, q.style.mask, c, m, eq);
			 IF m = {} THEN
				EXCL(valid, style)
			ELSIF (style IN valid) & ~eq THEN
				p.style.mask := m; equal := FALSE
			END;
			 IF p.weight # q.weight THEN EXCL(valid, weight) END;
			 IF p.valid # valid THEN p.valid := valid; equal := FALSE END
		END
	END IntersectWith;


TYPE SizeProp (Property)
Эта запись свойств представляет размер прямоугольной области, например, отображения.

width: INTEGER	определено, если и только если константа width IN SizeProp.valid
Текущая ширина в универсальных единицах.

height: INTEGER	определено, если и только если константа height IN SizeProp.valid
Текущая высота в универсальных единицах.


TYPE Message
ABSTRACT
Базовый тип для всех сообщений свойств.


TYPE PollMsg (Message)
Это сообщение посылается для получения свойств отображения-получателя. Получатель должен вернут свойства всего его содержимого, а не только выделения.

prop: Property
Список возвращаемых свойств, которые могут изменяться. Никакое свойство не может вносится в этот список дважды.


TYPE SetMsg (Message)
Это сообщение посылается для установки свойств отображения-получателя. Поля свойств known и readOnly не используются и не определены в этом случае. Получателю следует установить свойства всего своего содержимого, а не только выделения.

old: Property
Этот список предназначен для изменений типа "заменить старое на новое", например, "заменить шрифт Helvetica шрифтом Times". Может быть NIL.

prop: Property
Список свойств, которые должны быть изменены. Никакое свойство не может вноситься в этот список дважды.


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


TYPE ResizePref (Preference)
Получатель этого сообщения может показать, что он не хочет менять свой размер, устанавливая fixed в TRUE. Отображения фиксированного размера не показывают узлов изменения размера, когда они выделены как монолит.
Для корневого отображения в документе или окне поля horFitToPage, verFitToPage, horFitToWin и verFitToWin могут использоваться, чтобы осуществить автоматическую адаптацию размера отображения к текущему размеру окна или страницы. Для внедренных отображений эти четыре флага не дают никакого эффекта, в отличие от fixed.

fixed: BOOLEAN	fixed => ~horFitToPage & ~verFitToPage & ~horFitToWin & ~verFitToWin
(отображение => отправителю, инициализируется FALSE)
Может быть установлено для указания, что размер получателя должен остаться прежним.

horFitToPage: BOOLEAN	horFitToPage => ~horFitToWin
(отображение => отправителю, инициализируется FALSE)
Может быть установлено, чтобы указать, что ширину получателя следует адаптировать к текущей ширине страницы.

verFitToPage: BOOLEAN	verFitToPage => ~verFitToWin
(отображение => отправителю, инициализируется FALSE)
Может быть установлено, чтобы указать, что высоту получателя следует адаптировать к текущей высоте страницы.

horFitToWin: BOOLEAN	horFitToWin => ~horFitToPage
(отображение => отправителю, инициализируется FALSE)
Может быть установлено, чтобы указать, что ширину получателя следует адаптировать к текущей ширине окна.

verFitToWin: BOOLEAN	verFitToWin => ~verFitToPage
(отображение => отправителю, инициализируется FALSE)
Может быть установлено, чтобы указать, что высоту получателя следует адаптировать к текущей высоте окна.


TYPE SizePref (Preference)
Отправитель этого сообщения предлагает размер отображению-получателю; размер может быть равен Views.undefined. Отображение-получатель может корректировать предложение, например, в целях сохранения пропорций между его шириной и высотой. Процедуры ProportionalConstraint и GridConstraint - полезные стандартные реализации ограничений. Процедура PreferredSize реализует сторону отправителя в протоколе, то есть, заполняет, посылает и интерпретирует SizeMsg.

w, h: INTEGER	(w = Views.undefined) = (h = Views.undefined)
(отображение => отправителю, инициализируется Views.undefined, если отображение новое или предпочтений нет)
Требуемая ширина и высота. Либо обе величина инициализируются View.undefined, или ни одна из них.


fixedH, fixedW: BOOLEAN
(отправитель => отображению)
Эти значения устанавливаются при отправке сообщения для указания, что ширину и высоту отображения следует оставить фиксированными. Это может использоваться, например, для сохранения пропорций отображения, для адаптации ширины при фиксированной высоте и как угодно иначе. (См. процедуру ProportionalConstraint)


TYPE BoundsPref (Preference)
Отображению-получателю следует рассчитать свой ограничивающий прямоугольник, или, если это сделать достаточно сложно, вернуть приближенный результат приемлемой точности.
Для отображений, которые показывают только часть своего содержимого, например, из-за поддержки прокрутки в одном или обоих направлениях, обработка BoundsPref значительно отличается от SizePref. В то время как SizePref относится к ограничениям и предпочтениям на размер текущего взгляда на модель, BoundsPref должны рассчитываться исходя из размера, необходимого для полного показа всей модели. Для очень больших или комплексных моделей (таких как длинный текст на многих страницах) это может оказаться очень дорогостоящей операцией, и потому отображение может вернуть приблизительный размер границы, или другое предположение, такое как размер, который "совсем большой", но не больше, чем модель.

w, h: INTEGER
(отображение => отправителю, инициализируется Views.undefined)
Предпочтительная ширина и высота.


TYPE FocusPref (Preference)
Отображение может показать, что оно не хочет получать постоянный фокус, например, для кнопки. Решение может принимать даже в зависимости от места, в котором произошел щелчок мышью.

atLocation: BOOLEAN
(отправитель => отображению)
Этот флаг устанавливается, если получатель приобретает фокус по щелчку мышью.

x, y: INTEGER	[units]
(отправитель => отображению, определено, если и только если atLocation)
Позиция щелчка мышью относительно верхнего левого угла отображения-получателя.

hotFocus: BOOLEAN
(отображение => отправителю, инициализируется FALSE)
Получатель может установить этот флаг, чтобы показать, что отображение потеряет свой фокус сразу после отпускания кнопки мыши. Командные кнопки являются типичными горячими фокусами.

setFocus: BOOLEAN
(отображение => отправителю, preset to FALSE)
Получатель может установить этот флаг, чтобы указать, что отображение приобретает фокус при щелчке мышью внутри (иначе отображение может немедленно стать выделенным, например, для перетаскивания). setFocus следует устанавливать для всех редакторов, чтобы к отображению могли быть применены команды контекстно-зависимых меню.


TYPE ControlPref (Preference)
Отображение может описать свое предпочтительное поведение, если оно внедрено в диалог (то есть, контейнер в режиме маски, см. Containers) и нажата какая-либо клавиша.
Сообщение ControlPref посылается сначала текущему фокусированному отображению, а затем - всем остальным отображениям в контейнере, пока одно из отображений не установит флаги getFocus или accepts, или оба. Если ни одно из отображений не ответит на сообщение, символ пересылается фокусированному отображению.

char: CHAR
(отправитель => отображению)
Клавиша, которая была нажата.


focus: Views.View
(отправитель => отображению)
Текущее фокусированное отображение.

getFocus: BOOLEAN
(отображение => отправителю, определено, если (view # focus), инициализируется (char = tab) )
Указывает, что отображение желает стать фокусированным отображением.

accepts: BOOLEAN
(отображение => отправителю, инициализируется ((view = focus) & (char # tab)) )
Этот флаг должен быть установлен, если получатель примет и интерпретирует char выполнением некоторого действия.
Символ посылается отображению отдельным сообщением Edit.


TYPE PollVerbMsg (Message)
Сообщение используется для опроса отображения, поддерживает ли оно заказные глаголы. Глаголы - это одна из разновидностей действия, которую пользователь может применить к отображению, и которая показывается во всплывающем меню.

verb: INTEGER	verb >= 0	(IN)
(отправитель => отображению)
Номер глагола, информация о котором запрашивается.

label: ARRAY 64 OF CHAR
(отображение => отправителю, инициализируется "")
Показываемая надпись к глаголу.

disabled: BOOLEAN
(отображение => отправителю, инициализируется FALSE)
Указывает, когда глагол включен или выключен.

checked: BOOLEAN
(отображение => отправителю, инициализируется FALSE)
Указывает, когда глагол непомечен или помечен.


TYPE DoVerbMsg (Message)
Выполняет конкретный заказной глагол.

verb: INTEGER
(отправитель => отображению)
Глагол для выполнения.

frame: Views.Frame
(отправитель => глаголу)
Кадр отображения, в котором пользователь запустил глагол.


TYPE CollectMsg (Controllers.Message)
Это сообщение диспетчера посылается вдоль пути фокуса, для опроса свойств выделения или каретки во внутреннем фокусированном отображении, то есть, в отличие от PollMsg оно не возвращает свойства всего содержания.

poll: PollMsg


TYPE EmitMsg (Controllers.RequestMessage)
Это сообщение диспетчера посылается вдоль пути фокуса, для установки свойств выделения или каретки во внутреннем фокусированном отображении, то есть, в отличие от PollMsg оно не устанавливает свойства всего содержания.

set: SetMsg


TYPE PollPickMsg (Controllers.TransferMessage)
Пока элемент перетаскивается для указания свойств (механизм перетаскивания с указанием BlackBox), PollPickMsgs посылается для включения метки цели. Заметим, что эта роль похожа на Controllers.PollDropMsg для обычного перетаскивания.

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

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

dest: Views.Frame
Получателю следует установить dest равным своему собственному кадру, если он будет принимать указание.


TYPE PickMsg (Controllers.TransferMessage)
Расширение
Это сообщение используется, если свойства указываются в местоположении курсора. Заметим, что это аналогично Controllers.DropMsg для простого перетаскивания.

prop: Property
Получатель должен установить prop равным свойствам в местоположении курсора.


VAR era-: INTEGER	propEra >= 0
Эта переменная используется BlackBox для указания, когда свойства фокусированного отображения могут измениться.


PROCEDURE IncEra
Увеличивает era. Эту процедуру следует вызывать всякий раз, когда одно или несколько свойств отображения изменились. В качестве ответа система в конце концов пошлет PollMsg для получения новых свойств, например, для отражения изменений в меню или редакторе свойств.

Постусловие
era = era' + 1

PROCEDURE CollectProp (OUT prop: Property)
Опрашивает свойства фокусированного отображения.

PROCEDURE CollectStdProp (OUT prop: StdProp)
Опрашивает стандартные свойства фокусированного отображения.

PROCEDURE EmitProp (old, prop: Property)
Устанавливает свойства фокусированного отображения в prop. Если old не NIL, только свойства, совпадающие с полями old, будут заменены их аналогами из prop.

PROCEDURE PollPick (x, y: INTEGER; source: Views.Frame;
										sourceX, sourceY: INTEGER; mark, show: BOOLEAN;
										OUT dest: Views.Frame; OUT destX, destY: INTEGER)
Управляет меткой указания в положении (x, y) относительно координат источника, посылая сообщение PollPickMsg. Инициализирует msg.dest в NIL, msg.mark в mark, msg.show в show и вызывает Controllers.Transfer(x, y, source, sourceX, sourceY, msg). Возвращает msg.dest, msg.destX и msg.destY в dest, destX, и destY соответственно.
 
Предусловие
source # NIL   20

PROCEDURE Pick (x, y: INTEGER; source: Views.Frame;
								sourceX, sourceY: INTEGER; OUT prop: Property)
Указывает свойства в положении (x, y) относительно координат источника, посылая сообщение PickMsg. Инициализирует msg.prop в NIL и вызывает Controllers.Transfer(x, y, source, sourceX, sourceY, msg). Возвращает msg.prop в prop.

PROCEDURE Insert (VAR list: Property; x: Property)
Вставляет новую запись свойств в список list. Свойства, тип которых уже есть в списке, заменяют свойства в списке. Динамический тип x должен быть прямым расширением типа Property.

Предусловие
x # NIL   20
x.next = NIL   21
x # list   22
x.valid - x.known = {}   23
list # NIL
   list.valid - list.known = {}   24
   extension-level(list) = 1   25
extension-level(x) = 1   26

PROCEDURE CopyOf (p: Property): Property
Возвращает копию свойства p (не целого списка!). Динамические типы каждого свойства в p должны быть прямым расширением типа Property.

Предусловие
extension-level(p) = 1   20

PROCEDURE CopyOfList (p: Property): Property
Возвращает копию списка свойств p. Динамические типы каждого свойства в p должны быть прямым расширением типа Property.

Предусловие
all x in {p, p.next, p.next.next, ...}: extension-level(x) = 1   20

PROCEDURE Merge (VAR base, override: Property)
Сливает два списка свойств base и override. Если тип свойства присутствует в обоих списках, атрибуты свойства из override будут выбраны для списка слияния. Список слияния возвращается в base.

PROCEDURE Intersect (VAR list: Property; x: Property; OUT same: BOOLEAN)
Это убирает из свойств в list все те свойства, которые не в x, или которые имеют различные значения с x. Далее определяется, одинаковы ли оба списка.

PROCEDURE IntersectSelections (a, aMask, b, bMask: SET; OUT c, cMask: SET;
																	OUT equal: BOOLEAN)
Процедура поддержки для реализации процедуры IntersectWith свойств, содержащих множества. Эта процедура эквивалентна следующему коду:
	cMask := aMask * bMask - (a / b);
	c := a * cMask;
	equal  := (aMask = bMask) & (bMask = cMask)

PROCEDURE PreferredSize (v: Views.View; minW, maxW, minH, maxH,
													defW, defH: INTEGER; VAR w, h: INTEGER)
Устанавливает SizePref и использует его для опроса отображения v о его предпочтениях по размеру.
[minW, maxW] и [minH, maxH]  - легальные диапазоны ширины и высоты, соответственно, которые допускаются отправителем. (defW, defH) - заданный отправителем размер по умолчанию, то есть, размер, который предпочитает отправитель в отсутствие других предпочтений у v, задание  (Views.undefined, Views.undefined) означает "нет предпочтений". (w, h) могут быть инициализированы отправителем и будут использованы для инициализации SizePref; обычно отправитель использует их для передачи текущего размера отображения, размер которого изменяется.
Однако, если (w < Views.undefined) или (w > maxW), то defW будет использована вместо w. Аналогично, если (h < Views.undefined) или (h > maxH), то defH будет использована вместо h.
Если v не обрабатывает SizePref или возвращает w = Views.undefined, то defW заменяет предпочтения v.
Наконец, (w, h) урезается до ([minW, maxW], [minH, maxH]) перед возвратом к отправителю. Следовательно, если v не имеет (или не имеет определенных) предпочтений и заданное отправителем значение по умолчанию равно Views.undefined, то возвращаются минимальные значения.
 
Предусловие
Views.undefined < minW   20
minW < maxW   21
Views.undefined < minH   23
minH < maxH   24
Views.undefined <= defW   26
Views.undefiend <= defH   28

PROCEDURE ProportionalConstraint (scaleW, scaleH: INTEGER;
													fixedW, fixedH: BOOLEAN; VAR w, h: INTEGER)
Поддерживает пропорциональное изменение размера прямоугольных фигур, таких как отображения. (scaleW, scaleH) размер прямоугольника требуемых пропорций, например, (2,3) представляет все прямоугольники, имеющие коэффициент ширины к высоте как 2:3. (w, h) - предлагаемый размер, и ProportionalConstraint изменяет эту пару, чтобы удовлетворять ограничениям пропорции. Обычно ProportionalConstraint выполняет эту функцию, изменяя оба значения - w и h,  так что результирующий прямоугольник удовлетворяет ограничениям и площадь нового прямоугольника как можно ближе к площади старого. Установкой fixedW допускается изменение только h. Аналогично, установка fixedH запрашивает изменение только w. Когда установлены оба параметра, fixedW и fixedH, они игнорируются и снова используется эвристика сохранения площади.
 
Предусловие
w > Views.undefined   20
h > Views.undefined   21
scaleW > Views.undefined   22
scaleH > Views.undefined   23
~fixedW OR ~fixedH	24

PROCEDURE GridConstraint (gridX, gridY: INTEGER; VAR x, y: INTEGER)
Обеспечивает преобразование координат точки так, например, одного из углов отображения, к ближайшей точке сетки. (gridX, gridY) задает разрешение сетки в направлениях x и y, например, (5,3) задает сетку с допустимыми координатами, делящимися на 5 в направлении x и на 3 в направлении y.
 
Предусловие
gridX > Views.undefined   20
gridY > Views.undefined   21