Form/Docu/ru/Models.odc

FormModels

DEFINITION FormModels;

	IMPORT Ports, Models, Views, Containers;

	CONST minView Size = 4 * Ports.point; maxViewSize = 1000 * Ports.mm;

	TYPE
		Model = POINTER TO ABSTRACT RECORD (Containers.Model)
			(m: Model) Insert (v: Views.View; l, t, r, b: INTEGER), NEW, ABSTRACT;
			(m: Model) Delete (v: Views.View), NEW, ABSTRACT;
			(m: Model) Resize (v: Views.View; l, t, r, b: INTEGER), NEW, ABSTRACT;
			(m: Model) PutAbove (v, pos: Views.View), NEW, ABSTRACT;
			(m: Model) Move (v: Views.View; dx, dy: INTEGER), NEW, ABSTRACT;
			(m: Model) Copy (VAR v: Views.View; dx, dy: INTEGER), NEW, ABSTRACT;
			(m: Model) NewReader (old: Reader): Reader, NEW, ABSTRACT;
			(m: Model) NewWriter (old: Writer): Writer, NEW, ABSTRACT;
			(m: Model) ViewAt (x, y: INTEGER): Views.View, NEW, ABSTRACT;
			(m: Model) NofViews (): INTEGER, NEW, ABSTRACT
		END;

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

		Context = POINTER TO ABSTRACT RECORD (Models.Context)
			(c: Context) ThisModel (): Model, ABSTRACT;
			(c: Context) GetRect (OUT l, t, r, b: INTEGER), NEW, ABSTRACT
		END;

		Reader = POINTER TO ABSTRACT RECORD
			view: Views.View;
			l, t, r, b: INTEGER;
			(r: Reader) Set (pos: Views.View), NEW, ABSTRACT;
			(r: Reader) ReadView (OUT v: Views.View), NEW, ABSTRACT
		END;

		Writer = POINTER TO ABSTRACT RECORD
			(w: Writer) Set (pos: Views.View), NEW, ABSTRACT;
			(w: Writer) WriteView (v: Views.View; l, t, r, b: INTEGER), NEW, ABSTRACT
		END;

		UpdateMsg = RECORD (Models.UpdateMsg)
			l, t, r, b: INTEGER
		END;

	VAR dir-, stdDir-: Directory;

	PROCEDURE New (): Model;
	PROCEDURE CloneOf (source: Model): Model;
	PROCEDURE Copy (source: Model): Model;
	PROCEDURE SetDir (d: Directory);

END FormModels.

Модуль FormModels содержит модели форм - модели-контейнеры, которые содержат отображения и только отображения. Другого внутренного содержимого у них нет (как, например, текст в текстовых моделях). Модели форм предназначены для размещения прямоугольных отображений произвольным образом. Главное их назначение - использование в качестве форм для ввода данных и в качестве схем разметки диалогового окна. 


CONST minViewSize
Минимальные ширина и высота отображения, внедренного в модель формы.

CONST maxViewSize
Максимальные ширина и высота отображения, внедренного в модель формы.


TYPE Model (Containers.Model)
ABSTRACT
Модели форм - модели-контейнеры (см. Containers), которые могут содержать только прямоугольные отображения.

PROCEDURE (m: Model) Insert (v: Views.View; l, t, r, b: INTEGER)
NEW, ABSTRACT, Операция
Вставляет отображение v в m; прямоугольник (l, t, r, b) определяет его границы. (l, t) - координаты левого верхнего угла; (r, b) - нижнего правого.

Предусловия
v # NIL	20
v.context = NIL	22
l <= r	23
t <= b	24

Постусловия
v in m
v.context # NIL & v.context.ThisModel() = m

PROCEDURE (m: Model) Delete (v: Views.View)
NEW, ABSTRACT, Операция
Удаляет v из m.

Предусловия
v in m	20

Постусловия
~(v in m)

PROCEDURE (m: Model) Resize (v: Views.View; l, t, r, b: INTEGER)
NEW, ABSTRACT, Операция
Переопределят ограничивающий прямоугольник v.

Предусловия
v in m	20
l <= r	21
t <= b	22

PROCEDURE (m: Model) PutAbove (v, pos: Views.View)
NEW, ABSTRACT, Операция
Изменяет вертикальный порядок отображения v таким образом, что оно оказывается расположенным точно над pos, если pos # NIL; иначе оно располагается на форме как самое нижнее..

Предусловия
v in m	20
pos = NIL  OR  pos in m	21

PROCEDURE (m: Model) Move (v: Views.View; dx, dy: INTEGER)
NEW, ABSTRACT, Операция
Перемещает отображение v на (dx, dy), не меняя его размер.

Предусловия
v in m	20

