Text/Docu/ru/Views.odc

TextViews

DEFINITION TextViews;

	IMPORT Models, Views, Containers, TextModels, TextRulers, TextSetters;

	CONST
		show = FALSE; hide = TRUE;
		any = FALSE; focusOnly = TRUE;

	TYPE
		View = POINTER TO ABSTRACT RECORD (Containers.View)
			(v: View) ThisModel (): TextModels.Model, EXTENSIBLE;
			(v: View) DisplayMarks (hide: BOOLEAN), NEW, ABSTRACT;
			(v: View) HidesMarks (): BOOLEAN, NEW, ABSTRACT;
			(v: View) SetSetter (setter: TextSetters.Setter), NEW, ABSTRACT;
			(v: View) ThisSetter (): TextSetters.Setter, NEW, ABSTRACT;
			(v: View) SetOrigin (org, dy: INTEGER), NEW, ABSTRACT;
			(v: View) PollOrigin (OUT org, dy: INTEGER), NEW, ABSTRACT;
			(v: View) SetDefaults (r: TextRulers.Ruler; a: TextModels.Attributes),
								NEW, ABSTRACT;
			(v: View) PollDefaults (OUT r: TextRulers.Ruler; OUT a: TextModels.Attributes),
								NEW, ABSTRACT;
			(v: View) GetThisLocation (f: Views.Frame; pos: INTEGER; OUT loc: Location),
								NEW, ABSTRACT;
			(v: View) GetRange (f: Views.Frame; OUT beg, end: INTEGER), NEW, ABSTRACT;
			(v: View) GetRect (f: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER);
			(v: View) ThisPos (f: Views.Frame; x, y: INTEGER): INTEGER, NEW, ABSTRACT;
			(v: View) ShowRangeIn (f: Views.Frame; beg, end: INTEGER), NEW, ABSTRACT;
			(v: View) ShowRange (beg, end: INTEGER; focusOnly: BOOLEAN), NEW, ABSTRACT
		END;

		Directory = POINTER TO RECORD
			defAttr-: TextModels.Attributes;
			(d: Directory) Set (defAttr: TextModels.Attributes), NEW, ABSTRACT;
			(d: Directory) New (text: TextModels.Model): View, NEW, ABSTRACT
		END;

		Location = RECORD
			start, pos: INTEGER;
			x, y: INTEGER;
			asc, dsc: INTEGER;
			view: Views.View;
			l, t, r, b: INTEGER
		END;

		PageMsg = RECORD (Views.PropMessage)
			current: INTEGER
		END;

		PositionMsg = RECORD (Models.Message)
			focusOnly: BOOLEAN;
			beg, end: INTEGER
		END;

	VAR
		ctrlDir-: Containers.Directory;
		dir-, stdDir-: Directory;

	PROCEDURE SetCtrlDir (d: Containers.Directory);
	PROCEDURE SetDir (d: Directory);
	PROCEDURE Focus (): View;
	PROCEDURE FocusText (): TextModels.Model;
	PROCEDURE Deposit;
	PROCEDURE ShowRange (text: TextModels.Model; beg, end: INTEGER; focusOnly: BOOLEAN);
	PROCEDURE ThisRuler (v: View; pos: INTEGER): TextRulers.Ruler;

END TextViews.

Модуль TextViews содержит стандартные отображения для текстовых моделей (TextModels).


CONST show, hide
Возможные значения параметра hide процедуры view.DisplayMarks.

CONST any, focusOnly
Возможные значения параметра focusOnly процедур ShowRange и view.ShowRange.


TYPE View (Containers.View)
ABSTRACT
Стандартное отображение текстовых моделей.

PROCEDURE (v: View) ThisModel (): TextModels.Model
EXTENSBIBLE
Тип результата говорит сам за себя.

PROCEDURE (v: View) DisplayMarks (hide: BOOLEAN)
NEW, ABSTRACT, [Операция]
Управляет скрытием скрываемых отображений, внедренных в отображаемый текст. Если требуется скрытие, все отображения с предпочтением hideable будут скрыты (уменьшены до нулевой ширины и высоты). Например, эта процедура позволит выборочно скрыть или показать линейки в тексте.
Если v.context # NIL и ~v.context.Normalize(), действие процедуры - операция.

Постусловия
v.HidesMarks() = hide

PROCEDURE (v: View) HidesMarks (): BOOLEAN
NEW, ABSTRACT
Текущее состояние: скрываются ли скрываемые отображения или нет.

PROCEDURE (v: View) SetSetter (setter: TextSetters.Setter)
NEW, ABSTRACT, Операция
Подключает наборщика к отображению.

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

