Добрался до вашей замечательной подсистемы Abf.
Вот какой возник вопрос. Хочу программно вставить картинку, но когда я применяю фильтр, то изменение размера происходит непропорционально. Картинка тогда подстраивается под тот размер отображения, который указан жестко в
Controllers.PasteView. Если код установки фильтра закомментировать, то поведение более приятное — изображение встраивается в заданный размер отображения, сохраняя исходные пропорции.
Что я делаю не так?
Код:
MODULE CellUtils;
IMPORT AbfMedia, HostFiles, Controllers, Models, Stores, Views, Ports, Files, Dialog, TextCmds, TextControllers, TextViews, TextRulers, TextModels, TextMappers, TextSetters, Properties, Log, Services, AbfMediaCmds;
PROCEDURE ForceToNewLine (c: TextControllers.Controller);
VAR st: TextSetters.Setter; pos, start: INTEGER; msg: Controllers.EditMsg;
BEGIN
IF c.HasCaret() THEN
pos := c.CaretPos();
st := c.view.ThisSetter(); start := st.ThisLine(pos);
IF pos # start THEN
msg.op := Controllers.pasteChar; msg.char := TextModels.line;
Controllers.Forward(msg)
END
END
END ForceToNewLine;
(* Вставить изображение по центру страницы *)
PROCEDURE InsertPicture*;
VAR
ops: Controllers.PollOpsMsg;
c: TextControllers.Controller;
script: Stores.Operation;
s: TextMappers.Scanner;
f: TextMappers.Formatter;
r1, r2: TextRulers.Ruler;
p, prop: Properties.Property;
v : AbfMedia.View;
loc: Files.Locator;
name: Files.Name;
BEGIN
c := TextControllers.Focus();
Controllers.PollOps(ops);
IF ~ c.HasSelection() & (Controllers.paste IN ops.valid) THEN
Dialog.GetIntSpec("*", loc, name);
IF loc # NIL THEN
Models.BeginScript(c.text, "#CellUtils:InsertPicture", script);
f.ConnectTo(c.text);
s.ConnectTo(c.text);
s.Scan;
IF s.rider.attr # NIL THEN
f.rider.SetAttr(s.rider.attr)
END;
ForceToNewLine(c);
r1 := TextViews.ThisRuler(c.view, c.CaretPos());
r1 := TextRulers.CopyOf(r1, Views.deep);
r2 := TextRulers.CopyOf(r1, Views.deep);
TextRulers.SetCentered(r1);
TextRulers.SetNoBreakInside(r1);
Controllers.PasteView(r1, Views.undefined, Views.undefined, FALSE);
TextCmds.InsertParagraph;
v := AbfMedia.dir.New();
v.SetEmbLink(loc(HostFiles.Locator).path$ + "/" + name$);
Controllers.PasteView(v, 400 * Ports.point, 400 * Ports.point, FALSE);
v.AllowResize(1);
TextCmds.InsertParagraph;
f.SetPos(c.CaretPos());
f.WriteString("Рис. #. Подпись к рисунку");
f.WriteLn;
TextCmds.InsertParagraph;
Controllers.PasteView(r2, Views.undefined, Views.undefined, FALSE);
(* Устанавливаем фильтр *)
prop := AbfMedia.NewBrowseProp();
prop(AbfMedia.BrowseProp).filter := 6;
prop.valid :={0};
prop.known :={0};
c.SetSingleton(v);
Properties.CollectProp(p);
Properties.Merge(prop, p);
Properties.EmitProp(p, prop);
Models.EndScript(c.text, script)
END;
END
END InsertPicture;
BEGIN
END CellUtils.