PROCEDURE (m: Model) Copy (VAR v: Views.View; dx, dy: INTEGER)
NEW, ABSTRACT, Операция
Создает копиию v и размещает её в ограничивающий прямоугольник v, смещенный на (dx, dy). В параметре v возвращается копия.

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

Постусловия
v # NIL  &  v # v'

PROCEDURE (m: Model) NewReader (old: Reader): Reader
NEW, ABSTRACT
Возвращает считыватель, подключенный к m. В качестве входного параметра может быть передан уже существующий и более нигде не использующийся считыватель.

Постусловия
result # NIL

PROCEDURE (m: Model) NewWriter (old: Writer): Writer
NEW, ABSTRACT
Возвращает записыватель, подключенный к m. В качестве входного параметра может быть передан уже существующий и более нигде не использующийся записыватель.

Постусловия
result # NIL

PROCEDURE (m: Model) ViewAt (x, y: INTEGER): Views.View
NEW, ABSTRACT
Возвращает самое верхнее отображение в m, к которому относится точка (x, y).

Постусловия
result # NIL
	(l <= x <= r) & (t <= y <= b), здесь (l, t, r, b) - ограничивающий прямоугольник v
result = NIL
	нет отображения в точке (x, y)
	
PROCEDURE (m: Model) NofViews (): INTEGER
NEW, ABSTRACT
Возвращает число содержащихся в m отображений.

Постусловия
result >= 0


TYPE Directory
ABSTRACT
Фабрика моделей форм.

PROCEDURE (d: Directory) New (): Model
NEW, ABSTRACT
Создает и возвращает новую модель формы.

Постусловия
result # NIL


TYPE Context (Models.Context)
NEW, ABSTRACT
Контекст отображения на форме.

PROCEDURE (c: Context) ThisModel (): Model
ABSTRACT
Возвращает модель формы, содержащую контекст.

PROCEDURE (c: Context) GetRect (OUT l, t, r, b: INTEGER)
NEW, ABSTRACT
Возвращает ограничивающий прямоугольник отображения, принадлежащего данному контексту.

Постусловия
l < r  &  t < b


TYPE Reader
ABSTRACT
Считывающий курьер (считыватель) модели формы.

view: Views.View
Последнее считанное отображение.

l, t, r, b: INTEGER	view # NIL => l < r & t < b
Ограничивающий прямоугольник последнего считанного отображения.

PROCEDURE (r: Reader) Set (pos: Views.View)
NEW, ABSTRACT
Устнавливает положение считывателя r на отображение над pos (т. е. следующим будет прочитано отображение, расположенное точно над pos) или  в самый низ, если pos = NIL.

Предусловия
pos in Base(r)  OR  pos = NIL	20

PROCEDURE (r: Reader) ReadView (OUT v: Views.View)
NEW, ABSTRACT
Читает следующее отображение, в восходящем порядке. Если больше отображений нет, v устанавливается в NIL. Поля считывателя view и l, t, r, b устанавливаются соответсвтующим образом (l, t, r, b не определены, если view = NIL).

Постусловия
v = r.view


TYPE Writer
ABSTRACT
Записывающий курьер (записыватель) модели формы.

PROCEDURE (w: Writer) Set (pos: Views.View)
Интерфейс
Устнавливает положение записывателя w на отображение над pos (т. е. следующее записываемое отображение будет вставлено точно над pos) или  в самый низ, если pos = NIL.

Предусловия
pos in Base(r)  OR  pos = NIL	20

PROCEDURE (w: Writer) WriteView (v: Views.View; l, t, r, b: INTEGER)
NEW, ABSTRACT
Вставляет в форму на текущее положение записывателя w отображение v.

Предусловия
v # NIL	20
v.context = NIL	22
l <= r	23
t <= b	24

Постусловия
v.context # NIL


TYPE UpdateMsg
Это сообщение указывает, что прямоугольная часть формы на экране требует обновления. Получатель не должен включать какие-либо пометки в качестве реакции на это сообщение. UpdateMsgs посылается конкретными реализациями моделей форм после любых изменений отображений.
Тип UpdateMsg не расширяем.


VAR dir-, stdDir-: Directory;	dir # NIL  &  stdDir # NIL
Фабрика и стандартная фабрика моделей форм.


PROCEDURE New (): Model
Возвращает новую модель. Эквивалентно dir.New().

Постусловия
result # NIL

PROCEDURE CloneOf (source: Model): Model
Возвращает новую пустую модель того же типа, что и source.

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

Постусловия
result # NIL

PROCEDURE Copy (source: Model): Model
Возвращает новую модель того же типа, что и source, с копией содержимого source.

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

Постусловия
result # NIL

PROCEDURE SetDir (d: Directory)
Устанавливает фабрику моделей форм.

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

Постусловия
dir = d