Постусловия
v.ThisSetter() = setter

PROCEDURE (v: View) ThisSetter (): TextSetters.Setter
NEW, ABSTRACT
Возвращает наборщика, подключенного к отображению.

PROCEDURE (v: View) SetOrigin (org, dy: INTEGER)
NEW, ABSTRACT, [Операция]
Устанавливает начальную позицию и вериткальное смещение отображения.
Если v.context # NIL и ~v.context.Normalize(), это действие - операция.

Предусловия
v.ThisModel() # NIL	20
0 <= org	21
org <= v.ThisModel().Length()	22
dy <= 0	23

Постусловия
org = v.ThisSetter().ThisLine(org)
	v.PollOrigin(o, d): o = org, d = dy
org # v.ThisSetter().ThisLine(org)
	v.PollOrigin(o, d): o = v.ThisSetter().ThisLine(org), d = 0

PROCEDURE (v: View) PollOrigin (OUT org, dy: INTEGER)
NEW, ABSTRACT
Возвращает начальную позицию и вертикальное смещение отображения. Вертикальное смещение определяет смещение (в универсальных единицах) начала первой отображаемой строки относительно начала видимой области. Оно используется для частичного отображения первой строки во время прокрутки.

Постусловия
0 <= org <= v.ThisModel().Length()
dy <= 0

PROCEDURE (v: View) SetDefaults (r: TextRulers.Ruler; a: TextModels.Attributes)
NEW, ABSTRACT, Операция
Установка линейки по умолчанию и атрибутов по умолчанию.

Предусловия
r # NIL	20
a # NIL	22

PROCEDURE (v: View) PollDefaults (OUT r: TextRulers.Ruler; OUT a: TextModels.Attributes)
NEW, ABSTRACT
Получение линейки по умолчанию и атрибутов по умолчанию.

PROCEDURE (v: View) GetThisLocation (f: Views.Frame; pos: INTEGER; OUT loc: Location)
NEW, ABSTRACT
Получение параметров расположения элемента в позиции pos, отображаемого во фрейме f. (Фрейм необходим, чтобы учесть устройство-зависимое расположение символов в словах.) Если pos лежит вне видимой области, будет получено следующее наилучшее положение внутри области.

Предусловия
f # NIL	20
Displayed(f)	21
0 <= pos	22
pos <= v.ThisModel().Length()	23

Постусловия
loc.view # NIL
	loc.l <= loc.r, loc.t <= loc.b	прямоугольная граница отображения

PROCEDURE (v: View) GetRect (f: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER)
Предусловия
f # NIL	20
Displayed(f)	21
view.context # NIL	22
view.context.ThisModel() = v.ThisModel()	23

За исключением производительности, равносильно:
	VAR loc: Location;
	v.GetThisLocation(f, view.context(TextModels.Context).Pos(), loc);
	IF loc.view = view THEN
		l := loc.l; t := loc.t; r := loc.r; b := loc.b
	ELSE
		l := MAX(INTEGER); t := MAX(INTEGER); r := l; b := t
	END

PROCEDURE (v: View) GetRange (f: Views.Frame; OUT beg, end: INTEGER)
NEW, ABSTRACT
Получение отрезка текста [beg, end), видимого в v.

Предусловия
f # NIL	20
Displayed(f)	21

Постусловия
beg = BeginOf(FirstLineVisible(v))
end = EndOf(LastLineVisible(v))

PROCEDURE (v: View) ThisPos (f: Views.Frame; x, y: INTEGER): INTEGER;
NEW, ABSTRACT
Положение в тексте, соответствующее точке (x, y) фрейма f.

Предусловия
f # NIL	20
Displayed(f)	21

Постусловия
v.GetOrigin(o, d): o <= result <= v.ThisModel().Length()

PROCEDURE (v: View) ShowRangeIn (f: Views.Frame; beg, end: INTEGER);
NEW, ABSTRACT
Делает видимым в f участок текста [beg, end) , если это возможно.

Предусловия
f # NIL	20
Displayed(f)	21

Постусловия
If possible, BeginOf(FirstLineVisible(v)) <= k <= EndOf(LastLineVisible(v)):
	beg = end
		k = beg
	beg < end
		beg <= k < end

PROCEDURE (v: View) ShowRange (beg, end: INTEGER; focusOnly: BOOLEAN);
NEW, ABSTRACT
Определяет корневой кадр, выводящий v и выполняет на нём v.ShowRangeIn. Если ~focusOnly, берётся обычный кадр, при этом целевой кадр предпочитается остальным кроме переднего кадра, который предпочитается всем другим кадрам. Если focusOnly, только передний кадр (если его нет, то целевой) рассматривается как корневой, и если нет ни того ни другого, ничего не происходит.


TYPE Directory
ABSTRACT
Фабрика отображений.

defAttr-: TextModels.Attributes
Атрибуты по умолчанию, которые применяются изначально - при вводе в пустой текст.

PROCEDURE (d: Directory) Set (defAttr: TextModels.Attributes)
NEW, EXTENSIBLE
Установка атрибутов по умолчанию.

Предусловия
defAttr # NIL	явно не проверятся
defAttr.init	20

Постусловия
d.defAttr = defAttr

PROCEDURE (d: Directory) New (text: TextModels.Model): View
NEW, ABSTRACT
Возвращает новое отображение, выводящее текст text. Если text = NIL, создается новый текст при помощи TextModels.dir.New.

Постусловия
text = NIL
	result.ThisModel() = new-text
text # NIL
	result.ThisModel() = text


TYPE Location
Параметры расположения элемента (символа или внедренного отображения) в текстовом отображении.

start, pos: INTEGER
Положение начала строки и самого элемента в тексте.

x, y: INTEGER
Координаты элемента.

asc, dsc: INTEGER
Надстрочный и подстрочный элементы строки, содержащий элемент.

view: Views.View
l, t, r, b: INTEGER
Если элемент является внедренным отображением, то само отображение view, и его прямоугольная граница: левый верхний угол  (l, t), нижний правый (r, b).


TYPE  PageMsg (Views.PropMessage)
Сообщение, которое посылает текстовое отображение всем внедрённым отображениям на странице перед рендерингом этой страницы (для печати). Отображения могут использовать это сообщение для вывода на печать особого содержимого, зависящего от номера страницы.

current: INTEGER
Номер страницы, рендеринг которой будет выполнен.


TYPE PositionMsg (Models.Message)
Сообщение, которое ShowRange посылает всем отображениям модели, запрашивая изменение положения.

focusOnly: BOOLEAN
Смена положения только переднего кадра (если нет, то целевого).

beg, end: INTEGER
Участок текста, который должен стать видимым.


VAR ctrlDir-: Containers.Directory	stable ctrlDir # NIL
Фабрика диспетчеров. Эта фабрика, если инсталлирована, используется фабрикой отображений чтобы создать диспетчер для только что созданного отображения. При инициализации, модуль TextViews пытается загрузить модуль TextControllers, который, если доступен, устанавливает в ctrlDir стандартную фабрику диспетчеров.


VAR dir-, stdDir-: Directory	dir # NIL, stdDir # NIL, stable stdDir = d
Фабрика и стандартная фабрика отображений.


PROCEDURE SetCtrlDir (d: Containers.Directory)
Установка фабрики диспетчеров.

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

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

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

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

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

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

За исключением производительности, равносильно:
	VAR v: Views.View;
	v := Controllers.FocusView();
	IF (v # NIL) & (v IS View) THEN RETURN v(View) ELSE RETURN NIL END

PROCEDURE FocusText (): TextModels.Model
Возвращает сфокусированный текст, если он есть.

За исключением производительности, равносильно:
	VAR v: View;
	v := Focus();
	IF v # NIL THEN RETURN v.ThisModel() ELSE RETURN NIL END

PROCEDURE Deposit
Помещает текстовое отображение в очередь отображений модуля Views.

За исключением производительности, равносильно:
	Views.Deposit(dir.New(NIL))

PROCEDURE ShowRange (text: TextModels.Model; beg, end: INTEGER;
												focusOnly: BOOLEAN)
Выполняет v.ShowRange(beg, end, focusOnly) для всех отображений v, показывающих текст text.

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

За исключением производительности, равносильно:
	VAR pm: PositionMsg;
	pm.beg := beg; pm.end := end; pm.focusOnly := focusOnly;
	Models.Broadcast(text, pm)

PROCEDURE ThisRuler (v: View; pos: INTEGER): TextRulers.Ruler
Находит линейку, которая определяет форматирование в положении pos в тексте, отображаемом v.

Предусловия
v # NIL	20
v.ThisModel() # NIL	21
0 <= pos	22
pos <= v.ThisModel().Length()	23

За исключением производительности, равносильно:
	VAR r: TextRulers.Ruler; a: TextModels.Attributes; rpos: INTEGER;
	v.PollDefaults(r, a); rpos := -1; TextRulers.GetValidRuler(v.ThisModel(), pos, -1, r, rpos);
	RETURN r